20#include "OSLikeStuff/scheduler_api.h"
25namespace deluge::hid::encoders {
29class DetentedEncoder {
31 DetentedEncoder() =
default;
32 DetentedEncoder(
const DetentedEncoder&) =
delete;
33 DetentedEncoder& operator=(
const DetentedEncoder&) =
delete;
35 void applyEdges(int8_t edges);
38 bool pending()
const {
return pos.load(std::memory_order_relaxed) != 0; }
45 void restore(int32_t val) {
pos.fetch_add(val, std::memory_order_relaxed); }
49 std::atomic_int32_t
pos = 0;
53class ContinuousEncoder {
55 ContinuousEncoder() =
default;
56 ContinuousEncoder(
const ContinuousEncoder&) =
delete;
57 ContinuousEncoder& operator=(
const ContinuousEncoder&) =
delete;
59 void applyEdges(int8_t edges) {
pos.fetch_add(edges, std::memory_order_relaxed); }
62 bool pending()
const {
return pos.load(std::memory_order_relaxed) != 0; }
71 std::atomic_int8_t
pos = 0;
72 double currentKnobSpeed{0.0};
77extern DetentedEncoder scrollY;
78extern DetentedEncoder scrollX;
79extern DetentedEncoder tempo;
80extern DetentedEncoder select;
81extern ContinuousEncoder mod0;
82extern ContinuousEncoder mod1;
86constexpr size_t kNumFunctionEncoders = 4;
87constexpr size_t kNumModEncoders = 2;
89DetentedEncoder& functionEncoderAt(
size_t i);
90ContinuousEncoder& modEncoderAt(
size_t i);
96extern uint32_t timeModEncoderLastTurned[];
104extern TaskID EncoderTaskID;
bool pending() const
True if any ticks are waiting to be consumed.
Definition encoders.h:62
int8_t take()
Returns the accumulated tick count and resets pos to 0.
Definition encoders.cpp:47
std::atomic_int8_t pos
Written by the IRQ (applyEdges), drained by the encoder task.
Definition encoders.h:71
double calcNextKnobSpeed(int8_t offset)
Returns multiplier for encoder offset.
Definition encoders.cpp:51
void restore(int32_t val)
Definition encoders.h:45
bool pending() const
True if any detent steps are waiting to be consumed.
Definition encoders.h:38
int32_t edgeAccumulator
Accumulates A-pin edges until we have a full detent click. IRQ-only.
Definition encoders.h:48
int32_t take()
Returns the accumulated signed detent count and resets pos to 0.
Definition encoders.cpp:41
std::atomic_int32_t pos
Written by the IRQ (applyEdges), drained by the encoder task.
Definition encoders.h:49