From 10008d4eef14e638aaf1465f7531d1e7aadc292d Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Sun, 11 Oct 2020 21:19:22 -0700 Subject: [PATCH] fix merge conflict --- bin/version.sh | 2 +- platformio.ini | 2 +- src/Power.cpp | 61 +++++++------- src/PowerFSM.cpp | 12 ++- src/PowerFSM.h | 2 +- src/concurrency/InterruptableDelay.cpp | 22 ++--- src/graphics/Screen.h | 2 +- src/main.cpp | 109 +++++++++++++++---------- 8 files changed, 118 insertions(+), 94 deletions(-) diff --git a/bin/version.sh b/bin/version.sh index feeef016..ef346111 100644 --- a/bin/version.sh +++ b/bin/version.sh @@ -1,3 +1,3 @@ -export VERSION=1.1.3 \ No newline at end of file +export VERSION=1.1.4 \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index ee362235..3b7c6abb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -60,7 +60,7 @@ debug_tool = jlink lib_deps = https://github.com/meshtastic/esp8266-oled-ssd1306.git ; ESP8266_SSD1306 - 1260 ; OneButton library for non-blocking button debounce + https://github.com/geeksville/OneButton.git ; OneButton library for non-blocking button debounce 1202 ; CRC32, explicitly needed because dependency is missing in the ble ota update lib https://github.com/meshtastic/arduino-fsm.git#2f106146071fc7bc620e1e8d4b88dc4e0266ce39 https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad diff --git a/src/Power.cpp b/src/Power.cpp index 162047fa..12a63811 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -138,38 +138,39 @@ int32_t Power::runOnce() { readPowerStatus(); -#ifdef PMU_IRQ - if (pmu_irq) { - pmu_irq = false; - axp.readIRQ(); +#ifdef TBEAM_V10 + // WE no longer use the IRQ line to wake the CPU (due to false wakes from sleep), but we do poll + // the IRQ status by reading the registers over I2C + axp.readIRQ(); - DEBUG_MSG("pmu irq!\n"); - - if (axp.isChargingIRQ()) { - DEBUG_MSG("Battery start charging\n"); - } - if (axp.isChargingDoneIRQ()) { - DEBUG_MSG("Battery fully charged\n"); - } - if (axp.isVbusRemoveIRQ()) { - DEBUG_MSG("USB unplugged\n"); - powerFSM.trigger(EVENT_POWER_DISCONNECTED); - } - if (axp.isVbusPlugInIRQ()) { - DEBUG_MSG("USB plugged In\n"); - powerFSM.trigger(EVENT_POWER_CONNECTED); - } - if (axp.isBattPlugInIRQ()) { - DEBUG_MSG("Battery inserted\n"); - } - if (axp.isBattRemoveIRQ()) { - DEBUG_MSG("Battery removed\n"); - } - if (axp.isPEKShortPressIRQ()) { - DEBUG_MSG("PEK short button press\n"); - } - axp.clearIRQ(); + if (axp.isVbusRemoveIRQ()) { + DEBUG_MSG("USB unplugged\n"); + powerFSM.trigger(EVENT_POWER_DISCONNECTED); } + if (axp.isVbusPlugInIRQ()) { + DEBUG_MSG("USB plugged In\n"); + powerFSM.trigger(EVENT_POWER_CONNECTED); + } + /* + Other things we could check if we cared... + + if (axp.isChargingIRQ()) { + DEBUG_MSG("Battery start charging\n"); + } + if (axp.isChargingDoneIRQ()) { + DEBUG_MSG("Battery fully charged\n"); + } + if (axp.isBattPlugInIRQ()) { + DEBUG_MSG("Battery inserted\n"); + } + if (axp.isBattRemoveIRQ()) { + DEBUG_MSG("Battery removed\n"); + } + if (axp.isPEKShortPressIRQ()) { + DEBUG_MSG("PEK short button press\n"); + } + */ + axp.clearIRQ(); #endif // Only read once every 20 seconds once the power status for the app has been initialized diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index e6cc3738..6295b9dd 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -118,12 +118,21 @@ static void serialEnter() { setBluetoothEnable(false); screen->setOn(true); + screen->print("Using API...\n"); } static void powerEnter() { screen->setOn(true); setBluetoothEnable(true); + screen->print("Powered...\n"); +} + +static void powerExit() +{ + screen->setOn(true); + setBluetoothEnable(true); + screen->print("Unpowered...\n"); } static void onEnter() @@ -157,8 +166,7 @@ State stateDARK(darkEnter, NULL, NULL, "DARK"); State stateSERIAL(serialEnter, NULL, NULL, "SERIAL"); State stateBOOT(bootEnter, NULL, NULL, "BOOT"); State stateON(onEnter, NULL, NULL, "ON"); -State statePOWER(powerEnter, NULL, NULL, "POWER"); - +State statePOWER(powerEnter, NULL, powerExit, "POWER"); Fsm powerFSM(&stateBOOT); void PowerFSM_setup() diff --git a/src/PowerFSM.h b/src/PowerFSM.h index d996acbd..4af62040 100644 --- a/src/PowerFSM.h +++ b/src/PowerFSM.h @@ -20,6 +20,6 @@ #define EVENT_POWER_DISCONNECTED 14 extern Fsm powerFSM; -extern State statePOWER; +extern State statePOWER, stateSERIAL; void PowerFSM_setup(); diff --git a/src/concurrency/InterruptableDelay.cpp b/src/concurrency/InterruptableDelay.cpp index e7538235..80743cc2 100644 --- a/src/concurrency/InterruptableDelay.cpp +++ b/src/concurrency/InterruptableDelay.cpp @@ -4,30 +4,22 @@ namespace concurrency { -InterruptableDelay::InterruptableDelay() -{ -} +InterruptableDelay::InterruptableDelay() {} -InterruptableDelay::~InterruptableDelay() -{ -} +InterruptableDelay::~InterruptableDelay() {} /** * Returns false if we were interrupted */ bool InterruptableDelay::delay(uint32_t msec) { - if (msec) { - // DEBUG_MSG("delay %u ", msec); + // DEBUG_MSG("delay %u ", msec); - // sem take will return false if we timed out (i.e. were not interrupted) - bool r = semaphore.take(msec); + // sem take will return false if we timed out (i.e. were not interrupted) + bool r = semaphore.take(msec); - // DEBUG_MSG("interrupt=%d\n", r); - return !r; - } else { - return true; - } + // DEBUG_MSG("interrupt=%d\n", r); + return !r; } void InterruptableDelay::interrupt() diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 96e18ac5..e4007aea 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -202,7 +202,7 @@ class Screen : public concurrency::OSThread return true; // claim success if our display is not in use else { bool success = cmdQueue.enqueue(cmd, 0); - setInterval(0); // handle ASAP + enabled = true; // handle ASAP (we are the registered reader for cmdQueue, but might have been disabled) return success; } } diff --git a/src/main.cpp b/src/main.cpp index 93c9558e..e258ec52 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -128,31 +128,13 @@ class PowerFSMThread : public OSThread /// If we are in power state we force the CPU to wake every 10ms to check for serial characters (we don't yet wake /// cpu for serial rx - FIXME) - canSleep = (powerFSM.getState() != &statePOWER); - + auto state = powerFSM.getState(); + canSleep = (state != &statePOWER) && (state != &stateSERIAL); + return 10; } }; -static Periodic *ledPeriodic; -static OSThread *powerFSMthread; - -// Prepare for button presses -#ifdef BUTTON_PIN -OneButton userButton; -#endif -#ifdef BUTTON_PIN_ALT -OneButton userButtonAlt; -#endif -void userButtonPressed() -{ - powerFSM.trigger(EVENT_PRESS); -} -void userButtonPressedLong() -{ - screen->adjustBrightness(); -} - /** * Watch a GPIO and if we get an IRQ, wake the main thread. * Use to add wake on button press @@ -168,6 +150,65 @@ void wakeOnIrq(int irq, int mode) FALLING); } +class ButtonThread : public OSThread +{ +// Prepare for button presses +#ifdef BUTTON_PIN + OneButton userButton; +#endif +#ifdef BUTTON_PIN_ALT + OneButton userButtonAlt; +#endif + + public: + // 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.attachClick(userButtonPressed); + userButton.attachDuringLongPress(userButtonPressedLong); + wakeOnIrq(BUTTON_PIN, FALLING); +#endif +#ifdef BUTTON_PIN_ALT + userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); + userButtonAlt.attachClick(userButtonPressed); + userButton.attachDuringLongPress(userButtonPressedLong); + wakeOnIrq(BUTTON_PIN_ALT, FALLING); +#endif + } + + protected: + /// If the button is pressed we suppress CPU sleep until release + int32_t runOnce() + { + 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 &= userButton.isIdle(); +#endif + // if(!canSleep) DEBUG_MSG("Supressing sleep!\n"); + + return 5; + } + + private: + static void userButtonPressed() + { + // DEBUG_MSG("press!\n"); + powerFSM.trigger(EVENT_PRESS); + } + static void userButtonPressedLong() { screen->adjustBrightness(); } +}; + +static Periodic *ledPeriodic; +static OSThread *powerFSMthread, *buttonThread; + RadioInterface *rIf = NULL; void setup() @@ -210,18 +251,7 @@ void setup() #endif // Buttons & LED -#ifdef BUTTON_PIN - userButton = OneButton(BUTTON_PIN, true, true); - userButton.attachClick(userButtonPressed); - userButton.attachDuringLongPress(userButtonPressedLong); - wakeOnIrq(BUTTON_PIN, FALLING); -#endif -#ifdef BUTTON_PIN_ALT - userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); - userButtonAlt.attachClick(userButtonPressed); - userButton.attachDuringLongPress(userButtonPressedLong); - wakeOnIrq(BUTTON_PIN_ALT, FALLING); -#endif + buttonThread = new ButtonThread(); #ifdef LED_PIN pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, 1 ^ LED_INVERTED); // turn on for now @@ -411,13 +441,6 @@ void loop() esp32Loop(); #endif -#ifdef BUTTON_PIN - userButton.tick(); -#endif -#ifdef BUTTON_PIN_ALT - userButtonAlt.tick(); -#endif - // For debugging // if (rIf) ((RadioLibInterface *)rIf)->isActivelyReceiving(); @@ -438,9 +461,9 @@ void loop() /* if (mainController.nextThread && delayMsec) DEBUG_MSG("Next %s in %ld\n", mainController.nextThread->ThreadName.c_str(), - mainController.nextThread->tillRun(millis())); - */ - + mainController.nextThread->tillRun(millis())); */ + // We want to sleep as long as possible here - because it saves power mainDelay.delay(delayMsec); + // if (didWake) DEBUG_MSG("wake!\n"); }