aboutsummaryrefslogtreecommitdiffstats
path: root/tmk_core/protocol/lufa/ringbuffer.hpp
diff options
context:
space:
mode:
authorWez Furlong <wez@fb.com>2016-11-27 22:48:04 -0800
committerWez Furlong <wez@fb.com>2016-11-27 23:49:44 -0800
commit712476cd288505cabb2ad6163d1c1ba13a7a1cca (patch)
tree92c1ddd43fe1d86940d4a94dc545fabd01904f2a /tmk_core/protocol/lufa/ringbuffer.hpp
parent8485bb34d2e291db5b6c81f892850da1cdca37ba (diff)
downloadfirmware-712476cd288505cabb2ad6163d1c1ba13a7a1cca.tar.gz
firmware-712476cd288505cabb2ad6163d1c1ba13a7a1cca.tar.bz2
firmware-712476cd288505cabb2ad6163d1c1ba13a7a1cca.zip
Add support for Adafruit BLE modules
This implements some helper functions that allow sending key reports to an SPI based Bluetooth Low Energy module, such as the Adafruit Feather 32u4 Bluefruit LE. There is some plumbing required in lufa.c to enable this; that is in a follow-on commit.
Diffstat (limited to 'tmk_core/protocol/lufa/ringbuffer.hpp')
-rw-r--r--tmk_core/protocol/lufa/ringbuffer.hpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp
new file mode 100644
index 000000000..70a3c4881
--- /dev/null
+++ b/tmk_core/protocol/lufa/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);
+ }
+};