Skip to main content

Crate wifi_densepose_hardware

Crate wifi_densepose_hardware 

Source
Expand description

WiFi-DensePose hardware interface abstractions.

This crate provides platform-agnostic types and parsers for WiFi CSI data from various hardware sources:

  • ESP32/ESP32-S3: Parses ADR-018 binary CSI frames streamed over UDP
  • UDP Aggregator: Receives frames from multiple ESP32 nodes (ADR-018 Layer 2)
  • Bridge: Converts CsiFrame → CsiData for the detection pipeline (ADR-018 Layer 3)

§Design Principles

  1. No mock data: All parsers either parse real bytes or return explicit errors
  2. No hardware dependency at compile time: Parsing is done on byte buffers, not through FFI to ESP-IDF or kernel modules
  3. Deterministic: Same bytes in → same parsed output, always

§Example

use wifi_densepose_hardware::{CsiFrame, Esp32CsiParser, ParseError};

// Parse ESP32 CSI data from UDP bytes
let raw_bytes: &[u8] = &[/* ADR-018 binary frame */];
match Esp32CsiParser::parse_frame(raw_bytes) {
    Ok((frame, consumed)) => {
        println!("Parsed {} subcarriers ({} bytes)", frame.subcarrier_count(), consumed);
        let (amplitudes, phases) = frame.to_amplitude_phase();
        // Feed into detection pipeline...
    }
    Err(ParseError::InsufficientData { needed, got }) => {
        eprintln!("Need {} bytes, got {}", needed, got);
    }
    Err(e) => eprintln!("Parse error: {}", e),
}

Re-exports§

pub use radio_ops::crc32_ieee;
pub use radio_ops::decode_anomaly_alert;
pub use radio_ops::decode_mesh;
pub use radio_ops::decode_node_status;
pub use radio_ops::encode_health;
pub use radio_ops::AnomalyAlert;
pub use radio_ops::AuthClass;
pub use radio_ops::CaptureProfile;
pub use radio_ops::MeshError;
pub use radio_ops::MeshHeader;
pub use radio_ops::MeshMsgType;
pub use radio_ops::MeshRole;
pub use radio_ops::MockRadio;
pub use radio_ops::NodeStatus;
pub use radio_ops::RadioError;
pub use radio_ops::RadioHealth;
pub use radio_ops::RadioMode;
pub use radio_ops::RadioOps;
pub use radio_ops::MESH_HEADER_SIZE;
pub use radio_ops::MESH_MAGIC;
pub use radio_ops::MESH_MAX_PAYLOAD;
pub use radio_ops::MESH_VERSION;
pub use mediatek_csi::ChipsetProfile as MediatekChipsetProfile;
pub use mediatek_csi::CsiFlags as MediatekCsiFlags;
pub use mediatek_csi::CsiFrame as MediatekCsiFrame;
pub use mediatek_csi::CsiParseError as MediatekCsiParseError;
pub use mediatek_csi::CsiPayload as MediatekCsiPayload;
pub use mediatek_csi::ElementFormat as MediatekElementFormat;
pub use mediatek_csi::PpduType as MediatekPpduType;
pub use mediatek_csi::ReportKind as MediatekReportKind;
pub use mediatek_csi::MEDIATEK_CSI_HEADER_LEN;
pub use mediatek_csi::MEDIATEK_CSI_MAGIC;
pub use mediatek_csi::MEDIATEK_CSI_VERSION;
pub use qualcomm_csi::ChipsetProfile as QualcommChipsetProfile;
pub use qualcomm_csi::CsiFlags as QualcommCsiFlags;
pub use qualcomm_csi::CsiFrame as QualcommCsiFrame;
pub use qualcomm_csi::CsiParseError as QualcommCsiParseError;
pub use qualcomm_csi::CsiPayload as QualcommCsiPayload;
pub use qualcomm_csi::ElementFormat as QualcommElementFormat;
pub use qualcomm_csi::PpduType as QualcommPpduType;
pub use qualcomm_csi::ReportKind as QualcommReportKind;
pub use qualcomm_csi::QUALCOMM_CSI_HEADER_LEN;
pub use qualcomm_csi::QUALCOMM_CSI_MAGIC;
pub use qualcomm_csi::QUALCOMM_CSI_VERSION;
pub use rtl8720f::ElementFormat as Rtl8720fElementFormat;
pub use rtl8720f::RadarFlags as Rtl8720fRadarFlags;
pub use rtl8720f::RadarFrame as Rtl8720fRadarFrame;
pub use rtl8720f::RadarParseError as Rtl8720fRadarParseError;
pub use rtl8720f::RadarPayload as Rtl8720fRadarPayload;
pub use rtl8720f::ReportType as Rtl8720fReportType;
pub use rtl8720f::RTL8720F_RADAR_HEADER_LEN;
pub use rtl8720f::RTL8720F_RADAR_MAGIC;
pub use rtl8720f::RTL8720F_RADAR_VERSION;
pub use sync_packet::SyncPacket;
pub use sync_packet::SyncPacketFlags;
pub use sync_packet::SYNC_PACKET_MAGIC;
pub use sync_packet::SYNC_PACKET_PROTO_VER;
pub use sync_packet::SYNC_PACKET_SIZE;
pub use vendor_rf::ProviderAvailability;
pub use vendor_rf::ProviderDescriptor;
pub use vendor_rf::RfCapability;
pub use vendor_rf::VendorEventError;
pub use vendor_rf::VendorId;
pub use vendor_rf::VendorRfEvent;
pub use vendor_rf::VendorRfProvider;

Modules§

aggregator
UDP aggregator for ESP32 CSI nodes (ADR-018 Layer 2).
esp32
ESP32 hardware protocol modules.
ieee80211bf
IEEE 802.11bf-2025 WLAN sensing — forward-compatibility protocol model (ADR-153, amending ADR-152 §2.4).
mediatek_csi
ADR-267 vendor-neutral MediaTek Filogic MIMO CSI framing and simulator. Vendor-neutral MediaTek Filogic MIMO CSI transport and deterministic simulator. This is not a MediaTek firmware ABI; see ADR-266/267.
qualcomm_csi
ADR-269 vendor-neutral Qualcomm Atheros CSI framing and simulator. Vendor-neutral Qualcomm Atheros MIMO CSI transport and deterministic simulator. This is not a Qualcomm firmware ABI; see ADR-268/269.
radio_ops
ADR-081 Layer 1 Rust mirror + Layer 3 mesh-plane decoder.
rtl8720f
ADR-264 host-side framing for Realtek RTL8720F CFR and FMCW radar reports. This module has no dependency on the vendor SDK. ADR-264 transport-neutral framing for Realtek RTL8720F radar reports.
sync_packet
ADR-110 §A0.12 sync packet decoder (firmware v0.6.9+).
vendor_rf
ADR-270 capability-safe vendor RF provider contract. ADR-270 vendor RF provider contract.

Structs§

Adr018Flags
Flags encoded in ADR-018 byte 19 (ADR-110 extension).
AntennaConfig
Antenna configuration for MIMO.
CsiData
Pipeline-ready CSI data with amplitude and phase vectors (ADR-018).
CsiFrame
A parsed CSI frame containing subcarrier data and metadata.
CsiMetadata
Metadata associated with a CSI frame (ADR-018 format).
Esp32CsiParser
Parser for ESP32 CSI binary frames (ADR-018 format).
SubcarrierData
A single subcarrier’s I/Q data.

Enums§

Bandwidth
WiFi channel bandwidth.
ParseError
Errors that can occur when parsing CSI data from hardware.
PpduType
PPDU type encoded in ADR-018 byte 18 (ADR-110 extension).

Constants§

ESP32_CSI_MAGIC
ESP32 CSI binary frame magic number (ADR-018).
RUVIEW_COMPRESSED_CSI_MAGIC
ADR-039 compressed-CSI packet.
RUVIEW_FEATURE_MAGIC
ADR-069 feature-vector packet.
RUVIEW_FEATURE_STATE_MAGIC
ADR-081 compact feature-state packet (the default upstream payload).
RUVIEW_FUSED_VITALS_MAGIC
ADR-063 fused-vitals packet (multi-sensor fusion).
RUVIEW_TEMPORAL_MAGIC
ADR-095 / #513 on-device temporal-classification packet.
RUVIEW_VITALS_MAGIC
ADR-039 edge vitals packet (32 bytes: HR/BR/presence).

Functions§

ruview_sibling_packet_name
If magic is a recognized RuView wire packet other than the ADR-018 raw CSI frame, return a human-readable name for it; otherwise None.