HDMI Kiosk Mode
Plug a monitor and a gamepad into the ground station SBC. The agent launches Chromium in kiosk mode, rendering the Mission Control HUD route at full screen. You get video, telemetry overlays, and stick control without a laptop, phone, or internet connection.
HDMI kiosk showing the cockpit: video background, attitude indicator, and telemetry overlays
What you need
- Micro-HDMI to HDMI cable (Pi 4B uses micro-HDMI)
- Any HDMI monitor or display (7” field monitors work well)
- USB or Bluetooth gamepad (Logitech F310, Xbox, PS4, PS5, 8BitDo)
How it works
When a display is connected, the kiosk path comes up. The DRM node is not assumed to becard0: the service scans every card for a connected connector, because on a Pi 4 the render node and the display are different cards, and it waits for one to appear rather than checking once (the driver probes asynchronously, so a one-shot check loses the boot race).
- The agent serves the cockpit at
http://localhost:8080/cockpit/— a light single-page app served by the agent’s own front. The kiosk waits for that URL to answer before launching, so the panel never lands on an error page it will not retry from. ados-kiosklaunches Chromium pointed at it, either inside thecageWayland compositor (when the board has no desktop, the appliance case) or as a fullscreen window inside a running desktop session (cage needs the DRM master, which a running compositor already holds).- Chromium renders it fullscreen, with no address bar, no tabs, no browser chrome. Its profile and cache are kept in a RAM-backed directory with a bounded cache, so a panel running for months does not wear out the card.
ados-mediamtx-gs) on localhost. Telemetry comes from the local MAVLink WebSocket.
The cockpit layout
The cockpit is a flight view designed for a small fullscreen panel:- Full-frame video background (WebRTC from the local MediaMTX)
- Top bar: link RSSI, flight mode, battery percentage, altitude, speed, GPS satellite count
- Bottom bar: crosshair, artificial horizon, heading tape
- Corner alerts: failsafe indicators, home distance, connection health
- No menus, no maps, no multi-drone fleet views
Performance on Pi 4B
Gamepad input
The Web Gamepad API in Chromium handles controller mapping. USB gamepads work immediately. Bluetooth gamepads need to be paired first. To pair a Bluetooth gamepad:- Put the controller in pairing mode
- Use the OLED menu: navigate to Network > Bluetooth > Scan
- Select the controller from the list
- Press B3 (Select) to confirm
MANUAL_CONTROL MAVLink message path. The same code that handles gamepad input in the browser on your laptop handles it here.
Pilot-in-command (PIC)
When the kiosk starts and a gamepad is connected, the kiosk automatically claims PIC. If a laptop or phone also connects, they are observers until PIC is explicitly transferred. PIC transfer is done through:- The ground-station panel in Mission Control on a connected laptop (click “Take Control”)
- The OLED menu (B3 long-press to release PIC)
Display settings
You can configure HDMI output from three places:- OLED menu: Display > HDMI Resolution
- Setup webapp: Display page
- Mission Control: ground-station panel > Physical UI tab
- Resolution (auto-detect, 720p, 1080p)
- Refresh rate (30 Hz, 60 Hz)
- OLED brightness and auto-dim
Booting into kiosk
The kiosk service usescage as a minimal Wayland compositor. cage is designed for single-application kiosk use. It starts only when:
- A display output is detected (
/dev/dri/card0exists) - The ground-station profile is active
- The local Mission Control build is available
Graceful degradation
What is next
- Physical UI for the OLED and button system
- WiFi AP to add laptop observers while flying on HDMI
- Setup and Pairing for the first-time walkthrough