Bound failed RX retries without blocking power-saving sleep

This commit is contained in:
mikecarper committed 2026-10-16 01:27:24 -07:00
1 parent 862260de17
commit 339079c439
14 files changed
+463 -12

No files matched your search

+18 -1
View File
@@ -584,10 +584,18 @@ bool Dispatcher::getNextQueueWakeDelay(uint32_t& delay_millis) const {
}
}
uint32_t receive_retry_delay = 0;
const bool receive_retry = radio_available
&& _radio->getReceiveRetryDelay(now, receive_retry_delay);
if (outbound != NULL) {
if (outbound_radio_retry_pending) {
int32_t signed_retry_delay = (int32_t)(outbound_radio_retry_at - now);
delay_millis = signed_retry_delay > 0 ? (uint32_t)signed_retry_delay : 0;
// This backoff branch services checkRecv(), but returns before AGC.
// Wake for a failed RX retry without making overdue AGC a hot poll.
if (receive_retry && receive_retry_delay < delay_millis) {
delay_millis = receive_retry_delay;
}
} else {
// TX completion/timeout still needs the normal fast lifecycle path.
delay_millis = 0;
@@ -595,6 +603,11 @@ bool Dispatcher::getNextQueueWakeDelay(uint32_t& delay_millis) const {
return true;
}
if (receive_retry) {
if (!found || receive_retry_delay < shortest_delay) shortest_delay = receive_retry_delay;
found = true;
}
if (outbound_restore_cr) {
const int32_t restore_delay = (int32_t)(outbound_restore_retry_at - now);
const uint32_t delay = restore_delay > 0 ? (uint32_t)restore_delay : 0;
@@ -854,7 +867,11 @@ void Dispatcher::loop() {
agc_reset.noteAttempt(_ms->getMillis());
} else {
// Ownership/calibration deferral is not a reset or health evidence.
agc_reset.noteDeferred(_ms->getMillis());
const uint32_t deferred_at = _ms->getMillis();
uint32_t retry_delay = 50, receive_delay;
if (adaptive && _radio->getReceiveRetryDelay(deferred_at, receive_delay)
&& receive_delay > retry_delay) retry_delay = receive_delay;
agc_reset.noteDeferred(deferred_at, retry_delay);
}
}