From 12939eea89b87fec92ed16b3dfea77bb3428f28e Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Fri, 19 Dec 2025 12:51:11 +0100 Subject: [PATCH 1/7] increase timeouts --- examples/companion_radio/MyMesh.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 3a31893cc..849fe465a 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -85,10 +85,10 @@ #define RESP_CODE_TUNING_PARAMS 23 #define RESP_CODE_STATS 24 // v8+, second byte is stats type -#define SEND_TIMEOUT_BASE_MILLIS 500 +#define SEND_TIMEOUT_BASE_MILLIS 1000 // Increased from 500 for 3-hop reliability #define FLOOD_SEND_TIMEOUT_FACTOR 16.0f -#define DIRECT_SEND_PERHOP_FACTOR 6.0f -#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 250 +#define DIRECT_SEND_PERHOP_FACTOR 10.0f // Increased from 6.0 for congested repeaters +#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 500 // Increased from 250 for queueing delays #define LAZY_CONTACTS_WRITE_DELAY 5000 #define PUBLIC_GROUP_PSK "izOH6cXN6mrJ5e26oRXNcg==" From c2f320ce8a256de59a59f601e56103702c961edb Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Sat, 10 Jan 2026 18:21:32 +0100 Subject: [PATCH 2/7] Allow getting prv.key over LoRa --- src/helpers/CommonCLI.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 301ae6582..340195a28 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -265,7 +265,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2); } else if (memcmp(config, "guest.password", 14) == 0) { sprintf(reply, "> %s", _prefs->guest_password); - } else if (sender_timestamp == 0 && memcmp(config, "prv.key", 7) == 0) { // from serial command line only + } else if (memcmp(config, "prv.key", 7) == 0) { // requires admin authentication when remote uint8_t prv_key[PRV_KEY_SIZE]; int len = _callbacks->getSelfId().writeTo(prv_key, PRV_KEY_SIZE); mesh::Utils::toHex(tmp, prv_key, len); @@ -387,8 +387,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch StrHelper::strncpy(_prefs->guest_password, &config[15], sizeof(_prefs->guest_password)); savePrefs(); strcpy(reply, "OK"); - } else if (sender_timestamp == 0 && - memcmp(config, "prv.key ", 8) == 0) { // from serial command line only + } else if (memcmp(config, "prv.key ", 8) == 0) { // requires admin authentication when remote uint8_t prv_key[PRV_KEY_SIZE]; bool success = mesh::Utils::fromHex(prv_key, PRV_KEY_SIZE, &config[8]); if (success) { From df0464c32e0afe6343371a813f321ec05bbcf8a0 Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Sat, 10 Jan 2026 18:26:58 +0100 Subject: [PATCH 3/7] Slight delay for GC1109 FEM power-up --- variants/heltec_v4/HeltecV4Board.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/heltec_v4/HeltecV4Board.cpp b/variants/heltec_v4/HeltecV4Board.cpp index 18caeca15..fa17721c3 100644 --- a/variants/heltec_v4/HeltecV4Board.cpp +++ b/variants/heltec_v4/HeltecV4Board.cpp @@ -33,6 +33,7 @@ void HeltecV4Board::begin() { // CSD (GPIO2): Chip enable - must be HIGH for GC1109 to work pinMode(P_LORA_PA_EN, OUTPUT); digitalWrite(P_LORA_PA_EN, HIGH); + delay(1); // Allow GC1109 FEM time to power up } periph_power.begin(); From 006c0afd9507d3d59f3c2bd079edacffe84a61f1 Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Tue, 6 Jan 2026 12:16:49 +0100 Subject: [PATCH 4/7] Patch SX1262 register --- src/helpers/radiolib/CustomSX1262.h | 17 +++++++++++++++-- variants/heltec_v4/platformio.ini | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/helpers/radiolib/CustomSX1262.h b/src/helpers/radiolib/CustomSX1262.h index bfaea7c76..476996638 100644 --- a/src/helpers/radiolib/CustomSX1262.h +++ b/src/helpers/radiolib/CustomSX1262.h @@ -56,7 +56,7 @@ class CustomSX1262 : public SX1262 { } setCRC(1); - + #ifdef SX126X_CURRENT_LIMIT setCurrentLimit(SX126X_CURRENT_LIMIT); #endif @@ -74,7 +74,20 @@ class CustomSX1262 : public SX1262 { #define SX126X_TXEN RADIOLIB_NC #endif setRfSwitchPins(SX126X_RXEN, SX126X_TXEN); - #endif + #endif + + #ifdef SX126X_SEMTECH_PATCH + // Apply Semtech-recommended register modification for improved performance + // This writes to register 0x08B5 as suggested by Semtech + uint8_t regValue = 0x01; // Enable the register + int16_t regStatus = writeRegister(0x08B5, ®Value, 1); + if (regStatus == RADIOLIB_ERR_NONE) { + Serial.println("SX126x begin 0X8B5 enabled"); + } else { + Serial.print("SX126x register 0X8B5 write failed: "); + Serial.println(regStatus); + } + #endif return true; // success } diff --git a/variants/heltec_v4/platformio.ini b/variants/heltec_v4/platformio.ini index 44c4f00a1..1ae1d6f8f 100644 --- a/variants/heltec_v4/platformio.ini +++ b/variants/heltec_v4/platformio.ini @@ -33,6 +33,7 @@ build_flags = -D SX126X_RX_BOOSTED_GAIN=1 ; GC1109 FEM: TX/RX switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH) ; GPIO46 is CPS (power save), not TX control - do not use for RF switching + -D SX126X_SEMTECH_PATCH=1 -D PIN_GPS_RX=38 -D PIN_GPS_TX=39 -D PIN_GPS_RESET=42 From 617327511662bf4bdd51ef216ccf5af4e114b13f Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Sat, 10 Jan 2026 18:37:19 +0100 Subject: [PATCH 5/7] Heltec v4 battery voltage (works on my device) --- variants/heltec_v4/HeltecV4Board.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/heltec_v4/HeltecV4Board.cpp b/variants/heltec_v4/HeltecV4Board.cpp index fa17721c3..535b4b091 100644 --- a/variants/heltec_v4/HeltecV4Board.cpp +++ b/variants/heltec_v4/HeltecV4Board.cpp @@ -100,7 +100,7 @@ void HeltecV4Board::begin() { digitalWrite(PIN_ADC_CTRL, LOW); - return (5.42 * (3.3 / 1024.0) * raw) * 1000; + return (5.23 * (3.325 / 1024.0) * raw) * 1000; } const char* HeltecV4Board::getManufacturerName() const { From 7bf4bbe4a17564944323975735ae0aa4cc322f68 Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Sun, 11 Jan 2026 15:30:17 +0100 Subject: [PATCH 6/7] Add flag for heltec tracker v2 --- variants/heltec_tracker_v2/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/heltec_tracker_v2/platformio.ini b/variants/heltec_tracker_v2/platformio.ini index 21fe2325a..c076c28ab 100644 --- a/variants/heltec_tracker_v2/platformio.ini +++ b/variants/heltec_tracker_v2/platformio.ini @@ -28,6 +28,7 @@ build_flags = -D SX126X_RX_BOOSTED_GAIN=1 ; GC1109 FEM: TX/RX switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH) ; GPIO46 is CPS (PA mode), not TX control - do not use for RF switching + -D SX126X_SEMTECH_PATCH=1 -D PIN_BOARD_SDA=5 -D PIN_BOARD_SCL=6 -D PIN_USER_BTN=0 From 307fe091ff19eb3e38f38f3074e3617b70ca0d9d Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Mon, 12 Jan 2026 10:39:02 +0100 Subject: [PATCH 7/7] Read-then-write --- src/helpers/radiolib/CustomSX1262.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/helpers/radiolib/CustomSX1262.h b/src/helpers/radiolib/CustomSX1262.h index 476996638..3e22ca692 100644 --- a/src/helpers/radiolib/CustomSX1262.h +++ b/src/helpers/radiolib/CustomSX1262.h @@ -78,13 +78,20 @@ class CustomSX1262 : public SX1262 { #ifdef SX126X_SEMTECH_PATCH // Apply Semtech-recommended register modification for improved performance - // This writes to register 0x08B5 as suggested by Semtech - uint8_t regValue = 0x01; // Enable the register - int16_t regStatus = writeRegister(0x08B5, ®Value, 1); + // Read-modify-write to register 0x08B5 to set bit 0 while preserving other bits + uint8_t regValue = 0; + int16_t regStatus = readRegister(0x08B5, ®Value, 1); if (regStatus == RADIOLIB_ERR_NONE) { - Serial.println("SX126x begin 0X8B5 enabled"); + regValue |= 0x01; // Set bit 0 while preserving other bits + regStatus = writeRegister(0x08B5, ®Value, 1); + if (regStatus == RADIOLIB_ERR_NONE) { + Serial.println("SX126x begin 0X8B5 enabled"); + } else { + Serial.print("SX126x register 0X8B5 write failed: "); + Serial.println(regStatus); + } } else { - Serial.print("SX126x register 0X8B5 write failed: "); + Serial.print("SX126x register 0X8B5 read failed: "); Serial.println(regStatus); } #endif @@ -97,4 +104,4 @@ class CustomSX1262 : public SX1262 { bool detected = (irq & SX126X_IRQ_HEADER_VALID) || (irq & SX126X_IRQ_PREAMBLE_DETECTED); return detected; } -}; \ No newline at end of file +};