Skip to main content

wifi_densepose_hardware/
lib.rs

1//! WiFi-DensePose hardware interface abstractions.
2//!
3//! This crate provides platform-agnostic types and parsers for WiFi CSI data
4//! from various hardware sources:
5//!
6//! - **ESP32/ESP32-S3**: Parses ADR-018 binary CSI frames streamed over UDP
7//! - **UDP Aggregator**: Receives frames from multiple ESP32 nodes (ADR-018 Layer 2)
8//! - **Bridge**: Converts CsiFrame → CsiData for the detection pipeline (ADR-018 Layer 3)
9//!
10//! # Design Principles
11//!
12//! 1. **No mock data**: All parsers either parse real bytes or return explicit errors
13//! 2. **No hardware dependency at compile time**: Parsing is done on byte buffers,
14//!    not through FFI to ESP-IDF or kernel modules
15//! 3. **Deterministic**: Same bytes in → same parsed output, always
16//!
17//! # Example
18//!
19//! ```rust
20//! use wifi_densepose_hardware::{CsiFrame, Esp32CsiParser, ParseError};
21//!
22//! // Parse ESP32 CSI data from UDP bytes
23//! let raw_bytes: &[u8] = &[/* ADR-018 binary frame */];
24//! match Esp32CsiParser::parse_frame(raw_bytes) {
25//!     Ok((frame, consumed)) => {
26//!         println!("Parsed {} subcarriers ({} bytes)", frame.subcarrier_count(), consumed);
27//!         let (amplitudes, phases) = frame.to_amplitude_phase();
28//!         // Feed into detection pipeline...
29//!     }
30//!     Err(ParseError::InsufficientData { needed, got }) => {
31//!         eprintln!("Need {} bytes, got {}", needed, got);
32//!     }
33//!     Err(e) => eprintln!("Parse error: {}", e),
34//! }
35//! ```
36
37mod csi_frame;
38mod error;
39mod esp32_parser;
40pub mod aggregator;
41mod bridge;
42pub mod esp32;
43
44pub use csi_frame::{CsiFrame, CsiMetadata, SubcarrierData, Bandwidth, AntennaConfig};
45pub use error::ParseError;
46pub use esp32_parser::Esp32CsiParser;
47pub use bridge::CsiData;