[FL-2839] Furi stream buffer (#1834)

* Core: stream buffer
* stream buffer: API and usage
* stream buffer: documentation
* stream buffer: more documentation
* Furi: fix spelling

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
Sergey Gavrilov
2022-10-07 22:27:11 +10:00
committed by GitHub
parent d1843c0094
commit 38a82a1907
21 changed files with 403 additions and 208 deletions

View File

@@ -1,5 +1,4 @@
#include "buffer_stream.h"
#include <stream_buffer.h>
struct Buffer {
volatile bool occupied;
@@ -10,7 +9,7 @@ struct Buffer {
struct BufferStream {
size_t stream_overrun_count;
StreamBufferHandle_t stream;
FuriStreamBuffer* stream;
size_t index;
Buffer* buffers;
@@ -54,7 +53,7 @@ BufferStream* buffer_stream_alloc(size_t buffer_size, size_t buffers_count) {
buffer_stream->buffers[i].data = malloc(buffer_size);
buffer_stream->buffers[i].max_data_size = buffer_size;
}
buffer_stream->stream = xStreamBufferCreate(
buffer_stream->stream = furi_stream_buffer_alloc(
sizeof(BufferStream*) * buffer_stream->max_buffers_count, sizeof(BufferStream*));
buffer_stream->stream_overrun_count = 0;
buffer_stream->index = 0;
@@ -66,7 +65,7 @@ void buffer_stream_free(BufferStream* buffer_stream) {
for(size_t i = 0; i < buffer_stream->max_buffers_count; i++) {
free(buffer_stream->buffers[i].data);
}
vStreamBufferDelete(buffer_stream->stream);
furi_stream_buffer_free(buffer_stream->stream);
free(buffer_stream->buffers);
free(buffer_stream);
}
@@ -83,11 +82,7 @@ static inline int8_t buffer_stream_get_free_buffer(BufferStream* buffer_stream)
return id;
}
bool buffer_stream_send_from_isr(
BufferStream* buffer_stream,
const uint8_t* data,
size_t size,
BaseType_t* const task_woken) {
bool buffer_stream_send_from_isr(BufferStream* buffer_stream, const uint8_t* data, size_t size) {
Buffer* buffer = &buffer_stream->buffers[buffer_stream->index];
bool result = true;
@@ -96,7 +91,7 @@ bool buffer_stream_send_from_isr(
// if buffer is full - send it
buffer->occupied = true;
// we always have space for buffer in stream
xStreamBufferSendFromISR(buffer_stream->stream, &buffer, sizeof(Buffer*), task_woken);
furi_stream_buffer_send(buffer_stream->stream, &buffer, sizeof(Buffer*), 0);
// get new buffer from the pool
int8_t index = buffer_stream_get_free_buffer(buffer_stream);
@@ -119,7 +114,8 @@ bool buffer_stream_send_from_isr(
Buffer* buffer_stream_receive(BufferStream* buffer_stream, TickType_t timeout) {
Buffer* buffer;
size_t size = xStreamBufferReceive(buffer_stream->stream, &buffer, sizeof(Buffer*), timeout);
size_t size =
furi_stream_buffer_receive(buffer_stream->stream, &buffer, sizeof(Buffer*), timeout);
if(size == sizeof(Buffer*)) {
return buffer;
@@ -134,9 +130,8 @@ size_t buffer_stream_get_overrun_count(BufferStream* buffer_stream) {
void buffer_stream_reset(BufferStream* buffer_stream) {
FURI_CRITICAL_ENTER();
BaseType_t xReturn = xStreamBufferReset(buffer_stream->stream);
furi_assert(xReturn == pdPASS);
UNUSED(xReturn);
furi_stream_buffer_reset(buffer_stream->stream);
buffer_stream->stream_overrun_count = 0;
for(size_t i = 0; i < buffer_stream->max_buffers_count; i++) {
buffer_reset(&buffer_stream->buffers[i]);

View File

@@ -59,14 +59,9 @@ void buffer_stream_free(BufferStream* buffer_stream);
* @param buffer_stream
* @param data
* @param size
* @param task_woken
* @return bool
*/
bool buffer_stream_send_from_isr(
BufferStream* buffer_stream,
const uint8_t* data,
size_t size,
BaseType_t* const task_woken);
bool buffer_stream_send_from_isr(BufferStream* buffer_stream, const uint8_t* data, size_t size);
/**
* @brief Receive buffer from stream