Fix SENSOR power saving deep sleep truncating TX and skipping sleep on failed reads (#10939)

* Fix SENSOR power saving deep sleep behavior

Deep sleep could be entered while a telemetry packet was still queued
or on air, truncating the transmission. canSleep() gained a deepSleep
parameter and now vetoes in that case; light sleep is unchanged.
Telemetry modules defer a pending deep sleep (bounded to 30s) until the
radio is idle and no longer let the sensor polling interval override
the 5s pre-sleep grace period. A failed sensor read still arms deep
sleep instead of leaving the node awake for a full telemetry interval.

Fixes #10890
Fixes #10932

* Deduplicate telemetry deep sleep deferral logic

Move the radio-busy deferral and its counter into BaseTelemetryModule
and add an isPowerSavingSensor() helper. Removes the telemetry-specific
counter from OSThread. The sleep arming block stays per module because
it needs protected OSThread members not visible to the base class.
This commit is contained in:
Thomas Göttgens
2026-07-08 07:30:46 -05:00
committed by GitHub
co-authored by GitHub
parent ba473bf529
commit 38074f584f
11 changed files with 162 additions and 48 deletions
+12 -2
View File
@@ -23,8 +23,18 @@ void initDeepSleep();
void setCPUFast(bool on);
/** return true if sleep is allowed right now */
bool doPreflightSleep();
/** return true if sleep is allowed right now
* @param deepSleep true when the hardware (radio) is about to be powered down (deep sleep or
* shutdown), false for a light sleep where the radio keeps running. Observers may veto more
* aggressively for deep sleep, e.g. while a LoRa transmission is still in flight.
*/
bool doPreflightSleep(bool deepSleep = false);
/// When a power-saving module wants to deep sleep but doPreflightSleep() vetoes it (e.g. the
/// radio is still transmitting), re-check this often, and give up waiting after this many
/// attempts so a busy mesh can't keep the node awake forever
static constexpr uint32_t PREFLIGHT_SLEEP_RETRY_MS = 1000;
static constexpr uint32_t MAX_PREFLIGHT_SLEEP_DEFERRALS = 30;
extern int bootCount;