From b8c7b8474683cc9370d316f7d7c3ed9799250677 Mon Sep 17 00:00:00 2001 From: damage Date: Tue, 20 May 2025 22:23:19 +0200 Subject: [PATCH] implemented ringbuffer --- controller/ringbuffer.c | 55 +++++++++++++++++++++++++++++++++++++++++ controller/ringbuffer.h | 11 +++++++++ 2 files changed, 66 insertions(+) create mode 100644 controller/ringbuffer.c create mode 100644 controller/ringbuffer.h diff --git a/controller/ringbuffer.c b/controller/ringbuffer.c new file mode 100644 index 0000000..cc1d7c6 --- /dev/null +++ b/controller/ringbuffer.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "ringbuffer.h" + +void _ringBufferIncReader(struct ringBuffer *buf) { + buf->reader++; + if (buf->reader >= buf->capacity) { + buf->reader = 0; + } +} + +void _ringBufferIncWriter(struct ringBuffer *buf) { + buf->writer++; + if (buf->writer >= buf->capacity) { + buf->writer = 0; + } + + if (buf->writer == buf->reader) { + // we incremented the writer and now it is equal to reader + // this means, the writer is overtaking the reader + // so push the reader forward, even if we are + // loosing data but this is how ring buffers work, eh? + _ringBufferIncReader(buf); + } +} + +void ringBufferCreate(int capacity, struct ringBuffer *out) { + out->buffer = malloc(capacity * sizeof(uint8_t)); + out->capacity = capacity; + out->reader = 0; + out->writer = 0; +} + +void ringBufferDestroy(struct ringBuffer *buf) { + free(buf->buffer); +} + +int ringBufferRead(struct ringBuffer *buf, uint8_t *out) { + if (buf->reader != buf->writer) { + // we have data to read + memcpy(out, &buf->buffer[buf->reader], sizeof(uint8_t)); + _ringBufferIncReader(buf); + return 0; + } else { + // nothing to read + return 1; + } +} + +void ringBufferWrite(struct ringBuffer *buf, uint8_t *in) { + memcpy(&buf->buffer[buf->writer], in, sizeof(uint8_t)); + _ringBufferIncWriter(buf); +} diff --git a/controller/ringbuffer.h b/controller/ringbuffer.h new file mode 100644 index 0000000..244182f --- /dev/null +++ b/controller/ringbuffer.h @@ -0,0 +1,11 @@ +struct ringBuffer { + uint8_t *buffer; + int capacity; + int reader; + int writer; +}; + +void ringBufferCreate(int capacity, struct ringBuffer *out); +void ringBufferDestroy(struct ringBuffer *buf); +int ringBufferRead(struct ringBuffer *buf, uint8_t *out); +void ringBufferWrite(struct ringBuffer *buf, uint8_t *in);