ccsds_packetization
The ccsds_packetization library provides the inverse service-layer
helpers to the existing ccsds_packet_services library.
This first implementation slice covers:
fitting packet streams into TM and AOS packet-service regions
preserving partially emitted packet bytes across frame boundaries
tracking queued packets per frame type, spacecraft identifier, and virtual channel identifier
generating idle packets deliberately when there is remaining frame capacity
reporting explicit packetization events for buffered fragments and generated idle packets
Representation
Packetizer state is represented using the compound term:
packetizer_state(Channels)
Where Channels is a list of terms of the form:
packetizer_channel(FrameType, SpacecraftId, VirtualChannelId, PendingBytes, QueuedPackets)
Where:
FrameTypeis eithertmoraosSpacecraftIdis the keyed spacecraft identifierVirtualChannelIdis the keyed virtual channel identifierPendingBytesis a list of packet bytes already started in an earlier frame but not yet fully emittedQueuedPacketsis a list of completeccsds_packet(...)terms waiting to be packetized for that keyed channel
Idle packets are generated as telemetry packets using APID 2047,
standalone sequence flags, the requested sequence count, a zero-filled
secondary header of the requested length, and zero-filled user data.
Packetization
To get the initial packetizer state:
| ?- ccsds_packetization::initial_state(State).
To inspect the currently buffered pending bytes and queued packets:
| ?- ccsds_packetization::pending_packets(packetizer_state([packetizer_channel(tm, 42, 3, [0x22,0x33], [ccsds_packet(0,0,0,1,3,7,none,[0x44])])]), PendingPackets).
To packetize packets into a TM transfer frame:
| ?- ccsds_packetization::packetize_tm_packets(tm_transfer_frame(0, 42, 3, 0, 16, 32, 0, 0, 0, 3, 2047, none, [0,0,0,0,0,0,0], none, none), 0, packetizer_state([]), [ccsds_packet(0, 0, 0, 0, 3, 0, none, [0x42])], UpdatedFrame, UpdatedState).
When the input TM frame already carries a fecf/1 term,
packetize_tm_packets/6-7 refresh it from the updated frame bytes.
Frames with none keep none.
To packetize packets into an AOS transfer frame:
| ?- ccsds_packetization::packetize_aos_packets(aos_transfer_frame(1, 42, 3, 16, signaling_field(0,0,0,0), none, [0,0,0,0,0,0,0,0,0], none, none), 0, packetizer_state([]), [ccsds_packet(0, 0, 0, 0, 3, 0, none, [0x42])], UpdatedFrame, UpdatedState).
When the input AOS frame already carries a fecf/1 term,
packetize_aos_packets/6-7 refresh it from the updated frame bytes.
Frames with none keep none.
To packetize packets across a sequence of TM transfer frames:
| ?- ccsds_packetization::packetize_tm_frames([Frame1, Frame2], 0, packetizer_state([]), Packets, UpdatedFrames, RemainingPackets, UpdatedState).
Events
The richer single-frame and multi-frame packetization predicates return event lists using the terms:
buffered_packet_fragment(FrameType, SpacecraftId, VirtualChannelId, PendingBytes)
generated_idle_packet(FrameType, SpacecraftId, VirtualChannelId, Packet)
Where:
buffered_packet_fragment/4reports trailing packet bytes buffered for the next framegenerated_idle_packet/4reports an idle packet synthesized to consume remaining frame capacity
Idle packets
To generate a telemetry idle packet with APID 2047:
| ?- ccsds_packetization::generate_idle_packet(0, 7, 2, Packet).
API documentation
Open the ../../apis/library_index.html#ccsds_packetization link in a web browser.
Loading
To load all entities in this library, load the loader.lgt file:
| ?- logtalk_load(ccsds_packetization(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(ccsds_packetization(tester)).