From 10814713e95bf969fcf66ef6ab563cf2d43c4ee1 Mon Sep 17 00:00:00 2001 From: Patrick Pichler Date: Fri, 22 May 2020 15:15:53 +0200 Subject: [PATCH] renamed 3wire dpad to dpadHack.h; implemented proper dpad controls --- platformio.ini | 13 +++++--- src/dpad.h | 48 ++++++++++------------------- src/dpadHack.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 13 ++++++-- 4 files changed, 119 insertions(+), 38 deletions(-) create mode 100644 src/dpadHack.h diff --git a/platformio.ini b/platformio.ini index 4265ec0..2e7d7c5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -62,10 +62,15 @@ build_flags = -DPINS_TX2=26 -DPINS_GAS=35 -DPINS_BREMS=33 - -DFEATURE_3WIRESW - -DPINS_3WIRESW_OUT=0 - -DPINS_3WIRESW_IN1=16 - -DPINS_3WIRESW_IN2=27 +; -DFEATURE_3WIRESW +; -DPINS_3WIRESW_OUT=0 +; -DPINS_3WIRESW_IN1=16 +; -DPINS_3WIRESW_IN2=27 + -DFEATURE_DPAD + -DPINS_DPAD_IN1=22 + -DPINS_DPAD_IN2=23 + -DPINS_DPAD_IN3=27 + -DPINS_DPAD_IN4=32 ; -DFEATURE_ROTARY ; -DPINS_ROTARY_CLK=16 ; -DPINS_ROTARY_DT=27 diff --git a/src/dpad.h b/src/dpad.h index 9671ed8..1a5ecfe 100644 --- a/src/dpad.h +++ b/src/dpad.h @@ -9,53 +9,37 @@ namespace { using DPadState = std::tuple; -template +template class DPadHelper { -public: - static constexpr auto OutPin = OUT; - static constexpr auto In1Pin = IN1; - static constexpr auto In2Pin = IN2; - + public: void begin(); DPadState read(); }; -template -void DPadHelper::begin() +template +void DPadHelper::begin() { - pinMode(OUT, OUTPUT); + pinMode(IN1, INPUT_PULLUP); + pinMode(IN2, INPUT_PULLUP); + pinMode(IN3, INPUT_PULLUP); + pinMode(IN4, INPUT_PULLUP); } -template -DPadState DPadHelper::read() +template +DPadState DPadHelper::read() { - digitalWrite(OUT, LOW); - - pinMode(IN1, INPUT_PULLUP); - pinMode(IN2, INPUT_PULLUP); - - delay(1); - - const bool result0 = digitalRead(IN1)==LOW; - const bool result1 = digitalRead(IN2)==LOW; - - digitalWrite(OUT, HIGH); - - pinMode(IN1, INPUT_PULLDOWN); - pinMode(IN2, INPUT_PULLDOWN); - - delay(1); - - const bool result2 = digitalRead(IN1); - const bool result3 = digitalRead(IN2); + const bool result0 = digitalRead(IN1); + const bool result1 = digitalRead(IN2); + const bool result2 = digitalRead(IN3); + const bool result3 = digitalRead(IN4); return std::make_tuple(result0, result1, result2, result3); } -#ifdef FEATURE_3WIRESW -DPadHelper dpad; +#ifdef FEATURE_DPAD +DPadHelper dpad; DPadState lastState; void updateDpad() diff --git a/src/dpadHack.h b/src/dpadHack.h new file mode 100644 index 0000000..f8e54fb --- /dev/null +++ b/src/dpadHack.h @@ -0,0 +1,83 @@ +#pragma once + +#include + +#include + +#include "globals.h" + +#include "dpad.h" + +namespace { + +template +class DPadHackHelper +{ +public: + static constexpr auto OutPin = OUT; + static constexpr auto In1Pin = IN1; + static constexpr auto In2Pin = IN2; + + void begin(); + + DPadState read(); +}; + +template +void DPadHackHelper::begin() +{ + pinMode(OUT, OUTPUT); +} + +template +DPadState DPadHackHelper::read() +{ + digitalWrite(OUT, LOW); + + pinMode(IN1, INPUT_PULLUP); + pinMode(IN2, INPUT_PULLUP); + + delay(1); + + const bool result0 = digitalRead(IN1)==LOW; + const bool result1 = digitalRead(IN2)==LOW; + + digitalWrite(OUT, HIGH); + + pinMode(IN1, INPUT_PULLDOWN); + pinMode(IN2, INPUT_PULLDOWN); + + delay(1); + + const bool result2 = digitalRead(IN1); + const bool result3 = digitalRead(IN2); + + return std::make_tuple(result0, result1, result2, result3); +} + +#ifdef FEATURE_3WIRESW +DPadHackHelper dpadHack; + +DPadState lastState; +void updateDpadHack() +{ + const auto state = dpadHack.read(); + + enum { + ButtonUp = 3, + ButtonDown = 0, + ButtonConfirm = 1, + ButtonBack = 2 + }; + + if (!std::get(lastState) && std::get(state)) + InputDispatcher::rotate(-1); + if (!std::get(lastState) && std::get(state)) + InputDispatcher::rotate(1); + if (std::get(lastState) != std::get(state)) + InputDispatcher::button(std::get(state)); + + lastState = state; +} +#endif +} diff --git a/src/main.cpp b/src/main.cpp index 808f88a..ba83764 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "modes/tempomatmode.h" #include "screens.h" #include "dpad.h" +#include "dpadHack.h" #include "rotary.h" #include "serialhandler.h" #include "ota.h" @@ -40,8 +41,12 @@ void setup() initScreen(); +#ifdef FEATURE_DPAD + dpad.begin(); +#endif + #ifdef FEATURE_3WIRESW - dpad.begin(); + dpadHack.begin(); #endif #ifdef FEATURE_ROTARY @@ -91,8 +96,12 @@ void loop() { const auto now = millis(); +#ifdef FEATURE_DPAD + updateDpad(); +#endif + #ifdef FEATURE_3WIRESW - updateDpad(); + updateDpadHack(); #endif if (!lastModeUpdate)