Commit Graph
53 Commits
Author SHA1 Message Date
mikecarper eb4ca56f1b docs: document role feature switches and audit 1.17.1.5 guidance 2026-09-05 23:01:58 -07:00
mikecarper 49dcba5c6e Add retained-RAM staging for nRF52 mOTA 2026-09-05 12:08:21 -07:00
mikecarper e2da2701da Support 2 KiB DEFLATE OTA transport 2026-09-03 01:07:06 -07:00
mikecarper 3f6eddd5c2 Add compressed 171-byte OTA transport 2026-09-02 19:24:01 -07:00
mikecarper 9fd580c89e Harden marathon-tested OTA and hardware paths
Add durable TempRadio, ACL, clock, bridge, GPS/I2C, USB logging, and Indicator recovery safeguards together with expanded automation, build/profile contracts, release metadata, and the hardware validation ledger.
2026-08-30 19:26:15 -07:00
mikecarper b40d2e6cb2 fix: harden LoRa OTA chain and storage 2026-08-29 06:58:48 -07:00
mikecarper 69ded9d6c7 feat: add Bluetooth-controlled LoRa OTA
Add the framed BLE mOTA transport and companion control path, complete the full-profile build and runtime fixes, and document and test the OTA workflow.
2026-08-27 01:22:18 -07:00
mikecarper bd3a94bddb fix: harden firmware builds and runtime reliability 2026-08-26 15:42:12 -07:00
mikecarper 5362d36ac7 Unify full firmware profiles and add dual USB logging 2026-08-23 19:22:45 -07:00
mikecarper 142d166252 Unify OTA picker capabilities 2026-08-23 09:00:37 -07:00
mikecarper 4d5ccbdd98 Retain GPS in RAK nRF52 OTA repeaters 2026-08-22 13:27:01 -07:00
mikecarper d9f5dfa8a2 Harden signed SD and bootloader OTA 2026-08-21 12:15:54 -07:00
mikecarper 3d78d9c846 Add MeshTower SD bootloader updates over LoRa 2026-08-21 09:55:15 -07:00
mikecarper 177eb06745 Add shared-slot nRF52 bootloader updates 2026-08-21 00:55:01 -07:00
mikecarper 75a2b8f002 Add signed XIAO bootloader updates over LoRa 2026-08-20 22:05:11 -07:00
mikecarper 72a9fd765b Wait for QSPI flash operations to complete 2026-08-20 18:48:03 -07:00
mikecarper 509f831442 Add external QSPI staging for nRF52 OTA 2026-08-20 17:51:52 -07:00
mikecarper 67ed933a67 Expand companion offline queues 2026-08-19 17:32:05 -07:00
mikecarper f6c9d5a87f Document legacy OTA airtime tuning 2026-08-19 11:54:19 -07:00
mikecarper d37fefc204 Avoid legacy OTA proof collisions 2026-08-19 11:43:25 -07:00
mikecarper 425e8c81f3 Harden and qualify compact RAK3401 OTA updates 2026-08-19 11:17:22 -07:00
mikecarper e742333a0e Update MeshCore features and OTA layout handling 2026-08-18 23:17:42 -07:00
mikecarper 7a4da3ccfb Fix Cascade power saving, USB Companion, and mOTA flows 2026-08-18 14:02:10 -07:00
mikecarper 8c5262c6f8 Accelerate adaptive LoRa OTA transfers 2026-08-14 03:00:36 -07:00
mikecarper cd824765b4 Prioritize and pace private TempRadio OTA 2026-08-13 17:53:33 -07:00
mikecarper f7c2d382c3 Speed up and harden LoRa OTA transfers 2026-08-13 14:43:59 -07:00
mikecarper 4a3d86ef98 Add guarded nRF52 OTA rescue and SF5 test mode 2026-08-13 09:31:26 -07:00
mikecarper c0aeb8fc3a Pipeline OTA downloads and adapt relay timing 2026-08-13 00:38:17 -07:00
mikecarper c96bdd6eeb Size-optimize nRF52 LoRa OTA builds 2026-08-11 16:54:49 -07:00
mikecarper eed6581299 Add persistent SD OTA archive support 2026-08-04 17:33:17 -07:00
mikecarper 4ed3307c6c Add MeshTower V2 SD-backed LoRa OTA 2026-08-03 12:49:36 -07:00
mikecarper 60d99d099b Restore WiFi OTA to lean ESP32 builds 2026-07-31 16:01:07 -07:00
mikecarper 86160e9323 Relay opaque flood packets through repeaters 2026-07-31 13:28:45 -07:00
mikecarper 9103b40786 Add CLI command availability matrix 2026-07-30 15:19:19 -07:00
mikecarper 6460aaa53b Split FULL MQTT and logging profiles 2026-07-29 13:35:25 -07:00
mikecarper e6abf3ea7d Share WiFi OTA seeding across full ESP32 builds 2026-07-29 01:51:01 -07:00
mikecarper ea030f8e9a Add standardized ESP32 FULL logging builds 2026-07-25 10:24:21 -07:00
mikecarper ae2af7ef4d Harden observer preferences and portable controls 2026-07-25 07:59:44 -07:00
mikecarper 886a1a9c6f Add constrained companion OTA fallbacks 2026-07-22 18:09:05 -07:00
mikecarper 3a7101556f Enable LoRa OTA for full and companion builds 2026-07-22 16:41:50 -07:00
mikecarper b98a7a7b54 Keep ESP32 OTA images within legacy slot 2026-07-22 15:04:40 -07:00
mikecarper 7abb5fb95b Add portable LoRa OTA repeater builds 2026-07-22 10:05:52 -07:00
mikecarper 371d86c4b1 Normalize tracked text to ASCII 2026-07-22 00:43:38 -07:00
mikecarper 3a6af3bf20 Clarify OTA companion source setup 2026-07-21 18:27:19 -07:00
mikecarper 11aa4bc191 Harden LoRa OTA and enable unattended targets 2026-07-14 15:24:35 -07:00
mikecarper 4c0dbe707d Merge PR 2864 LoRa OTA into Keymind 2026-07-11 12:40:31 -07:00
Valentin Kivachuk Burda 872413231d ota: extract the motatool CLI to its own repo (github.com/vk496/motatool)
The host-side build/verify/inspect/serve CLI now lives as a standalone Rust
project at https://github.com/vk496/motatool. Remove the in-tree C++ copy
(tools/motatool/) and repoint the docs (ota_protocol.md, ota_user_guide.md,
tools/mota/README.md) at the standalone repo.

No cross-dependency either direction: MeshCore's firmware build never invoked
motatool (only tools/mota/ Python glue runs in the build), and motatool depends
only on the shared .mota wire spec in docs/ota_protocol.md. tools/mota/
(pio_endf.py EndF hook, motalib.py reference lib, gen_targets.py) is unchanged.
2026-07-11 14:47:11 +02:00
Valentin Kivachuk Burda 8953214761 ota: fragment-level want_mask requests (anti-burst) + warm-start leaf-diff capture
Protocol: OTA_REQ and OTA_GET_MANIFEST now carry a want_mask bitmap, so a fetcher asks for specific fragments (all on the first request, only the still-missing holes on a retry) instead of a whole block/manifest window. The WANT_MANIFEST and FETCHING retry loops re-ask only on a no-progress tick, so a lost fragment costs one fragment to recover and a re-request can't collide with an in-flight multi-fragment burst on half-duplex radios.

Warm-start (motatool folder-capture only): new OTA_GET_LEAVES/OTA_LEAVES let `ota pull <#> folder validate` bulk-fetch the target's merkle leaves, authenticate them against the manifest root, diff a similar seed build already staged in the destination, and pull DATA over LoRa only for the blocks that differ. Leaves are bitmap-fragmented + no-progress retry-gated like the manifest, capped at OTA_DIFF_MAX_BLOCKS so the want_mask stays a fixed uint16, and the diff runs a bounded batch per loop tick so it never starves the mesh loop. motatool `serve --seed <build.mota>` injects the seed payload into the destination .part on OP_BEGIN.
2026-07-02 19:03:28 +02:00
Valentin Kivachuk Burda 49820b57aa docs: pull a firmware .mota off the mesh into a motatool folder
Document `ota pull <#> <dest>` (flash|folder, destination mandatory), the folder
pull that captures a device's exact firmware to the host as <mid>.mota (for
delta-building), the paused/resume-on-reconnect behaviour, and that a `motatool
serve` link doubles as the pull-to-folder store. (protocol §10, user guide,
motatool README)
2026-07-02 08:52:40 +02:00
Valentin Kivachuk Burda 259802b706 ota: configurable hop limit (ota config hops) + accept-gate + forward RAM guard
Bound OTA-over-LoRa duty cycle across repeaters with one runtime-tunable,
persisted limit (OtaManager::max_hops, `ota config hops <0..8>`, default 3):

- Accept-gate: a node ignores OTA that arrived from more than max_hops hops
  away (neither processes nor relays it). 0 = direct only.
- Forward-cap: relay a flood only while still under max_hops, appending this
  node's path-hash (hop count increments like the mesh flood routing).
- RAM guard: relay an OTA flood only while more than OTA_FWD_MIN_FREE packet-
  pool slots stay free, so heavy OTA (best-effort, lowest-priority) can never
  monopolise the shared pool and starve real traffic — a dropped relay is
  re-requested by the source.

Persisted in NodePrefs (CommonCLI) and shown in `ota config`. Docs updated.
2026-06-30 20:35:48 +02:00