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
parent ba473bf529
commit 38074f584f
11 changed files with 162 additions and 48 deletions
+7 -3
View File
@@ -222,11 +222,15 @@ meshtastic_QueueStatus RadioLibInterface::getQueueStatus()
return qs;
}
bool RadioLibInterface::canSleep()
bool RadioLibInterface::canSleep(bool deepSleep)
{
bool res = txQueue.empty();
// A packet being actively transmitted has already left the TX queue (sendingPacket), so
// check it separately. It only vetoes deep sleep: light sleep keeps the radio powered and
// the TX finishes on its own, but deep sleep powers the radio down and would truncate the
// packet on air.
bool res = txQueue.empty() && !(deepSleep && isSending());
if (!res) { // only print debug messages if we are vetoing sleep
LOG_DEBUG("Radio wait to sleep, txEmpty=%d", res);
LOG_DEBUG("Radio wait to sleep, txEmpty=%d, txInFlight=%d", txQueue.empty(), isSending());
}
return res;
}