> ## Documentation Index
> Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Display

> A 480 by 320 touch panel on the ground station. Native dashboard, five-screen status carousel, mesh-pairing overlays. Auto-provisioning across Cubie A7Z, Rock 5C Lite, and Pi 4B.

# Display

The ground station ships with an optional SPI-attached touch LCD. The OLED is the always-on glance. The LCD is what you reach for when you need to do something. Color, fonts that read at arm's length, and gestures that mean what they mean on every other touchscreen.

<Frame caption="Native 480 by 320 dashboard rendered on the SPI LCD. Four tiles: radio link, drone, mesh, uplink and cloud.">
  <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/dashboard/dashboard.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=76d3677fc24b38334d82c9bc5c0afaf8" alt="ADOS ground station dashboard rendered on the SPI LCD" width="480" height="320" data-path="images/ground-agent/display/dashboard/dashboard.png" />
</Frame>

<Note>
  Looking for the OLED and four buttons? See [Physical UI](/ground-agent/physical-ui). The two surfaces coexist on the same node.
</Note>

## Auto-provisioning

The installer takes care of the panel end to end. No `dtoverlay=` editing. No kernel rebuild.

<Steps>
  <Step title="Detect">
    The board fingerprint resolves a HAL profile. The profile lists one or more supported displays. The installer picks the first match, or honors a flag if the operator wants a different one.
  </Step>

  <Step title="Provision">
    The overlay source compiles to a device-tree binary. Modules load on every boot through a drop-in. Resolution, rotation, and touch state land in `/etc/ados/display.conf` for the renderer to read at startup.
  </Step>

  <Step title="Bind">
    First boot brings up the panel. The renderer probes the framebuffer, the touch bridge attaches to the input device, and the ground-station panel in Mission Control populates with live state.
  </Step>
</Steps>

See [Installation](/ground-agent/installation) for the install command and [Hardware Tab](/ground-agent/hardware-tab) for the Mission Control mirror.

## Native dashboard

The dashboard is purpose-built for the LCD. Bigger fonts, four stat tiles, each one a tap target. The render engine and every page are drawn by the native Rust display binary (`ados-display`, the `ados-oled` unit), so there is no Python imaging stack in the render path.

<Frame caption="Tap a tile to drill into that subsystem. The four tiles always render together so the at-a-glance scan never misses anything to a carousel rotation.">
  <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/dashboard/dashboard.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=76d3677fc24b38334d82c9bc5c0afaf8" alt="Dashboard with radio link, drone, mesh, uplink and cloud tiles" width="480" height="320" data-path="images/ground-agent/display/dashboard/dashboard.png" />
</Frame>

The carousel is upscaled from the 128x64 OLED canvas for backwards compatibility. The dashboard runs natively at 480x320.

## Status carousel

The same five screens that cycle on the OLED are upscaled onto the LCD. Glance behavior stays identical across hardware. Tap to freeze on the active screen.

<CardGroup cols={2}>
  <Card title="Link">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/carousel/link.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=a99d534cf112c5b54042c5e35cc321ad" alt="Link status screen" width="480" height="320" data-path="images/ground-agent/display/carousel/link.png" />
    </Frame>

    RSSI, bitrate, FEC repaired and lost, channel, TX power.
  </Card>

  <Card title="Drone">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/carousel/drone.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=30f9f735c13a76e6702aa0198e20cc8b" alt="Drone status screen" width="480" height="320" data-path="images/ground-agent/display/carousel/drone.png" />
    </Frame>

    Paired device id, flight mode, battery, GPS sat count.
  </Card>

  <Card title="GCS">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/carousel/gcs.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=b898cefffbe67251c2dd96fcf4ec1a13" alt="GCS clients screen" width="480" height="320" data-path="images/ground-agent/display/carousel/gcs.png" />
    </Frame>

    Connected client list with PIC badge.
  </Card>

  <Card title="Net">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/carousel/net.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=aa413d71d4dad26666d4991cb3e938a2" alt="Network status screen" width="480" height="320" data-path="images/ground-agent/display/carousel/net.png" />
    </Frame>

    AP SSID and IP, USB tether IP, current uplink and reachability.
  </Card>

  <Card title="System">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/carousel/system.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=8fb1f2a3968f351ca9adff8609b5ce41" alt="System health screen" width="480" height="320" data-path="images/ground-agent/display/carousel/system.png" />
    </Frame>

    CPU, RAM, temperature, uptime, agent version.
  </Card>
</CardGroup>

## Field tap-to-pair flow

Two devices, no laptop, under two minutes. Each step has its own screen. No silent transitions. No modal-blocking dead ends.

<Steps>
  <Step title="First boot, role unset">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/unset-boot.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=d0030882fd7822985ab14801eda23e41" alt="Role unset banner" width="480" height="320" data-path="images/ground-agent/display/mesh/unset-boot.png" />
    </Frame>

    A mesh-capable node with no role picked yet shows a banner pointing at the menu instead of cycling status screens.
  </Step>

  <Step title="Pick a role">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/role-picker.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=9a6c3075d3c9ac7b4e97bf5f8da7cebf" alt="Role picker" width="480" height="320" data-path="images/ground-agent/display/mesh/role-picker.png" />
    </Frame>

    Cycle direct, relay, or receiver. Tap apply to commit.
  </Step>

  <Step title="Open the receiver window">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/accept-window.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=c4b45eb0cde332ffe91f33d5da5f379d" alt="Receiver accept window" width="480" height="320" data-path="images/ground-agent/display/mesh/accept-window.png" />
    </Frame>

    On the receiver, open a 60-second accept window. The countdown is on the panel.
  </Step>

  <Step title="Scan from the relay">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/join-scan.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=cd16a1ffde9aa0c53851462629f6962a" alt="Relay scanning for receiver" width="480" height="320" data-path="images/ground-agent/display/mesh/join-scan.png" />
    </Frame>

    On the relay, scan for the receiver. mDNS discovery on `bat0` brings up host and signal.
  </Step>

  <Step title="Confirm joined">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/joined-status.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=b907ede1529e428511219b2b7adbd423" alt="Mesh joined status" width="480" height="320" data-path="images/ground-agent/display/mesh/joined-status.png" />
    </Frame>

    Mesh up. Confirmed on both ends.
  </Step>
</Steps>

The full ground-side reference for this flow lives at [Field pairing](/ground-agent/field-pairing).

## Overlay screens

Recovery, confirmation, list views. A node without a second WiFi adapter shows a hint screen so the operator knows the feature exists and how to unlock it.

<CardGroup cols={2}>
  <Card title="Neighbors">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/neighbors.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=1129e19c6f93c0a7c1444b4d066da70a" alt="Mesh neighbors list" width="480" height="320" data-path="images/ground-agent/display/mesh/neighbors.png" />
    </Frame>

    Mesh peers with link quality. Scrollable.
  </Card>

  <Card title="Hub unreachable">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/hub-unreachable.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=701fd88a94b23527ca9c64cd0586f68f" alt="Hub unreachable grace period" width="480" height="320" data-path="images/ground-agent/display/mesh/hub-unreachable.png" />
    </Frame>

    Receiver lost, grace period running. Wait or fall back to direct.
  </Card>

  <Card title="Leave confirm">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/leave-confirm.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=1737366063857657c4f20c3cd1da3b3c" alt="Leave mesh confirm screen" width="480" height="320" data-path="images/ground-agent/display/mesh/leave-confirm.png" />
    </Frame>

    Two-tap confirmation before leaving the mesh.
  </Card>

  <Card title="Error states">
    <Frame>
      <img src="https://mintcdn.com/altnautica/CxQ-v5ihdb-eTodF/images/ground-agent/display/mesh/error-states.png?fit=max&auto=format&n=CxQ-v5ihdb-eTodF&q=85&s=5da552b6f2e2a867bf27851d076e3bbe" alt="Unified error overlay" width="480" height="320" data-path="images/ground-agent/display/mesh/error-states.png" />
    </Frame>

    Single overlay that switches on the agent error code.
  </Card>
</CardGroup>

A `mesh-unavailable` hint screen replaces the silent empty submenu when the node has only one WiFi adapter, with a one-line nudge to plug a second adapter and reboot.

## Touch gestures

Gesture classification is shared across every screen. Same thresholds, same behavior. Hit zones are page-local so a tile tap maps to the right detail page regardless of theme.

| Gesture    | Threshold           | What it does                            |
| ---------- | ------------------- | --------------------------------------- |
| Tap        | \< 400 ms, \< 12 px | Drill into a tile or select an item.    |
| Long-press | >= 400 ms, \< 12 px | Open a context menu, start calibration. |
| Swipe      | \< 250 ms, >= 24 px | Navigate between pages.                 |
| Drag       | >= 250 ms, >= 12 px | Scroll a list or pan content.           |

## Supported boards

New boards add a `displays` block to their HAL profile YAML and the installer picks them up. No code change in the renderer.

| Board              | SoC            | Panel                      | Driver  | Touch   | Resolution |
| ------------------ | -------------- | -------------------------- | ------- | ------- | ---------- |
| Radxa Cubie A7Z    | Allwinner A733 | Waveshare 3.5" RPi LCD (A) | ILI9486 | ADS7846 | 480 x 320  |
| Radxa ROCK 5C Lite | RK3582         | Waveshare 3.5" RPi LCD (A) | ILI9486 | ADS7846 | 480 x 320  |
| Raspberry Pi 4B    | BCM2711        | Waveshare 3.5" RPi LCD (A) | ILI9486 | ADS7846 | 480 x 320  |

Display profiles live in each board's HAL YAML. Adding a new pair is a YAML change plus an overlay file.

## Mission Control mirror

The ground-station panel in Mission Control mirrors the on-device display state. Type, controller, resolution, rotation, last-touch age, current page, calibration state. Calibrate from the desk before the operator walks out the door.

<CardGroup cols={2}>
  <Card title="Live mirror">
    The local-display card appears the moment the panel binds. If the panel goes dark, the card flips to degraded state without taking down the rest of the panel.
  </Card>

  <Card title="Calibrate from the desk">
    The five-point calibration wizard runs from Mission Control as well as from a long-press on the panel itself. Calibration data persists across reboots.
  </Card>
</CardGroup>

See [Hardware Tab](/ground-agent/hardware-tab) for the full Mission Control surface.

## Graceful degradation

If the LCD is absent, the agent does not complain. The OLED still cycles, the setup webapp still serves status, and the ground-station panel in Mission Control still surfaces every config knob. Nothing in the agent's runtime requires the panel to exist.

## What's next

<CardGroup cols={2}>
  <Card title="Physical UI" icon="sliders" href="/ground-agent/physical-ui">
    The OLED + four-button surface that ships on every node.
  </Card>

  <Card title="Installation" icon="download" href="/ground-agent/installation">
    The one-line install handles the LCD overlay automatically.
  </Card>

  <Card title="Setup and pairing" icon="handshake" href="/ground-agent/setup-and-pairing">
    First-time pairing and onboarding from the device webapp or the GCS.
  </Card>

  <Card title="Field pairing" icon="link" href="/ground-agent/field-pairing">
    The full mesh tap-to-pair walkthrough, with the same screens shown on the panel.
  </Card>
</CardGroup>
