9740bc64c9
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier1) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (full-adr060) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (tdm-3node) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / Swarm Test (ADR-062) (push) Has been skipped
npm packages / tools/ruview-mcp (node 22) (push) Failing after 1s
nvsim-server → ghcr.io / build-and-publish (push) Failing after 1s
ruview-swarm CI guard / tests (full+train) (push) Failing after 2s
Bench Regression Guard / bench compile-verify (--no-run) (push) Failing after 0s
Bench Regression Guard / bench fast-run (informational, non-gating) (push) Has been skipped
Firmware CI / Verify version.txt matches release tag (push) Has been skipped
Dashboard a11y + cross-browser / a11y (push) Failing after 0s
nvsim Dashboard → GitHub Pages / build-and-deploy (push) Failing after 2s
Firmware CI / Build firmware (esp32s3 / 4mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / Build Espressif QEMU (push) Failing after 1s
Firmware QEMU Tests (ADR-061) / Fuzz Testing (ADR-061 Layer 6) (push) Failing after 1s
Continuous Deployment / Pre-deployment Checks (push) Has been skipped
Firmware CI / Build firmware (esp32c6 / c6-4mb) (push) Failing after 15s
Firmware CI / Build firmware (esp32s3 / 8mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-max) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-min) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (default) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier0) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / NVS Matrix Generation (push) Failing after 1s
Security Scanning / Security Policy Compliance (push) Failing after 0s
Security Scanning / Dependency Vulnerability Scan (push) Failing after 0s
Security Scanning / Static Application Security Testing (push) Failing after 1s
Security Scanning / Infrastructure Security Scan (push) Failing after 1s
Security Scanning / Secret Scanning (push) Failing after 1s
npm packages / harness/ruview (node 22) (push) Failing after 17s
Security Scanning / License Compliance Scan (push) Failing after 1s
Security Scanning / Container Security Scan (push) Failing after 4s
three.js demos → GitHub Pages / build-and-deploy (push) Failing after 1s
Verify Pipeline Determinism / Verify Pipeline Determinism (3.11) (push) Failing after 1s
Fix-Marker Regression Guard / Verify fix markers (push) Failing after 1s
ADR-115 MQTT integration tests / mqtt-integration (push) Failing after 1s
npm packages / harness/ruview (node 20) (push) Failing after 1s
npm packages / tools/ruview-mcp (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 22) (push) Failing after 1s
BFLD MQTT Integration / cargo test --features mqtt (live mosquitto) (push) Failing after 29s
ruview-swarm CI guard / build train_marl bin (push) Failing after 2s
ruview-swarm CI guard / clippy (-D warnings, --no-deps) (push) Failing after 3s
ruview-swarm CI guard / tests (ruflo) (push) Failing after 1s
ruview-swarm CI guard / tests (train) (push) Failing after 2s
ruview-swarm CI guard / tests (default) (push) Failing after 2s
Point Cloud Viewer → GitHub Pages / build-and-deploy (push) Failing after 8s
ruview-swarm CI guard / ITAR / publish guard (push) Failing after 0s
wifi-densepose sensing-server → Docker Hub + ghcr.io / build · push · smoke-test (push) Failing after 1s
Continuous Deployment / Deploy to Production (push) Has been cancelled
Continuous Deployment / Rollback Deployment (push) Has been cancelled
Continuous Deployment / Post-deployment Monitoring (push) Has been cancelled
Continuous Deployment / Notify Deployment Status (push) Has been cancelled
Continuous Deployment / Deploy to Staging (push) Has been cancelled
Security Scanning / Security Report (push) Has been cancelled
138 lines
4.0 KiB
Python
138 lines
4.0 KiB
Python
"""
|
|
WiFi-DensePose — WiFi-based human pose estimation using CSI data.
|
|
|
|
Usage:
|
|
from wifi_densepose import WiFiDensePose
|
|
|
|
system = WiFiDensePose()
|
|
system.start()
|
|
poses = system.get_latest_poses()
|
|
system.stop()
|
|
"""
|
|
|
|
__version__ = "1.2.0"
|
|
|
|
import sys
|
|
import os
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Allow importing the v1 src package when installed from the repo
|
|
_v1_src = os.path.join(os.path.dirname(os.path.dirname(__file__)), "v1")
|
|
if os.path.isdir(_v1_src) and _v1_src not in sys.path:
|
|
sys.path.insert(0, _v1_src)
|
|
|
|
|
|
class WiFiDensePose:
|
|
"""High-level facade for the WiFi-DensePose sensing system.
|
|
|
|
This is the primary entry point documented in the README Quick Start.
|
|
It wraps the underlying ServiceOrchestrator and exposes a simple
|
|
start / get_latest_poses / stop interface.
|
|
"""
|
|
|
|
def __init__(self, host: str = "0.0.0.0", port: int = 3000, **kwargs):
|
|
self.host = host
|
|
self.port = port
|
|
self._config = kwargs
|
|
self._orchestrator = None
|
|
self._server_task = None
|
|
self._poses = []
|
|
self._running = False
|
|
|
|
# ------------------------------------------------------------------
|
|
# Public API (matches README Quick Start)
|
|
# ------------------------------------------------------------------
|
|
|
|
def start(self):
|
|
"""Start the sensing system (blocking until ready)."""
|
|
import asyncio
|
|
|
|
loop = _get_or_create_event_loop()
|
|
loop.run_until_complete(self._async_start())
|
|
|
|
async def _async_start(self):
|
|
try:
|
|
from src.config.settings import get_settings
|
|
from src.services.orchestrator import ServiceOrchestrator
|
|
|
|
settings = get_settings()
|
|
self._orchestrator = ServiceOrchestrator(settings)
|
|
await self._orchestrator.initialize()
|
|
await self._orchestrator.start()
|
|
self._running = True
|
|
logger.info("WiFiDensePose system started on %s:%s", self.host, self.port)
|
|
except ImportError:
|
|
raise ImportError(
|
|
"Core dependencies not found. Make sure you installed "
|
|
"from the repository root:\n"
|
|
" cd wifi-densepose && pip install -e .\n"
|
|
"Or install the v1 package:\n"
|
|
" cd wifi-densepose/v1 && pip install -e ."
|
|
)
|
|
|
|
def stop(self):
|
|
"""Stop the sensing system."""
|
|
import asyncio
|
|
|
|
if self._orchestrator is not None:
|
|
loop = _get_or_create_event_loop()
|
|
loop.run_until_complete(self._orchestrator.shutdown())
|
|
self._running = False
|
|
logger.info("WiFiDensePose system stopped")
|
|
|
|
def get_latest_poses(self):
|
|
"""Return the most recent list of detected pose dicts."""
|
|
if self._orchestrator is None:
|
|
return []
|
|
try:
|
|
import asyncio
|
|
|
|
loop = _get_or_create_event_loop()
|
|
return loop.run_until_complete(self._fetch_poses())
|
|
except Exception:
|
|
return []
|
|
|
|
async def _fetch_poses(self):
|
|
try:
|
|
pose_svc = self._orchestrator.pose_service
|
|
if pose_svc and hasattr(pose_svc, "get_latest"):
|
|
return await pose_svc.get_latest()
|
|
except Exception:
|
|
pass
|
|
return []
|
|
|
|
# ------------------------------------------------------------------
|
|
# Context-manager support
|
|
# ------------------------------------------------------------------
|
|
|
|
def __enter__(self):
|
|
self.start()
|
|
return self
|
|
|
|
def __exit__(self, *exc):
|
|
self.stop()
|
|
|
|
# ------------------------------------------------------------------
|
|
# Convenience re-exports
|
|
# ------------------------------------------------------------------
|
|
|
|
@staticmethod
|
|
def version():
|
|
return __version__
|
|
|
|
|
|
def _get_or_create_event_loop():
|
|
import asyncio
|
|
|
|
try:
|
|
return asyncio.get_event_loop()
|
|
except RuntimeError:
|
|
loop = asyncio.new_event_loop()
|
|
asyncio.set_event_loop(loop)
|
|
return loop
|
|
|
|
|
|
__all__ = ["WiFiDensePose", "__version__"]
|