feat: ADR-039 edge intelligence — on-device CSI processing pipeline

Implements a dual-core edge processing system for ESP32-S3:
- Lock-free SPSC ring buffer (Core 0 produces, Core 1 consumes)
- Tier 1: phase unwrap, Welford stats, top-K subcarrier selection, delta compression
- Tier 2: presence/motion detection, vital signs (breathing/heart rate via biquad IIR), fall detection
- Vitals UDP packet (magic 0xC5110002, 32 bytes, sent at 1 Hz)
- NVS/Kconfig configurable (edge_tier, thresholds, intervals)
- Backward compatible: tier=0 (default) is a no-op
- GitHub Actions firmware CI: build, binary size gate, credential scan, flash image verification
- Binary: 777 KB (24% free in 1 MB partition)

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
ruv
2026-03-02 19:55:35 -05:00
parent 14902e6b4e
commit e9bb4faf53
9 changed files with 1671 additions and 5 deletions
@@ -39,6 +39,14 @@ typedef struct {
/* MAC address filter for CSI source selection (Issue #98) */
uint8_t filter_mac[6]; /**< Transmitter MAC to accept (all zeros = no filter). */
uint8_t filter_mac_enabled; /**< 1 = filter active, 0 = accept all. */
/* ADR-039: Edge intelligence configuration */
uint8_t edge_tier; /**< 0=disabled, 1=phase/stats, 2=vitals, 3=reserved. */
uint16_t presence_thresh; /**< Presence detection threshold (default 50). */
uint16_t fall_thresh; /**< Fall detection threshold (default 500). */
uint16_t vital_window; /**< Vital signs window in frames (default 300). */
uint16_t vital_interval_ms; /**< Vitals packet send interval in ms (default 1000). */
uint8_t subk_count; /**< Top-K subcarrier count (default 32). */
} nvs_config_t;
/**