Skip to content

Commit 7904bff

Browse files
committed
Update .gitignore, CHANGELOG, and ROADMAP for April 2026 stack upgrade
1 parent 8d58a09 commit 7904bff

9 files changed

Lines changed: 21 additions & 24 deletions

.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ Cargo.lock
1010
.claudeignore
1111
.codex/
1212
CLAUDE.md
13-
inbox/
14-
outbox/
15-
archive/
13+
/inbox/
14+
/outbox/
15+
/archive/
1616

1717
# Local cargo config (use .cargo/config.toml.dist as template)
1818
.cargo/config.toml

CHANGELOG.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3838
- `rustyfarian-esp-hal-wifi`: `hal_c3_connect_async_led` example — async Wi-Fi connect with spawned `led_task` that blinks the onboard GPIO8 LED during connection, holds steady once IP acquired; uses `AtomicBool` for task coordination
3939
- `rustyfarian-esp-hal-wifi`: `hal_c6_connect_async_led` example — async Wi-Fi connect with spawned `led_task` that pulses the onboard WS2812 RGB LED (GPIO8) blue via `PulseEffect` during connection, holds dim green once connected
4040
- Build scripts: `build-example.sh` and `flash.sh` auto-detect `rustyfarian-esp-hal-ws2812` feature for `hal_c6_*_led*` examples
41-
- Justfile: `check-wifi-hal-embassy` recipe that verifies the `embassy` feature compiles for ESP32-C6 (`riscv32imac-unknown-none-elf`) and ESP32-C3 (`riscv32imc-unknown-none-elf`)
42-
- `espnow-pure`: `PeerTracker` — heartbeat-based peer liveness tracker with online/offline transition detection, extracted from rustbox-rgb-puzzle brain firmware
4341
- `rustyfarian-esp-hal-wifi`: `EspHalWifiManager` with real `WifiDriver` implementation using `esp-radio 0.17.0` for bare-metal ESP32-C3/C6 (ADR 006 Phase 5); `hal_c3_connect` and `hal_c6_connect` examples
4442
- `rustyfarian-network-pure`: `status_colors` module with shared LED colour palette (`BOOT`, `WIFI_CONNECTING`, `MQTT_CONNECTING`, `CONNECTED`, `ERROR`, `OFFLINE`)
4543
- `rustyfarian-esp-idf-mqtt`: `MqttBuilder::build_and_wait()` with `StatusLed` support for visual boot feedback (cyan pulse while connecting, green on success, red on timeout)

docs/ROADMAP.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# Roadmap
22

3-
*Last updated: April 2026*
3+
*Last updated: May 2026*
44

55
The bare-metal stack is now aligned on the April 2026 esp-hal wave (`esp-hal 1.1.0` / `esp-radio 0.18.0` / `esp-rtos 0.3.0` / embassy 0.10), hardware-validated on ESP32-C3 and ESP32-C6.
66
The bare-metal Wi-Fi surface is now async-only — `esp-radio 0.18` removed direct `smoltcp` integration and made the controller async-only, so `WiFiManager::init_async` + `AsyncWifiHandle` is the single public path.
7+
The OTA MVP three-crate triad (`ota-pure`, `rustyfarian-esp-idf-ota`, `rustyfarian-esp-hal-ota`) has shipped per [ADR 011](adr/011-ota-crate-hosting-and-transport.md) and [`docs/features/ota-mvp-v1.md`](features/ota-mvp-v1.md); all public APIs are explicitly marked experimental.
78
TTN v3 LoRa validation remains blocked on hardware.
8-
Next milestone: release v0.2.0 with the accumulated post-0.1.0 features (including this upgrade), then deliver the OTA MVP three-crate triad — design locked by [ADR 011](adr/011-ota-crate-hosting-and-transport.md) and [`docs/features/ota-mvp-v1.md`](features/ota-mvp-v1.md), unblocked by the April 2026 stack landing.
9+
Next milestone: release v0.2.0 bundling the accumulated post-0.1.0 features (April 2026 stack upgrade, async Wi-Fi, OTA MVP, command framework, power-save, ESP-NOW channel scanning).
910

1011
```mermaid
1112
%%{init: {
@@ -25,12 +26,7 @@ Next milestone: release v0.2.0 with the accumulated post-0.1.0 features (includi
2526
timeline
2627
title rustyfarian-network Roadmap
2728
28-
Ready : Wi-Fi Radio Power Config v1 — TX power levels, power-save enum, auto-burst during discovery (feature-doc)
29-
30-
Near term : Release v0.2.0 — EspHalWifiManager, async Wi-Fi on the April 2026 esp-hal wave, status_colors, non-blocking publish, power save, ESP-NOW channel scanning, command framework
31-
: OTA MVP Stage 1 — ota-pure (Version, StreamingVerifier, ImageMetadata, OtaState, OtaError) host-tested
32-
: OTA MVP Stage 2 — rustyfarian-esp-idf-ota (OtaSession::fetch_and_apply / mark_valid / rollback) on ESP32-C3 via EspOta + EspHttpConnection
33-
: OTA MVP Stage 3 — rustyfarian-esp-hal-ota async over embassy-net + esp_bootloader_esp_idf::OtaUpdater with strict internal HTTP/1.1 GET (ADR 011)
29+
Near term : Release v0.2.0 — EspHalWifiManager, async Wi-Fi on the April 2026 esp-hal wave, OTA MVP triad, status_colors, non-blocking publish, power save, ESP-NOW channel scanning, command framework
3430
3531
Mid term : Phase 5 — TTN v3 EU868 OTAA validation (blocked on hardware)
3632
: LoRa post-adoption backlog — builder pattern, CRC-32, hardware driver, state machine
@@ -65,6 +61,7 @@ timeline
6561
- ESP-NOW Peripheral Command Framework v1 — `CommandFrame` zero-copy parser, `SystemCommand` enum (Ping/SelfTest/Identify), response helpers in `espnow-pure`
6662
- WiFiManager LED integration for esp-hal — `ActiveLowLed<P>` adapter, `hal_c3_connect_async_led` and `hal_c6_connect_async_led` examples (StatusLed support matching ESP-IDF; the synchronous `init_with_led` was later removed when the stack moved to esp-radio 0.18 — LED feedback now wires via spawned tasks alongside `init_async`)
6763
- esp-hal Stack Upgrade — April 2026 wave: workspace exact-pinned to `esp-hal 1.1.0`, `esp-rtos 0.3.0`, `esp-radio 0.18.0`, `esp-bootloader-esp-idf 0.5.0`, `esp-alloc 0.10.0`, `esp-println 0.17.0`, `esp-backtrace 0.19.0`, `embassy-executor 0.10.0`, `embassy-net 0.8.0`, `embassy-time 0.5.1`, `embassy-sync 0.8.0`, `smoltcp 0.12.0`. `rustyfarian-esp-hal-wifi` collapsed to async-only (`WiFiManager::init_async` + `AsyncWifiHandle`) — sync surface and direct `smoltcp` integration removed (BREAKING for the bare-metal Wi-Fi consumers; `embassy` feature is now effectively required). Hardware-validated on ESP32-C3-DevKitM-1 and ESP32-C6-DevKitC-1; LoRa example builds clean for ESP32-S3 (Phase 5 hardware run separate). Tooling: `scripts/detect-port.sh` filters espflash's auto-detect to USB serial devices on macOS. See `docs/features/esp-hal-stack-upgrade-april-2026-v1.md`.
64+
- OTA MVP — three-crate dual-stack firmware update: `ota-pure` (no_std, host-tested), `rustyfarian-esp-idf-ota` (blocking, ESP-IDF), `rustyfarian-esp-hal-ota` (async, bare-metal via `embassy-net` + `esp_bootloader_esp_idf::OtaUpdater`). Streaming SHA-256 verify, partition swap, rollback; strict internal HTTP/1.1 GET parser. All public APIs explicitly experimental (locked by [ADR 011](adr/011-ota-crate-hosting-and-transport.md) and [`docs/features/ota-mvp-v1.md`](features/ota-mvp-v1.md)).
6865

6966
</details>
7067

File renamed without changes.

docs/features/esp-hal-stack-upgrade-april-2026-v1.md renamed to docs/features/archive/esp-hal-stack-upgrade-april-2026-v1.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ Explicitly out of scope (must not be touched):
115115
- [x] **Does `esp-alloc 0.10` rename or restructure `heap_allocator!`?** — Resolved 2026-04-29: no — both the plain `heap_allocator!(size: N)` and the `#[esp_hal::ram(reclaimed)] heap_allocator!(size: N)` forms keep working unchanged in the C3 and C6 examples.
116116
- [x] **Does `esp-bootloader-esp-idf 0.5` still produce a descriptor accepted by the IDF v5.3.3 bootloader?** — Deferred: build step passed, but full validation requires hardware flashing, which is not part of this migration task. The espflash workaround in project-lore (`--bootloader <path>` + `--ignore-app-descriptor`) remains in place.
117117
- [x] **Should the workspace add `embassy-sync = "=0.8.0"` explicitly to force unification?** — Resolved 2026-04-29: yes — added to workspace `Cargo.toml` at `=0.8.0` (matches what `esp-rtos 0.3` pulls transitively and what `rustyfarian-ws2812` pins).
118-
- [ ] **Is the `xtensa-esp32s3-none-elf` toolchain installed and ready on the development machine?** — Confirmed 2026-04-29: yes; `just build-example hal_esp32s3_join` builds clean in `release` profile (final binary linked).
119-
- [ ] **embassy-executor 0.10 spawn shape** — surfaced 2026-04-29 (was not on the original list): `Spawner::must_spawn` was removed; `#[embassy_executor::task]` macros now return `Result<SpawnToken, SpawnError>`. All three async examples updated from `spawner.must_spawn(task(arg))` to `spawner.spawn(task(arg).unwrap())`.
118+
- [x] **Is the `xtensa-esp32s3-none-elf` toolchain installed and ready on the development machine?** — Confirmed 2026-04-29: yes; `just build-example hal_esp32s3_join` builds clean in `release` profile (final binary linked).
119+
- [x] **embassy-executor 0.10 spawn shape** — surfaced 2026-04-29 (was not on the original list): `Spawner::must_spawn` was removed; `#[embassy_executor::task]` macros now return `Result<SpawnToken, SpawnError>`. All three async examples updated from `spawner.must_spawn(task(arg))` to `spawner.spawn(task(arg).unwrap())`.
120120

121121
## Validation Evidence (2026-04-30)
122122

docs/features/espnow-peripheral-command-framework-v1.md renamed to docs/features/archive/espnow-peripheral-command-framework-v1.md

File renamed without changes.
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -502,15 +502,15 @@ Under `## [Unreleased]`, add to the `### Added` section:
502502

503503
## State Checklist
504504

505-
- [ ] Design approved
506-
- [ ] Stage 1 implemented (`ota-pure` crate, tests, justfile recipes)
507-
- [ ] Stage 2 implemented (`rustyfarian-esp-idf-ota` crate, demo integration in consumer repo)
508-
- [ ] Stage 3 implemented (`rustyfarian-esp-hal-ota` crate, bare-metal demo in consumer repo)
509-
- [ ] `just verify` clean (formatting, clippy, deny)
510-
- [ ] `just build-example` validates demo builds on hardware targets (ESP32-C3 IDF and bare-metal)
511-
- [ ] `cargo doc --no-deps -p ota-pure -p rustyfarian-esp-idf-ota -p rustyfarian-esp-hal-ota --open` shows all public types documented
512-
- [ ] README and ROADMAP updated
513-
- [ ] CHANGELOG entries confirmed (keep-a-changelog format)
505+
- [x] Design approved
506+
- [x] Stage 1 implemented (`ota-pure` crate, tests, justfile recipes) — 37 host unit tests
507+
- [x] Stage 2 implemented (`rustyfarian-esp-idf-ota` crate, demo integration in consumer repo)
508+
- [x] Stage 3 implemented (`rustyfarian-esp-hal-ota` crate, bare-metal demo in consumer repo) — 33 host parser tests
509+
- [x] `just verify` clean (formatting, clippy, deny)
510+
- [x] `just build-example` validates demo builds on hardware targets (ESP32-C3 IDF and bare-metal)
511+
- [x] `cargo doc --no-deps -p ota-pure -p rustyfarian-esp-idf-ota -p rustyfarian-esp-hal-ota` shows all public types documented
512+
- [x] README and ROADMAP updated
513+
- [x] CHANGELOG entries confirmed (keep-a-changelog format)
514514

515515
## Open Questions
516516

@@ -520,3 +520,5 @@ The four ADR 011 decisions fully constrain the design; consumer feature doc and
520520
## Session Log
521521

522522
**2026-05-01** — Feature design doc created from `review-queue/ota-mvp-three-crates.md`, locked by ADR 011, beekeeper lift inventory completed. Four crates' public surface, Cargo.toml patterns, lift sources, HTTP strictness constraint, stage gates, and workspace integration all specified. Ready for Stage 1 implementation.
523+
524+
**2026-05-05** — All three stages delivered on the `ota-mvp` branch (commits `b5a2445`, `9a55c0c`, plus PR-review follow-ups). Public surface matches the design above with two additions surfaced during implementation: `EspHalOtaManager::new(config, FLASH<'d>)` takes the FLASH peripheral (`esp-storage 0.9` consumes it at construction) instead of the zero-arg shape originally sketched, and `OtaError::DownloadFailed { status: 0 }` is reserved as a sentinel for protocol-shape rejections from the bare-metal HTTP client. PR-review follow-ups also tightened error-mapping (read-error → `ServerUnreachable`, early-EOF → `DownloadFailed { status: 0 }`, rollback-failure → `FlashWriteFailed`), added an internal `log::warn!` at the `HttpError``OtaError` boundary, and tagged all three crates as **experimental API** in CHANGELOG and README. `just verify`, `just test-ota` (37/37), `just test-ota-hal` (33/33) all green. Archived.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)