diff --git a/src/helpers/radiolib/CustomLLCC68Wrapper.h b/src/helpers/radiolib/CustomLLCC68Wrapper.h index f7dd7a9f..b48ae58e 100644 --- a/src/helpers/radiolib/CustomLLCC68Wrapper.h +++ b/src/helpers/radiolib/CustomLLCC68Wrapper.h @@ -14,9 +14,5 @@ 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); - } + int getCurrentSF() const override { return ((CustomLLCC68 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/CustomLR1110Wrapper.h b/src/helpers/radiolib/CustomLR1110Wrapper.h index 947bb51d..da1a742f 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -23,4 +23,5 @@ class CustomLR1110Wrapper : public RadioLibWrapper { float getLastRSSI() const override { return ((CustomLR1110 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); } int16_t setRxBoostedGainMode(bool en) { return ((CustomLR1110 *)_radio)->setRxBoostedGainMode(en); }; + int getCurrentSF() const override { return ((CustomLR1110 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/CustomSTM32WLxWrapper.h b/src/helpers/radiolib/CustomSTM32WLxWrapper.h index 9e2d0441..67ba5e30 100644 --- a/src/helpers/radiolib/CustomSTM32WLxWrapper.h +++ b/src/helpers/radiolib/CustomSTM32WLxWrapper.h @@ -15,9 +15,5 @@ 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); - } + int getCurrentSF() const override { return ((CustomSTM32WLx *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index 119f6dce..a2e546dc 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -14,9 +14,5 @@ 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); - } + int getCurrentSF() const override { return ((CustomSX1262 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/CustomSX1268Wrapper.h b/src/helpers/radiolib/CustomSX1268Wrapper.h index 5d7106b4..3365c066 100644 --- a/src/helpers/radiolib/CustomSX1268Wrapper.h +++ b/src/helpers/radiolib/CustomSX1268Wrapper.h @@ -14,9 +14,5 @@ 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); - } + int getCurrentSF() const override { return ((CustomSX1268 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/CustomSX1276Wrapper.h b/src/helpers/radiolib/CustomSX1276Wrapper.h index 28257990..b3aa4292 100644 --- a/src/helpers/radiolib/CustomSX1276Wrapper.h +++ b/src/helpers/radiolib/CustomSX1276Wrapper.h @@ -14,9 +14,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); - } + int getCurrentSF() const override { return ((CustomSX1276 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 9014743a..332a746d 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -178,13 +178,16 @@ static float snr_threshold[] = { -20 // SF12 needs at least -20 dB SNR }; -float RadioLibWrapper::packetScoreInt(float snr, int sf, int packet_len) { +float RadioLibWrapper::packetScoreByAirtime(float snr, int sf, uint32_t airtime_ms) { if (sf < 7) return 0.0f; - - if (snr < snr_threshold[sf - 7]) return 0.0f; // Below threshold, no chance of success - - auto success_rate_based_on_snr = (snr - snr_threshold[sf - 7]) / 10.0; - auto collision_penalty = 1 - (packet_len / 256.0); // Assuming max packet of 256 bytes - - return max(0.0, min(1.0, success_rate_based_on_snr * collision_penalty)); + if (snr < snr_threshold[sf - 7]) return 0.0f; + + float success = (snr - snr_threshold[sf - 7]) / 10.0f; + // Penalize by time-on-air to account for BW/CR/SF. + // 0 ms => no penalty, ~300 ms+ => strong penalty (tunable). + float airtime_penalty = 1.0f - min(1.0f, (float)airtime_ms / 300.0f); + float score = success * airtime_penalty; + if (score < 0.0f) score = 0.0f; + if (score > 1.0f) score = 1.0f; + return score; } diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 25cc5358..73ad821e 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -14,7 +14,7 @@ class RadioLibWrapper : public mesh::Radio { void idle(); void startRecv(); - float packetScoreInt(float snr, int sf, int packet_len); + float packetScoreByAirtime(float snr, int sf, uint32_t airtime_ms); virtual bool isReceivingPacket() =0; public: @@ -50,7 +50,9 @@ 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 + // Default assumed SF=10, kept as fallback for backward compatibility. + virtual int getCurrentSF() const { return 10; } + float packetScore(float snr, int packet_len) override { return packetScoreByAirtime(snr, getCurrentSF(), getEstAirtimeFor(packet_len)); } }; /**