From ce1575754cecf92ec83f30236a1abed5844ae274 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 12:58:44 -0700 Subject: [PATCH] Prevent forced TX during JP LBT backoff via getCADFailMaxDuration() Add isJapanMode() virtual to mesh::Radio (default false) so Dispatcher can query frequency context without depending on RadioLibWrapper. Dispatcher::getCADFailMaxDuration() returns UINT32_MAX for JP nodes, eliminating the 4-second forced-TX that would violate ARIB STD-T108. Non-JP nodes retain the original 4-second safety timeout unchanged. --- src/Dispatcher.cpp | 1 + src/Dispatcher.h | 2 ++ src/helpers/radiolib/RadioLibWrappers.h | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index c0610b7f8..d0cfc3966 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -60,6 +60,7 @@ uint32_t Dispatcher::getCADFailRetryDelay() const { return 200; } uint32_t Dispatcher::getCADFailMaxDuration() const { + if (_radio->isJapanMode()) return UINT32_MAX; // ARIB STD-T108: never force TX during LBT return 4000; // 4 seconds } diff --git a/src/Dispatcher.h b/src/Dispatcher.h index aad6cba3e..e53b75aa0 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -78,6 +78,8 @@ public: virtual float getLastRSSI() const { return 0; } virtual float getLastSNR() const { return 0; } + + virtual bool isJapanMode() const { return false; } }; /** diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 3330ccb08..051bec7ef 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -57,7 +57,7 @@ public: virtual uint8_t getCodingRate() const { return 8; } // default CR4/8, override in subclass virtual float getFreqMHz() const { return 0.0f; } // default unknown, override in subclass - bool isJapanMode() const { + bool isJapanMode() const override { float freq = getFreqMHz(); return (fabsf(freq - 920.800f) < 0.05f || fabsf(freq - 921.000f) < 0.05f ||