dynamically adjust measurement interval in power management

This commit is contained in:
m1nl 2025-04-24 00:36:47 +02:00
parent 5d956d6bdc
commit f1c1808449
2 changed files with 46 additions and 1 deletions

View File

@ -572,6 +572,19 @@ Power::Power() : OSThread("Power")
#ifdef DEBUG_HEAP
lastheap = memGet.getFreeHeap();
#endif
#ifdef ARCH_ESP32
lsObserver.observe(&notifyLightSleep);
lsEndObserver.observe(&notifyLightSleepEnd);
#endif
}
Power::~Power()
{
#ifdef ARCH_ESP32
lsObserver.unobserve(&notifyLightSleep);
lsEndObserver.unobserve(&notifyLightSleepEnd);
#endif
}
bool Power::analogInit()
@ -708,6 +721,8 @@ void Power::readPowerStatus()
OptionalBool hasBattery = OptUnknown; // These must be static because NRF_APM code doesn't run every time
OptionalBool isChargingNow = OptUnknown;
powerFSM.trigger(EVENT_WAKE_TIMER); // ensure we're not light-sleeping
if (batteryLevel) {
hasBattery = batteryLevel->isBatteryConnect() ? OptTrue : OptFalse;
usbPowered = batteryLevel->isVbusIn() ? OptTrue : OptFalse;
@ -862,10 +877,29 @@ int32_t Power::runOnce()
PMU->clearIrqStatus();
}
#endif
// Only read once every 20 seconds once the power status for the app has been initialized
return (statusHandler && statusHandler->isInitialized()) ? (1000 * 20) : RUN_SAME;
if (statusHandler && statusHandler->isInitialized() && interval == 0) {
setInterval(20 * 1000UL);
}
return RUN_SAME;
}
#ifdef ARCH_ESP32
int Power::beforeLightSleep(void *unused)
{
setInterval(config.power.ls_secs * 1000UL);
return 0;
}
int Power::afterLightSleep(esp_sleep_wakeup_cause_t cause)
{
setInterval(20 * 1000UL);
return 0;
}
#endif
/**
* Init the power manager chip
*

View File

@ -109,6 +109,7 @@ class Power : private concurrency::OSThread
Observable<const meshtastic::PowerStatus *> newStatus;
Power();
~Power();
void shutdown();
void readPowerStatus();
@ -133,6 +134,16 @@ class Power : private concurrency::OSThread
#ifdef DEBUG_HEAP
uint32_t lastheap;
#endif
#ifdef ARCH_ESP32
// Get notified when lightsleep begins and ends to set power refresh interval
CallbackObserver<Power, void *> lsObserver = CallbackObserver<Power, void *>(this, &Power::beforeLightSleep);
CallbackObserver<Power, esp_sleep_wakeup_cause_t> lsEndObserver =
CallbackObserver<Power, esp_sleep_wakeup_cause_t>(this, &Power::afterLightSleep);
int beforeLightSleep(void *unused);
int afterLightSleep(esp_sleep_wakeup_cause_t cause);
#endif
};
extern Power *power;