Add debug-only WiFi live-video UI capture for QA
Stream the live shadow framebuffer over WiFi so QA can record the device
UI in motion (scroll tweens, tab-indicator slide, PIN arc, popup
transitions) that static screenshots cannot show. Entirely behind
DEBUG_SERIAL_BUTTONS; zero cost in release.
Firmware:
- platform/wifi_station: new STA facade (counterpart to the SoftAP
facade) that joins an existing network, waits for a DHCP lease, and
tears down via the shared wifi::stopAndDeinit path.
- platform/http_server: add sendResponseChunk() over httpd_resp_send_chunk
for streaming responses.
- web/video_frame_header.h: pure, host-testable length-framed RGB565
frame header (KVID magic, little-endian fields).
- web/video_stream: VIDEO serial commands (WIFI/START/STOP/?) and a
GET /stream endpoint that pushes the framebuffer (read via
display::readRect) throttled to fps. The httpd worker is pinned to the
services core (Core 0) so the UI core stays smooth. Full shutdown path;
also torn down before deep sleep.
Security: WiFi SSID/password are runtime-only secrets passed as serial
command arguments; never hardcoded, persisted, or logged. The password
is redacted (only pass_len printed) and the local copy is secure-wiped.
Host tool: scripts/video_qa.py connects to /stream, decodes RGB565, and
records MP4/GIF (imageio/Pillow) or a PPM frame sequence, with optional
live preview, scaling, duration/frame limits, and reconnect handling.
Tests/docs: native unit test for the frame-header encode/decode;
docs/testing/video-qa-capture.md runbook plus serial-debug-commands and
platform-abstraction updates.