def decode_to_spp_packets( self, datalink_list: List[TCDataLinkPacket] ): """ Given a list of datalink packest, reconstruct the SPP packets :param datalink_list: :return: """ spp_packet_list = [] segmented_packet_list = [] # TODO : Support reordering of packets, right now it assumes that packets must come in order reordered_datalink_list = [None] * len(datalink_list) for packet in datalink_list: reordered_datalink_list[packet.frame_seq_num] = packet for packet in reordered_datalink_list: # filter out packets that do not match spacecraft_id, virtual_channel_id and map_id if packet.spacecraft_id != self.spacecraft_id or packet.virtual_channel_id != self.virtual_channel_id or \ packet.map_id != self.map_id: continue # handle different case scenarios if packet.seq_flags == SegmentHeaderSequenceFlags.UNSEGMENTED: spp_packet_list.append(SpacePacket.from_bytes(packet.data)) elif packet.seq_flags == SegmentHeaderSequenceFlags.SEGMENT_FIRST: segmented_packet_list = [packet] elif packet.seq_flags == SegmentHeaderSequenceFlags.SEGMENT_CONTINUATION: assert (len(segmented_packet_list) > 0) segmented_packet_list.append(packet) elif packet.seq_flags == SegmentHeaderSequenceFlags.SEGMENT_LAST: segmented_packet_list.append(packet) # receive the last segmented packet, reconstruct the packet here data_bytestream = b'' for segmented_packet in segmented_packet_list: data_bytestream += segmented_packet.data segmented_packet_list = [] spp_packet_list.append(SpacePacket.from_bytes(data_bytestream)) else: raise RuntimeError("Sequence Flag {} not implemented".format(packet.seq_flags)) return spp_packet_list
def test_space_packet_from_bytes(): """ Test deserialization of space packets :return: """ byte_sequence = b'\x05\x39\xc0\x11\x00\x04\xde\xad\xbe\xef' expected_space_packet = SpacePacket( ccsds_version=0, packet_type=SpacePacketType.TELECOMMAND, apid=TEST_APID_VAL, seq_flags=SpacePacketSequenceFlags.UNSEGMENTED, packet_seq_count=17, data=b'\xde\xad\xbe\xef', sec_hdr_flag=False ) space_packet = SpacePacket.from_bytes(byte_sequence) assert(space_packet == expected_space_packet)