wifi-densepose/v2/crates/wifi-densepose-mat
rUv f49c722764
chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427)
The Rust port lived two directories deep (rust-port/wifi-densepose-rs/)
without any sibling under rust-port/ that warranted the extra level.
Move the whole workspace up to v2/ to match v1/ (Python) at the same
depth and shorten every cd / build command across the repo.

git mv preserves history for all tracked files. 60 files updated for
path references (CI workflows, ADRs, docs, scripts, READMEs, internal
.claude-flow state). Two manual fixes for relative-cd paths in
CLAUDE.md and ADR-043 that became wrong after the depth change
(cd ../.. → cd ..).

Validated:
- cargo check --workspace --no-default-features → clean (after target/
  nuke; the gitignored target/ was carried by the OS rename and had
  hard-coded old paths in build scripts)
- cargo test --workspace --no-default-features → 1,539 passed, 0 failed,
  8 ignored (same totals as pre-rename)
- ESP32-S3 on COM7 → still streaming live CSI (cb #40300, RSSI -64 dBm)

After-merge follow-up: contributors should `rm -rf v2/target` once and
let cargo regenerate from the new path.
2026-04-25 21:28:13 -04:00
..
benches chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427) 2026-04-25 21:28:13 -04:00
src chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427) 2026-04-25 21:28:13 -04:00
tests chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427) 2026-04-25 21:28:13 -04:00
Cargo.toml chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427) 2026-04-25 21:28:13 -04:00
README.md chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427) 2026-04-25 21:28:13 -04:00

README.md

wifi-densepose-mat

Crates.io Documentation License

Mass Casualty Assessment Tool for WiFi-based disaster survivor detection and localization.

Overview

wifi-densepose-mat uses WiFi Channel State Information (CSI) to detect and locate survivors trapped in rubble, debris, or collapsed structures. The crate follows Domain-Driven Design (DDD) with event sourcing, organized into three bounded contexts -- detection, localization, and alerting -- plus a machine learning layer for debris penetration modeling and vital signs classification.

Use cases include earthquake search and rescue, building collapse response, avalanche victim location, flood rescue operations, and mine collapse detection.

Features

  • Vital signs detection -- Breathing patterns, heartbeat signatures, and movement classification with ensemble classifier combining all three modalities.
  • Survivor localization -- 3D position estimation through debris via triangulation, depth estimation, and position fusion.
  • Triage classification -- Automatic START protocol-compatible triage with priority-based alert generation and dispatch.
  • Event sourcing -- All state changes emitted as domain events (DetectionEvent, AlertEvent, ZoneEvent) stored in a pluggable EventStore.
  • ML debris model -- Debris material classification, signal attenuation prediction, and uncertainty-aware vital signs classification.
  • REST + WebSocket API -- axum-based HTTP API for real-time monitoring dashboards.
  • ruvector integration -- ruvector-solver for triangulation math, ruvector-temporal-tensor for compressed CSI buffering.

Feature flags

Flag Default Description
std yes Standard library support
api yes REST + WebSocket API (enables serde for all types)
ruvector yes ruvector-solver and ruvector-temporal-tensor
serde no Serialization (also enabled by api)
portable no Low-power mode for field-deployable devices
distributed no Multi-node distributed scanning
drone no Drone-mounted scanning (implies distributed)

Quick Start

use wifi_densepose_mat::{
    DisasterResponse, DisasterConfig, DisasterType,
    ScanZone, ZoneBounds,
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let config = DisasterConfig::builder()
        .disaster_type(DisasterType::Earthquake)
        .sensitivity(0.8)
        .build();

    let mut response = DisasterResponse::new(config);

    // Define scan zone
    let zone = ScanZone::new(
        "Building A - North Wing",
        ZoneBounds::rectangle(0.0, 0.0, 50.0, 30.0),
    );
    response.add_zone(zone)?;

    // Start scanning
    response.start_scanning().await?;

    Ok(())
}

Architecture

wifi-densepose-mat/src/
  lib.rs            -- DisasterResponse coordinator, config builder, MatError
  domain/
    survivor.rs     -- Survivor aggregate root
    disaster_event.rs -- DisasterEvent, DisasterType
    scan_zone.rs    -- ScanZone, ZoneBounds
    alert.rs        -- Alert, Priority
    vital_signs.rs  -- VitalSignsReading, BreathingPattern, HeartbeatSignature
    triage.rs       -- TriageStatus, TriageCalculator (START protocol)
    coordinates.rs  -- Coordinates3D, LocationUncertainty
    events.rs       -- DomainEvent, EventStore, InMemoryEventStore
  detection/        -- BreathingDetector, HeartbeatDetector, MovementClassifier, EnsembleClassifier
  localization/     -- Triangulator, DepthEstimator, PositionFuser
  alerting/         -- AlertGenerator, AlertDispatcher, TriageService
  ml/               -- DebrisPenetrationModel, VitalSignsClassifier, UncertaintyEstimate
  api/              -- axum REST + WebSocket router
  integration/      -- SignalAdapter, NeuralAdapter, HardwareAdapter
Crate Role
wifi-densepose-core Foundation types and traits
wifi-densepose-signal CSI preprocessing for detection pipeline
wifi-densepose-nn Neural inference for ML models
wifi-densepose-hardware Hardware sensor data ingestion
ruvector-solver Triangulation and position math
ruvector-temporal-tensor Compressed CSI buffering

License

MIT OR Apache-2.0