From 02f08ee27f4cc92223e54da5fdce8e63264462ed Mon Sep 17 00:00:00 2001 From: Marcel Verdult Date: Thu, 12 Nov 2026 13:06:38 +0100 Subject: [PATCH] Score packets at the spreading factor the radio reports RadioLibWrapper::packetScore() assumed spreading factor 10 for every wrapper that did not override it. LR1110, LR1121 and LR2021 have no override, so their packets were always scored as if the radio ran at SF10, although all three report their real factor through getSpreadingFactor(). The SNR a packet needs to be decodable rises as the spreading factor falls (packetScoreInt() holds one threshold per factor, -7.5 dB at SF7 to -20 dB at SF12), so below SF10 the score came out too high and above SF10 too low. The five wrappers that did override packetScore() (SX1262, SX1268, SX1276, LLCC68, STM32WLx) read the same member that their getSpreadingFactor() returns. The base class now calls getSpreadingFactor() and those five overrides are removed. A wrapper that reports its factor is scored correctly without extra code, and one that reports nothing falls back to the build's LORA_SF. The score is used for logging and for calcRxDelay(). All four roles compute that delay from rx_delay_base, which is 0 by default, so on a default configuration the change affects what is logged. With rxdelay above 0 the rebroadcast delay of LR boards changes. For a 64 byte packet and 500 ms airtime with rxdelay 10: SF7 at -5 dB goes from score 0.750 to 0.188 and from 129 ms to 1799 ms delay; SF12 at -10 dB goes from 0.375 to 0.750 and from 993 ms to 129 ms. At SF10 nothing changes. --- src/helpers/radiolib/CustomLLCC68Wrapper.h | 4 ---- src/helpers/radiolib/CustomSTM32WLxWrapper.h | 4 ---- src/helpers/radiolib/CustomSX1262Wrapper.h | 4 ---- src/helpers/radiolib/CustomSX1268Wrapper.h | 4 ---- src/helpers/radiolib/CustomSX1276Wrapper.h | 4 ---- src/helpers/radiolib/RadioLibWrappers.h | 6 +++++- 6 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/helpers/radiolib/CustomLLCC68Wrapper.h b/src/helpers/radiolib/CustomLLCC68Wrapper.h index b8b4096a6fe..c198facd2ec 100644 --- a/src/helpers/radiolib/CustomLLCC68Wrapper.h +++ b/src/helpers/radiolib/CustomLLCC68Wrapper.h @@ -34,10 +34,6 @@ class CustomLLCC68Wrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomLLCC68 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomLLCC68 *)_radio)->getSNR(); } - float packetScore(float snr, int packet_len) override { - int sf = ((CustomLLCC68 *)_radio)->spreadingFactor; - return packetScoreInt(snr, sf, packet_len); - } uint8_t getSpreadingFactor() const override { return ((CustomLLCC68 *)_radio)->spreadingFactor; } void doResetAGC() override { sx126xResetAGC((SX126x *)_radio, getRxBoostedGainMode()); } diff --git a/src/helpers/radiolib/CustomSTM32WLxWrapper.h b/src/helpers/radiolib/CustomSTM32WLxWrapper.h index bc93de7584a..2323c7caf03 100644 --- a/src/helpers/radiolib/CustomSTM32WLxWrapper.h +++ b/src/helpers/radiolib/CustomSTM32WLxWrapper.h @@ -34,10 +34,6 @@ class CustomSTM32WLxWrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomSTM32WLx *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSTM32WLx *)_radio)->getSNR(); } - float packetScore(float snr, int packet_len) override { - int sf = ((CustomSTM32WLx *)_radio)->spreadingFactor; - return packetScoreInt(snr, sf, packet_len); - } uint8_t getSpreadingFactor() const override { return ((CustomSTM32WLx *)_radio)->spreadingFactor; } void doResetAGC() override { sx126xResetAGC((SX126x *)_radio, getRxBoostedGainMode()); } diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index cf393200818..c1a51e4d6c1 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -37,10 +37,6 @@ class CustomSX1262Wrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomSX1262 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSX1262 *)_radio)->getSNR(); } - float packetScore(float snr, int packet_len) override { - int sf = ((CustomSX1262 *)_radio)->spreadingFactor; - return packetScoreInt(snr, sf, packet_len); - } uint8_t getSpreadingFactor() const override { return ((CustomSX1262 *)_radio)->spreadingFactor; } virtual void powerOff() override { ((CustomSX1262 *)_radio)->sleep(false); diff --git a/src/helpers/radiolib/CustomSX1268Wrapper.h b/src/helpers/radiolib/CustomSX1268Wrapper.h index ba1a635e3c0..9a10a41ce42 100644 --- a/src/helpers/radiolib/CustomSX1268Wrapper.h +++ b/src/helpers/radiolib/CustomSX1268Wrapper.h @@ -37,10 +37,6 @@ class CustomSX1268Wrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomSX1268 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSX1268 *)_radio)->getSNR(); } - float packetScore(float snr, int packet_len) override { - int sf = ((CustomSX1268 *)_radio)->spreadingFactor; - return packetScoreInt(snr, sf, packet_len); - } uint8_t getSpreadingFactor() const override { return ((CustomSX1268 *)_radio)->spreadingFactor; } bool supportsRxBoostedGain() const override { return true; } diff --git a/src/helpers/radiolib/CustomSX1276Wrapper.h b/src/helpers/radiolib/CustomSX1276Wrapper.h index 9d75ce12a1b..71a19962a95 100644 --- a/src/helpers/radiolib/CustomSX1276Wrapper.h +++ b/src/helpers/radiolib/CustomSX1276Wrapper.h @@ -28,9 +28,5 @@ class CustomSX1276Wrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomSX1276 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSX1276 *)_radio)->getSNR(); } - float packetScore(float snr, int packet_len) override { - int sf = ((CustomSX1276 *)_radio)->spreadingFactor; - return packetScoreInt(snr, sf, packet_len); - } uint8_t getSpreadingFactor() const override { return ((CustomSX1276 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 02ce834390d..df886161f2f 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -77,7 +77,11 @@ class RadioLibWrapper : public mesh::Radio { virtual float getLastRSSI() const override; virtual float getLastSNR() const override; - float packetScore(float snr, int packet_len) override { return packetScoreInt(snr, 10, packet_len); } // assume sf=10 + // The score depends on the spreading factor, because the SNR a packet needs + // to be decodable rises as the spreading factor falls. Ask the driver for it + // rather than assume one: a guess here is wrong on every radio that does not + // happen to run at that factor, and it silently stays wrong. + float packetScore(float snr, int packet_len) override { return packetScoreInt(snr, getSpreadingFactor(), packet_len); } virtual bool supportsRxBoostedGain() const { return false; } virtual bool setRxBoostedGainMode(bool) { return false; }