#include "dpad5wire.h" // system includes #include // Arduino includes #include // 3rdparty lib includes #include #include #include // local includes #include "types.h" #include "globals.h" #include "newsettings.h" #include "bobbybuttons.h" namespace { template class Helper { public: static constexpr auto OutPin = OUT; static constexpr auto In1Pin = IN1; static constexpr auto In2Pin = IN2; static constexpr auto In3Pin = IN3; static constexpr auto In4Pin = IN4; void begin(); std::array read(); }; template void Helper::begin() { pinMode(OUT, OUTPUT); } template std::array Helper::read() { std::array result; digitalWrite(OUT, LOW); pinMode(IN1, INPUT_PULLUP); pinMode(IN2, INPUT_PULLUP); pinMode(IN3, INPUT_PULLUP); pinMode(IN4, INPUT_PULLUP); vPortYield(); result[0] = digitalRead(IN1)==LOW; result[1] = digitalRead(IN2)==LOW; result[2] = digitalRead(IN3)==LOW; result[3] = digitalRead(IN4)==LOW; digitalWrite(OUT, HIGH); pinMode(IN1, INPUT_PULLDOWN); pinMode(IN2, INPUT_PULLDOWN); pinMode(IN3, INPUT_PULLDOWN); pinMode(IN4, INPUT_PULLDOWN); vPortYield(); result[4] = digitalRead(IN1); result[5] = digitalRead(IN2); result[6] = digitalRead(IN3); result[7] = digitalRead(IN4); return result; } #ifdef FEATURE_DPAD_5WIRESW Helper helper; std::array lastState; std::array debounce; #endif } // namespace #ifdef FEATURE_DPAD_5WIRESW namespace dpad5wire { void init() { helper.begin(); std::fill(std::begin(lastState), std::end(lastState), false); std::fill(std::begin(debounce), std::end(debounce), espchrono::millis_clock::now()); } void update() { const auto newState = helper.read(); #ifdef DPAD_5WIRESW_DEBUG lastState = newState; return; #endif const auto now = espchrono::millis_clock::now(); const std::chrono::milliseconds dpadDebounce{settings.boardcomputerHardware.dpadDebounce}; for (auto i = 0; i < 8; i++) if (lastState[i] != newState[i] && now - debounce[i] > dpadDebounce) { lastState[i] = newState[i]; if (espgui::currentDisplay) { if (newState[i]) espgui::currentDisplay->rawButtonPressed(i); else espgui::currentDisplay->rawButtonReleased(i); } debounce[i] = now; } } } // namespace dpad5wire #endif