From 98cba32ca9d62f6e4b7e735d177dba699b8d0698 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 6 Jun 2015 12:38:36 +0100 Subject: inititalcommit --- app/ring.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 app/ring.c (limited to 'app/ring.c') diff --git a/app/ring.c b/app/ring.c new file mode 100644 index 0000000..8f13567 --- /dev/null +++ b/app/ring.c @@ -0,0 +1,75 @@ +#include "project.h" + + +static inline size_t +ring_next (volatile ring_t * r, size_t p) +{ + p++; + if (p >= r->size) + p -= r->size; + return p; +} + +void +ring_init (volatile ring_t * r, uint8_t * buf, size_t len) +{ + r->data = buf; + r->size = len; + r->write = 0; + r->read = 0; +} + +int +ring_write_byte (volatile ring_t * r, uint8_t c) +{ + size_t n = ring_next (r, r->write); + + if (n == r->read) + return -EAGAIN; + + r->data[r->write] = c; + + r->write = n; + + return 0; +} + + +int +ring_read_byte (volatile ring_t * r, uint8_t * c) +{ + size_t n = ring_next (r, r->read); + + if (r->read == r->write) + return -EAGAIN; + + *c = r->data[r->read]; + r->read = n; + + return 0; +} + +int +ring_write (volatile ring_t * r, uint8_t * buf, size_t len, int blocking) +{ + while (len--) + { + if (blocking) { + while (ring_write_byte (r, *buf)); + buf++; + } else { + if (ring_write_byte (r, *(buf++))) + return -EAGAIN; + } + } + + return 0; +} + + + +int +ring_empty (volatile ring_t * r) +{ + return (r->read == r->write) ? 1 : 0; +} -- cgit v1.2.3