#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); }