Repository navigation
Releases: RustSpaceLab/xtce-gs
Release list
v0.1.1
Five fixes, one of which the station found by photographing itself.
The window can take its own picture
--screenshot <path> on run and replay asks egui for the frame it was going to paint
anyway, writes a PNG and closes; --screenshot-after is how long the station gets to fill
first, because every plot is empty until packets arrive. The README has a picture of the
interface now, and the command that makes it again sitting under it.
This was not a feature looking for a reason. A screen grabber cannot supply a reproducible
picture: macOS refuses screen recording outright to a process that is not an application
bundle, and does not error — it returns the desktop with every window missing.
The first picture it took showed two bugs no test had.
What was wrong
The event log read "22 of 12 saved parameters are in this definition; the other
18446744073709551606 are kept". Layout::restore counted mentions while its caller's
denominator counted the watch list, and every plotted parameter is in both — so the count
exceeded its own denominator and the subtraction wrapped. In a debug build that is a panic.
The packet counters drew underneath the Pause button. The source label carries a whole
file URL with its query string, longer than everything else on the strip together.
The "… and N more, narrow the search" notice was drawn below the clip rect, every time. An
operator searching a nine-thousand-parameter definition saw 512 rows and nothing to say the
other 8 981 existed, which reads as a search that found everything.
--history did nothing whenever a layout file existed — which, since the bundled layout
started shipping, is always for the demo. The command line wins now, the way it does over a
config file everywhere else.
A headless pass whose source never opened exited 0. xtce-gs run --headless --record under
a supervisor exited clean after a second having recorded nothing, and Restart=on-failure
never fired. A missing definition already exited 1, because it is opened on the caller's
thread; a missing recording exited 0, because it is opened one spawn later. Two spellings of
one mistake, split on something no operator can see. Session::outcome now says which ending
it was, and the two that are failures are reported as such.
Also
Pinned to xtce-rs v0.1.1. The comments were thinned by about 450 lines, which changed no
behaviour and is in the history if you want to see what went.
542 tests.
Binaries
Built by this workflow from the tag, stripped, measured on the runner.
| Target | Bytes | Stripped |
|---|---|---|
aarch64-apple-darwin |
9220592 | 7944920 |
x86_64-apple-darwin |
10051400 | 8700360 |
x86_64-unknown-linux-gnu |
13765144 | 11492264 |
v0.1.0
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 |