Alpha

Under active development. Breaking changes expected. APIs, installers, and UI may shift between releases.

Physical UI

A screen and four buttons.

Every ground node ships with a 128 by 64 OLED and four tactile buttons. A bench engineer is fine with SSH. A field pilot is not. This is the field-ready surface.

Why

Because a laptop is not always there.

A headless box breaks the moment something goes wrong in a field. The OLED lets an operator see link quality, battery state, and current uplink at a glance. The buttons let them fix the common cases without sitting down.

Status Screens

Five screens. Auto-cycle every five seconds.

Short-press B1 or B2 to freeze on one screen. The OLED uses a 0.96 inch SSD1306 (or 1.3 inch SH1106) over I2C at address 0x3C.

Link

RSSI, bitrate, FEC repaired, FEC lost, channel

Drone

Device ID, flight mode, battery percent, GPS sat count

GCS

Connected client list, HDMI kiosk status, IP addresses

Net

AP SSID and IP, USB tether IP, current uplink and status

System

CPU, RAM, temp in C, uptime, agent version

Buttons

Four buttons. Two layers.

Short press navigates. Long press (2 seconds minimum) fires a layer-2 action. Destructive actions require a visible confirm on the OLED before they run.

ButtonShort pressLong press
B1Menu up. Cycle status screens up.Toggle recording to local storage.
B2Menu down. Cycle status screens down.Toggle WiFi AP on or off.
B3Select. Enter submenu. Confirm.Rotate WFB-ng session key. Open 60s mesh pairing window.
B4Back. Leave submenu. Cancel.Factory reset (10 second hold with on-screen confirm).

Button pins on the Pi 4B bench rig: GPIO 5, 6, 13, 19, active-low with internal pull-ups. No external resistors required.

Field Tap-to-Pair

The magic moment.

Two nodes, no laptop, under two minutes. This is the mesh-pairing flagship UX. The OLED and four buttons are the entire provisioning surface.

Receiver screen

┌──────────────────────┐
│ [receiver]          │
│                     │
│ Accepting relay     │
│ 60s remaining       │
│                     │
│ Pending: 1          │
│ Accepted: 0         │
│                     │
│ B1 accept  B4 deny  │
└──────────────────────┘

Relay screen

┌──────────────────────┐
│ [relay joining]     │
│                     │
│ Scanning for mesh.. │
│                     │
│ Found:              │
│  ados-gs-a4b2  -52  │
│  ados-gs-1f0c  -78  │
│                     │
│ B1 join  B4 cancel  │
└──────────────────────┘

On the receiver, long-press B3 to open the pairing window. On the incoming relay, enter Mesh and pick Join mesh. The relay listens for mDNS broadcasts on UDP 5801 over bat0, filters for receivers with an open window, and shows them with link quality. Tap B1 on the relay to request. The receiver shows the request, tap B1 to accept. Curve25519 ECDH runs, the receiver seals a ChaCha20-Poly1305 invite bundle, the relay decrypts, batman-adv comes up on bat0, and the mesh is live. Total wall clock target: under 120 seconds.

Burn-in Mitigation

OLEDs wear. The agent works around it.

Field units run for long sessions. The OLED driver rotates pixel state and dims the display to stretch life.

Auto-dim

Drops to 20 percent brightness after 60 seconds of no button activity.

Pixel invert

Flips every pixel every 10 minutes. Invisible during status cycling.

Screensaver

Bouncing ADOS logo after 5 minutes idle. Status returns on any button.

Graceful Degradation

Missing hardware is not an error.

If the OLED or the buttons are absent, the agent does not complain. Every menu function is also reachable from the setup webapp or the Mission Control Hardware tab.

No OLED

Status is served over HTTP at the setup webapp endpoint. Menu actions available in the Hardware tab. No boot error, no service crash.

No buttons

Status screens still cycle every 5 seconds. Menu entry disabled. Use the setup webapp, the ados gs CLI, or the Hardware tab to change config.

A screen and four buttons. Enough for the field.

Full screen reference, menu walkthrough, and button reassignment are in public docs.

Physical UI docs
Get Early Access