[package] name = "wifi-densepose-mat" version = "0.3.1" edition = "2021" authors = ["rUv ", "WiFi-DensePose Contributors"] description = "Mass Casualty Assessment Tool - WiFi-based disaster survivor detection" license = "MIT OR Apache-2.0" repository = "https://github.com/ruvnet/wifi-densepose" documentation = "https://docs.rs/wifi-densepose-mat" keywords = ["wifi", "disaster", "rescue", "detection", "vital-signs"] categories = ["science", "algorithms"] readme = "README.md" [features] default = ["std", "api", "ruvector"] ruvector = ["dep:ruvector-solver", "dep:ruvector-temporal-tensor"] std = [] # REST/WebSocket surface. Pulls the web stack (axum, futures-util) only when # enabled, and enables the `serde` FEATURE (not just `dep:serde`) so the # `cfg_attr(feature = "serde", ...)` derives on domain types are actually # active when the API is on (review finding 5: `api = ["dep:serde"]` enabled # the dependency but left every `feature = "serde"` cfg dead). api = ["serde", "dep:axum", "dep:futures-util"] # Real ESP32 serial CSI ingest. Pulls the native `serialport` crate (libudev on # Linux) only when enabled, so the default/no-default appliance build stays free # of native serial deps. With the feature OFF, the ESP32 serial *parser* still # works on supplied bytes; only live port reads return UnsupportedAdapter. serial = ["dep:serialport"] portable = ["low-power"] low-power = [] distributed = ["tokio/sync"] drone = ["distributed"] serde = ["dep:serde", "chrono/serde", "geo/use-serde"] [dependencies] # Workspace dependencies wifi-densepose-core = { version = "0.3.0", path = "../wifi-densepose-core" } wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" } ruvector-solver = { workspace = true, optional = true } ruvector-temporal-tensor = { workspace = true, optional = true } # Async runtime — required by the core integration layer (UDP CSI receiver, # hardware adapter, scan loop in `DisasterResponse::start_scanning`), not just # the REST API, so it is deliberately NOT gated behind `api`. tokio = { version = "1.35", features = ["rt", "sync", "time"] } async-trait = "0.1" # Web framework (REST API) — only compiled with the `api` feature. axum = { version = "0.7", features = ["ws"], optional = true } futures-util = { version = "0.3", optional = true } # Error handling thiserror = "2.0" anyhow = "1.0" # Serialization serde = { version = "1.0", features = ["derive"], optional = true } serde_json = "1.0" # Time handling chrono = { version = "0.4", features = ["serde"] } # Math and signal processing num-complex = "0.4" ndarray = "0.15" rustfft = "6.1" # Utilities uuid = { version = "1.6", features = ["v4", "serde"] } tracing = "0.1" parking_lot = "0.12" # Geo calculations geo = "0.27" # Real serial CSI ingest (ESP32) — optional, native deps gated behind `serial`. serialport = { version = "4.3", optional = true } [dev-dependencies] tokio-test = "0.4" criterion = { version = "0.5", features = ["html_reports"] } proptest = "1.4" approx = "0.5" [[bench]] name = "detection_bench" harness = false [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"]