10static const char *
const TAG =
"ring_buffer";
14 vRingbufferDelete(this->
handle_);
21 std::unique_ptr<RingBuffer> rb = make_unique<RingBuffer>();
29 rb->storage_ = allocator.
allocate(rb->size_);
30 if (rb->storage_ ==
nullptr) {
34 rb->handle_ = xRingbufferCreateStatic(rb->size_, RINGBUF_TYPE_BYTEBUF, rb->storage_, &rb->structure_);
35 ESP_LOGD(TAG,
"Created ring buffer with size %u",
len);
42 void *buffer_data = xRingbufferReceiveUpTo(this->
handle_, &length, ticks_to_wait, max_length);
49 size_t bytes_read = 0;
51 void *buffer_data = xRingbufferReceiveUpTo(this->
handle_, &bytes_read, ticks_to_wait,
len);
53 if (buffer_data ==
nullptr) {
57 std::memcpy(data, buffer_data, bytes_read);
59 vRingbufferReturnItem(this->
handle_, buffer_data);
61 if (bytes_read <
len) {
63 size_t follow_up_bytes_read = 0;
64 size_t bytes_remaining =
len - bytes_read;
66 buffer_data = xRingbufferReceiveUpTo(this->
handle_, &follow_up_bytes_read, 0, bytes_remaining);
68 if (buffer_data ==
nullptr) {
72 std::memcpy((
void *) ((uint8_t *) (data) + bytes_read), buffer_data, follow_up_bytes_read);
74 vRingbufferReturnItem(this->
handle_, buffer_data);
75 bytes_read += follow_up_bytes_read;
92 if (!xRingbufferSend(this->
handle_, data,
len, ticks_to_wait)) {
97 size_t free = std::min(this->
free(), len);
98 if (xRingbufferSend(this->
handle_, data,
free, 0)) {
107 UBaseType_t ux_items_waiting = 0;
108 vRingbufferGetInfo(this->
handle_,
nullptr,
nullptr,
nullptr,
nullptr, &ux_items_waiting);
109 return ux_items_waiting;
120 size_t bytes_read = 0;
122 void *buffer_data = xRingbufferReceiveUpTo(this->
handle_, &bytes_read, 0, discard_bytes);
123 if (buffer_data !=
nullptr)
124 vRingbufferReturnItem(this->
handle_, buffer_data);
126 if (bytes_read < discard_bytes) {
127 size_t wrapped_bytes_read = 0;
128 buffer_data = xRingbufferReceiveUpTo(this->
handle_, &wrapped_bytes_read, 0, discard_bytes - bytes_read);
129 if (buffer_data !=
nullptr) {
130 vRingbufferReturnItem(this->
handle_, buffer_data);
131 bytes_read += wrapped_bytes_read;
135 return (bytes_read == discard_bytes);
An STL allocator that uses SPI or internal RAM.
void deallocate(T *p, size_t n)
BaseType_t reset()
Resets the ring buffer, discarding all stored data.
size_t write(const void *data, size_t len)
Writes to the ring buffer, overwriting oldest data if necessary.
size_t write_without_replacement(const void *data, size_t len, TickType_t ticks_to_wait=0, bool write_partial=true)
Writes to the ring buffer without overwriting oldest data.
size_t free() const
Returns the number of free bytes in the ring buffer.
size_t available() const
Returns the number of available bytes in the ring buffer.
bool discard_bytes_(size_t discard_bytes)
Discards data from the ring buffer.
void receive_release(void *item)
Releases a previously acquired ring buffer item.
static std::unique_ptr< RingBuffer > create(size_t len, MemoryPreference preference=MemoryPreference::EXTERNAL_FIRST)
size_t read(void *data, size_t len, TickType_t ticks_to_wait=0)
Reads from the ring buffer, waiting up to a specified number of ticks if necessary.
void * receive_acquire(size_t &length, size_t max_length, TickType_t ticks_to_wait=0)
Acquires a pointer into the ring buffer's internal storage without copying.