summaryrefslogtreecommitdiff
path: root/usb-serial-rs485/ringb.h
diff options
context:
space:
mode:
Diffstat (limited to 'usb-serial-rs485/ringb.h')
-rw-r--r--usb-serial-rs485/ringb.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/usb-serial-rs485/ringb.h b/usb-serial-rs485/ringb.h
new file mode 100644
index 0000000..c3d5356
--- /dev/null
+++ b/usb-serial-rs485/ringb.h
@@ -0,0 +1,60 @@
+/*
+ * Karl Palsson <karlp@tweak.net.au>
+ * Considered to be released under your choice of:
+ * MIT/ISC/Apache2/BSD2Clause/GPLv2
+ * If you're looking for elegant compact performance you've come to the wrong
+ * place hombre.
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdbool.h>
+#include <stdint.h>
+
+struct ringb {
+ volatile unsigned int idx_r;
+ volatile unsigned int idx_w;
+ uint8_t *buf;
+ int buf_len;
+};
+
+/**
+ * Load up a ring buffer. Always suceeds
+ * @param ring struct saving state, provided by the user
+ * @param buf where the data will be kept
+ * @param len size of buf in in elements.
+ */
+void ringb_init(struct ringb *ring, uint8_t *buf, int len);
+
+/**
+ * push data in
+ * @param ring
+ * @param c
+ * @return true if space was available
+ */
+bool ringb_put(struct ringb *ring, uint8_t c);
+
+/**
+ * pull data out
+ * @param ring
+ * @return -1 for no data, uint8_t range for valid.
+ */
+int ringb_get(struct ringb *ring);
+
+/**
+ * Toss data and reset to empty
+ * @param ring
+ */
+void ringb_flush(struct ringb *ring);
+
+int ringb_depth(struct ringb *ring);
+
+
+
+#ifdef __cplusplus
+}
+#endif