34
34
#endif
35
35
36
36
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))
38
40
{
39
41
if (_buf == NULL ) {
40
42
log_e (" failed to allocate ring buffer" );
@@ -127,6 +129,7 @@ size_t cbuf::available() const
127
129
if (_buf != NULL ){
128
130
vRingbufferGetInfo (_buf, NULL , NULL , NULL , NULL , (UBaseType_t *)&available);
129
131
}
132
+ if (has_peek) available++;
130
133
return available;
131
134
}
132
135
@@ -160,12 +163,24 @@ bool cbuf::full() const
160
163
161
164
int cbuf::peek ()
162
165
{
163
- return -1 ;
164
- }
166
+ if (!available ()) {
167
+ return -1 ;
168
+ }
165
169
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;
169
184
}
170
185
171
186
int cbuf::read ()
@@ -185,34 +200,50 @@ size_t cbuf::read(char* dst, size_t size)
185
200
CBUF_MUTEX_UNLOCK ();
186
201
return 0 ;
187
202
}
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;
195
207
}
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" );
206
235
}
207
- vRingbufferReturnItem (_buf, received_buff);
208
- size_read += received_size;
209
- } else {
210
- log_e (" failed to read wrap around data from ring buffer" );
211
236
}
237
+ } else {
238
+ log_e (" failed to read from ring buffer" );
212
239
}
213
- } else {
214
- log_e (" failed to read from ring buffer" );
215
240
}
241
+
242
+ if (has_peek) {
243
+ has_peek = false ;
244
+ size_read++;
245
+ }
246
+
216
247
CBUF_MUTEX_UNLOCK ();
217
248
return size_read;
218
249
}
0 commit comments