implemented ringbuffer
This commit is contained in:
55
controller/ringbuffer.c
Normal file
55
controller/ringbuffer.c
Normal file
@ -0,0 +1,55 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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);
|
||||
}
|
11
controller/ringbuffer.h
Normal file
11
controller/ringbuffer.h
Normal file
@ -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);
|
Reference in New Issue
Block a user