diff --git a/data_embed/index.html b/data_embed/index.html index bf5511e..a05e683 100644 --- a/data_embed/index.html +++ b/data_embed/index.html @@ -1429,8 +1429,8 @@ body{background:var(--msh-bg);color:var(--msh-text);font-family:"Inter",system-u name="lora.power" id="lora.power" placeholder="20" - min="0" - max="20" + min="2" + max="22" step="1" class="form-control" required="" diff --git a/src/lora_utils.cpp b/src/lora_utils.cpp index b3dc4f1..afb1a9a 100644 --- a/src/lora_utils.cpp +++ b/src/lora_utils.cpp @@ -69,6 +69,18 @@ int rssi, freqError; float snr; APRSPacket lastAprsPacket; +#if defined(HAS_SX1278) || defined(HAS_SX1276) + #define CHIP_MIN_POWER 2 // PA_BOOST (below 2 RadioLib switches to RFO, not wired on most modules) + #define CHIP_MAX_POWER 20 +#else // SX1262 / SX1268 / LLCC68 + #define CHIP_MIN_POWER -9 + #define CHIP_MAX_POWER 22 +#endif + +#ifndef RADIO_MAX_POWER // optional per board in board_pinout.h (e.g. 1W PA modules) + #define RADIO_MAX_POWER CHIP_MAX_POWER +#endif + namespace LoRa_Utils { @@ -85,6 +97,15 @@ namespace LoRa_Utils { operationDone = true; } + int validPower(int requested) { + const int maxPower = (RADIO_MAX_POWER < CHIP_MAX_POWER) ? RADIO_MAX_POWER : CHIP_MAX_POWER; + int power = constrain(requested, CHIP_MIN_POWER, maxPower); + #if defined(HAS_SX1278) || defined(HAS_SX1276) + if (power > 17 && power < 20) power = 17; // SX127x PA_BOOST: only 2-17 or 20 + #endif + return power; + } + void setup() { #if defined (LIGHTGATEWAY_1_0) || defined(LIGHTGATEWAY_PLUS_1_0) pinMode(RADIO_VCC_PIN,OUTPUT); @@ -136,16 +157,17 @@ namespace LoRa_Utils { radio.setDio2AsRfSwitch(true); #endif*/ - #ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) / Ebyte E220 400M30S (LLCC68) - state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp - radio.setCurrentLimit(140); // to be validated (100 , 120, 140)? - #endif + int power = validPower(Config.loramodule.power); + if (power != Config.loramodule.power) { + Utils::println("LoRa power adjusted: " + String(Config.loramodule.power) + " -> " + String(power)); + } + state = radio.setOutputPower(power); + if (state != RADIOLIB_ERR_NONE) { + Utils::println("LoRa setOutputPower failed! State: " + String(state)); // log and keep going + } #if defined(HAS_SX1278) || defined(HAS_SX1276) - state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 400M30S as it has Low Noise Amp radio.setCurrentLimit(120); // OCP ceiling for SX127x: ~120mA needed at +20dBm (not a fixed consumption) - #endif - #if (defined(HAS_SX1268) || defined(HAS_SX1262)) && !defined(HAS_1W_LORA) - state = radio.setOutputPower(Config.loramodule.power + 2); // values available: 10, 17, 22 --> if 20 in tracker_conf.json it will be updated to 22. + #else // SX1262 / SX1268 / LLCC68 (also 1W Ebyte E22 / E220 modules) radio.setCurrentLimit(140); #endif @@ -160,12 +182,7 @@ namespace LoRa_Utils { radio.setTCXO(1.8); #endif - if (state == RADIOLIB_ERR_NONE) { - Utils::println("init : LoRa Module ... done!"); - } else { - Utils::println("Starting LoRa failed! State: " + String(state)); - while (true); - } + Utils::println("init : LoRa Module ... done!"); } void changeFreqTx() {