diff --git a/src/configuration.h b/src/configuration.h
index 1b386ec17..91181890b 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -117,6 +117,12 @@ along with this program. If not, see .
#define SX126X_MAX_POWER 22
#endif
+#ifdef HELTEC_V4
+// Power Amps are often non-linear, so we can use an array of values for the power curve
+#define NUM_PA_POINTS 22
+#define TX_GAIN_LORA 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7
+#endif
+
// Default system gain to 0 if not defined
#ifndef TX_GAIN_LORA
#define TX_GAIN_LORA 0
diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp
index 3caee78f8..7ce106317 100644
--- a/src/mesh/FloodingRouter.cpp
+++ b/src/mesh/FloodingRouter.cpp
@@ -54,6 +54,10 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
// We already enqueued the improved copy, so make sure the incoming packet stops here.
return true;
}
+
+ // No queue entry was replaced by this upgraded copy, so treat it as a duplicate to avoid
+ // delivering the same packet to applications/phone twice with different hop limits.
+ seenRecently = true;
}
if (seenRecently) {
diff --git a/src/mesh/NextHopRouter.cpp b/src/mesh/NextHopRouter.cpp
index 4ae0a818e..dce436471 100644
--- a/src/mesh/NextHopRouter.cpp
+++ b/src/mesh/NextHopRouter.cpp
@@ -64,6 +64,10 @@ bool NextHopRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
// We already enqueued the improved copy, so make sure the incoming packet stops here.
return true;
}
+
+ // No queue entry was replaced by this upgraded copy, so treat it as a duplicate to avoid
+ // delivering the same packet to applications/phone twice with different hop limits.
+ seenRecently = true;
}
if (seenRecently) {
diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp
index 31c68c302..b891ec89c 100644
--- a/src/mesh/RadioInterface.cpp
+++ b/src/mesh/RadioInterface.cpp
@@ -674,11 +674,25 @@ void RadioInterface::limitPower(int8_t loraMaxPower)
power = maxPower;
}
+#ifndef NUM_PA_POINTS
if (TX_GAIN_LORA > 0) {
LOG_INFO("Requested Tx power: %d dBm; Device LoRa Tx gain: %d dB", power, TX_GAIN_LORA);
power -= TX_GAIN_LORA;
}
+#else
+ // we have an array of PA gain values. Find the highest power setting that works.
+ const uint16_t tx_gain[NUM_PA_POINTS] = {TX_GAIN_LORA};
+ for (int radio_dbm = 0; radio_dbm < NUM_PA_POINTS; radio_dbm++) {
+ if (((radio_dbm + tx_gain[radio_dbm]) > power) ||
+ ((radio_dbm == (NUM_PA_POINTS - 1)) && ((radio_dbm + tx_gain[radio_dbm]) <= power))) {
+ // we've exceeded the power limit, or hit the max we can do
+ LOG_INFO("Requested Tx power: %d dBm; Device LoRa Tx gain: %d dB", power, tx_gain[radio_dbm]);
+ power -= tx_gain[radio_dbm];
+ break;
+ }
+ }
+#endif
if (power > loraMaxPower) // Clamp power to maximum defined level
power = loraMaxPower;
diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp
index 3fc2562b3..785338483 100644
--- a/src/mesh/SX126xInterface.cpp
+++ b/src/mesh/SX126xInterface.cpp
@@ -80,6 +80,9 @@ template bool SX126xInterface::init()
RadioLibInterface::init();
limitPower(SX126X_MAX_POWER);
+ // Make sure we reach the minimum power supported to turn the chip on (-9dBm)
+ if (power < -9)
+ power = -9;
int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage, useRegulatorLDO);
// \todo Display actual typename of the adapter, not just `SX126x`
@@ -118,8 +121,8 @@ template bool SX126xInterface::init()
LOG_DEBUG("Set DIO2 as %sRF switch, result: %d", dio2AsRfSwitch ? "" : "not ", res);
}
- // If a pin isn't defined, we set it to RADIOLIB_NC, it is safe to always do external RF switching with RADIOLIB_NC as it has
- // no effect
+// If a pin isn't defined, we set it to RADIOLIB_NC, it is safe to always do external RF switching with RADIOLIB_NC as it has
+// no effect
#if ARCH_PORTDUINO
if (res == RADIOLIB_ERR_NONE) {
LOG_DEBUG("Use MCU pin %i as RXEN and pin %i as TXEN to control RF switching", portduino_config.lora_rxen_pin.pin,
diff --git a/variants/esp32s3/heltec_v4/platformio.ini b/variants/esp32s3/heltec_v4/platformio.ini
index 1a448bc99..d0a250ad3 100644
--- a/variants/esp32s3/heltec_v4/platformio.ini
+++ b/variants/esp32s3/heltec_v4/platformio.ini
@@ -8,4 +8,3 @@ build_flags =
-D HELTEC_V4
-I variants/esp32s3/heltec_v4
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
- -D SX126X_MAX_POWER=11