---
name: hmd-bench-rig
description: "VDO.Ninja camera bench rig — windows, profiles, prox bypass, validated photon-latency method"
metadata: 
  node_type: memory
  type: project
  originSessionId: 858f599c-f5d2-4894-9e45-5313d8d0f8c1
---

Bench rig (2026-06-12, HFENDULEAM): phone camera streams via VDO.Ninja into a Chrome window ("VDO.Ninja, View=vrinznonzel") showing monitor (DISPLAY5 = Windows display #3, 1920x1080 @ 2560,0) + Beyond on a stool, face toward camera. Green-square marker = separate ShareX "Pin to screen" window — NOT in window-targeted captures, only desktop captures.

Method (validated): `tools/bench_timer.html` fullscreen kiosk on DISPLAY5 (Edge `--guest --kiosk` avoids sync popup) shows wallclock; `panel_bench.exe N` (≤30 s cap) lights left eye white and stamps INIT_START/FIRST_DRAW/DSTAT_CHANGE; screen-timelapse repository capture of the VDO window @125 ms catches photons. In-frame timer cancels feed latency (~0.3 s). Firmware DISPLAYS_ON (telemetry bytes 24-25 bit0) agreed with camera within one frame.

Key facts:
- Beyond firmware gates panel emission on prox even with scanout+vsync healthy — unworn headset presents at 75 fps with ZERO photons and no free-run symptom. Bypass: HID 'p' (restore '[', persists until power cycle) — McuProx::setProxBypass.
- Cold DirectMode feed→photons = 3.1–4.8 s (n=5, median ~3.2 s): host init ~1 s; firmware/VXR video detect ~1.5–2.7 s with a consistent link-retrain bounce; DSC enable; DISPLAYS_ON +50–100 ms.
- Panel-off after release: ~0.1–0.2 s.
- Repo-capture frames land in `<project>\.screen-timelapse\frames\<sessionId>\NNNNNN.jpg`; `startedAt` in get_capture_status + per-frame `elapsed_ms` give wallclock. Pixel-luminance sweep over optic-cavity region detects on/off unambiguously (28→152).

`panel_bench` modes (sauna `src/app/panel_bench.cpp`): `panel_bench N` = cold-init; `panel_bench cycle [n] [warm] [dwell]` = warm PARKED→wake (host POWER_OFF via requestPanelPower); `panel_bench doze [n] [warm] [dwell]` = warm DOZE→wake (keeps presenting, drives firmware `McuProx::setDoze` 'H'/'h'). All stamp WAKE_REQUEST + print WARM_WAKE_LATENCY (request→DISPLAYS_ON). Optic crop region = window_region (185,505,130,140) ("left-optic" profile).

Measured wake (2026-06-12): PARKED ~4-6 s (4.07, 6.21 — same retrain bounce as cold, POWER_OFF de-locks link); DOZE ~94 ms display-on / ~110-310 ms photon onset / ~400 ms full — link/DSC stays locked (status word 0x2318↔0x2319, DSC bit set throughout), no retrain. ~50× win. Gamma-eased sweep (fw 0.4.1) makes the ramp perceptually even. Validates ADR-0005. See [[beyond-synaptics-firmware-build]] for build/flash.

Durable writeups: sauna/docs/photon-latency-bench.md (method+results incl doze "the payoff" section), ADR-0003 + ADR-0005 evidence, CONTEXT.md glossary (emission gating / DISPLAYS_ON / photon latency / doze / parked), claude-screen-timelapse/docs/wishlist-hmd-bench.md (MCP feature wishlist).

Related: [[hmd-firmware-liberty]], [[beyond-synaptics-firmware-build]], [[fan-kickstart-approach]]
