diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 518c94d92..2139d9d8f 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -69,11 +69,11 @@ static void lsIdle() // Do we have more sleeping to do? if (secsSlept < config.power.ls_secs) { - // Briefly come out of sleep long enough to blink the led once every few seconds - uint32_t sleepTime = 30; - // If some other service would stall sleep, don't let sleep happen yet if (doPreflightSleep()) { + // Briefly come out of sleep long enough to blink the led once every few seconds + uint32_t sleepTime = 30; + setLed(false); // Never leave led on while in light sleep esp_sleep_source_t wakeCause2 = doLightSleep(sleepTime * 1000LL); @@ -93,24 +93,18 @@ static void lsIdle() powerFSM.trigger(EVENT_SERIAL_CONNECTED); break; + case ESP_SLEEP_WAKEUP_GPIO: + // GPIO of BUTTON_PIN (if available) triggered the wakeup + powerFSM.trigger(EVENT_PRESS); + break; + default: - // We woke for some other reason (button press, device interrupt) + // We woke for some other reason (device interrupt) // uint64_t status = esp_sleep_get_ext1_wakeup_status(); LOG_INFO("wakeCause2 %d\n", wakeCause2); - -#ifdef BUTTON_PIN - bool pressed = !digitalRead(BUTTON_PIN); -#else - bool pressed = false; -#endif - if (pressed) // If we woke because of press, instead generate a PRESS event. - { - powerFSM.trigger(EVENT_PRESS); - } else { - // Otherwise let the NB state handle the IRQ (and that state will handle stuff like IRQs etc) - // we lie and say "wake timer" because the interrupt will be handled by the regular IRQ code - powerFSM.trigger(EVENT_WAKE_TIMER); - } + // Let the NB state handle the IRQ (and that state will handle stuff like IRQs etc) + // we lie and say "wake timer" because the interrupt will be handled by the regular IRQ code + powerFSM.trigger(EVENT_WAKE_TIMER); break; } } else { @@ -172,7 +166,11 @@ static void powerEnter() } else { screen->setOn(true); setBluetoothEnable(true); - screen->print("Powered...\n"); + // within enter() the function getState() returns the state we came from + if (strcmp(powerFSM.getState()->name, "BOOT") != 0 && strcmp(powerFSM.getState()->name, "POWER") != 0 && + strcmp(powerFSM.getState()->name, "DARK") != 0) { + screen->print("Powered...\n"); + } } } @@ -189,7 +187,8 @@ static void powerExit() { screen->setOn(true); setBluetoothEnable(true); - screen->print("Unpowered...\n"); + if (!isPowered()) + screen->print("Unpowered...\n"); } static void onEnter() @@ -249,7 +248,7 @@ void PowerFSM_setup() // Handle press events - note: we ignore button presses when in API mode powerFSM.add_transition(&stateLS, &stateON, EVENT_PRESS, NULL, "Press"); powerFSM.add_transition(&stateNB, &stateON, EVENT_PRESS, NULL, "Press"); - powerFSM.add_transition(&stateDARK, &stateON, EVENT_PRESS, NULL, "Press"); + powerFSM.add_transition(&stateDARK, isPowered() ? &statePOWER : &stateON, EVENT_PRESS, NULL, "Press"); powerFSM.add_transition(&statePOWER, &statePOWER, EVENT_PRESS, screenPress, "Press"); powerFSM.add_transition(&stateON, &stateON, EVENT_PRESS, screenPress, "Press"); // reenter On to restart our timers powerFSM.add_transition(&stateSERIAL, &stateSERIAL, EVENT_PRESS, screenPress, @@ -322,6 +321,12 @@ void PowerFSM_setup() powerFSM.add_timed_transition(&stateON, &stateDARK, getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL, "Screen-on timeout"); + powerFSM.add_timed_transition(&statePOWER, &stateDARK, + getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL, + "Screen-on timeout"); + powerFSM.add_timed_transition(&stateDARK, &stateDARK, + getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL, + "Screen-on timeout"); #ifdef ARCH_ESP32 State *lowPowerState = &stateLS; diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index b5a74b386..482e76450 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1206,7 +1206,7 @@ void Screen::setFrames() LOG_DEBUG("Total frame count: %d\n", totalFrameCount); // We don't show the node info our our node (if we have it yet - we should) - size_t numnodes = nodeStatus->getNumTotal(); + size_t numnodes = nodeDB.getNumNodes(); if (numnodes > 0) numnodes--; diff --git a/src/sleep.cpp b/src/sleep.cpp index 8b6346038..e3f042a27 100644 --- a/src/sleep.cpp +++ b/src/sleep.cpp @@ -301,7 +301,10 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t sleepMsec) // FIXME, use a more r // assert(esp_sleep_enable_uart_wakeup(0) == ESP_OK); #endif #ifdef BUTTON_PIN - gpio_wakeup_enable((gpio_num_t)BUTTON_PIN, GPIO_INTR_LOW_LEVEL); // when user presses, this button goes low + esp_sleep_enable_ext0_wakeup((gpio_num_t)BUTTON_PIN, LOW); // when user presses, this button goes low +#endif +#if defined(LORA_DIO1) && (LORA_DIO1 != RADIOLIB_NC) + gpio_wakeup_enable((gpio_num_t)LORA_DIO1, GPIO_INTR_HIGH_LEVEL); // SX126x/SX128x interrupt, active high #endif #ifdef RF95_IRQ gpio_wakeup_enable((gpio_num_t)RF95_IRQ, GPIO_INTR_HIGH_LEVEL); // RF95 interrupt, active high