From 82620f74d6e40617b725dcb8e50cdd94eb3e3e86 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 29 Jun 2026 22:00:26 +0200 Subject: tq: rewrite for shift register semantics --- ThrottleQuadrant.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 ThrottleQuadrant.cpp (limited to 'ThrottleQuadrant.cpp') 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 + +#include + +auto SaitekThrottleQuadrant::beginTransaction() -> void { + noInterrupts(); + digitalWrite(latch_pin, LOW); + delayMicroseconds(latchDelayMicros); +} + +auto SaitekThrottleQuadrant::endTransaction() -> void { + digitalWrite(latch_pin, HIGH); + delayMicroseconds(latchDelayMicros); + interrupts(); +} + +template +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(); + result.middle = doRead(); + result.right = doRead(); + result.buttons = doRead(); + + endTransaction(); + + return result; +} -- cgit v1.2.3