91 lines
4.0 KiB
Markdown
91 lines
4.0 KiB
Markdown
# 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 reported vehicle identity and
|
|
heartbeat, 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
|
|
|
|
```text
|
|
VehicleDataPort (replay now; MAVLink adapter later)
|
|
-> typed observation-or-drop updates
|
|
-> Riverpod observability state
|
|
-> Vehicle observation / Event stream 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:
|
|
|
|
```sh
|
|
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 pairs a near-black canvas with muted-silver text
|
|
and restrained green accents. The visual system is intentionally layered:
|
|
locally blurred glass is reserved for persistent navigation and session
|
|
chrome, while vehicle facts and the event stream use opaque instrument
|
|
surfaces for reliable scanning at volume.
|
|
|
|
Use **Appearance** in the desktop rail or compact session strip to select
|
|
**System default**, **Light**, or **Dark**. The choice applies for the current
|
|
session only.
|
|
|
|
## Replay workspace
|
|
|
|
The shell keeps provenance and authority visible before any detail:
|
|
|
|
- **Vehicle observation** presents the replay source, last reported heartbeat,
|
|
observed data streams, and ingress accounting. Typed replay marks integrity
|
|
as not evaluated; reported state is not a current safety authority.
|
|
- **Event stream** is a dense, copyable diagnostic timeline. Logs, runtime
|
|
errors, and orderly shutdown reports remain distinct, and bounded delivery
|
|
flags such as truncation and coalescing remain visible. The app retains a
|
|
bounded local history, prioritising runtime errors and shutdown reports, and
|
|
discloses local UI evictions separately from vehicle-side delivery loss.
|
|
- **Vehicle setup · unavailable** is explanatory text, not a disabled control.
|
|
It accurately reflects that this firmware currently accepts no inbound
|
|
MAVLink authority.
|
|
|
|
## 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.
|