Commit Graph

5 Commits

Author SHA1 Message Date
Dragan Spiridonov d33e4a531c merge: bring upstream/main into PR #397
Upstream moved forward with v0.6.2-esp32 (ADR-081 adaptive CSI mesh kernel,
Timer Svc stack fix) and the Docker entrypoint merge of PR #402.

Conflicts resolved:

- `firmware/esp32-csi-node/sdkconfig.defaults`: both sides appended a new
  config block. Kept both — `CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y` (ours,
  defense-in-depth for RuView#396 SPI cache race) AND
  `CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=8192` (upstream's ADR-081 Timer
  Svc stack bump). They target different crash modes.

- Applied the same `CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y` line to
  `sdkconfig.defaults.4mb` and `sdkconfig.defaults.template` for
  consistency — the SPI cache race is not flash-size specific, and the
  4MB / template variants run the same CSI collector code with the same
  MGMT-only callback path.

- `firmware/esp32-csi-node/version.txt`: both sides bumped to 0.6.2.
  Upstream already released v0.6.2-esp32, so our in-flight work bumps
  to 0.6.3.

- `CHANGELOG.md`: auto-merge placed our [Unreleased] #397 entries
  (and the older #391 / #390 entries) inside the newly-cut
  [v0.6.2-esp32] section. Moved them back to [Unreleased] — they
  describe work that has not been released yet.

Auto-merged cleanly: `csi_collector.c`, `csi_collector.h`, `main.c`,
`docker/*`, `README.md`, `docs/user-guide.md`. Verified the PR's
defensive-copy code (`s_node_id_early_set`, `s_filter_mac`,
`CSI_MIN_PROCESS_INTERVAL_US`, `s_early_drop`, the 50 Hz rate gate,
MGMT-only filter, and `csi_collector_set_node_id()` API) is still
present, and that the dropped probe-injection symbols stay absent
(grep confirms 0 / 27 hits).

Validation in this devcontainer:

- ADR-081 host tests built and ran from `firmware/esp32-csi-node/tests/host/`:
  `test_adaptive_controller` 18/18 pass, `test_rv_feature_state` 15/15
  pass, `test_rv_mesh` 27/27 pass — 60/60 total. These exercise the
  merged-in pure-C logic that this PR has no changes against, so
  they're a regression check that the merge didn't corrupt the
  upstream modules.
- `edge_processing.c` still has `const float sample_rate = 10.0f;`.
- Brace balance and dangling-ref checks on `csi_collector.c` pass.

ESP-IDF firmware build, flash, and miniterm soak still deferred to
@ruvnet's COM7 per the original review comment.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-21 15:30:15 +00:00
Dragan Spiridonov 728a8fd97e fix(firmware): address PR #397 review feedback
Applies @ruvnet's five review requests on PR #397 (RuView#397 comment
4289417527):

1. **Inline comment on `provision.py` `write_flash`** — ESP-IDF v5.4
   bundles esptool 4.10.0 (underscore-only). #391's hyphen swap broke
   the documented venv flow; kept the underscore form and added a
   three-line comment warning future maintainers not to "re-fix" it.

2. **Correct `edge_processing.c` sample_rate** (blocking) — changed
   hard-coded `20.0f` → `10.0f` at line 718 so
   `estimate_bpm_zero_crossing()` matches the MGMT-only CSI rate.
   Without this, breathing and heart-rate reports were 2× the true
   value. Added a comment tying the constant to the callback rate gate.

3. **Removed disabled probe-injection infrastructure** — dropped the
   forward declaration, the `CSI_PROBE_INTERVAL_MS` define, six static
   variables (`s_probe_timer`, `s_probe_tx_count`, `s_probe_tx_fail`,
   `s_ap_bssid`, `s_ap_bssid_known`), and three functions
   (`csi_send_probe_request`, `probe_timer_cb`,
   `csi_collector_start_probe_timer`). None were reachable.
   `csi_inject_ndp_frame()` reverted to the original ADR-029 stub.
   Can be revived from this commit's parent if needed.

4. **Cleaned `sdkconfig.defaults`** — removed the SPIRAM prose and
   commented-out `# CONFIG_SPIRAM is not set` line. Kept only the live
   `CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y` with a concise rationale.

5. **Bumped firmware version 0.6.1 → 0.6.2** and added four
   `[Unreleased]` CHANGELOG entries covering the SPI cache crash fix,
   the `filter_mac` / `node_id` clobber defense, the sample-rate
   correction, and the `write_flash` command-form revert.

Net: +39 / -128 across six files.

Validation in this devcontainer:
- Static sanity on modified C files: braces balance (csi_collector.c
  59/59; edge_processing.c 96/96), zero dangling references to removed
  probe-injection symbols.
- Rust workspace tests and Python proof not executed here — cargo not
  installed and pip blocked by PEP 668. Deferring hardware build +
  flash + miniterm verification to @ruvnet's COM7 per his offer in
  the review comment.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-21 15:02:14 +00:00
ruv ae40e2b33e Release v0.6.2-esp32: ADR-081 kernel + Timer Svc fix, 4MB CI variant
version.txt → 0.6.2.

firmware-ci.yml: matrix-build both 8MB (sdkconfig.defaults) and 4MB
(sdkconfig.defaults.4mb) variants, uploading variant-named artifacts
(esp32-csi-node.bin / esp32-csi-node-4mb.bin, partition-table.bin /
partition-table-4mb.bin). Unblocks 6-binary releases from CI alone,
no local ESP-IDF required.

CHANGELOG: promote [Unreleased] ADR-081 work into [v0.6.2-esp32],
plus Fixed entries for Timer Svc stack overflow and the
fast_loop_cb → emit_feature_state implicit-decl compile error.

Validation: 30 s run on ESP32-S3 (MAC 3c:0f:02:e9:b5:f8), 149
rv_feature_state emissions, no stack overflow, HEALTH mesh packet sent.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-20 10:59:05 -04:00
ruv 8914538bfe chore: bump firmware version to 0.6.1
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-16 10:38:02 -04:00
ruv b5e924cd72 fix: embed firmware version from version.txt, log at boot (#354)
- Add version.txt (0.6.0) read by CMakeLists.txt so
  esp_app_get_description()->version matches the release tag
- Log firmware version on boot: "v0.6.0 — Node ID: X"
- Remove stale Kconfig help text (said default 2.0, actual is 15.0)

Fixes the version mismatch reported in #354 where flashing v0.5.3
binaries showed v0.4.3 because PROJECT_VER was never set.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-06 11:26:58 -04:00