@@ -47,6 +47,19 @@ bool configureRadio()
4747 success = false ;
4848 }
4949
50+ // Force LDRO for low airspeeds
51+ uint16_t airSpeed = convertSettingsToAirSpeed (&settings);
52+ if (airSpeed <= 400 )
53+ {
54+ if (radio.forceLDRO (true ) != RADIOLIB_ERR_NONE)
55+ success = false ;
56+ }
57+ else
58+ {
59+ if (radio.autoLDRO (true ) != RADIOLIB_ERR_NONE)
60+ success = false ;
61+ }
62+
5063 radio.setDio0Action (transactionCompleteISR); // Called when transmission is finished
5164 radio.setDio1Action (hopISR); // Called after a transmission has started, so we can move to next freq
5265
@@ -198,6 +211,25 @@ void convertAirSpeedToSettings(Settings *newSettings, uint16_t airSpeed)
198211 }
199212}
200213
214+ // Given settings, attempt to ID our airSpeed
215+ uint16_t convertSettingsToAirSpeed (Settings *newSettings)
216+ {
217+ uint16_t airSpeed = 0 ;
218+
219+ if ( (newSettings->radioBandwidth == 62.5 ) && (newSettings->radioSpreadFactor == 11 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 40 ;
220+ else if ( (newSettings->radioBandwidth == 62.5 ) && (newSettings->radioSpreadFactor == 10 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 150 ;
221+ else if ( (newSettings->radioBandwidth == 125 ) && (newSettings->radioSpreadFactor == 10 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 400 ;
222+ else if ( (newSettings->radioBandwidth == 125 ) && (newSettings->radioSpreadFactor == 9 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 1200 ;
223+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 10 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 2400 ;
224+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 9 ) && (newSettings->radioCodingRate == 8 ) ) airSpeed = 4800 ;
225+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 8 ) && (newSettings->radioCodingRate == 7 ) ) airSpeed = 9600 ;
226+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 7 ) && (newSettings->radioCodingRate == 7 ) ) airSpeed = 19200 ;
227+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 6 ) && (newSettings->radioCodingRate == 6 ) ) airSpeed = 28800 ;
228+ else if ( (newSettings->radioBandwidth == 500 ) && (newSettings->radioSpreadFactor == 6 ) && (newSettings->radioCodingRate == 5 ) ) airSpeed = 38400 ;
229+
230+ return (airSpeed);
231+ }
232+
201233// Set radio frequency
202234bool setRadioFrequency (bool rxAdjust)
203235{
@@ -3352,7 +3384,7 @@ void syncChannelTimer(uint32_t frameAirTimeUsec, bool clockStarting)
33523384 // For low speed operation move the TX start into the current dwell time period
33533385 // to make the rest of the math look like the 4800 BPS operation.
33543386 frameAirTimeMsec = settings.maxDwellTime - msToNextHopRemote
3355- + (frameAirTimeUsec + settings.txToRxUsec + micros () - transactionCompleteMicros) / 1000 ;
3387+ + (frameAirTimeUsec + settings.txToRxUsec + micros () - transactionCompleteMicros) / 1000 ;
33563388 while (frameAirTimeMsec >= (settings.maxDwellTime + (settings.maxDwellTime >> 6 )))
33573389 {
33583390 frameAirTimeMsec -= settings.maxDwellTime ;
0 commit comments