summaryrefslogtreecommitdiffstats
path: root/radiator-plc/stm32/app/ring.c
diff options
context:
space:
mode:
Diffstat (limited to 'radiator-plc/stm32/app/ring.c')
-rw-r--r--radiator-plc/stm32/app/ring.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/radiator-plc/stm32/app/ring.c b/radiator-plc/stm32/app/ring.c
new file mode 100644
index 0000000..c1d1803
--- /dev/null
+++ b/radiator-plc/stm32/app/ring.c
@@ -0,0 +1,69 @@
+#include "project.h"
+
+
+static inline size_t
+ring_next (ring_t *r, size_t p)
+{
+ p++;
+
+ if (p >= r->size)
+ p -= r->size;
+
+ return p;
+}
+
+void
+ring_init (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 (ring_t *r, uint8_t c)
+{
+ size_t n = ring_next (r, r->write);
+
+ if (n == r->read)
+ return -1;
+
+ r->data[r->write] = c;
+
+ r->write = n;
+
+ return 0;
+}
+
+
+int
+ring_read_byte (ring_t *r, uint8_t *c)
+{
+ size_t n = ring_next (r, r->read);
+
+ if (r->read == r->write)
+ return -1;
+
+ *c = r->data[r->read];
+ r->read = n;
+
+ return 0;
+}
+
+int
+ring_write (ring_t *r, uint8_t *buf, size_t len)
+{
+ while (len--) {
+ if (ring_write_byte (r, * (buf++)))
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+ring_empty (ring_t *r)
+{
+ return (r->read == r->write) ? 1 : 0;
+}