mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-09 14:42:05 +00:00
Fall back to default modem preset if requested bandwidth is too large (#4497)
This commit is contained in:
parent
e3e36e23f9
commit
7a65c8838d
@ -412,72 +412,93 @@ void RadioInterface::applyModemConfig()
|
|||||||
// Set up default configuration
|
// Set up default configuration
|
||||||
// No Sync Words in LORA mode
|
// No Sync Words in LORA mode
|
||||||
meshtastic_Config_LoRaConfig &loraConfig = config.lora;
|
meshtastic_Config_LoRaConfig &loraConfig = config.lora;
|
||||||
if (loraConfig.use_preset) {
|
bool validConfig = false; // We need to check for a valid configuration
|
||||||
|
while (!validConfig) {
|
||||||
|
if (loraConfig.use_preset) {
|
||||||
|
|
||||||
switch (loraConfig.modem_preset) {
|
switch (loraConfig.modem_preset) {
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO:
|
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO:
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 500;
|
bw = (myRegion->wideLora) ? 812.5 : 500;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 7;
|
sf = 7;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST:
|
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST:
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 250;
|
bw = (myRegion->wideLora) ? 812.5 : 250;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 7;
|
sf = 7;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW:
|
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW:
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 250;
|
bw = (myRegion->wideLora) ? 812.5 : 250;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 8;
|
sf = 8;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST:
|
case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST:
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 250;
|
bw = (myRegion->wideLora) ? 812.5 : 250;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 9;
|
sf = 9;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW:
|
case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW:
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 250;
|
bw = (myRegion->wideLora) ? 812.5 : 250;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 10;
|
sf = 10;
|
||||||
break;
|
break;
|
||||||
default: // Config_LoRaConfig_ModemPreset_LONG_FAST is default. Gracefully use this is preset is something illegal.
|
default: // Config_LoRaConfig_ModemPreset_LONG_FAST is default. Gracefully use this is preset is something illegal.
|
||||||
bw = (myRegion->wideLora) ? 812.5 : 250;
|
bw = (myRegion->wideLora) ? 812.5 : 250;
|
||||||
cr = 5;
|
cr = 5;
|
||||||
sf = 11;
|
sf = 11;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE:
|
case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE:
|
||||||
bw = (myRegion->wideLora) ? 406.25 : 125;
|
bw = (myRegion->wideLora) ? 406.25 : 125;
|
||||||
cr = 8;
|
cr = 8;
|
||||||
sf = 11;
|
sf = 11;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW:
|
case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW:
|
||||||
bw = (myRegion->wideLora) ? 406.25 : 125;
|
bw = (myRegion->wideLora) ? 406.25 : 125;
|
||||||
cr = 8;
|
cr = 8;
|
||||||
sf = 12;
|
sf = 12;
|
||||||
break;
|
break;
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW:
|
case meshtastic_Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW:
|
||||||
bw = (myRegion->wideLora) ? 203.125 : 62.5;
|
bw = (myRegion->wideLora) ? 203.125 : 62.5;
|
||||||
cr = 8;
|
cr = 8;
|
||||||
sf = 12;
|
sf = 12;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sf = loraConfig.spread_factor;
|
||||||
|
cr = loraConfig.coding_rate;
|
||||||
|
bw = loraConfig.bandwidth;
|
||||||
|
|
||||||
|
if (bw == 31) // This parameter is not an integer
|
||||||
|
bw = 31.25;
|
||||||
|
if (bw == 62) // Fix for 62.5Khz bandwidth
|
||||||
|
bw = 62.5;
|
||||||
|
if (bw == 200)
|
||||||
|
bw = 203.125;
|
||||||
|
if (bw == 400)
|
||||||
|
bw = 406.25;
|
||||||
|
if (bw == 800)
|
||||||
|
bw = 812.5;
|
||||||
|
if (bw == 1600)
|
||||||
|
bw = 1625.0;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
sf = loraConfig.spread_factor;
|
|
||||||
cr = loraConfig.coding_rate;
|
|
||||||
bw = loraConfig.bandwidth;
|
|
||||||
|
|
||||||
if (bw == 31) // This parameter is not an integer
|
if ((myRegion->freqEnd - myRegion->freqStart) < bw / 1000) {
|
||||||
bw = 31.25;
|
static const char *err_string =
|
||||||
if (bw == 62) // Fix for 62.5Khz bandwidth
|
"Regional frequency range is smaller than bandwidth. Falling back to default preset.\n";
|
||||||
bw = 62.5;
|
LOG_ERROR(err_string);
|
||||||
if (bw == 200)
|
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
|
||||||
bw = 203.125;
|
|
||||||
if (bw == 400)
|
meshtastic_ClientNotification *cn = clientNotificationPool.allocZeroed();
|
||||||
bw = 406.25;
|
cn->level = meshtastic_LogRecord_Level_ERROR;
|
||||||
if (bw == 800)
|
sprintf(cn->message, err_string);
|
||||||
bw = 812.5;
|
service->sendClientNotification(cn);
|
||||||
if (bw == 1600)
|
|
||||||
bw = 1625.0;
|
// Set to default modem preset
|
||||||
|
loraConfig.use_preset = true;
|
||||||
|
loraConfig.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST;
|
||||||
|
} else {
|
||||||
|
validConfig = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
power = loraConfig.tx_power;
|
power = loraConfig.tx_power;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "PointerQueue.h"
|
#include "PointerQueue.h"
|
||||||
#include "airtime.h"
|
#include "airtime.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
#define MAX_TX_QUEUE 16 // max number of packets which can be waiting for transmission
|
#define MAX_TX_QUEUE 16 // max number of packets which can be waiting for transmission
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user