diff --git a/crates/xtce-cli/Cargo.toml b/crates/xtce-cli/Cargo.toml index 7649f4c..4eb1c3d 100644 --- a/crates/xtce-cli/Cargo.toml +++ b/crates/xtce-cli/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-cli" description = "Command-line tools for inspecting and decoding CCSDS telemetry defined by XTCE" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "cli"] +categories = ["aerospace::space-protocols", "command-line-utilities"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-cli/README.md b/crates/xtce-cli/README.md new file mode 100644 index 0000000..4f93e93 --- /dev/null +++ b/crates/xtce-cli/README.md @@ -0,0 +1,14 @@ +# xtce-cli + +The `xtce` command: inspect an XTCE definition and decode a CCSDS stream against it. + +```console +$ xtce info mission.xml # what it contains, and what cannot be decoded +$ xtce decode mission.xml downlink.dat # values, as a table or as JSON lines +$ xtce decode mission.xml downlink.dat --param 'ADGPSPOS*' +``` + +`--param` takes a glob, and a value matching nothing in the definition is an error naming the +nearest parameter rather than an empty report. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-codegen/Cargo.toml b/crates/xtce-codegen/Cargo.toml index c81b1a7..7b01a5b 100644 --- a/crates/xtce-codegen/Cargo.toml +++ b/crates/xtce-codegen/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-codegen" description = "Compile an XTCE telemetry definition into a static Rust decoder" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "codegen", "spacecraft"] +categories = ["aerospace::space-protocols", "development-tools"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-codegen/README.md b/crates/xtce-codegen/README.md new file mode 100644 index 0000000..8fe21d8 --- /dev/null +++ b/crates/xtce-codegen/README.md @@ -0,0 +1,14 @@ +# xtce-codegen + +Compiles an XTCE definition into a `struct` per container whose `decode` is a sequence of +loads, shifts and masks with every offset already a literal. Nothing consults the XTCE model at +run time. + +Measured against the interpreted decoder in the same repository on the same 7 200-packet +stream: roughly 100× it, which is about 11 000× the Python reference. + +Refusals are fatal by design. A construct the generator cannot compile is refused with the +element named, rather than falling back to interpretation — a silent fallback would make the +measurement above meaningless. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-decode/Cargo.toml b/crates/xtce-decode/Cargo.toml index 97519cc..e33dacd 100644 --- a/crates/xtce-decode/Cargo.toml +++ b/crates/xtce-decode/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-decode" description = "Decode CCSDS telemetry packets against an XTCE definition" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "decoder"] +categories = ["aerospace::space-protocols", "encoding"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-decode/README.md b/crates/xtce-decode/README.md new file mode 100644 index 0000000..d990124 --- /dev/null +++ b/crates/xtce-decode/README.md @@ -0,0 +1,19 @@ +# xtce-decode + +Decodes CCSDS space packets against an XTCE definition, and is tested the only way that means +anything: packet for packet against +[`lasp/space_packet_parser`](https://github.com/lasp/space_packet_parser), the Python +implementation, over nine recorded mission streams. Where the two disagree, this crate is wrong +until proven otherwise — and the handful of deliberate divergences are listed, with reasons, in +the repository's `SUPPORTED.md`. + +Measured at roughly 100× that reference on decode. + +* **No panics.** Every failure is a `DecodeError`; a corrupt or hostile packet must not take + down a process sitting on a live downlink. +* **No allocation for aligned reads.** Byte-aligned binary and string fields borrow straight + from the packet. +* **Raw and engineering values both kept.** XTCE treats them as distinct and restriction + criteria may test either. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-model/Cargo.toml b/crates/xtce-model/Cargo.toml index 0a4fd8e..ba12755 100644 --- a/crates/xtce-model/Cargo.toml +++ b/crates/xtce-model/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-model" description = "XTCE telemetry metadata: streaming XML parser and arena-backed intermediate representation" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "parser"] +categories = ["aerospace::space-protocols", "parser-implementations"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-model/README.md b/crates/xtce-model/README.md new file mode 100644 index 0000000..2d4a70e --- /dev/null +++ b/crates/xtce-model/README.md @@ -0,0 +1,15 @@ +# xtce-model + +Reads an XTCE `SpaceSystem` document into `XtceDb`: a flat, index-addressed model that +[`xtce-decode`](https://crates.io/crates/xtce-decode) walks to decode CCSDS packets, and that +`xtce-codegen` compiles into static Rust decoders. + +Streaming XML through `quick-xml`, an arena behind every entity, and a `u32` newtype instead of +a pointer — which keeps the model `Send + Sync`, makes cloning cheap, and turns following a +reference into an array index. + +Only `TelemetryMetaData` is modelled. Constructs outside the decodable subset are still +*represented*, so loading a real mission database never fails merely because part of it is out +of scope; the error comes later, from the decoder, at the point a value actually depends on it. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs).