From 394eefec51917c69c7983d4d3b85ee1e1e5f5d7d Mon Sep 17 00:00:00 2001 From: liquidraver <504870+liquidraver@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:46:04 +0200 Subject: [PATCH] bump to 1.16.7 --- releasenotes/RELEASE_NOTES_1.16.7-zephcore.md | 108 ++++++++++++++++++ zephcore/CMakeLists.txt | 2 +- zephcore/boards/common/zephcore_common.conf | 2 +- 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 releasenotes/RELEASE_NOTES_1.16.7-zephcore.md diff --git a/releasenotes/RELEASE_NOTES_1.16.7-zephcore.md b/releasenotes/RELEASE_NOTES_1.16.7-zephcore.md new file mode 100644 index 0000000..9633d44 --- /dev/null +++ b/releasenotes/RELEASE_NOTES_1.16.7-zephcore.md @@ -0,0 +1,108 @@ +# ZephCore 1.16.7-zephcore + +> [!IMPORTANT] +> ## Before you upgrade +> +> **From v1.16.6 / v1.16.5** — clean flash, no re-bond, bonds and data survive. +> +> **From v1.16.2 / v1.16.3 / v1.16.4** — clean flash, bonds and data survive. If you are on an +> **ESP32-S3 / ESP32-C board** and have *not* yet taken the v1.16.5 update, you still owe the one-time +> serial reflash: the app moved to flash offset `0x10000` in v1.16.5, and a board on the old layout +> cannot cross that update over WiFi-OTA or the browser flasher — **flash the `-merged.bin` once over +> USB/serial.** Affected boards: *Heltec V3 / V4 / V4.3, Station G2, Wireless Tracker / V2, XIAO +> ESP32-S3 / C3 / C6, LilyGo T-Lora C6.* Identity, contacts, channels, prefs, and BLE bonds are +> preserved. nRF52, classic ESP32 (T-Beam / PICO-D4 / TTGO LoRa32), STM32WL, and native Linux are +> unaffected. +> +> **From v1.16.1 or older** — flash it; on first boot it clears BLE bonds automatically (identity, +> contacts, channels, prefs preserved). Re-bond your phone/desktop once. +> +> **Coming from Arduino MeshCore** — flash it; auto-formats on first boot (new identity, clean storage). +> +> Take this with a grain of salt — try the formatters if anything anomalous happens with your node. + +--- + +A stability-and-hardware release. The headline is a **whole-node wedge fixed** in the GPS power-management +path that shipped in v1.16.6, plus **RX duty cycle finally working on LR1110 boards** and a new safety +margin that stops signal-independent duty-cycle packet drops on every radio. Rounded out by joystick-UI +fixes and a color-display improvement for the Heltec T114. + +## Highlights + +### Fixed: a GPS node could wedge completely on standby (regression in v1.16.6) + +v1.16.6 introduced GPS-UART suspend to save power (an armed nRF UARTE receiver costs ~0.5–1 mA even with +the GPS module powered down). It had a race that could **hang the entire node** — no LoRa, no USB, no BLE, +CLI answering `-> busy`, recoverable only by reboot. + +The upstream nRF UARTE suspend path spins forever waiting for an `RXTO` event after issuing `STOPRX`. In +interrupt-driven mode the receiver runs one byte at a time and re-arms from its ISR; if a byte happened to +finish in the narrow window where the driver had already disabled the `ENDRX` interrupt, the receiver was +left stopped-and-un-rearmed, `STOPRX` produced no `RXTO`, and the wait never returned — with the main mesh +thread stuck inside it. Any nRF board that powers its GPS module down and suspends the port on standby +could hit this. + +Fixed in two independent layers, so neither alone is load-bearing: + +- **`ZephyrGPSManager` settles ~5 ms before suspending** the GPS UART, letting the last in-flight byte + finish and the RX ISR re-arm, so the receiver is armed-and-idle when `STOPRX` fires — the state that + reliably yields `RXTO`. Standby happens at most every few minutes, so the cost is negligible. +- **New patch `0010` bounds the driver's `RXTO` wait** to 4 ms instead of spinning forever. On timeout it + falls through to the unconditional `nrf_uarte_disable()` that force-stops the receiver anyway — so even + if a byte still lands in the race window, the node can never hang. + +### RX duty cycle now works on LR1110 boards + +LR1110 boards (T1000-E, ThinkNode M9, and other LR11xx radios) now get real **RX duty-cycle sniff mode** +instead of sitting in continuous receive — a substantial receive-power saving on battery nodes, the same +mechanism SX126x boards have had. This took a significant rework of the LR11xx LoRa driver to land +correctly. + +### New: duty-cycle safety margin stops signal-independent packet drops + +`set`-able via `CONFIG_ZEPHCORE_LORA_DC_MARGIN_PCT` (default **15%**), shared by every radio +(SX126x / LR11xx / LR20xx). + +The theoretical per-cycle "deaf-time" budget that duty cycle is computed from assumes the sleep clock and +the wake transition are exact. They are not: the chip's sleep timer runs on an internal RC oscillator +(RC64k on SX126x, RTC on LR11xx) that drifts several percent over temperature, and the wake-transition +figure is a datasheet number the datasheet itself calls "not accurate and may vary." Either overshoot +silently pushes real deaf time past the budget and drops exactly the fraction of packets whose preamble +phase lands on the window edge — a **strength-independent loss that shows up as random duty-cycle packet +drops**, not as weak-signal loss. + +The margin derates the whole budget before the sleep period is programmed, trading a little radio-off time +for robustness. Set it to `0` to restore the old zero-margin behaviour; lower it below 15% once you have +measured your board's clock-plus-transition on air. + +### Joystick UI fixes + +- **The 2-tap and 5-tap actions were swapped.** The everyday action (LED heartbeat toggle) is now **2 taps** + and the rarer one (flood advert) is **5 taps** — matching the button-UI mapping and the on-device help. + Applies to both the joystick UI and single-button boards. +- **Fixed: a node booted with LEDs disabled could never turn its LEDs back on from the UI.** The toggle + called only the heartbeat helper and left the underlying `leds_disabled` gate at its boot value, so + `leds_disabled=1` was effectively one-way. It now flips the real gate. +- **The LED toggle now shows an on-screen "LEDs: ON / OFF" confirmation**, so you can tell it registered. + +### Heltec T114 color display improvements + +From [PR #62](https://github.com/liquidraver/ZephCore/pull/62) by [@Calvario](https://github.com/Calvario): +the button UI now **respects `CONFIG_ZEPHCORE_DISPLAY_LARGE_FONT`** on color panels, and the gray used for +secondary text was retuned (`0x8410` → `0xEF7D`) so it actually reads as a visible gray on the T114's TFT, +which crushes darker grays to invisibility. Thanks to Steve Calvário. + +## Other changes + +- **west manifest bumped** (routine pinned-tree advance). + +## Recommended upgrade checklist + +1. **Running v1.16.6 on a GPS-equipped nRF node?** Update — this release fixes the standby wedge described + above. Bonds and data survive. +2. **ESP32-S3 / ESP32-C boards that skipped v1.16.5:** flash `-merged.bin` once over USB/serial. Data survives. +3. **Everything else, from v1.16.2 onward:** just flash — bonds and data survive. +4. **From v1.16.1 or older:** just flash — self-migrates on first boot; re-bond once. +5. **From Official MeshCore:** just flash — auto-formats on first boot. +6. **Anything odd?** Format first. diff --git a/zephcore/CMakeLists.txt b/zephcore/CMakeLists.txt index 02be58b..dae5ef7 100644 --- a/zephcore/CMakeLists.txt +++ b/zephcore/CMakeLists.txt @@ -464,7 +464,7 @@ add_definitions(-DFIRMWARE_BUILD_EPOCH=${ZEPHCORE_BUILD_EPOCH}u) # release is tagged/named, and what the Mesh America catalog uses as its version # key — so the configurator can match a running device against the catalog. Keep # all four identical; the release workflow reads this value directly. -set(ZEPHCORE_FIRMWARE_VERSION "1.16.6-zephcore") +set(ZEPHCORE_FIRMWARE_VERSION "1.16.7-zephcore") add_definitions(-DFIRMWARE_VERSION="${ZEPHCORE_FIRMWARE_VERSION}") add_subdirectory(lib/monocypher) diff --git a/zephcore/boards/common/zephcore_common.conf b/zephcore/boards/common/zephcore_common.conf index 1d5f015..8de6d2b 100644 --- a/zephcore/boards/common/zephcore_common.conf +++ b/zephcore/boards/common/zephcore_common.conf @@ -156,7 +156,7 @@ CONFIG_BT_DIS_FW_REV=y # of truth for the C side, injected as -DFIRMWARE_VERSION). This Kconfig value can't # read a C macro, so it must be bumped here too. Phones that read DIS and phones # that query CMD_DEVICE_QUERY should see the same version. -CONFIG_BT_DIS_FW_REV_STR="1.16.6-zephcore" +CONFIG_BT_DIS_FW_REV_STR="1.16.7-zephcore" CONFIG_BT_DIS_SW_REV=y CONFIG_BT_DIS_SW_REV_STR="Zephyr" CONFIG_BT_DIS_PNP=n