From 9d4f93806d83abd593bbaae51c2944cac12c422b Mon Sep 17 00:00:00 2001 From: taco Date: Sun, 12 Jul 2026 18:03:25 +1000 Subject: [PATCH] LR2021: auto-LDRO for side detectors --- examples/simple_repeater/MyMesh.cpp | 4 ++-- examples/simple_repeater/MyMesh.h | 2 +- src/helpers/CommonCLI.cpp | 2 +- src/helpers/CommonCLI.h | 2 +- src/helpers/radiolib/CustomLR2021Wrapper.h | 11 ++++++++--- src/helpers/radiolib/RadioLibWrappers.h | 2 +- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index cc0cc1f1a..6da8cca2c 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -1065,8 +1065,8 @@ bool MyMesh::setRxBoostedGain(bool enable) { } #if defined(USE_LR2021) -bool MyMesh::configSideDetectors(const uint8_t sideDetSFs[], uint8_t num) { - return radio_driver.configSideDetectors(sideDetSFs, num); +bool MyMesh::configSideDetectors(const uint8_t sideDetSFs[], uint8_t num, float bw) { + return radio_driver.configSideDetectors(sideDetSFs, num, bw); } #endif diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index 6a260e339..ff35cfab2 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -256,7 +256,7 @@ public: bool setRxBoostedGain(bool enable) override; #if defined(USE_LR2021) - virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num) override; + virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num, float bw) override; #endif }; diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index bb54197f5..07181e16a 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -766,7 +766,7 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep sideDetSFs[i] = atoi(parts[i]); } sideDetSFs[num] = 0; - if (_callbacks->configSideDetectors(sideDetSFs, num)) { + if (_callbacks->configSideDetectors(sideDetSFs, num, _prefs->bw)) { for (int i = 0; i <= num; i++) _prefs->extra_sf[i] = sideDetSFs[i]; savePrefs(); sprintf(reply, "OK - extra SFs set"); diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index fafabcb17..2a9ec43bc 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -241,7 +241,7 @@ public: }; #if defined(USE_LR2021) - virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num) { + virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num, float bw) { return false; // Override in wrapper } #endif diff --git a/src/helpers/radiolib/CustomLR2021Wrapper.h b/src/helpers/radiolib/CustomLR2021Wrapper.h index 6d0204ac1..879898315 100644 --- a/src/helpers/radiolib/CustomLR2021Wrapper.h +++ b/src/helpers/radiolib/CustomLR2021Wrapper.h @@ -24,7 +24,7 @@ public: applySideDetectorConfig(); } - bool configSideDetectors(const uint8_t* sideDetSFs, uint8_t num) override { + bool configSideDetectors(const uint8_t* sideDetSFs, uint8_t num, float bw) override { LR2021LoRaSideDetector_t tmp[3]; uint8_t sf = getSpreadingFactor(); @@ -35,7 +35,8 @@ public: if (sideDetSFs[i] > sf + 4) { return false; } // span must not be > 4 tmp[i].sf = sideDetSFs[i]; - if (sideDetSFs[i] == 10) { // TODO: set ldro=true when tSym >=16 + float tSym = calcTsym(tmp[i].sf, bw); + if (tSym >= 16.0f) { tmp[i].ldro = true; } else { tmp[i].ldro = false; @@ -63,6 +64,11 @@ public: return status; } + float calcTsym(uint8_t sf, float bw) { + float tSym = (float)(uint32_t(1) << sf) / (float)bw; + return tSym; + } + bool isReceivingPacket() override { return ((CustomLR2021 *)_radio)->isReceiving(); } @@ -98,5 +104,4 @@ public: LR2021LoRaSideDetector_t _sideDet[3]; size_t _numSideDet = 0; - }; diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 4ca958e47..99f5ebbd8 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -78,7 +78,7 @@ public: virtual bool setRxBoostedGainMode(bool) { return false; } virtual bool getRxBoostedGainMode() const { return false; } - virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num) { return false; } + virtual bool configSideDetectors(const uint8_t sideDetSFs[], uint8_t num, float bw) { return false; } }; /**