From 6a5e0edb60df14a3670054402b2d5265a40c6751 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Wed, 18 Jan 2023 21:02:45 -0600 Subject: [PATCH 1/2] Double click sends ad-hoc position, triple turns off gps --- src/ButtonThread.h | 333 +++++++++++++++++++++++---------------------- 1 file changed, 171 insertions(+), 162 deletions(-) diff --git a/src/ButtonThread.h b/src/ButtonThread.h index d94b6a769..764a62479 100644 --- a/src/ButtonThread.h +++ b/src/ButtonThread.h @@ -9,201 +9,210 @@ namespace concurrency { -/** - * Watch a GPIO and if we get an IRQ, wake the main thread. - * Use to add wake on button press - */ -void wakeOnIrq(int irq, int mode) -{ - attachInterrupt( - irq, - [] { - BaseType_t higherWake = 0; - mainDelay.interruptFromISR(&higherWake); - }, - FALLING); -} + /** + * Watch a GPIO and if we get an IRQ, wake the main thread. + * Use to add wake on button press + */ + void wakeOnIrq(int irq, int mode) + { + attachInterrupt( + irq, + [] + { + BaseType_t higherWake = 0; + mainDelay.interruptFromISR(&higherWake); + }, + FALLING); + } -class ButtonThread : public concurrency::OSThread -{ + class ButtonThread : public concurrency::OSThread + { // Prepare for button presses #ifdef BUTTON_PIN - OneButton userButton; + OneButton userButton; #endif #ifdef BUTTON_PIN_ALT - OneButton userButtonAlt; + OneButton userButtonAlt; #endif #ifdef BUTTON_PIN_TOUCH - OneButton userButtonTouch; + OneButton userButtonTouch; #endif - static bool shutdown_on_long_stop; + static bool shutdown_on_long_stop; - public: - static uint32_t longPressTime; + public: + static uint32_t longPressTime; - // callback returns the period for the next callback invocation (or 0 if we should no longer be called) - ButtonThread() : OSThread("Button") - { + // callback returns the period for the next callback invocation (or 0 if we should no longer be called) + ButtonThread() : OSThread("Button") + { #ifdef BUTTON_PIN - userButton = OneButton(BUTTON_PIN, true, true); + userButton = OneButton(BUTTON_PIN, true, true); #ifdef INPUT_PULLUP_SENSE - // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did - pinMode(BUTTON_PIN, INPUT_PULLUP_SENSE); + // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did + pinMode(BUTTON_PIN, INPUT_PULLUP_SENSE); #endif - userButton.attachClick(userButtonPressed); - userButton.setClickTicks(300); - userButton.attachDuringLongPress(userButtonPressedLong); - userButton.attachDoubleClick(userButtonDoublePressed); - userButton.attachMultiClick(userButtonMultiPressed); - userButton.attachLongPressStart(userButtonPressedLongStart); - userButton.attachLongPressStop(userButtonPressedLongStop); - wakeOnIrq(BUTTON_PIN, FALLING); + userButton.attachClick(userButtonPressed); + userButton.setClickTicks(300); + userButton.attachDuringLongPress(userButtonPressedLong); + userButton.attachDoubleClick(userButtonDoublePressed); + userButton.attachMultiClick(userButtonMultiPressed); + userButton.attachLongPressStart(userButtonPressedLongStart); + userButton.attachLongPressStop(userButtonPressedLongStop); + wakeOnIrq(BUTTON_PIN, FALLING); #endif #ifdef BUTTON_PIN_ALT - userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); + userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); #ifdef INPUT_PULLUP_SENSE - // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did - pinMode(BUTTON_PIN_ALT, INPUT_PULLUP_SENSE); + // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did + pinMode(BUTTON_PIN_ALT, INPUT_PULLUP_SENSE); #endif - userButtonAlt.attachClick(userButtonPressed); - userButtonAlt.attachDuringLongPress(userButtonPressedLong); - userButtonAlt.attachDoubleClick(userButtonDoublePressed); - userButtonAlt.attachLongPressStart(userButtonPressedLongStart); - userButtonAlt.attachLongPressStop(userButtonPressedLongStop); - wakeOnIrq(BUTTON_PIN_ALT, FALLING); + userButtonAlt.attachClick(userButtonPressed); + userButtonAlt.attachDuringLongPress(userButtonPressedLong); + userButtonAlt.attachDoubleClick(userButtonDoublePressed); + userButtonAlt.attachLongPressStart(userButtonPressedLongStart); + userButtonAlt.attachLongPressStop(userButtonPressedLongStop); + wakeOnIrq(BUTTON_PIN_ALT, FALLING); #endif #ifdef BUTTON_PIN_TOUCH - userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); - userButtonTouch.attachClick(touchPressed); - wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); + userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); + userButtonTouch.attachClick(touchPressed); + wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); #endif - } - - protected: - /// If the button is pressed we suppress CPU sleep until release - int32_t runOnce() override - { - canSleep = true; // Assume we should not keep the board awake - -#ifdef BUTTON_PIN - userButton.tick(); - canSleep &= userButton.isIdle(); -#endif -#ifdef BUTTON_PIN_ALT - userButtonAlt.tick(); - canSleep &= userButtonAlt.isIdle(); -#endif -#ifdef BUTTON_PIN_TOUCH - userButtonTouch.tick(); - canSleep &= userButtonTouch.isIdle(); -#endif - // if (!canSleep) LOG_DEBUG("Supressing sleep!\n"); - // else LOG_DEBUG("sleep ok\n"); - - return 5; - } - - private: - static void touchPressed() - { - screen->forceDisplay(); - LOG_DEBUG("touch press!\n"); - } - - static void userButtonPressed() - { - // LOG_DEBUG("press!\n"); -#ifdef BUTTON_PIN - if ((BUTTON_PIN != moduleConfig.canned_message.inputbroker_pin_press) || - !moduleConfig.canned_message.enabled) { - powerFSM.trigger(EVENT_PRESS); } + + protected: + /// If the button is pressed we suppress CPU sleep until release + int32_t runOnce() override + { + canSleep = true; // Assume we should not keep the board awake + +#ifdef BUTTON_PIN + userButton.tick(); + canSleep &= userButton.isIdle(); #endif - } - static void userButtonPressedLong() - { - // LOG_DEBUG("Long press!\n"); +#ifdef BUTTON_PIN_ALT + userButtonAlt.tick(); + canSleep &= userButtonAlt.isIdle(); +#endif +#ifdef BUTTON_PIN_TOUCH + userButtonTouch.tick(); + canSleep &= userButtonTouch.isIdle(); +#endif + // if (!canSleep) LOG_DEBUG("Supressing sleep!\n"); + // else LOG_DEBUG("sleep ok\n"); + + return 5; + } + + private: + static void touchPressed() + { + screen->forceDisplay(); + LOG_DEBUG("touch press!\n"); + } + + static void userButtonPressed() + { + // LOG_DEBUG("press!\n"); +#ifdef BUTTON_PIN + if ((BUTTON_PIN != moduleConfig.canned_message.inputbroker_pin_press) || !moduleConfig.canned_message.enabled) + { + powerFSM.trigger(EVENT_PRESS); + } +#endif + } + static void userButtonPressedLong() + { + // LOG_DEBUG("Long press!\n"); #ifdef ARCH_ESP32 - screen->adjustBrightness(); + screen->adjustBrightness(); #endif - // If user button is held down for 5 seconds, shutdown the device. - if ((millis() - longPressTime > 5 * 1000) && (longPressTime > 0)) { + // If user button is held down for 5 seconds, shutdown the device. + if ((millis() - longPressTime > 5 * 1000) && (longPressTime > 0)) + { #ifdef HAS_PMU - if (pmu_found == true) { - setLed(false); - power->shutdown(); - } + if (pmu_found == true) + { + setLed(false); + power->shutdown(); + } #elif defined(ARCH_NRF52) - // Do actual shutdown when button released, otherwise the button release - // may wake the board immediatedly. - if ((!shutdown_on_long_stop) && (millis() > 30 * 1000)) { - screen->startShutdownScreen(); - LOG_INFO("Shutdown from long press"); - playBeep(); + // Do actual shutdown when button released, otherwise the button release + // may wake the board immediatedly. + if ((!shutdown_on_long_stop) && (millis() > 30 * 1000)) + { + screen->startShutdownScreen(); + LOG_INFO("Shutdown from long press"); + playBeep(); #ifdef PIN_LED1 - ledOff(PIN_LED1); + ledOff(PIN_LED1); #endif -#ifdef PIN_LED2 - ledOff(PIN_LED2); +#ifdef PIN_LED2 + ledOff(PIN_LED2); #endif -#ifdef PIN_LED3 - ledOff(PIN_LED3); +#ifdef PIN_LED3 + ledOff(PIN_LED3); +#endif + shutdown_on_long_stop = true; + } #endif - shutdown_on_long_stop = true; } -#endif - } else { - // LOG_DEBUG("Long press %u\n", (millis() - longPressTime)); - } - } - - static void userButtonDoublePressed() - { - #if defined(USE_EINK) && defined(PIN_EINK_EN) - digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW); - #endif - #if defined(GPS_POWER_TOGGLE) - if(config.position.gps_enabled) - { - LOG_DEBUG("Flag set to false for gps power\n"); - } - else - { - LOG_DEBUG("Flag set to true to restore power\n"); - } - config.position.gps_enabled = !(config.position.gps_enabled); - doGPSpowersave(config.position.gps_enabled); - #endif - } - - static void userButtonMultiPressed() - { - screen->print("Sent ad-hoc ping\n"); - service.refreshMyNodeInfo(); - service.sendNetworkPing(NODENUM_BROADCAST, true); - } - - static void userButtonPressedLongStart() - { - if (millis() > 30 * 1000) { - LOG_DEBUG("Long press start!\n"); - longPressTime = millis(); - } - } - - static void userButtonPressedLongStop() - { - if (millis() > 30 * 1000) { - LOG_DEBUG("Long press stop!\n"); - longPressTime = 0; - if (shutdown_on_long_stop) { - playShutdownMelody(); - delay(3000); - power->shutdown(); + else + { + // LOG_DEBUG("Long press %u\n", (millis() - longPressTime)); } } - } -}; + + static void userButtonDoublePressed() + { +#if defined(USE_EINK) && defined(PIN_EINK_EN) + digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW); +#endif + screen->print("Sent ad-hoc ping\n"); + service.refreshMyNodeInfo(); + service.sendNetworkPing(NODENUM_BROADCAST, true); + } + + static void userButtonMultiPressed() + { +#if defined(GPS_POWER_TOGGLE) + if (config.position.gps_enabled) + { + LOG_DEBUG("Flag set to false for gps power\n"); + } + else + { + LOG_DEBUG("Flag set to true to restore power\n"); + } + config.position.gps_enabled = !(config.position.gps_enabled); + doGPSpowersave(config.position.gps_enabled); +#endif + } + + static void userButtonPressedLongStart() + { + if (millis() > 30 * 1000) + { + LOG_DEBUG("Long press start!\n"); + longPressTime = millis(); + } + } + + static void userButtonPressedLongStop() + { + if (millis() > 30 * 1000) + { + LOG_DEBUG("Long press stop!\n"); + longPressTime = 0; + if (shutdown_on_long_stop) + { + playShutdownMelody(); + delay(3000); + power->shutdown(); + } + } + } + }; } // namespace concurrency From 384eac9a87a5b5e5c34970c8889cdf466f96df3e Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Wed, 18 Jan 2023 21:13:31 -0600 Subject: [PATCH 2/2] Format plz --- src/ButtonThread.h | 287 ++++++++++++++++++++++----------------------- 1 file changed, 137 insertions(+), 150 deletions(-) diff --git a/src/ButtonThread.h b/src/ButtonThread.h index 764a62479..5bb856027 100644 --- a/src/ButtonThread.h +++ b/src/ButtonThread.h @@ -9,210 +9,197 @@ namespace concurrency { - /** - * Watch a GPIO and if we get an IRQ, wake the main thread. - * Use to add wake on button press - */ - void wakeOnIrq(int irq, int mode) - { - attachInterrupt( - irq, - [] - { - BaseType_t higherWake = 0; - mainDelay.interruptFromISR(&higherWake); - }, - FALLING); - } +/** + * Watch a GPIO and if we get an IRQ, wake the main thread. + * Use to add wake on button press + */ +void wakeOnIrq(int irq, int mode) +{ + attachInterrupt( + irq, + [] { + BaseType_t higherWake = 0; + mainDelay.interruptFromISR(&higherWake); + }, + FALLING); +} - class ButtonThread : public concurrency::OSThread - { +class ButtonThread : public concurrency::OSThread +{ // Prepare for button presses #ifdef BUTTON_PIN - OneButton userButton; + OneButton userButton; #endif #ifdef BUTTON_PIN_ALT - OneButton userButtonAlt; + OneButton userButtonAlt; #endif #ifdef BUTTON_PIN_TOUCH - OneButton userButtonTouch; + OneButton userButtonTouch; #endif - static bool shutdown_on_long_stop; + static bool shutdown_on_long_stop; - public: - static uint32_t longPressTime; + public: + static uint32_t longPressTime; - // callback returns the period for the next callback invocation (or 0 if we should no longer be called) - ButtonThread() : OSThread("Button") - { + // callback returns the period for the next callback invocation (or 0 if we should no longer be called) + ButtonThread() : OSThread("Button") + { #ifdef BUTTON_PIN - userButton = OneButton(BUTTON_PIN, true, true); + userButton = OneButton(BUTTON_PIN, true, true); #ifdef INPUT_PULLUP_SENSE - // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did - pinMode(BUTTON_PIN, INPUT_PULLUP_SENSE); + // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did + pinMode(BUTTON_PIN, INPUT_PULLUP_SENSE); #endif - userButton.attachClick(userButtonPressed); - userButton.setClickTicks(300); - userButton.attachDuringLongPress(userButtonPressedLong); - userButton.attachDoubleClick(userButtonDoublePressed); - userButton.attachMultiClick(userButtonMultiPressed); - userButton.attachLongPressStart(userButtonPressedLongStart); - userButton.attachLongPressStop(userButtonPressedLongStop); - wakeOnIrq(BUTTON_PIN, FALLING); + userButton.attachClick(userButtonPressed); + userButton.setClickTicks(300); + userButton.attachDuringLongPress(userButtonPressedLong); + userButton.attachDoubleClick(userButtonDoublePressed); + userButton.attachMultiClick(userButtonMultiPressed); + userButton.attachLongPressStart(userButtonPressedLongStart); + userButton.attachLongPressStop(userButtonPressedLongStop); + wakeOnIrq(BUTTON_PIN, FALLING); #endif #ifdef BUTTON_PIN_ALT - userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); + userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); #ifdef INPUT_PULLUP_SENSE - // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did - pinMode(BUTTON_PIN_ALT, INPUT_PULLUP_SENSE); + // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did + pinMode(BUTTON_PIN_ALT, INPUT_PULLUP_SENSE); #endif - userButtonAlt.attachClick(userButtonPressed); - userButtonAlt.attachDuringLongPress(userButtonPressedLong); - userButtonAlt.attachDoubleClick(userButtonDoublePressed); - userButtonAlt.attachLongPressStart(userButtonPressedLongStart); - userButtonAlt.attachLongPressStop(userButtonPressedLongStop); - wakeOnIrq(BUTTON_PIN_ALT, FALLING); + userButtonAlt.attachClick(userButtonPressed); + userButtonAlt.attachDuringLongPress(userButtonPressedLong); + userButtonAlt.attachDoubleClick(userButtonDoublePressed); + userButtonAlt.attachLongPressStart(userButtonPressedLongStart); + userButtonAlt.attachLongPressStop(userButtonPressedLongStop); + wakeOnIrq(BUTTON_PIN_ALT, FALLING); #endif #ifdef BUTTON_PIN_TOUCH - userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); - userButtonTouch.attachClick(touchPressed); - wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); + userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); + userButtonTouch.attachClick(touchPressed); + wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); #endif - } + } - protected: - /// If the button is pressed we suppress CPU sleep until release - int32_t runOnce() override - { - canSleep = true; // Assume we should not keep the board awake + protected: + /// If the button is pressed we suppress CPU sleep until release + int32_t runOnce() override + { + canSleep = true; // Assume we should not keep the board awake #ifdef BUTTON_PIN - userButton.tick(); - canSleep &= userButton.isIdle(); + userButton.tick(); + canSleep &= userButton.isIdle(); #endif #ifdef BUTTON_PIN_ALT - userButtonAlt.tick(); - canSleep &= userButtonAlt.isIdle(); + userButtonAlt.tick(); + canSleep &= userButtonAlt.isIdle(); #endif #ifdef BUTTON_PIN_TOUCH - userButtonTouch.tick(); - canSleep &= userButtonTouch.isIdle(); + userButtonTouch.tick(); + canSleep &= userButtonTouch.isIdle(); #endif - // if (!canSleep) LOG_DEBUG("Supressing sleep!\n"); - // else LOG_DEBUG("sleep ok\n"); + // if (!canSleep) LOG_DEBUG("Supressing sleep!\n"); + // else LOG_DEBUG("sleep ok\n"); - return 5; - } + return 5; + } - private: - static void touchPressed() - { - screen->forceDisplay(); - LOG_DEBUG("touch press!\n"); - } + private: + static void touchPressed() + { + screen->forceDisplay(); + LOG_DEBUG("touch press!\n"); + } - static void userButtonPressed() - { - // LOG_DEBUG("press!\n"); + static void userButtonPressed() + { + // LOG_DEBUG("press!\n"); #ifdef BUTTON_PIN - if ((BUTTON_PIN != moduleConfig.canned_message.inputbroker_pin_press) || !moduleConfig.canned_message.enabled) - { - powerFSM.trigger(EVENT_PRESS); - } -#endif + if ((BUTTON_PIN != moduleConfig.canned_message.inputbroker_pin_press) || !moduleConfig.canned_message.enabled) { + powerFSM.trigger(EVENT_PRESS); } - static void userButtonPressedLong() - { - // LOG_DEBUG("Long press!\n"); +#endif + } + static void userButtonPressedLong() + { + // LOG_DEBUG("Long press!\n"); #ifdef ARCH_ESP32 - screen->adjustBrightness(); + screen->adjustBrightness(); #endif - // If user button is held down for 5 seconds, shutdown the device. - if ((millis() - longPressTime > 5 * 1000) && (longPressTime > 0)) - { + // If user button is held down for 5 seconds, shutdown the device. + if ((millis() - longPressTime > 5 * 1000) && (longPressTime > 0)) { #ifdef HAS_PMU - if (pmu_found == true) - { - setLed(false); - power->shutdown(); - } + if (pmu_found == true) { + setLed(false); + power->shutdown(); + } #elif defined(ARCH_NRF52) - // Do actual shutdown when button released, otherwise the button release - // may wake the board immediatedly. - if ((!shutdown_on_long_stop) && (millis() > 30 * 1000)) - { - screen->startShutdownScreen(); - LOG_INFO("Shutdown from long press"); - playBeep(); + // Do actual shutdown when button released, otherwise the button release + // may wake the board immediatedly. + if ((!shutdown_on_long_stop) && (millis() > 30 * 1000)) { + screen->startShutdownScreen(); + LOG_INFO("Shutdown from long press"); + playBeep(); #ifdef PIN_LED1 - ledOff(PIN_LED1); + ledOff(PIN_LED1); #endif #ifdef PIN_LED2 - ledOff(PIN_LED2); + ledOff(PIN_LED2); #endif #ifdef PIN_LED3 - ledOff(PIN_LED3); + ledOff(PIN_LED3); #endif - shutdown_on_long_stop = true; - } + shutdown_on_long_stop = true; + } #endif - } - else - { - // LOG_DEBUG("Long press %u\n", (millis() - longPressTime)); - } + } else { + // LOG_DEBUG("Long press %u\n", (millis() - longPressTime)); } + } - static void userButtonDoublePressed() - { + static void userButtonDoublePressed() + { #if defined(USE_EINK) && defined(PIN_EINK_EN) - digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW); + digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW); #endif - screen->print("Sent ad-hoc ping\n"); - service.refreshMyNodeInfo(); - service.sendNetworkPing(NODENUM_BROADCAST, true); - } + screen->print("Sent ad-hoc ping\n"); + service.refreshMyNodeInfo(); + service.sendNetworkPing(NODENUM_BROADCAST, true); + } - static void userButtonMultiPressed() - { + static void userButtonMultiPressed() + { #if defined(GPS_POWER_TOGGLE) - if (config.position.gps_enabled) - { - LOG_DEBUG("Flag set to false for gps power\n"); - } - else - { - LOG_DEBUG("Flag set to true to restore power\n"); - } - config.position.gps_enabled = !(config.position.gps_enabled); - doGPSpowersave(config.position.gps_enabled); + if (config.position.gps_enabled) { + LOG_DEBUG("Flag set to false for gps power\n"); + } else { + LOG_DEBUG("Flag set to true to restore power\n"); + } + config.position.gps_enabled = !(config.position.gps_enabled); + doGPSpowersave(config.position.gps_enabled); #endif - } + } - static void userButtonPressedLongStart() - { - if (millis() > 30 * 1000) - { - LOG_DEBUG("Long press start!\n"); - longPressTime = millis(); + static void userButtonPressedLongStart() + { + if (millis() > 30 * 1000) { + LOG_DEBUG("Long press start!\n"); + longPressTime = millis(); + } + } + + static void userButtonPressedLongStop() + { + if (millis() > 30 * 1000) { + LOG_DEBUG("Long press stop!\n"); + longPressTime = 0; + if (shutdown_on_long_stop) { + playShutdownMelody(); + delay(3000); + power->shutdown(); } } - - static void userButtonPressedLongStop() - { - if (millis() > 30 * 1000) - { - LOG_DEBUG("Long press stop!\n"); - longPressTime = 0; - if (shutdown_on_long_stop) - { - playShutdownMelody(); - delay(3000); - power->shutdown(); - } - } - } - }; + } +}; } // namespace concurrency