The CSI callback fires for every WiFi frame in promiscuous mode
(100-500+ fps). Each call invoked sendto() synchronously, exhausting
lwIP packet buffers (errno 12 = ENOMEM). The rapid-fire failures
cascaded into a LoadProhibited guru meditation crash.
Two fixes:
1. csi_collector.c: Rate-limit UDP sends to 50 Hz (20ms interval).
CSI frames arriving between sends are dropped — the sensing
pipeline only needs 20-50 Hz.
2. stream_sender.c: When sendto fails with ENOMEM, suppress further
sends for 100ms to let lwIP reclaim buffers. Logs the backoff
event and resumes automatically.
Closes#127
The user guide and release notes document TDM and edge intelligence
provisioning flags but provision.py only accepted --ssid, --password,
--target-ip, --target-port, and --node-id.
Add all NVS keys the firmware actually reads:
- --tdm-slot / --tdm-total: TDM mesh slot assignment
- --edge-tier: edge processing tier (0=off, 1=stats, 2=vitals)
- --pres-thresh, --fall-thresh: detection thresholds
- --vital-win, --vital-int: vitals timing parameters
- --subk-count: top-K subcarrier selection
Also validates that --tdm-slot and --tdm-total are specified together
and that slot < total.
Closes#130
- Move provision.py from release-only asset into firmware/esp32-csi-node/
- Fix user guide references from scripts/provision.py to correct path
- Update release link to v0.2.0-esp32
Co-Authored-By: claude-flow <ruv@ruv.net>
* feat: add MAC address filter for ESP32 CSI collection
In multi-AP environments, CSI frames from different access points get
mixed together, corrupting the sensing signal. Add transmitter MAC
filtering so only frames from a specified AP are processed.
Implementation:
- csi_collector: filter in wifi_csi_callback by comparing info->mac
against configured MAC; log transmitter MAC in periodic debug output
- csi_collector_set_filter_mac(): runtime API to enable/disable filter
- Kconfig: CSI_FILTER_MAC option (format "AA:BB:CC:DD:EE:FF")
- NVS: "filter_mac" 6-byte blob overrides Kconfig at runtime
- nvs_config: parse Kconfig MAC string at boot, load NVS override
- main: apply filter from config after csi_collector_init()
When no filter is configured (default), behavior is unchanged —
all transmitter MACs are accepted for backward compatibility.
Fixes#98
Co-Authored-By: claude-flow <ruv@ruv.net>
* chore: add CLAUDE.local.md to .gitignore
Local machine configuration (ESP-IDF paths, COM port, build
instructions) should not be committed to the repository.
Co-Authored-By: claude-flow <ruv@ruv.net>
The source code was moved to v1/src/ but the Dockerfile still
referenced src/ directly, causing build failures. Updated all
COPY paths, uvicorn module paths, test paths, and bandit scan
paths. Also added missing v1/__init__.py for Python module
resolution.
Fixes#33
Co-Authored-By: claude-flow <ruv@ruv.net>