Files
kaptan/ground-suite

Ground Suite

Ground Suite is Kaptan's desktop ground-control software. Its application identifier is dev.kaptan.ground_suite.

Current scope

The first vertical slice is a read-only observability console. It uses a deterministic replay fixture to present a vehicle identity, heartbeat state, telemetry presence, ordinary logs, runtime errors, and orderly-shutdown observations. It never sends bytes to a vehicle.

This is deliberate: the current F722 firmware rejects every inbound MAVLink frame, and kaptan-sitl serve has no MAVLink endpoint. A connected-looking UI must not suggest the vehicle is controllable, safe, armed, or writable.

Architecture

VehicleDataPort (replay now; MAVLink adapter later)
        -> typed observation-or-drop updates
        -> Riverpod observability state
        -> Overview / Diagnostics presentation

MavlinkByteSource and MavlinkEventDecoder are receive-only seams. The future decoder must combine pinned MAVLink Common definitions with Kaptan's kaptan.xml root, and preserve the firmware's semantic rules for bounded KAPTAN_LOG, KAPTAN_ERROR, and KAPTAN_SHUTDOWN payloads. Raw severity, shutdown-reason, and diagnostic-flag values remain visible even when an app does not yet recognise them. Expected malformed or unsupported frames become parser/semantic drop updates and never terminate the observation stream.

Development

From the repository root:

nix develop -c flutter analyze ground-suite
nix develop -c dart format --set-exit-if-changed ground-suite
nix develop -c sh -c 'cd ground-suite && flutter test'
nix develop -c sh -c 'cd ground-suite && flutter run -d linux'

Linux is the first tested desktop runner. Native macOS and Windows runners will be added only with their respective CI coverage.

Appearance

Ground Suite supplies light and dark themes and follows the operating system by default. Its dark palette uses near-black, muted-silver, and restrained green accents; translucent, locally blurred panels keep operational content legible without turning diagnostics into decoration.

Deliberately deferred work

  • TODO(gcs-live-mavlink): generated MAVLink Common plus custom-dialect bindings, a MAVLink 2 receive parser, semantic validation, and serial/UDP/recording endpoints.
  • TODO(gcs-connection): endpoint lifecycle, reconnect generation, link-loss policy, and parser/semantic-drop accounting sourced from real frames.
  • TODO(gcs-config): descriptor-driven configuration UI only after firmware has authenticated ingress, source binding, persistent anti-replay state, target storage, and a disarmed atomic activation path.
  • TODO(gcs-upload): CBOR import/export only through the reviewed transaction protocol; never treat a local file as active vehicle configuration.
  • TODO(gcs-control): arm, command, calibration, and shutdown workflows need their own reviewed authority and safety contracts.