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
示例#2
0
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)