3434#endif
3535
3636cbuf::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
161164int 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
171186int 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}
0 commit comments