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() {