ringbuffer implementation
diff --git a/firmware/src_simtrace/ringbuffer.c b/firmware/src_simtrace/ringbuffer.c
index 85e3916..f6e9985 100644
--- a/firmware/src_simtrace/ringbuffer.c
+++ b/firmware/src_simtrace/ringbuffer.c
@@ -1,34 +1,35 @@
-typedef struct ringbuf {
-    uint8_t buf[BUFLEN];
-    uint8_t *buf_end;
-    uint8_t *reader;
-    uint8_t *writer;
-} ringbuf;
+#include "ringbuffer.h"
+#include "trace.h"
 
-void rbuf_init(ringbuf *rb)
+void rbuf_reset(volatile ringbuf *rb)
 {
-    rb->buf_end = buf[BUFLEN-1];
-    rb->buf = {0};
-    rb->reader = rb->buf[0];
-    rb->writer = rb->buf[0];
+    rb->ird = 0;
+    rb->iwr = 0;
 }
 
-uint8_t rbuf_read(ringbuf *rb)
+uint8_t rbuf_read(volatile ringbuf *rb)
 {
-    uint8_t val = *(rb->reader);
-    if (rb->reader == rb->buf_end) {
-        rb->reader = rb->buf;
-    } else{
-        rb->reader++;
-    }
+    uint8_t val = rb->buf[rb->ird];
+    rb->ird = (rb->ird + 1)%RING_BUFLEN;
     return val;
 }
 
-void rbuf_write(ringbuf *rb, uint8_t item) {
-    *(rb->writer) = item;
-    if (rb->writer == rb->buf_end) {
-        rb->writer = rb->buf;
-    } else{
-        rb->writer++;
+void rbuf_write(volatile volatile ringbuf *rb, uint8_t item)
+{
+    if(!rbuf_is_full(rb)) {
+        rb->buf[rb->iwr] = item;
+        rb->iwr = (rb->iwr + 1)%RING_BUFLEN;
+    } else {
+        TRACE_ERROR("Ringbuffer full, losing bytes!");
     }
 }
+
+bool rbuf_is_empty(volatile ringbuf *rb)
+{
+    return rb->ird == rb->iwr;
+}
+
+bool rbuf_is_full(volatile ringbuf *rb)
+{
+    return rb->ird == (rb->iwr+1)%RING_BUFLEN;
+}