Five spacecraft subsystems — DHS, TTC, ADCS, EPS and PAYLOAD — each built as an independent FreeRTOS binary, talking over a simulated multi-drop CAN bus, plus a ground-segment EGSE you can drive over TCP. Nodes share no memory: the only thing that crosses a subsystem boundary is an 8-byte CAN frame — except bulk science, which crosses a second bus, a point-to-point SpaceWire link carrying RMAP writes from the payload straight into the DHS's mass memory. The spacecraft/ground boundary is a TCP stream of CCSDS Space Packets with ECSS PUS-C headers.
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ DHS │ │ TTC │ │ ADCS │ │ EPS │ │ PAYLOAD │
│ 0x1 │ │ 0x2 │ │ 0x3 │ │ 0x4 │ │ 0x5 │
└──┬───┬──┘ └──┬──┬───┘ └────┬────┘ └────┬────┘ └──┬───┬──┘
│ └─────────┴──┼────┬───────┴─────────────┴───────────┘ │
│ │ │ UDP :20000 (CAN backplane) │
│ │ ┌─┴─────────┐ │
│ │ │ can_hub │ routing table, learned │
│ │ └───────────┘ at runtime │
└────────────────┼──────────────────────────────────────────┘
UDP :20100 │ SpaceWire: RMAP bulk science, one way
│
TCP :21000 │ ── spacecraft ──
════════════════════╪══════════════════════════════════════
│ ──── ground ────
┌─────┴─────┐ TCP :21001 ┌──────────┐
│ egse │ ──── stream ──▶│ egse_tm │ decode TM
│ (relay) │ ◀─── TC ───────│ egse_tc │ build TC
└───────────┘ └──────────┘
Build the project using cmake and then run the complete platform using the ./run_sim.sh script:
$ cmake -B build && cmake --build build -j # fetches FreeRTOS-Kernel V11.3.0
$ ./run_sim.sh # Ctrl+C stops the platform
$ ./build/bin/egse_tm # watch decoded telemetry, in another terminal
$ ./build/bin/egse_tc DHS PING # send a command, in a thirdOr using docker:
$ docker compose up --buildThe documentation is available from: https://nunorc.github.io/minscs/, the source is available from docs/.