feat: render minimal flight OSD from supervisor snapshots (#3)

This commit is contained in:
2026-10-17 08:49:01 +02:00
parent ffae3560c4
commit f0d5052ccb
19 changed files with 1434 additions and 50 deletions
+22 -2
View File
@@ -15,11 +15,17 @@ Current capabilities:
- validates protocol version, frame length and CRC-16;
- logs channel changes instead of every frame;
- starts/stops `fpv-video` from the configured CH6 power/lifecycle control;
- publishes immutable flight OSD snapshots — final RC channels, arm state
derived from the configured arm channel, requested CH6 WFB power and
decoded-video presence — to a tmpfs state file without ever blocking the
UART, WFB or video paths; unchanged state is republished as a heartbeat
and the file is removed on shutdown;
- starts an independent kiosk display before video, tolerates temporary X11 downtime without restarting the supervisor, and stops deterministically on shutdown;
- keeps the fullscreen fallback/menu canvas below `fpv-video`, showing `Brak połączenia WFB` only while video is absent;
- maps a transparent, input-transparent OSD overlay above `fpv-video` as the reserved flight OSD rendering surface: it never presents pixels over the video or intercepts its input.
- maps a transparent, input-transparent OSD overlay above `fpv-video` as the flight OSD rendering surface: it never intercepts video input, and it punches its output shape only around the text it draws;
- renders a deliberately minimal Viture OSD — arm state and requested CH6 WFB power — on that overlay while decoded video is present, refreshing on a slower cadence than the video so the pilot stream keeps priority; a stale snapshot (dead UART) stops rendering instead of freezing telemetry over live video.
Future MIPI/touch targets use their own templates rather than sharing one global layout. The flight OSD will render on the existing transparent layer above video, preserving the pilot stream's priority.
Future MIPI/touch targets use their own templates rather than sharing one global layout. The flight OSD renders on the existing transparent layer above video, preserving the pilot stream's priority.
## Installation on Orange Pi
@@ -55,6 +61,20 @@ serial:
`/dev/ttyS0` is the Orange Pi boot/debug UART and must not be used for the permanently connected GX12.
The flight OSD is configured alongside:
```yaml
osd:
state_path: /run/groundstation/osd-state.bin
arm_index: 4 # CH5/AUX1, zero-based
armed_threshold: 0 # armed while the arm channel stays above this
```
`groundstation-display` reads the same state file; both sides must agree on
the path (override the renderer's with `groundstation-display -osd-state
<path>` if you change `osd.state_path`). The state file carries only flight
telemetry and never any credentials or keys.
## Runtime dependencies
- X11 session on `:0` owned by `orangepi`; the kiosk waits for X11 and reconnects after display-manager restarts;