Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d5d970f

Browse filesBrowse files
committed
Implement peek method
1 parent 76710cf commit d5d970f
Copy full SHA for d5d970f

File tree

Expand file treeCollapse file tree

2 files changed

+62
-30
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+62
-30
lines changed

‎cores/esp32/cbuf.cpp

Copy file name to clipboardExpand all lines: cores/esp32/cbuf.cpp
+60-29Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
#endif
3535

3636
cbuf::cbuf(size_t size) :
37-
next(NULL), _buf(xRingbufferCreate(size, RINGBUF_TYPE_BYTEBUF))
37+
next(NULL),
38+
has_peek(false),
39+
_buf(xRingbufferCreate(size, RINGBUF_TYPE_BYTEBUF))
3840
{
3941
if(_buf == NULL) {
4042
log_e("failed to allocate ring buffer");
@@ -127,6 +129,7 @@ size_t cbuf::available() const
127129
if(_buf != NULL){
128130
vRingbufferGetInfo(_buf, NULL, NULL, NULL, NULL, (UBaseType_t *)&available);
129131
}
132+
if (has_peek) available++;
130133
return available;
131134
}
132135

@@ -160,12 +163,24 @@ bool cbuf::full() const
160163

161164
int cbuf::peek()
162165
{
163-
return -1;
164-
}
166+
if (!available()) {
167+
return -1;
168+
}
165169

166-
size_t cbuf::peek(char *dst, size_t size)
167-
{
168-
return 0;
170+
int c;
171+
172+
CBUF_MUTEX_LOCK();
173+
if (has_peek) {
174+
c = peek_byte;
175+
} else {
176+
c = read();
177+
if (c >= 0) {
178+
has_peek = true;
179+
peek_byte = c;
180+
}
181+
}
182+
CBUF_MUTEX_UNLOCK();
183+
return c;
169184
}
170185

171186
int cbuf::read()
@@ -185,34 +200,50 @@ size_t cbuf::read(char* dst, size_t size)
185200
CBUF_MUTEX_UNLOCK();
186201
return 0;
187202
}
188-
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
189-
size_t size_read = 0;
190-
size_t received_size = 0;
191-
uint8_t *received_buff = (uint8_t *)xRingbufferReceiveUpTo(_buf, &received_size, 0, size_to_read);
192-
if (received_buff != NULL) {
193-
if(dst != NULL){
194-
memcpy(dst, received_buff, received_size);
203+
204+
if (has_peek) {
205+
if (dst != NULL) {
206+
*dst++ = peek_byte;
195207
}
196-
vRingbufferReturnItem(_buf, received_buff);
197-
size_read = received_size;
198-
size_to_read -= received_size;
199-
// wrap around data
200-
if(size_to_read){
201-
received_size = 0;
202-
received_buff = (uint8_t *)xRingbufferReceiveUpTo(_buf, &received_size, 0, size_to_read);
203-
if (received_buff != NULL) {
204-
if(dst != NULL){
205-
memcpy(dst+size_read, received_buff, received_size);
208+
size--;
209+
}
210+
211+
size_t size_read = 0;
212+
if (size) {
213+
size_t received_size = 0;
214+
size_t size_to_read = (size < bytes_available) ? size : bytes_available;
215+
uint8_t *received_buff = (uint8_t *)xRingbufferReceiveUpTo(_buf, &received_size, 0, size_to_read);
216+
if (received_buff != NULL) {
217+
if(dst != NULL){
218+
memcpy(dst, received_buff, received_size);
219+
}
220+
vRingbufferReturnItem(_buf, received_buff);
221+
size_read = received_size;
222+
size_to_read -= received_size;
223+
// wrap around data
224+
if(size_to_read){
225+
received_size = 0;
226+
received_buff = (uint8_t *)xRingbufferReceiveUpTo(_buf, &received_size, 0, size_to_read);
227+
if (received_buff != NULL) {
228+
if(dst != NULL){
229+
memcpy(dst+size_read, received_buff, received_size);
230+
}
231+
vRingbufferReturnItem(_buf, received_buff);
232+
size_read += received_size;
233+
} else {
234+
log_e("failed to read wrap around data from ring buffer");
206235
}
207-
vRingbufferReturnItem(_buf, received_buff);
208-
size_read += received_size;
209-
} else {
210-
log_e("failed to read wrap around data from ring buffer");
211236
}
237+
} else {
238+
log_e("failed to read from ring buffer");
212239
}
213-
} else {
214-
log_e("failed to read from ring buffer");
215240
}
241+
242+
if (has_peek) {
243+
has_peek = false;
244+
size_read++;
245+
}
246+
216247
CBUF_MUTEX_UNLOCK();
217248
return size_read;
218249
}

‎cores/esp32/cbuf.h

Copy file name to clipboardExpand all lines: cores/esp32/cbuf.h
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class cbuf
4444
bool full() const;
4545

4646
int peek();
47-
size_t peek(char *dst, size_t size);
4847

4948
int read();
5049
size_t read(char* dst, size_t size);
@@ -56,6 +55,8 @@ class cbuf
5655
size_t remove(size_t size);
5756

5857
cbuf *next;
58+
bool has_peek;
59+
uint8_t peek_byte;
5960

6061
protected:
6162
RingbufHandle_t _buf = NULL;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.