From aeb9bfa063fd97cae8c4d88188e897b115f8d3d0 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 4 Dec 2022 20:41:00 -0600 Subject: [PATCH 1/6] Return false --- src/PowerFSM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index dd3992a14..6af5f7f47 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -27,7 +27,7 @@ static bool isPowered() 2) If we detect USB power from the power management chip, we must be getting power externally. */ - return !isPowerSavingMode && powerStatus && (!powerStatus->getHasBattery() || powerStatus->getHasUSB()); + return false;//!isPowerSavingMode && powerStatus && (!powerStatus->getHasBattery() || powerStatus->getHasUSB()); } static void sdsEnter() From 1fef6f0656ef4a3e55da8c8b563571a963b0cc53 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 5 Dec 2022 07:37:01 -0600 Subject: [PATCH 2/6] Clean up on battery shutdown condition --- src/PowerFSMThread.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/PowerFSMThread.h b/src/PowerFSMThread.h index 36bee834d..f45eec2f7 100644 --- a/src/PowerFSMThread.h +++ b/src/PowerFSMThread.h @@ -26,11 +26,9 @@ class PowerFSMThread : public OSThread if (powerStatus->getHasUSB()) { timeLastPowered = millis(); - } else if (config.power.on_battery_shutdown_after_secs > 0 && - millis() > - timeLastPowered + - (1000 * - config.power.on_battery_shutdown_after_secs)) { // shutdown after 30 minutes unpowered + } else if (config.power.on_battery_shutdown_after_secs > 0 && + config.power.on_battery_shutdown_after_secs != UINT32_MAX && + millis() > (timeLastPowered + getConfiguredOrDefaultMs(config.power.on_battery_shutdown_after_secs))) { // shutdown after 30 minutes unpowered powerFSM.trigger(EVENT_SHUTDOWN); } From b14289e97627ac285afe596a6863ccd55eb1dcdb Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 5 Dec 2022 08:35:54 -0600 Subject: [PATCH 3/6] More cleanup --- .gitignore | 1 + src/PowerFSM.cpp | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index e9d3cfdf9..be3ca3397 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ __pycache__ venv/ release/ +.vscode/extensions.json diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 6af5f7f47..5d4d031d2 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -34,7 +34,7 @@ static void sdsEnter() { DEBUG_MSG("Enter state: SDS\n"); // FIXME - make sure GPS and LORA radio are off first - because we want close to zero current draw - doDeepSleep(config.power.sds_secs * 1000); + doDeepSleep(getConfiguredOrDefaultMs(config.power.sds_secs)); } extern Power *power; @@ -324,11 +324,6 @@ void PowerFSM_setup() powerFSM.add_transition(&stateDARK, &stateDARK, EVENT_CONTACT_FROM_PHONE, NULL, "Contact from phone"); - // each time we get a new update packet make sure we are staying in the ON state so the screen stays awake (also we don't - // shutdown bluetooth if is_router) - powerFSM.add_transition(&stateDARK, &stateON, EVENT_FIRMWARE_UPDATE, NULL, "Got firmware update"); - powerFSM.add_transition(&stateON, &stateON, EVENT_FIRMWARE_UPDATE, NULL, "Got firmware update"); - powerFSM.add_timed_transition(&stateON, &stateDARK, getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL, "Screen-on timeout"); // On most boards we use light-sleep to be our main state, but on NRF52 we just stay in DARK @@ -348,7 +343,7 @@ void PowerFSM_setup() #endif if (config.power.sds_secs != UINT32_MAX) - powerFSM.add_timed_transition(lowPowerState, &stateSDS, config.power.sds_secs * 1000, NULL, "mesh timeout"); + powerFSM.add_timed_transition(lowPowerState, &stateSDS, getConfiguredOrDefaultMs(config.power.sds_secs), NULL, "mesh timeout"); powerFSM.run_machine(); // run one interation of the state machine, so we run our on enter tasks for the initial DARK state } From 2a84d39e40fbc6909163add2556cf6ae09f8410f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Dec 2022 16:40:23 +0100 Subject: [PATCH 4/6] Always do battery resampling if we use the ADC. Improves reading a lot. --- src/Power.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Power.cpp b/src/Power.cpp index af10acb5e..dd3ac1497 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -102,6 +102,10 @@ class AnalogBatteryLevel : public HasBatteryLevel #define ADC_MULTIPLIER 2.0 #endif +#ifndef BATTERY_SENSE_SAMPLES +#define BATTERY_SENSE_SAMPLES 30 +#endif + #ifdef BATTERY_PIN // Override variant or default ADC_MULTIPLIER if we have the override pref float operativeAdcMultiplier = config.power.adc_multiplier_override > 0 @@ -112,16 +116,12 @@ class AnalogBatteryLevel : public HasBatteryLevel if (millis() - last_read_time_ms > min_read_interval) { last_read_time_ms = millis(); -#ifdef BATTERY_SENSE_SAMPLES //Set the number of samples, it has an effect of increasing sensitivity, especially in complex electromagnetic environment. uint32_t raw = 0; - for(uint32_t i=0; igetBattVoltage() < MIN_BAT_MILLIVOLTS) { low_voltage_counter++; - if (low_voltage_counter > 3) + DEBUG_MSG("Warning RAK4631 Low voltage counter: %d/10\n", low_voltage_counter); + if (low_voltage_counter > 10) powerFSM.trigger(EVENT_LOW_BATTERY); } else { low_voltage_counter = 0; From 0f2a83535944f59367399fff04c46d56b282a44f Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 5 Dec 2022 10:13:19 -0600 Subject: [PATCH 5/6] Remove hard coded !isPowered --- src/PowerFSM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 5d4d031d2..46048d467 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -27,7 +27,7 @@ static bool isPowered() 2) If we detect USB power from the power management chip, we must be getting power externally. */ - return false;//!isPowerSavingMode && powerStatus && (!powerStatus->getHasBattery() || powerStatus->getHasUSB()); + return !isPowerSavingMode && powerStatus && (!powerStatus->getHasBattery() || powerStatus->getHasUSB()); } static void sdsEnter() From 45b518baf27106f5992b8a3d12ab224a371a74ec Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 12 Dec 2022 10:24:51 -0600 Subject: [PATCH 6/6] Move sds transition back into esp32 only --- src/PowerFSM.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 46048d467..647167242 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -336,14 +336,15 @@ void PowerFSM_setup() if (isRouter || config.power.is_power_saving) { powerFSM.add_timed_transition(&stateNB, &stateLS, getConfiguredOrDefaultMs(config.power.min_wake_secs, default_min_wake_secs), NULL, "Min wake timeout"); powerFSM.add_timed_transition(&stateDARK, &stateLS, getConfiguredOrDefaultMs(config.power.wait_bluetooth_secs, default_wait_bluetooth_secs), NULL, "Bluetooth timeout"); - } + } + + if (config.power.sds_secs != UINT32_MAX) + powerFSM.add_timed_transition(lowPowerState, &stateSDS, getConfiguredOrDefaultMs(config.power.sds_secs), NULL, "mesh timeout"); #elif defined (ARCH_NRF52) lowPowerState = &stateDARK; #endif - if (config.power.sds_secs != UINT32_MAX) - powerFSM.add_timed_transition(lowPowerState, &stateSDS, getConfiguredOrDefaultMs(config.power.sds_secs), NULL, "mesh timeout"); powerFSM.run_machine(); // run one interation of the state machine, so we run our on enter tasks for the initial DARK state }