diff --git a/main/buttons.h b/main/buttons.h index fd2b3ca..b9a6b0a 100644 --- a/main/buttons.h +++ b/main/buttons.h @@ -1,8 +1,9 @@ #pragma once -// Arduino includes -#include +// system includes +#include +// 3rdparty lib includes #include // local includes @@ -18,14 +19,64 @@ bool confirmButtonLongPressed{}; bool backButtonPressed{}; bool backButtonLongPressed{}; +std::optional upPressedSince; +int upPressRepeat{}; +std::optional downPressedSince; +int downPressRepeat{}; + class InputDispatcher { public: + static void update() + { + if (upPressedSince && espchrono::ago(*upPressedSince) > (upPressRepeat > 3 ? 100ms : 500ms)) + { + upPressedSince = espchrono::millis_clock::now(); + upPressRepeat++; + rotated -= 1; + } + + if (downPressedSince && espchrono::ago(*downPressedSince) > (downPressRepeat > 3 ? 100ms : 500ms)) + { + downPressedSince = espchrono::millis_clock::now(); + downPressRepeat++; + rotated += 1; + } + } + static void rotate(int offset) { rotated += offset; } + static void upButton(bool pressed) + { + if (pressed) + { + upPressedSince = espchrono::millis_clock::now(); + upPressRepeat = 0; + rotated -= 1; + } + else + { + upPressedSince = std::nullopt; + } + } + + static void downButton(bool pressed) + { + if (pressed) + { + downPressedSince = espchrono::millis_clock::now(); + downPressRepeat = 0; + rotated += 1; + } + else + { + downPressedSince = std::nullopt; + } + } + static void confirmButton(bool pressed) { static espchrono::millis_clock::time_point pressBegin{}; diff --git a/main/can.h b/main/can.h index b36ee9d..9053458 100644 --- a/main/can.h +++ b/main/can.h @@ -177,12 +177,10 @@ bool parseBoardcomputerCanMessage(const twai_message_t &message) }; if (lastButtonsState.up != newState.up) - if (newState.up) - InputDispatcher::rotate(-1); + InputDispatcher::upButton(newState.up); if (lastButtonsState.down != newState.down) - if (newState.down) - InputDispatcher::rotate(1); + InputDispatcher::downButton(newState.down); if (lastButtonsState.confirm != newState.confirm) InputDispatcher::confirmButton(newState.confirm); diff --git a/main/dpad.h b/main/dpad.h index e5d170e..5fbe662 100644 --- a/main/dpad.h +++ b/main/dpad.h @@ -67,15 +67,13 @@ void update() if (std::get(lastState) != std::get(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) - InputDispatcher::rotate(-1); + InputDispatcher::upButton(std::get(state)); std::get(lastState) = std::get(state); debounceUp = now; } if (std::get(lastState) != std::get(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) - InputDispatcher::rotate(1); + InputDispatcher::downButton(std::get(state)); std::get(lastState) = std::get(state); debounceDown = now; } diff --git a/main/dpad3wire.h b/main/dpad3wire.h index b659437..1918419 100644 --- a/main/dpad3wire.h +++ b/main/dpad3wire.h @@ -81,15 +81,13 @@ void update() if (std::get(lastState) != std::get(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) - InputDispatcher::rotate(-1); + InputDispatcher::upButton(std::get(state)); std::get(lastState) = std::get(state); debounceUp = now; } if (std::get(lastState) != std::get(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) { - if (std::get(state)) - InputDispatcher::rotate(1); + InputDispatcher::downButton(std::get(state)); std::get(lastState) = std::get(state); debounceDown = now; } diff --git a/main/dpad5wire.h b/main/dpad5wire.h index 9d328b5..689a6e9 100644 --- a/main/dpad5wire.h +++ b/main/dpad5wire.h @@ -122,15 +122,13 @@ void update() if (lastState.up != newState.up && now - debounceUp > dpadDebounce) { - if (newState.up) - InputDispatcher::rotate(-1); + InputDispatcher::upButton(newState.up); debounceUp = now; } if (lastState.down != newState.down && now - debounceDown > dpadDebounce) { - if (newState.down) - InputDispatcher::rotate(1); + InputDispatcher::downButton(newState.down); debounceDown = now; } diff --git a/main/main.cpp b/main/main.cpp index 42e24fc..8b27520 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -318,6 +318,8 @@ extern "C" void app_main() lastWifiUpdate = now; } + InputDispatcher::update(); + #ifdef FEATURE_DPAD dpad::update(); #endif diff --git a/main/menudisplay.h b/main/menudisplay.h index 9bd9f8c..790f5cd 100644 --- a/main/menudisplay.h +++ b/main/menudisplay.h @@ -168,9 +168,9 @@ void MenuDisplay::update() m_selectedIndex = m_selectedIndex + offset; if (m_selectedIndex < 0) - m_selectedIndex = 0; + m_selectedIndex += itemCount; if (m_selectedIndex >= itemCount) - m_selectedIndex = itemCount - 1; + m_selectedIndex -= itemCount; if (m_selectedIndex < m_scrollOffset) m_scrollOffset = m_selectedIndex;