Two debuggability fixes:
* `make start` now passes `--verbose` to both the bridge and the presence
injector so you can see `[bridge] seq=… max_var=…` and `[presence] aps=…
weight=… motion=… posted=…` lines while running. Previously start was
silent and you couldn't tell whether data was flowing or where the
pipeline was stuck.
* `presence_to_pose.py` sway amplitudes bumped ~3x (e.g. lateral sway
6 cm → 20 cm at full motion, knee bend 5 cm → 18 cm, head turn 4 cm →
12 cm). The old values were tuned for a close-up viewer; at the
Observatory's orbit camera distance (~5–10 m) they were imperceptible,
so a real-motion figure looked frozen even though the data was live.
Still seeded purely by RSSI variance — same intent as before, just
visible.
Co-authored-by: Cursor <cursoragent@cursor.com>
The 3D Observatory needs an explicit POST to /api/v1/pose/external to
render a single coherent figure — without it the UI shows the placeholder
five-skeleton fallback that doesn't respond to real RSSI variance, which
manifests as a "frozen" figure even when the bridge is emitting frames
and the sensing-server is processing them. presence_to_pose.py is the
component that closes that loop (polls /aps, POSTs one pose at 10 Hz).
`make start` now manages all three children (server, bridge, presence
injector) under one trap, and `make stop` kills the trio. New `make
run-presence` target for running the injector standalone against an
already-running stack.
Co-authored-by: Cursor <cursoragent@cursor.com>
The server's --source=auto probes for ESP32 frames *before* the bridge
starts emitting and falls back to `simulate` if it sees none. Simulate
mode never binds UDP, so the bridge then gets ECONNREFUSED on every
send and the UI displays fake (simulated) motion instead of real RSSI
data. Pin --source esp32 explicitly — the bridge IS the ESP32 source.
Also call `make stop` at the top of `make start` so re-running doesn't
collide with a stale instance.
Co-authored-by: Cursor <cursoragent@cursor.com>
`make start` builds both binaries, launches the v2 sensing-server and the
bridge under a single process group, opens both UIs (sensing UI on :8080
and the tomography dashboard on :9090/dashboard), and tears both down
cleanly on Ctrl-C via a TRAP. Adds `make stop` for stray-process cleanup
and `make build-server` so the sensing-server build can be invoked
independently. README updated to point at the one-command flow.
Co-authored-by: Cursor <cursoragent@cursor.com>
Swift CoreWLAN helper + Rust UDP emitter that turns any Mac into a
"node 0" for RuView's sensing-server while waiting on ESP32 hardware.
Wraps multi-BSSID scans into ESP32 CSI frame format (magic 0xC511_0001)
with per-AP RSSI as pseudo-subcarrier amplitude and rolling variance
as the Q channel — pipeline runs unmodified.
Standalone Cargo project (not a v2 workspace member, so the main build
is unaffected). Handles macOS 14.4+ BSSID redaction by synthesizing
stable per-AP identifiers from (channel, RSSI bucket, ordinal).
Co-authored-by: Cursor <cursoragent@cursor.com>