Add configurable Xbox motion and action bindings, frame-aware six-axis MAVLink controls, sensor logging, camera viewing and recording, and a faster startup path. Synchronize both app copies and document companion hardware setup and verification limits.
3.4 KiB
V2 verification — 22 October 2026
Passing checks
- 41 Python tests: vehicle-state confirmation, control leases/watchdogs, six-axis packet values, unsupported firmware/frame gating, endpoint handling, telemetry conversion/staleness, persisted names/profiles, recording chunks, and relay acknowledgement.
node tests/controller_v2.cjs: synthetic Xbox triggers, B/A direction, opposing input cancellation, six axes, custom buttons, limits, invalid/missing inputs, migration, and actions.node tests/controller_input.cjs: existing stick conditioning and console parser checks.- Python compilation, JavaScript syntax checks, and
git diff --check.
No tests opened a real COM port or armed a physical vehicle.
Rendered browser checks
Used the supported local in-app browser with the real app assets in Demo Mode:
- Mapping dialog: three-axis and six-axis presets, saving, reopening after a full page reload, and retained LB/RB roll bindings.
- Vehicle settings: saved BlueROV1 six-thruster preview, independent accessory relay selectors, and consistent FC/demo status.
- Drive: all six command controls at 1024×768, 960×580 (the native window minimum), and 700×572; no overlap with the output toolbar.
- Active-output list: six rows for the six-thruster preview, with scrolling and reversal buttons. General frames disable the SimpleROV-3-specific independent-scale mode.
- Engagement: held F2 in Demo Mode, inspected rendered engaging, then disengaging and their settled states. Both words are spelled correctly, centered, and have no trailing dots.
- Dashboard: camera-off state, active simulated inspection view, missing/offline readings, explicit Demo labeling, sensor values and video controls at desktop and compact sizes.
- Recording: started/stopped a canvas preview recording; the browser produced a 1,386,065-byte WebM file.
- Accessories: demo lights toggle, camera power toggle, and viewing stops after demo power-off.
Reduced-motion CSS is included. The connected browser offers viewport testing but no media-preference emulation, so a rendered reduced-motion override was not verified.
Existing harness limitation
The older tests/control_ui.test.cjs fake-DOM harness is not passing. It reports 23 failures on the saved pre-V2 checkpoint and 21 on V2. Most fail before app initialization because the harness lacks ResizeObserver; it also has obsolete markup/animation assertions and omits browser dependencies. It is not counted as a passing check. Actual browser checks above establish the rendered behavior of this implementation.
Startup measurement
Three fresh-process worker-module imports on this laptop:
| Build | Samples | Median |
|---|---|---|
| Pre-V2 checkpoint | 781.8 / 616.3 / 655.3 ms | 655.3 ms |
| V2 | 402.8 / 362.4 / 399.1 ms | 399.1 ms |
This measures the module import, not total app startup. The launcher also avoids pip on subsequent launches when requirements have not changed, and starts the web interface directly.
Physical verification still required
Real Xbox hardware, live six-axis FC motor allocation, live sensor calibration, WHEP video from a Raspberry Pi, native WebView full-video recording, physical relay outputs, and tether/underwater behavior were not verified. The browser recording and native chunk-writing path were checked separately. BlueOS native camera discovery/signaling is not integrated; this release uses an explicit WHEP, HTTP video, or MJPEG URL.