Svc/Subtopologies/ComCcsds/docs/sdd.md
The ComCcsds subtopologies implement F´’s CCSDS communications stack for framing/deframing on the flight side. There are two variants in the same module:
Svc::ComStub implementation of Svc.ComInterface and expects to be wired to a Drv::ByteStreamDriverModel (TCP/UDP/UART, etc.), andSvc.ComInterface provided by the deployment.Both variants provide the standard router + ComQueue + CCSDS framers/deframers path and are tuned through ComCcsdsConfig instance properties.
[!IMPORTANT]
ComCcsdsprovides framing/deframing for CCSDS SpacePackets inside TM/TC data transfer frames.
| ID | Description | Validation |
|---|---|---|
| SVC-COMCCSDS-001 | Provide a CCSDS framer to convert COM buffers into CCSDS frames for downlink. | Inspection |
| SVC-COMCCSDS-002 | Provide a CCSDS deframing path to parse incoming CCSDS frames into COM buffers for uplink. | Inspection |
| SVC-COMCCSDS-003 | Provide an F´ router to route deframed packets (e.g., commands/files) into the flight software. | Inspection |
| SVC-COMCCSDS-004 | Provide a subtopology variant that supplies Svc::ComStub designed to connect to a ByteStream driver. | Inspection |
| SVC-COMCCSDS-005 | Provide a subtopology variant that expects an external Svc::ComInterface supplied by the deployment. | Inspection |
| SVC-COMCCSDS-006 | Support configurable instance properties (IDs, queue sizes, stack sizes, priorities, CPU affinities) via ComCcsdsConfig. | Inspection |
| SVC-COMCCSDS-007 | Provide composable layer topologies: a Space Packet packet layer (SpacePacketFraming, SpacePacket) and a TM/TC transfer frame layer (TmTcFraming), from which the full stack is composed. | Inspection |
| Instance name | Type (Svc/Drv) | Kind | Purpose (core function) |
|---|---|---|---|
fprimeRouter | Svc.FprimeRouter (default; configurable via ComCcsdsRouterConfig.fpp) | Passive | Routes deframed packets (e.g., commands/files) into the flight software. |
comQueue | Svc.ComQueue | Active | Queues categorized COM data for framing (telemetry, events, file, etc.); exposes run. |
spacePacketFramer | Svc.Ccsds.SpacePacketFramer | Passive | Builds CCSDS Space Packets from COM buffers (downlink step 1). |
framer | Svc.Ccsds.TmFramer | Passive | Builds CCSDS TM Transfer Frames from space packets and sends to the link (downlink step 2). |
spacePacketDeframer | Svc.Ccsds.SpacePacketDeframer | Passive | Deframes F Prime data from CCSDS Space Packets (uplink step 2). |
tcDeframer | Svc.Ccsds.tcFramer | Passive | Deframes CCSDS Space Packets from CCSDS TM Transfer Frames (uplink step 1). |
frameAccumulator | Svc.FrameAccumulator | Passive | Collects bytes from the link and emits complete frames/packets for deframing (uplink path). |
comStub | Svc.ComStub | Passive | (Variant A only) Implementation of Svc.ComInterface, adapting a Drv::ByteStreamDriverModel. |
Two variants: A. “With ComStub”: Subtopology includes
Svc::ComStuband exposes ByteStream ports to your driver. B. “With External ComInterface”: Subtopology does not includeSvc::ComStub; you provide one in the deployment.
The module also exposes the two layers of the stack as importable topologies, allowing projects to compose alternative stacks (e.g., inserting an SDLS security layer between them) while reusing the same instances:
| Topology | Contents |
|---|---|
SpacePacketFraming | Packet layer: comQueue, fprimeRouter, spacePacketFramer, spacePacketDeframer, apidManager, aggregator, commsBufferManager. Open framing boundary. |
SpacePacket | SpacePacketFraming plus comStub — a space-packet-only stack with no transfer frame layer. |
TmTcFraming | Transfer frame layer: framer (TM), tcDeframer, frameAccumulator. Open upstream/downstream boundaries. |
FramingSubtopology | SpacePacketFraming composed with TmTcFraming (variant B). |
Subtopology | FramingSubtopology plus comStub (variant A). |
Each layer topology exposes its open boundary as topology ports (e.g. SpacePacketFraming.dataOut,
TmTcFraming.framedDataIn, FramingSubtopology.comStatusIn), so composing topologies and deployments wire
to the layer's ports rather than to individual component instances.
Rate Groups: Connect a rate group to comQueue.run. This is not required for the subtopology to function, but defines the rate at which ComQueue will send telemetry.
Transport Endpoint:
Drv::ByteStreamDriverModel and the subtopology’s ComStub.Svc::ComInterface and wire it to the CCSDS framer/deframer ports in the subtopology.Flight-side hookups: Wire the router outputs (commands/files) into your CDH stack (e.g., command dispatcher, file uplink), and feed packet sources (telemetry/events/file downlink) into comQueue.
These subtopologies focus on the CCSDS framing and deframing setup and does not provide wider CDH.
Below are two usage patterns, one for each variant. Replace identifiers/ports with the exact names in ComCcsds.fpp.
Svc::ComStub (expects a ByteStream driver)topology Flight {
instance ComCcsds.Subtopology
instance comDriver: <ByteStreamDriverInterface>
# (A1) Schedule ComQueue telemetry downlink (optional)
connections RateGroups {
rg.RateGroupMemberOut[0] -> ComCcsds.Subtopology.comQueueRun
}
# (A2) Wire ByteStream driver <-> ComStub supplied by the subtopology
connections Link {
comDriver.$recv -> ComCcsds.Subtopology.drvReceiveIn
ComCcsds.Subtopology.drvReceiveReturnOut -> comDriver.recvReturnIn
ComCcsds.Subtopology.drvSendOut -> comDriver.$send
comDriver.ready -> ComCcsds.Subtopology.drvConnected
}
}
[!TIP]
ComCcsds.commsBufferManagerandComCcsds.commsBufferSendIncan be used if theByteStreamDriverrequires buffer management.
Svc::ComStubtopology Flight {
import ComCcsds.FramingSubtopology
# (B1) Provide your own ComInterface
instance radio: <YourComInterface>
# (B2) Schedule ComQueue
connections RateGroups {
rg.RateGroupMemberOut[0] -> ComCcsds.comQueue.run
}
# (B3) Wire your ComInterface between the driver and the ComCcsds framer/deframer
connections Link {
# Downlink: framing layer -> your ComInterface
ComCcsds.FramingSubtopology.dataOut -> radio.dataIn
radio.dataReturnOut -> ComCcsds.FramingSubtopology.dataReturnIn
radio.comStatusOut -> ComCcsds.FramingSubtopology.comStatusIn
# Uplink: your ComInterface -> framing layer
radio.dataOut -> ComCcsds.FramingSubtopology.dataIn
ComCcsds.FramingSubtopology.dataReturnOut -> radio.dataReturnIn
}
}
Configure only the instance properties owned by the ComCcsds subtopologies. All knobs live under:
Svc/Subtopologies/ComCcsds/ComCcsdsConfig/ComCcsdsConfig.fpp
ComCcsdsConfig.fpp)ComQueue and any other active/queued elements defined by the subtopology.ComQueue).TASK_DEFAULT (no pinning).module BuffMgr provides constants for the bins configured for commsBufferManager.
| Requirement ID | Satisfied by (instance/type) |
|---|---|
| SVC-COMCCSDS-001 | spacePacketFramer — Svc.Ccsds.SpacePacketFramer, tmFramer — Svc.Ccsds.TmFramer |
| SVC-COMCCSDS-002 | frameAccumulator — Svc.FrameAccumulator |
| SVC-COMCCSDS-003 | fprimeRouter — Svc.FprimeRouter (default; swappable via ComCcsdsRouterConfig.fpp) |
| SVC-COMCCSDS-004 | Subtopology (variant including Svc.ComStub) |
| SVC-COMCCSDS-005 | FramingSubtopology (variant expecting external Svc.ComInterface) |
| SVC-COMCCSDS-006 | ComCcsdsConfig module |
| SVC-COMCCSDS-007 | SpacePacketFraming, SpacePacket, and TmTcFraming topologies |