Offband offband-v1.1.2
Companion GPS auto-baud + on-demand GPS status, plus the wedge/time fixes
found while validating it on real hardware, and a safer first-flash default — a
fresh Observer no longer auto-publishes to a preset MQTT broker. Still on the
MeshCore 1.16.0 base.
Added
- GPS auto-baud detection — the companion now detects the GPS modem's baud rate at
runtime (probing 115200 then 9600, validating by a checksum-good NMEA sentence), so one
image reads either a standard 9600 module or a 115200 one with no rebuild. It re-probes
on a GPS enable and keeps trying if a modem is slow to start at boot. (#216, #233) - On-demand GPS status to the app (
0xC1) — the client can query live GPS state
(enabled / detected / fix / baud / lat / lon / alt / sats / time) instead of only seeing
position at connect. (#216) - On-device build identity — an optional build tag shows on the app device-info
field and the OLED splash, so a specific build is identifiable without a serial
console. (#222)
Changed
- Fresh flashes no longer auto-publish to OKIMesh CoreScope. A newly-flashed
Observer previously seeded the CoreScope (Dayton) broker enabled, so a device
flashed anywhere in the world immediately fed MQTT to OKIMesh CoreScope tagged as a
Dayton node. On a fresh flash every broker now ships disabled — the operator
opts in per slot. (#262) - Default region is now
XYZ(a non-geographic placeholder) instead ofHAO
(Dayton), so an out-of-region device stops mislabeling itself until the operator sets
its region viamqtt iata. Fresh / NVS-erased devices only; existing devices keep
their stored config. (#262)
Fixed
- GPS at high baud could wedge BLE. An unbounded GPS read loop let a fast modem
(e.g. 115200, multi-constellation) monopolize the main loop and starve BLE — the app
would slog or stall. GPS ingestion is now bounded per loop. (#231) - GPS time showed garbage before the date was acquired. A position fix can arrive
before the calendar date; the device now reportstime=0("acquiring") until a real
date is parsed, instead of a wrapped-garbage timestamp. (#232)
Internal
- Build/governance tooling + GPS design & diagnostic records — no firmware-behavior
change. (#214, #217–#219)
Which file do I download?
| File | What it is | When to use it |
|---|---|---|
*-merged.bin (ESP32 — Heltec V3/V4, XIAO) |
Full image — bootloader + partition table + app in one, flashed at 0x0 after a chip erase. Self-contained, works on a blank chip. |
First install / clean setup. In a web flasher this is the "Full Firmware" option. |
*.bin (ESP32) |
App only — flashed at the app offset (0x10000); the bootloader must already be on the chip. |
Updating an existing node — OTA / "Update Only." Keeps the device identity + WiFi/MQTT config. |
*.uf2 (nRF52 — RAK, T-Echo, XIAO nRF52) |
Complete self-contained image. | First install and updates — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.) |
⚠️ ESP32: the app-only*.binwill not boot if flashed at0x0— use*-merged.binfor a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, never a routine update.
What's Changed
- fix(#239): round CLI frequency output to 3 decimals (ftoa3) by @Strycher in #240
- docs(#244): block-user firmware<->app architectural contract by @Strycher in #245
- feat(#241): Block/Ignore Users — firmware half (BlockStore + 0xC2 sync + DM-drop) by @Strycher in #247
- chore: sync pre-commit to canonical (§0.6) + pin DW_PROJECT=Crosswire by @Strycher in #249
- fix(#251): pio-flash ESP32-S3 USB-Serial/JTAG robustness by @Strycher in #252
- chore(crosswire): deploy session-identity hook + SessionStart wiring + gitignore by @Strycher in #269
- chore(#270): session-state.py sources identity from session-identity.py by @Strycher in #271
- fix(#262): don't auto-enable OKIMesh CoreScope on fresh flash + default region XYZ by @Strycher in #272
Full Changelog: offband-v1.1.2-rc1...offband-v1.1.2