Skip to content

Commit d5d970f

Browse files
committed
Implement peek method
1 parent 76710cf commit d5d970f

File tree

2 files changed

+62
-30
lines changed

2 files changed

+62
-30
lines changed

Diff for: cores/esp32/cbuf.cpp

+60-29
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
}

Diff for: cores/esp32/cbuf.h

+2-1
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)