1
0
Fork 0

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.
This commit is contained in:
Wez Furlong 2016-11-27 22:48:04 -08:00
parent 8485bb34d2
commit 712476cd28
5 changed files with 940 additions and 1 deletions

View file

@ -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);
}
};