3#ifndef ARDUINO_ARCH_RP2040
4# error "Unsupported architecture"
7#include "TinyRobotics/utils/Config.h"
8#include "TinyRobotics/utils/LoggerClass.h"
9#include "TinyRobotics/utils/Buffers.h"
11namespace tinyrobotics {
16
17
18
19
20
21
22
23
24
25
26
27
28
29
33 BufferRP2040T(
int bufferCount) :
BaseBuffer<T>() {
35 buffer_size_bytes =
sizeof(T);
36 buffer_size_req_bytes = buffer_size_bytes * bufferCount;
39 BufferRP2040T(size_t bufferSize,
int bufferCount) :
BaseBuffer<T>() {
40 buffer_size = bufferSize;
41 buffer_size_bytes = bufferSize *
sizeof(T);
42 buffer_size_req_bytes = buffer_size_bytes * bufferCount;
49 int req_bytes = size *
sizeof(T);
50 if (buffer_size_alloc_bytes < req_bytes) {
51 LOGI(
"resize %d -> %d", buffer_size_alloc_bytes /
sizeof(T), size);
52 assert(buffer_size_bytes > 0);
53 write_buffer.resize(buffer_size);
54 read_buffer.resize(buffer_size * 2);
56 if (req_bytes > buffer_size_alloc_bytes) {
58 if (buffer_size_alloc_bytes > 0) {
62 int count = req_bytes / buffer_size_bytes;
63 LOGI(
"queue_init(size:%d, count:%d)", buffer_size_bytes, count);
64 queue_init(&queue, buffer_size_bytes, count);
65 buffer_size_alloc_bytes = req_bytes;
78 bool peek(T &result)
override {
79 LOGE(
"peek not implemented");
84 int readArray(T data[],
int len)
override {
85 LOGD(
"readArray: %d", len);
87 if (buffer_size_alloc_bytes == 0)
return 0;
90 while (is_blocking_read && read_buffer.available() + available() < len)
94 while (read_buffer.availableForWrite() >= buffer_size) {
95 LOGD(
"reading %d %d ", buffer_size, read_buffer.availableForWrite());
97 if (queue_try_remove(&queue, tmp)){
98 LOGD(
"queue_try_remove -> success");
99 read_buffer.writeArray(tmp, buffer_size);
101 LOGD(
"queue_try_remove -> failed");
105 LOGD(
"read_buffer.available: %d, availableForWrite: %d ", read_buffer.available(), read_buffer.availableForWrite());
106 int result = read_buffer.readArray(data, len);
107 LOGD(
"=> readArray: %d -> %d", len, result);
111 int writeArray(
const T data[],
int len)
override {
112 LOGD(
"writeArray: %d", len);
115 resize(buffer_size_req_bytes /
sizeof(T));
117 if (is_blocking_write) {
118 result = writeBlocking(data, len);
120 result = writeNonBlocking(data, len);
128 if (buffer_size_alloc_bytes == 0)
return false;
129 return queue_is_full(&queue);
133 if (buffer_size_alloc_bytes == 0)
return true;
134 return queue_is_empty(&queue);
141 void reset()
override {
143 buffer_size_alloc_bytes = 0;
148 if (buffer_size_alloc_bytes == 0)
return 0;
149 return (queue_get_level(&queue) * buffer_size);
154 if (buffer_size_alloc_bytes == 0)
return size();
155 return size() - available(); }
159 LOGE(
"address() not implemented");
163 size_t size() {
return buffer_size_alloc_bytes /
sizeof(T); }
167 is_blocking_write = flag;
172 is_blocking_read = flag;
178 int buffer_size_alloc_bytes = 0;
179 int buffer_size_req_bytes = 0;
180 int buffer_size_bytes = 0;
183 audio_tools::RingBuffer<T> read_buffer{0};
184 bool is_blocking_write =
true;
185 bool is_blocking_read =
false;
187 int writeBlocking(
const T data[],
int len) {
188 LOGD(
"writeArray: %d", len);
190 if (len > buffer_size_bytes){
191 LOGE(
"write %d too big for buffer_size: %d", len, buffer_size_bytes);
196 for (
int j = 0; j < len; j++) {
197 write_buffer.write(data[j]);
198 if (write_buffer.isFull()) {
199 LOGD(
"queue_add_blocking");
200 queue_add_blocking(&queue, write_buffer.data());
201 write_buffer.reset();
207 int writeNonBlocking(
const T data[],
int len) {
208 if (len != buffer_size_bytes){
209 LOGE(
"write %d must be buffer_size: %d", len, buffer_size_bytes);
213 if (queue_try_add(&queue, write_buffer.data())){
#define LOGI
Definition: ESPNowStream.h:11
#define LOGD
Definition: ESPNowStream.h:12
#define LOGE
Definition: ESPNowStream.h:9
Shared functionality of all buffers.
Definition: Buffers.h:26
Buffer implementation which is based on a RP2040 queue. This class is intended to be used to exchange...
Definition: BufferRP2040.h:31
void setBlockingRead(bool flag)
When we use a blockingread, the we wait for the data to be available.
Definition: BufferRP2040.h:171
void setBlockingWrite(bool flag)
When we use a non blocking write, the write size must be identical with the buffer size.
Definition: BufferRP2040.h:166
bool peek(T &result) override
peeks the actual entry from the buffer
Definition: BufferRP2040.h:78
bool write(T data) override
write add an entry to the buffer
Definition: BufferRP2040.h:138
int available() override
provides the number of entries that are available to read
Definition: BufferRP2040.h:147
bool read(T &data)
reads a single value
Definition: BufferRP2040.h:72
int availableForWrite() override
provides the number of entries that are available to write
Definition: BufferRP2040.h:153
T * address() override
returns the address of the start of the physical read buffer
Definition: BufferRP2040.h:158
bool isFull() override
checks if the buffer is full
Definition: BufferRP2040.h:127
int writeArray(const T data[], int len) override
Fills the buffer data.
Definition: BufferRP2040.h:111
bool resize(size_t size)
Re-Allocats the memory and the queue (size is in entries)
Definition: BufferRP2040.h:48
void reset() override
clears the buffer
Definition: BufferRP2040.h:141
int readArray(T data[], int len) override
reads multiple values
Definition: BufferRP2040.h:84
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition: Buffers.h:136