diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-06-29 22:00:26 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-06-29 22:00:26 +0200 |
| commit | 82620f74d6e40617b725dcb8e50cdd94eb3e3e86 (patch) | |
| tree | f3c7e118b85cdf711617a1c1b82f61545c6ccd6c /ThrottleQuadrant.cpp | |
| parent | d7c2a8029c4aefc295719174a863129645d6ab99 (diff) | |
| download | throttle-quadrant-82620f74d6e40617b725dcb8e50cdd94eb3e3e86.tar.xz throttle-quadrant-82620f74d6e40617b725dcb8e50cdd94eb3e3e86.zip | |
Diffstat (limited to 'ThrottleQuadrant.cpp')
| -rw-r--r-- | ThrottleQuadrant.cpp | 59 |
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; +} |
