mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
fix: use max estimated airtime for duty cycle enforcement
Previously the max required airtime to enter the next transmit slot was computed to be half the estimated time. However, the transmit logic uses 1.5 times the estimated time as maximum TX duration. By that, the duty cycle could still be violated as the actual transmit logic might send for longer than what we ensured to stay within the cycle. We fix this by aligning both computations and always use 1.5 times the estimated airtime. Xref: #817
This commit is contained in:
parent
e797d55c7a
commit
0ded46a975
1 changed files with 2 additions and 3 deletions
|
|
@ -10,7 +10,6 @@ namespace mesh {
|
|||
|
||||
#define MAX_RX_DELAY_MILLIS 32000 // 32 seconds
|
||||
#define MIN_TX_BUDGET_RESERVE_MS 100 // min budget (ms) required before allowing next TX
|
||||
#define MIN_TX_BUDGET_AIRTIME_DIV 2 // require at least 1/N of estimated airtime as budget before TX
|
||||
/// add some time to get the max allowed airtime for the est. airtime
|
||||
#define MAX_TX_AIRTIME_FOR_EST(est_airtime) (((est_airtime) * 3) / 2)
|
||||
|
||||
|
|
@ -275,9 +274,9 @@ void Dispatcher::processRecvPacket(Packet* pkt) {
|
|||
|
||||
void Dispatcher::ensureTxDutyCycle(int tx_len) {
|
||||
uint32_t est_airtime = _radio->getEstAirtimeFor(tx_len);
|
||||
if (tx_budget_ms < est_airtime / MIN_TX_BUDGET_AIRTIME_DIV) {
|
||||
if (tx_budget_ms < MAX_TX_AIRTIME_FOR_EST(est_airtime)) {
|
||||
float duty_cycle = 1.0f / (1.0f + getAirtimeBudgetFactor());
|
||||
unsigned long needed = est_airtime / MIN_TX_BUDGET_AIRTIME_DIV - tx_budget_ms;
|
||||
unsigned long needed = MAX_TX_AIRTIME_FOR_EST(est_airtime) - tx_budget_ms;
|
||||
next_tx_time = futureMillis((unsigned long)(needed / duty_cycle));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue