mirror of
https://github.com/ruvnet/RuView.git
synced 2026-04-28 14:09:33 +00:00
* docs: ADR-063 mmWave sensor fusion with WiFi CSI 60 GHz mmWave radar (Seeed MR60BHA2, HLK-LD2410/LD2450) fusion with WiFi CSI for dual-confirm fall detection, clinical-grade vitals, and self-calibrating CSI pipeline. Covers auto-detection, 6 supported sensors, Kalman fusion, extended 48-byte vitals packet, RuVector/RuvSense integration points, and 6-phase implementation plan. Based on live hardware capture from ESP32-C6 + MR60BHA2 on COM4. Co-Authored-By: claude-flow <ruv@ruv.net> * feat(firmware): ADR-063 mmWave sensor fusion — full implementation Phase 1-2 of ADR-063: mmwave_sensor.c/h: - MR60BHA2 UART parser (60 GHz: HR, BR, presence, distance) - LD2410 UART parser (24 GHz: presence, distance) - Auto-detection: probes UART for known frame headers at boot - Mock generator for QEMU testing (synthetic HR 72±2, BR 16±1) - Capability flag registration per sensor type edge_processing.c/h: - 48-byte fused vitals packet (magic 0xC5110004) - Kalman-style fusion: mmWave 80% + CSI 20% when both available - Automatic fallback to CSI-only 32-byte packet when no mmWave - Dual presence flag (Bit3 = mmwave_present) main.c: - mmwave_sensor_init() called at boot with auto-detect - Status logged in startup banner Fuzz stubs updated for mmwave_sensor API. Build verified: QEMU mock build passes. Co-Authored-By: claude-flow <ruv@ruv.net> * fix(firmware): correct MR60BHA2 + LD2410 UART protocols (ADR-063) MR60BHA2: SOF=0x01 (not 0x5359), XOR+NOT checksums on header and data, frame types 0x0A14 (BR), 0x0A15 (HR), 0x0A16 (distance), 0x0F09 (presence). Based on Seeed Arduino library research. LD2410: 256000 baud (not 115200), 0xAA report head marker, target state byte at offset 2 (after data_type + head_marker). Auto-detect: probes MR60 at 115200 first, then LD2410 at 256000. Sets final baud rate after detection. Co-Authored-By: claude-flow <ruv@ruv.net> * feat: ADR-063 Phase 6 server-side mmWave + CSI fusion bridge Python script reads both serial ports simultaneously: - COM4 (ESP32-C6 + MR60BHA2): parses ESPHome debug output for HR, BR, presence, distance - COM7 (ESP32-S3): reads CSI edge processing frames Kalman-style fusion: mmWave 80% + CSI 20% for vitals, OR gate for presence. Verified on real hardware: mmWave HR=75bpm, BR=25/min at 52cm range, CSI frames flowing concurrently. Both sensors live for 30 seconds. Co-Authored-By: claude-flow <ruv@ruv.net> * docs: ADR-064 multimodal ambient intelligence roadmap 25+ applications across 4 tiers from practical to exotic: - Tier 1 (build now): zero-FP fall detection, sleep monitoring, occupancy HVAC, baby breathing, bathroom safety - Tier 2 (research): gait analysis, stress detection, gesture control, respiratory screening, multi-room activity - Tier 3 (frontier): cardiac arrhythmia, RF tomography, sign language, cognitive load, swarm sensing - Tier 4 (exotic): emotion contagion, lucid dreaming, plant monitoring, pet behavior Priority matrix with effort estimates. All P0-P1 items work with existing hardware (ESP32-S3 + MR60BHA2 + BH1750). Co-Authored-By: claude-flow <ruv@ruv.net> * fix(ci): add ESP_ERR_NOT_FOUND to fuzz stubs mmwave_sensor stub returns ESP_ERR_NOT_FOUND which wasn't defined in the minimal esp_stubs.h for host-based fuzz testing. Co-Authored-By: claude-flow <ruv@ruv.net>
83 lines
3 KiB
C
83 lines
3 KiB
C
/**
|
|
* @file mmwave_sensor.h
|
|
* @brief ADR-063: 60 GHz mmWave sensor auto-detection and UART driver.
|
|
*
|
|
* Supports:
|
|
* - Seeed MR60BHA2 (60 GHz, heart rate + breathing + presence)
|
|
* - HLK-LD2410 (24 GHz, presence + distance)
|
|
*
|
|
* Auto-detects sensor type at boot by probing UART for known frame headers.
|
|
* Runs a background task that parses incoming frames and updates shared state.
|
|
*/
|
|
|
|
#ifndef MMWAVE_SENSOR_H
|
|
#define MMWAVE_SENSOR_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include "esp_err.h"
|
|
|
|
/* ---- Sensor type enumeration ---- */
|
|
typedef enum {
|
|
MMWAVE_TYPE_NONE = 0, /**< No sensor detected. */
|
|
MMWAVE_TYPE_MR60BHA2 = 1, /**< Seeed MR60BHA2 (60 GHz, HR + BR). */
|
|
MMWAVE_TYPE_LD2410 = 2, /**< HLK-LD2410 (24 GHz, presence + range). */
|
|
MMWAVE_TYPE_MOCK = 99, /**< Mock sensor for QEMU testing. */
|
|
} mmwave_type_t;
|
|
|
|
/* ---- Capability flags ---- */
|
|
#define MMWAVE_CAP_HEART_RATE (1 << 0)
|
|
#define MMWAVE_CAP_BREATHING (1 << 1)
|
|
#define MMWAVE_CAP_PRESENCE (1 << 2)
|
|
#define MMWAVE_CAP_DISTANCE (1 << 3)
|
|
#define MMWAVE_CAP_FALL (1 << 4)
|
|
#define MMWAVE_CAP_MULTI_TARGET (1 << 5)
|
|
|
|
/* ---- Shared mmWave state (updated by background task) ---- */
|
|
typedef struct {
|
|
/* Detection */
|
|
mmwave_type_t type; /**< Detected sensor type. */
|
|
uint16_t capabilities; /**< Bitmask of MMWAVE_CAP_* flags. */
|
|
bool detected; /**< True if sensor responded on UART. */
|
|
|
|
/* Vital signs (MR60BHA2) */
|
|
float heart_rate_bpm; /**< Heart rate in BPM (0 if unavailable). */
|
|
float breathing_rate; /**< Breathing rate in breaths/min. */
|
|
|
|
/* Presence and range (LD2410 / MR60BHA2) */
|
|
bool person_present; /**< True if person detected. */
|
|
float distance_cm; /**< Distance to nearest target in cm. */
|
|
uint8_t target_count; /**< Number of detected targets. */
|
|
|
|
/* Quality metrics */
|
|
uint32_t frame_count; /**< Total parsed frames since boot. */
|
|
uint32_t error_count; /**< Parse errors / CRC failures. */
|
|
int64_t last_update_us; /**< Timestamp of last valid frame. */
|
|
} mmwave_state_t;
|
|
|
|
/**
|
|
* Initialize the mmWave sensor subsystem.
|
|
*
|
|
* Probes the configured UART for known sensor types. If a sensor is
|
|
* detected, starts a background FreeRTOS task to parse incoming frames.
|
|
*
|
|
* @param uart_tx_pin GPIO pin for UART TX (to sensor RX). Use -1 for default.
|
|
* @param uart_rx_pin GPIO pin for UART RX (from sensor TX). Use -1 for default.
|
|
* @return ESP_OK if sensor detected, ESP_ERR_NOT_FOUND if no sensor.
|
|
*/
|
|
esp_err_t mmwave_sensor_init(int uart_tx_pin, int uart_rx_pin);
|
|
|
|
/**
|
|
* Get a snapshot of the current mmWave state (thread-safe copy).
|
|
*
|
|
* @param state Output state struct.
|
|
* @return true if valid data is available (sensor detected and running).
|
|
*/
|
|
bool mmwave_sensor_get_state(mmwave_state_t *state);
|
|
|
|
/**
|
|
* Get the detected sensor type name as a string.
|
|
*/
|
|
const char *mmwave_type_name(mmwave_type_t type);
|
|
|
|
#endif /* MMWAVE_SENSOR_H */
|