LR2021: auto-LDRO for side detectors

This commit is contained in:
taco
2026-08-05 14:23:32 +10:00
parent 36e77671a2
commit 9d4f93806d
6 changed files with 14 additions and 9 deletions
+2 -2
View File
@@ -1065,8 +1065,8 @@ bool MyMesh::setRxBoostedGain(bool enable) {
} }
#if defined(USE_LR2021) #if defined(USE_LR2021)
bool MyMesh::configSideDetectors(const uint8_t sideDetSFs[], uint8_t num) { bool MyMesh::configSideDetectors(const uint8_t sideDetSFs[], uint8_t num, float bw) {
return radio_driver.configSideDetectors(sideDetSFs, num); return radio_driver.configSideDetectors(sideDetSFs, num, bw);
} }
#endif #endif
+1 -1
View File
@@ -256,7 +256,7 @@ public:
bool setRxBoostedGain(bool enable) override; bool setRxBoostedGain(bool enable) override;
#if defined(USE_LR2021) #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 #endif
}; };
+1 -1
View File
@@ -766,7 +766,7 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep
sideDetSFs[i] = atoi(parts[i]); sideDetSFs[i] = atoi(parts[i]);
} }
sideDetSFs[num] = 0; 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]; for (int i = 0; i <= num; i++) _prefs->extra_sf[i] = sideDetSFs[i];
savePrefs(); savePrefs();
sprintf(reply, "OK - extra SFs set"); sprintf(reply, "OK - extra SFs set");
+1 -1
View File
@@ -241,7 +241,7 @@ public:
}; };
#if defined(USE_LR2021) #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 return false; // Override in wrapper
} }
#endif #endif
+8 -3
View File
@@ -24,7 +24,7 @@ public:
applySideDetectorConfig(); 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]; LR2021LoRaSideDetector_t tmp[3];
uint8_t sf = getSpreadingFactor(); uint8_t sf = getSpreadingFactor();
@@ -35,7 +35,8 @@ public:
if (sideDetSFs[i] > sf + 4) { return false; } // span must not be > 4 if (sideDetSFs[i] > sf + 4) { return false; } // span must not be > 4
tmp[i].sf = sideDetSFs[i]; 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; tmp[i].ldro = true;
} else { } else {
tmp[i].ldro = false; tmp[i].ldro = false;
@@ -63,6 +64,11 @@ public:
return status; return status;
} }
float calcTsym(uint8_t sf, float bw) {
float tSym = (float)(uint32_t(1) << sf) / (float)bw;
return tSym;
}
bool isReceivingPacket() override { bool isReceivingPacket() override {
return ((CustomLR2021 *)_radio)->isReceiving(); return ((CustomLR2021 *)_radio)->isReceiving();
} }
@@ -98,5 +104,4 @@ public:
LR2021LoRaSideDetector_t _sideDet[3]; LR2021LoRaSideDetector_t _sideDet[3];
size_t _numSideDet = 0; size_t _numSideDet = 0;
}; };
+1 -1
View File
@@ -78,7 +78,7 @@ public:
virtual bool setRxBoostedGainMode(bool) { return false; } virtual bool setRxBoostedGainMode(bool) { return false; }
virtual bool getRxBoostedGainMode() const { 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; }
}; };
/** /**