From 7e1368627685c8cd87bfcf8363c36ae6413176c0 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Thu, 20 Jul 2023 22:30:50 +1000 Subject: [PATCH] Add auto-repeat to settings menu --- .../Threads/OperatingModes/SettingsMenu.cpp | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/source/Core/Threads/OperatingModes/SettingsMenu.cpp b/source/Core/Threads/OperatingModes/SettingsMenu.cpp index 610885e0..f2c8ff44 100644 --- a/source/Core/Threads/OperatingModes/SettingsMenu.cpp +++ b/source/Core/Threads/OperatingModes/SettingsMenu.cpp @@ -69,10 +69,12 @@ OperatingMode gui_SettingsMenu(const ButtonState buttons, guiContext *cxt) { // State 2 -> Sub entry // Draw main entry if sub-entry is 0, otherwise draw sub-entry - uint16_t *mainEntry = &(cxt->scratch_state.state1); - uint16_t *subEntry = &(cxt->scratch_state.state2); - uint16_t *currentMenuLength = &(cxt->scratch_state.state5); - uint16_t *wasRenderingHelp = &(cxt->scratch_state.state6); + uint16_t *mainEntry = &(cxt->scratch_state.state1); + uint16_t *subEntry = &(cxt->scratch_state.state2); + uint16_t *currentMenuLength = &(cxt->scratch_state.state5); + uint16_t *wasRenderingHelp = &(cxt->scratch_state.state6); + uint32_t *autoRepeatAcceleration = &(cxt->scratch_state.state3); + uint32_t *autoRepeatTimer = &(cxt->scratch_state.state4); const menuitem *currentMenu; // Draw the currently on screen item @@ -105,26 +107,34 @@ OperatingMode gui_SettingsMenu(const ButtonState buttons, guiContext *cxt) { auto callIncrementHandler = [&]() { if ((int)currentMenu[currentScreen].autoSettingOption < (int)SettingsOptions::SettingsOptionsLength) { - nextSettingValue(currentMenu[currentScreen].autoSettingOption); + return nextSettingValue(currentMenu[currentScreen].autoSettingOption); } else if (currentMenu[currentScreen].incrementHandler != nullptr) { - currentMenu[currentScreen].incrementHandler(); + return currentMenu[currentScreen].incrementHandler(); } + return false; }; // switch (buttons) { case BUTTON_NONE: + (*autoRepeatAcceleration) = 0; // reset acceleration + (*autoRepeatTimer) = 0; // reset acceleration break; case BUTTON_BOTH: return OperatingMode::HomeScreen; break; - case BUTTON_B_LONG: - - break; case BUTTON_F_LONG: - + if (xTaskGetTickCount() + (*autoRepeatAcceleration) > (*autoRepeatTimer) + PRESS_ACCEL_INTERVAL_MAX) { + if (callIncrementHandler()) { + (*autoRepeatTimer) = 1000; + } else { + (*autoRepeatTimer) = 0; + } + (*autoRepeatTimer) += xTaskGetTickCount(); + (*autoRepeatAcceleration) += PRESS_ACCEL_STEP; + } break; case BUTTON_F_SHORT: // Increment setting @@ -144,6 +154,14 @@ OperatingMode gui_SettingsMenu(const ButtonState buttons, guiContext *cxt) { } } break; + case BUTTON_B_LONG: + if (xTaskGetTickCount() - (*autoRepeatTimer) + (*autoRepeatAcceleration) > PRESS_ACCEL_INTERVAL_MAX) { + (*autoRepeatTimer) = xTaskGetTickCount(); + (*autoRepeatAcceleration) += PRESS_ACCEL_STEP; + } else { + break; + } + /* Fall through*/ case BUTTON_B_SHORT: // Increment menu item if (*wasRenderingHelp) { @@ -173,6 +191,7 @@ OperatingMode gui_SettingsMenu(const ButtonState buttons, guiContext *cxt) { } } break; + default: break; }