From 71479a6b17f1afc0d2e2184288f6b1890e6f8e4a Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Sun, 2 Apr 2023 21:28:12 +0200 Subject: [PATCH 1/6] Fix for device display issues --- src/PowerFSM.cpp | 19 ++++++++++++++++--- src/graphics/Screen.cpp | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 518c94d92..48a94444b 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -172,7 +172,13 @@ 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 +195,8 @@ static void powerExit() { screen->setOn(true); setBluetoothEnable(true); - screen->print("Unpowered...\n"); + if (!isPowered()) + screen->print("Unpowered...\n"); } static void onEnter() @@ -249,7 +256,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 +329,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--; From 923969800438304db6a78ae004ad62ba357a3c96 Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Mon, 3 Apr 2023 08:52:21 +0200 Subject: [PATCH 2/6] make trunk happy --- src/PowerFSM.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 48a94444b..1c3441769 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -173,10 +173,8 @@ static void powerEnter() screen->setOn(true); setBluetoothEnable(true); // 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) - { + if (strcmp(powerFSM.getState()->name, "BOOT") != 0 && strcmp(powerFSM.getState()->name, "POWER") != 0 && + strcmp(powerFSM.getState()->name, "DARK") != 0) { screen->print("Powered...\n"); } } From 038ff0f6cb7ef0816de363f396ef5dff9f3bb88a Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Sun, 2 Apr 2023 21:28:12 +0200 Subject: [PATCH 3/6] Fix for device display issues --- src/PowerFSM.cpp | 19 ++++++++++++++++--- src/graphics/Screen.cpp | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 518c94d92..48a94444b 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -172,7 +172,13 @@ 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 +195,8 @@ static void powerExit() { screen->setOn(true); setBluetoothEnable(true); - screen->print("Unpowered...\n"); + if (!isPowered()) + screen->print("Unpowered...\n"); } static void onEnter() @@ -249,7 +256,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 +329,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--; From 9a42861766f9db7f0ffc863e700b8e775a81385a Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Mon, 3 Apr 2023 08:52:21 +0200 Subject: [PATCH 4/6] make trunk happy --- src/PowerFSM.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 48a94444b..1c3441769 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -173,10 +173,8 @@ static void powerEnter() screen->setOn(true); setBluetoothEnable(true); // 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) - { + if (strcmp(powerFSM.getState()->name, "BOOT") != 0 && strcmp(powerFSM.getState()->name, "POWER") != 0 && + strcmp(powerFSM.getState()->name, "DARK") != 0) { screen->print("Powered...\n"); } } From 3c0817340a722149d30b5fa4e0583987085b46a8 Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Mon, 3 Apr 2023 19:45:12 +0200 Subject: [PATCH 5/6] Fixed blank screen button issue and SX126x wakeup --- src/PowerFSM.cpp | 24 +++++++++--------------- src/sleep.cpp | 5 ++++- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 1c3441769..66dfdc9fd 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -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 { 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 From 23e6bc32c08670b8655c2523cfb187907b1d0604 Mon Sep 17 00:00:00 2001 From: Manuel Verch Date: Mon, 3 Apr 2023 20:14:57 +0200 Subject: [PATCH 6/6] make cpptools happy --- src/PowerFSM.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 66dfdc9fd..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);