summaryrefslogtreecommitdiff
path: root/drivers/bluetooth/ringbuffer.hpp
diff options
context:
space:
mode:
authorRyan <fauxpark@gmail.com>2021-09-21 19:58:46 +1000
committerGitHub <noreply@github.com>2021-09-21 19:58:46 +1000
commit20ea5f3fb5ba108153148e57981a7e804fd4be61 (patch)
treec6ff504e55d223df435ca439673e4771d480f079 /drivers/bluetooth/ringbuffer.hpp
parentc38a7308054f2072d234ee0d44d3bea9f809a63d (diff)
Relocate Adafruit BLE code (#14530)
Diffstat (limited to 'drivers/bluetooth/ringbuffer.hpp')
-rw-r--r--drivers/bluetooth/ringbuffer.hpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/drivers/bluetooth/ringbuffer.hpp b/drivers/bluetooth/ringbuffer.hpp
new file mode 100644
index 0000000000..70a3c4881d
--- /dev/null
+++ b/drivers/bluetooth/ringbuffer.hpp
@@ -0,0 +1,66 @@
+#pragma once
+// A simple ringbuffer holding Size elements of type T
+template <typename T, uint8_t Size>
+class RingBuffer {
+ protected:
+ T buf_[Size];
+ uint8_t head_{0}, tail_{0};
+ public:
+ inline uint8_t nextPosition(uint8_t position) {
+ return (position + 1) % Size;
+ }
+
+ inline uint8_t prevPosition(uint8_t position) {
+ if (position == 0) {
+ return Size - 1;
+ }
+ return position - 1;
+ }
+
+ inline bool enqueue(const T &item) {
+ static_assert(Size > 1, "RingBuffer size must be > 1");
+ uint8_t next = nextPosition(head_);
+ if (next == tail_) {
+ // Full
+ return false;
+ }
+
+ buf_[head_] = item;
+ head_ = next;
+ return true;
+ }
+
+ inline bool get(T &dest, bool commit = true) {
+ auto tail = tail_;
+ if (tail == head_) {
+ // No more data
+ return false;
+ }
+
+ dest = buf_[tail];
+ tail = nextPosition(tail);
+
+ if (commit) {
+ tail_ = tail;
+ }
+ return true;
+ }
+
+ inline bool empty() const { return head_ == tail_; }
+
+ inline uint8_t size() const {
+ int diff = head_ - tail_;
+ if (diff >= 0) {
+ return diff;
+ }
+ return Size + diff;
+ }
+
+ inline T& front() {
+ return buf_[tail_];
+ }
+
+ inline bool peek(T &item) {
+ return get(item, false);
+ }
+};