summaryrefslogtreecommitdiff
path: root/ThrottleQuadrant.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-06-29 22:00:26 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-06-29 22:00:26 +0200
commit82620f74d6e40617b725dcb8e50cdd94eb3e3e86 (patch)
treef3c7e118b85cdf711617a1c1b82f61545c6ccd6c /ThrottleQuadrant.cpp
parentd7c2a8029c4aefc295719174a863129645d6ab99 (diff)
downloadthrottle-quadrant-82620f74d6e40617b725dcb8e50cdd94eb3e3e86.tar.xz
throttle-quadrant-82620f74d6e40617b725dcb8e50cdd94eb3e3e86.zip
tq: rewrite for shift register semanticsHEADmaster
Diffstat (limited to 'ThrottleQuadrant.cpp')
-rw-r--r--ThrottleQuadrant.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/ThrottleQuadrant.cpp b/ThrottleQuadrant.cpp
new file mode 100644
index 0000000..4e4404a
--- /dev/null
+++ b/ThrottleQuadrant.cpp
@@ -0,0 +1,59 @@
+#include "ThrottleQuadrant.hpp"
+
+#include <limits.h>
+
+#include <Arduino.h>
+
+auto SaitekThrottleQuadrant::beginTransaction() -> void {
+ noInterrupts();
+ digitalWrite(latch_pin, LOW);
+ delayMicroseconds(latchDelayMicros);
+}
+
+auto SaitekThrottleQuadrant::endTransaction() -> void {
+ digitalWrite(latch_pin, HIGH);
+ delayMicroseconds(latchDelayMicros);
+ interrupts();
+}
+
+template<typename T, size_t Bits>
+auto SaitekThrottleQuadrant::doRead() -> T {
+ auto value = T{};
+
+ for (auto i = 0u; i < Bits; ++i) {
+ digitalWrite(clock_pin, LOW);
+ delayMicroseconds(clockDelayMicros);
+
+ value |= digitalRead(data_pin) << i;
+
+ digitalWrite(clock_pin, HIGH);
+ delayMicroseconds(clockDelayMicros);
+ }
+
+ return value;
+}
+
+auto SaitekThrottleQuadrant::begin(unsigned clock_pin, unsigned latch_pin, unsigned data_pin) -> void {
+ clock_pin = clock_pin;
+ latch_pin = latch_pin;
+ data_pin = data_pin;
+
+ pinMode(clock_pin, OUTPUT);
+ pinMode(latch_pin, OUTPUT);
+ pinMode(data_pin, INPUT);
+}
+
+auto SaitekThrottleQuadrant::read() noexcept -> Data {
+ auto result = Data{};
+
+ beginTransaction();
+
+ result.left = doRead<uint8_t>();
+ result.middle = doRead<uint8_t>();
+ result.right = doRead<uint8_t>();
+ result.buttons = doRead<uint16_t, numberOfButtons>();
+
+ endTransaction();
+
+ return result;
+}