ESPHome  2024.4.2
ring_buffer.cpp
Go to the documentation of this file.
1 #include "ring_buffer.h"
2 
3 #include "esphome/core/helpers.h"
4 #include "esphome/core/log.h"
5 
6 #ifdef USE_ESP32
7 
8 #include "helpers.h"
9 
10 namespace esphome {
11 
12 static const char *const TAG = "ring_buffer";
13 
14 std::unique_ptr<RingBuffer> RingBuffer::create(size_t len) {
15  std::unique_ptr<RingBuffer> rb = make_unique<RingBuffer>();
16 
18  rb->storage_ = allocator.allocate(len + 1);
19  if (rb->storage_ == nullptr) {
20  return nullptr;
21  }
22 
23  rb->handle_ = xStreamBufferCreateStatic(len + 1, 0, rb->storage_, &rb->structure_);
24  ESP_LOGD(TAG, "Created ring buffer with size %u", len);
25  return rb;
26 }
27 
28 size_t RingBuffer::read(void *data, size_t len, TickType_t ticks_to_wait) {
29  return xStreamBufferReceive(this->handle_, data, len, ticks_to_wait);
30 }
31 
32 size_t RingBuffer::write(void *data, size_t len) {
33  size_t free = this->free();
34  if (free < len) {
35  size_t needed = len - free;
36  uint8_t discard[needed];
37  xStreamBufferReceive(this->handle_, discard, needed, 0);
38  }
39  return xStreamBufferSend(this->handle_, data, len, 0);
40 }
41 
42 size_t RingBuffer::available() const { return xStreamBufferBytesAvailable(this->handle_); }
43 
44 size_t RingBuffer::free() const { return xStreamBufferSpacesAvailable(this->handle_); }
45 
46 BaseType_t RingBuffer::reset() { return xStreamBufferReset(this->handle_); }
47 
48 } // namespace esphome
49 
50 #endif
size_t free() const
Definition: ring_buffer.cpp:44
An STL allocator that uses SPI RAM.
Definition: helpers.h:645
BaseType_t reset()
Definition: ring_buffer.cpp:46
size_t read(void *data, size_t len, TickType_t ticks_to_wait=0)
Definition: ring_buffer.cpp:28
const char *const TAG
Definition: spi.cpp:8
size_t available() const
Definition: ring_buffer.cpp:42
std::string size_t len
Definition: helpers.h:292
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
Definition: a01nyub.cpp:7
size_t write(void *data, size_t len)
Definition: ring_buffer.cpp:32
static std::unique_ptr< RingBuffer > create(size_t len)
Definition: ring_buffer.cpp:14
StreamBufferHandle_t handle_
Definition: ring_buffer.h:27