Skip to content

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 08:21
· 9 commits to main since this release

First release.

A ground station in one binary: a socket, an XTCE definition, and a window. 8.19 MiB stripped
on macOS arm64 and 10.90 on Linux x86_64 — the table at the bottom of these notes is the
measurement, taken by the workflow that built the files attached to them. No JVM, no Node, no
database, no browser.

What it does

Bytes arrive over UDP, TCP or from a file. CCSDS TM transfer frames are recovered from them —
attached sync marker, pseudo-randomiser, Reed-Solomon (255,223) and (255,239) in the Berlekamp
dual basis, interleaved up to eight deep — or the packets arrive bare, or wrapped in CSP v1 or
v2. Space packets are reassembled across frame boundaries, decoded against the definition by
xtce-rs, and land in a store the interface reads:
a parameter tree, a table, plots that decimate to the pixel budget rather than to the ring,
limit checking, an event log, recording and CSV export.

Each of those four steps fails on its own and has counters an operator watches, because
"nothing is coming through" has four different answers and they need different fixes.

What it is tested against

533 tests, and a real downlink: 7 200 JPSS geolocation packets, vendored under testdata/
with provenance. Every value this produces for that stream is identical to what xtce-cli
produces, which is itself checked packet for packet against the Python reference
implementation over nine streams.

The recording ships with a layout, so xtce-gs replay … --repeat opens on GPS position,
velocity and the attitude quaternion without anyone clicking anything — and a test asserts
that it does, because a layout naming a parameter the definition lost is dropped with a note
rather than an error.

One of those tests is worth reading on its own. The pipeline is synchronise → derandomise → Reed-Solomon, and the order is the whole defence: RS(255,223) is linear over GF(2⁸), the
255-octet CCSDS randomiser sequence is itself a codeword, and so a frame nobody derandomised
is also a codeword — it decodes clean, reports zero corrections, and disagrees with the
frame it came from in all 255 of its 255 symbols. The error-correcting code cannot see the one
mistake somebody reordering this pipeline would make.

What it is not

Not flight-proven. Not an operations centre. Not a parameter archive — history is a ring in
memory and a recording is a file of bytes. One process, one operator, one window; two
operators want Yamcs.

What is deliberately missing, and what each thing needs decided before it can be built, is in
TODO.md: AOS frames, erasure decoding, shortened codeblocks, a serial
source, and eighteen other entries.

Binaries

Built by this workflow from the tag, stripped, measured on the runner.

Target Bytes Stripped
aarch64-apple-darwin 9103024 7843528
x86_64-apple-darwin 9922128 8587400
x86_64-unknown-linux-gnu 13685384 11424312