Bound failed RX retries without blocking power-saving sleep
This commit is contained in:
1 parent
862260de17
commit
339079c439
14 files changed
+463
-12
No files matched your search
+18
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user