[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:
@@ -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]);
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user