*/
size_t xRingbufferGetCurFreeSize(RingbufHandle_t ringbuf);
+/**
+ * @brief Check if the next item is wrapped
+ *
+ * This API tells if the next item that is available for a Receive is wrapped
+ * or not. This is valid only if the ring buffer type is RINGBUF_TYPE_ALLOWSPLIT
+ *
+ * @note This API is not thread safe. So, if multiple threads are accessing the same
+ * ring buffer, it is the application's responsibility to ensure atomic access to this
+ * API and the subsequent Receive
+ *
+ * @param ringbuf - Ring buffer to query
+ *
+ * @return true if the next item is wrapped around
+ * @return false if the next item is not wrapped
+ */
+bool xRingbufferIsNextItemWrapped(RingbufHandle_t ringbuf);
+
/**
* @brief Insert an item into the ring buffer
*
typedef enum {
iflag_free = 1, //Buffer is not read and given back by application, free to overwrite
iflag_dummydata = 2, //Data from here to end of ringbuffer is dummy. Restart reading at start of ringbuffer.
+ iflag_wrap = 4, //Valid for RINGBUF_TYPE_ALLOWSPLIT, indicating that rest of the data is wrapped around
} itemflag_t;
if (buffer_size == 0) {
rb->write_ptr=rb->data;
return pdTRUE;
+ } else {
+ /* Indicate the wrapping */
+ hdr->flags|=iflag_wrap;
}
} else {
//Huh, only the header fit. Mark as dummy so the receive function doesn't receive
configASSERT((hdr->flags & iflag_dummydata)==0);
configASSERT((hdr->flags & iflag_free)==0);
//Mark the buffer as free.
+ hdr->flags&=~iflag_wrap;
hdr->flags|=iflag_free;
//Do a cleanup pass.
return rb->maxItemSize;
}
+bool xRingbufferIsNextItemWrapped(RingbufHandle_t ringbuf)
+{
+ ringbuf_t *rb=(ringbuf_t *)ringbuf;
+ configASSERT(rb);
+ buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->read_ptr;
+ return hdr->flags & iflag_wrap;
+}
+
+
BaseType_t xRingbufferSend(RingbufHandle_t ringbuf, void *data, size_t dataSize, TickType_t ticks_to_wait)
{
ringbuf_t *rb=(ringbuf_t *)ringbuf;