Files
ruvnet--RuView/v2/crates/wifi-densepose-hardware
ruv 8ce3bd090b fix(ruview-unified): panics, NaN corruption, entity-conflation, and wrong center-freq found in review
Deep review of PR #1437 (ADR-273..282 unified RF spatial world model)
plus hardware-in-the-loop testing against a live ESP32-C6 CSI node
turned up several real defects, fixed here:

- pretrain.rs: sample_mask panicked (usize::clamp(1, 0)) on any
  single-token window, reachable from a valid RfTensor via a perfectly
  normal tokenizer output. eval() now skips empty masks instead of
  averaging in NaN.
- math.rs: resample_complex(x, 1) with x.len() > 1 divided by zero
  (m - 1 == 0), silently poisoning the output with NaN. Now returns
  the mean.
- gaussian/map.rs: merge_overlapping had no entity-kind guard (unlike
  insert()), so an unlabeled Room-linked Gaussian and an unlabeled
  PersonClass-linked Gaussian within each other's merge gate would be
  silently conflated. Added the same same_kind check insert() uses.
  Also hardened decay()'s tau_eff against a post-construction
  decay_tau_s of 0 (NaN instead of merely-fast decay).
- adapters.rs: WifiCsiAdapter used the frequency band's fixed
  per-band constant (e.g. 2437 MHz) instead of the frame's real
  channel, misreporting center_freq_hz for every channel except the
  one that happens to match the constant. Confirmed against a live
  ESP32-C6 node on channel 4: pre-fix would report 2437000000 Hz,
  post-fix correctly reports 2427000000 Hz, matching the hardware
  parser's independently-computed frequency exactly. Added
  examples/esp32_live_hardware_test.rs, a hardware-in-the-loop test
  that bridges real ADR-018 UDP captures through the adapter (also
  confirms no panic on real 256-subcarrier HE-SU frames, well beyond
  CANONICAL_BINS=56).
- control.rs: admit_task didn't validate requested_resolution_m,
  maximum_latency_ms, or modalities, so a task with 0/NaN resolution,
  0ms latency, or zero modalities passed admission. Added boundary
  checks.
- control.rs + security_boundaries.rs: validate_representation's only
  test coverage (unit test and proptest) hardcoded
  SensingPurpose::Presence, leaving the other three purpose-ceiling
  branches (Activity/Localization at P3, Vitals/PoseTracking at P4,
  IdentityRecognition at P5 — the higher-risk representations)
  completely unverified. Added coverage for all branches in both.

Also fixed pre-existing issues surfaced while validating the above:
- wifi-densepose-core: 7 clippy warnings (cast_possible_truncation/
  wrap, single_match_else, suboptimal_flops) in the canonical
  encode/decode path, now using try_from/from_le_bytes/mul_add.
- wifi-densepose-hardware: a test missing #[cfg(unix)] that used
  std::os::unix::fs::PermissionsExt unconditionally, breaking
  Windows builds of ruview-auth's test suite; a manual Default impl
  clippy flagged as derivable; two tests using field-reassignment
  instead of struct-update syntax after ::default().
- wifi-densepose-sensing-server: auth_wiring.rs's free_port() /
  child-process bind race (documented as "mildly racy" by design)
  now retries up to 3x specifically on an AddrInUse-shaped failure,
  preserving the original fail-loud behavior for genuine wiring
  regressions.

All touched crates re-verified: ruview-unified 99 tests (was 98),
wifi-densepose-core 37+40, wifi-densepose-hardware 483+1(ignored),
ruview-auth builds and tests on Windows, sensing-server auth_wiring
7/7. ruview-unified remains clippy-clean under -D warnings; the
pre-existing dependency warnings that -D warnings surfaced are fixed
too.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-07-26 17:08:27 -04:00
..

wifi-densepose-hardware

Crates.io Documentation License

Hardware interface abstractions for WiFi CSI sensors (ESP32, Intel 5300, Atheros).

Overview

wifi-densepose-hardware provides platform-agnostic parsers for WiFi CSI data from multiple hardware sources. All parsing operates on byte buffers with no C FFI or hardware dependencies at compile time, making the crate fully portable and deterministic -- the same bytes in always produce the same parsed output.

RTL8720F radar simulator (ADR-263/264)

Until Realtek hardware and the radar report SDK arrive, the Rust-only simulator exercises the same versioned CFR/Range-FFT wire codec used by the future device adapter. Every frame is marked SYNTHETIC.

cargo run -p wifi-densepose-hardware --bin rtl8720f-sim -- `
  --frames 100 --seed 0x8720f123456789ab `
  --output rtl8720f-synthetic.rtr

Add --udp 127.0.0.1:5005 --realtime to stream one ADR-264 frame per UDP datagram. Replay files contain a little-endian u32 frame length followed by the encoded frame.

MediaTek Filogic CSI simulator (ADR-266/267)

The Rust-only simulator models bounded MIMO CSI for MT7981/MT7976, MT7986/MT7975, and MT7988/MT7996 profiles without claiming an undocumented MediaTek firmware ABI. Every frame is marked SYNTHETIC.

cargo run -p wifi-densepose-hardware --bin mediatek-csi-sim -- `
  --profile mt7981 --frames 100 --output mediatek-synthetic.mtc

Add --udp 127.0.0.1:5005 --realtime to stream one CRC-protected ADR-267 frame per UDP datagram. Physical support remains gated on a documented mt76 or MediaTek firmware channel-estimate export.

Features

  • ESP32 binary parser -- Parses ADR-018 binary CSI frames streamed over UDP from ESP32 and ESP32-S3 devices.
  • UDP aggregator -- Receives and aggregates CSI frames from multiple ESP32 nodes (ADR-018 Layer 2). Provided as a standalone binary.
  • Bridge -- Converts hardware CsiFrame into the CsiData format expected by the detection pipeline (ADR-018 Layer 3).
  • No mock data -- Parsers either parse real bytes or return explicit ParseError values. There are no synthetic fallbacks.
  • Pure byte-buffer parsing -- No FFI to ESP-IDF or kernel modules. Safe to compile and test on any platform.

Feature flags

Flag Default Description
std yes Standard library support
esp32 no ESP32 serial CSI frame parsing
intel5300 no Intel 5300 CSI Tool log parsing
linux-wifi no Linux WiFi interface for commodity sensing

Quick Start

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

// Parse ESP32 CSI data from raw 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),
}

Architecture

wifi-densepose-hardware/src/
  lib.rs            -- Re-exports: CsiFrame, Esp32CsiParser, ParseError, CsiData
  csi_frame.rs      -- CsiFrame, CsiMetadata, SubcarrierData, Bandwidth, AntennaConfig
  esp32_parser.rs   -- Esp32CsiParser (ADR-018 binary protocol)
  error.rs          -- ParseError
  bridge.rs         -- CsiData bridge to detection pipeline
  aggregator/       -- UDP multi-node frame aggregator (binary)
Crate Role
wifi-densepose-core Foundation types (CsiFrame definitions)
wifi-densepose-signal Consumes parsed CSI data for processing
wifi-densepose-mat Uses hardware adapters for disaster detection
wifi-densepose-vitals Vital sign extraction from parsed frames

License

MIT OR Apache-2.0