From 9d204db5c73b9d69dc09bb3dba282ba998eb3b31 Mon Sep 17 00:00:00 2001 From: liquidraver <504870+liquidraver@users.noreply.github.com> Date: Sun, 12 Jul 2026 14:23:37 +0200 Subject: [PATCH] bump to 1.16.5 --- releasenotes/RELEASE_NOTES_v1.16.5.md | 63 ++++++++++++++++++++- zephcore/CMakeLists.txt | 2 +- zephcore/boards/common/zephcore_common.conf | 2 +- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/releasenotes/RELEASE_NOTES_v1.16.5.md b/releasenotes/RELEASE_NOTES_v1.16.5.md index 8d8e875..09fe1e9 100644 --- a/releasenotes/RELEASE_NOTES_v1.16.5.md +++ b/releasenotes/RELEASE_NOTES_v1.16.5.md @@ -10,7 +10,7 @@ > Your identity, contacts, channels, prefs, and BLE bonds are preserved. After this reflash, OTA and > app-updates work again. > -> **nRF52, classic ESP32 (T-Beam / PICO-D4), STM32WL, and native Linux are unaffected** — upgrade as usual. +> **nRF52, classic ESP32 (T-Beam / PICO-D4 / TTGO LoRa32), STM32WL, and native Linux are unaffected** — upgrade as usual. > > **From v1.16.2 / v1.16.3 / v1.16.4** — clean flash, no re-bond, bonds and data survive. > @@ -24,6 +24,8 @@ The headline of this release is **browser flashing via the Mesh America configurator** — and, in wiring it up, we found and fixed a bug that was silently breaking **WiFi-OTA on every ESP32-S3 / ESP32-C board**. +Alongside it: **Adaptive CAD**, a self-tuning listen-before-talk that calibrates itself to each site; +**V-Contact**, an in-app admin channel for companions; and a batch of LoRa-driver reliability fixes. ## Highlights @@ -44,6 +46,65 @@ The ESP32 app slot moved from `0x20000` to `0x10000` — matching the Arduino / change that fixes OTA above, and it also enables the configurator's fast **app-only update** (rewrites just the app, keeps your settings). Requires the one-time serial reflash (see *Before you upgrade*). +### New: Adaptive CAD — listen-before-talk that tunes itself to your site +Every transmission is preceded by a Channel Activity Detection (CAD) check that listens for other LoRa +traffic and holds off if the channel is busy. How sensitive that check is has always been a single +hardcoded number — but the right value depends on where the node lives. A quiet valley node and a +50-network hilltop need very different thresholds: too sensitive and the node keeps deferring for phantom +traffic (wasted airtime, latency); not sensitive enough and it transmits over real packets (collisions). + +Nodes now **measure their own RF environment and adjust automatically**. In the background, between +transmissions, the radio runs short calibration probes, tracks how often each sensitivity level produces a +false "busy", and settles on the lowest false-positive threshold for *that* site — responding to a +changing environment within an hour or two. It runs on repeaters and companions, and it is **on by +default**; there is nothing to configure. + +- `get cad` — watch what it's doing: the current threshold and per-level false-positive statistics. +- `set cad.auto off` — turn off the auto-adjust to observe or hand-tune with `set cad.offset`. + +Quiet sites end up *more* sensitive than the old fixed default (fewer stomped packets); noisy sites back +off until the false alarms stop. CAD also now uses 4 detection symbols everywhere, which improves detection +of an in-progress packet's payload (not just its preamble). Full guide, including the honest limitation +that the "missed detection" side isn't locally observable, is in +**[ADAPTIVE_CAD.md](https://github.com/liquidraver/ZephCore/blob/master/zephcore/ADAPTIVE_CAD.md)**. +(SX127x boards have no hardware CAD and keep their RSSI-based gate.) + +### New: V-Contact — admin your companion from the chat app, no cable +Companions now expose a special contact named `v`. Chat with it and your messages run the +same text CLI you'd use over USB serial — the reply comes back as ordinary chat messages. It's the easiest +way to check or change settings on a companion in the field without plugging in. + +It's also used for two unsolicited notices: a **restart-reason message** after a reboot (so an unexpected +brownout or watchdog reset is visible instead of silent) and a **one-shot low-battery alert**. The whole +thing is local to your device — the v-contact has no real keypair and **never creates a packet or touches +the radio**, so none of this costs airtime. On by default; toggle the `v_contact_enabled` variable from the +app to disable. + +### LoRa driver reliability (LR1110 / LR2021) +- **Fixed: LR1110 accepted CRC-failed packets.** On the LR11xx/LR20xx family a CRC-failed receive raises + `RX_DONE` and `CRC_ERROR` together; the driver was acting on `RX_DONE` alone and passing corrupt frames + up the stack. It now gates on the error bits (matching the SX126x path). +- **Ported the SX126x preamble-grace / RX-busy handling to LR11xx/LR20xx.** A foreign or noise-triggered + preamble detection could pin the channel-busy state and stall listen-before-talk recovery. The same + SF-aware grace window and header-valid latch the SX126x driver uses now guard the LR path, so a real + packet promotes to "receiving" and a false preamble releases after a bounded window. + +## Other fixes and improvements + +- **Classic ESP32 companion builds** (TTGO LoRa32, T-Beam) now build and link correctly. The Espressif BT + HCI controller node wasn't wired on TTGO LoRa32 (companion needs BLE), and the CLI backing the V-Contact + chat wasn't compiled on plain (non-logging) companion builds — both fixed. Contact-table sizes on these + DRAM-tight classic-ESP32 boards were trimmed to fit alongside the BLE controller. +- **SenseCAP Solar** LED devicetree fix. +- **LilyGo T-Impulse Plus** display fixes (follow-up to the initial port). +- **Repeater + observer hybrid** role wiring fixups (MQTT publisher / uplink credentials / observer mesh). +- **`get`/`set` command keywords are now case-insensitive** (e.g. `Get cad` works). Command *values* — + passwords, node names, keys — remain case-sensitive as they must be. +- **Platform: Zephyr west manifest advanced** (continuing along the `v4.4-branch`). +- **New `-update` build artifacts** for OTA / manual app-only updates, published alongside the full images. +- **Docs:** new `ADAPTIVE_CAD.md`; `Repeater_CLI_commands.md`, `ARCHITECTURE.md`, and `PROVIDER_CATALOG.md` + updated for the above. + ## Recommended upgrade checklist 1. **ESP32-S3 / ESP32-C boards:** flash `-merged.bin` once over USB/serial. WiFi-OTA can't cross this update; data survives. diff --git a/zephcore/CMakeLists.txt b/zephcore/CMakeLists.txt index ef0df39..dc58f96 100644 --- a/zephcore/CMakeLists.txt +++ b/zephcore/CMakeLists.txt @@ -459,7 +459,7 @@ add_definitions(-DFIRMWARE_BUILD_EPOCH=${ZEPHCORE_BUILD_EPOCH}u) # value; the per-app `#ifndef FIRMWARE_VERSION` fallbacks only apply to builds that # bypass this injection. NOTE: the BLE DIS value in boards/common/zephcore_common.conf # (CONFIG_BT_DIS_FW_REV_STR) is Kconfig, not C, so it must be bumped here AND there. -set(ZEPHCORE_FIRMWARE_VERSION "v1.16.4-zephyr") +set(ZEPHCORE_FIRMWARE_VERSION "v1.16.5-zephyr") 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 6fbf755..08a270d 100644 --- a/zephcore/boards/common/zephcore_common.conf +++ b/zephcore/boards/common/zephcore_common.conf @@ -151,7 +151,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="v1.16.4-zephyr" +CONFIG_BT_DIS_FW_REV_STR="v1.16.5-zephyr" CONFIG_BT_DIS_SW_REV=y CONFIG_BT_DIS_SW_REV_STR="Zephyr" CONFIG_BT_DIS_PNP=n