/py-spacepackets

Various CCSDS and ECSS packet implementations in Python

Primary LanguagePythonApache License 2.0Apache-2.0

package Documentation Status codecov PyPI version

ECSS and CCSDS Spacepackets

This package contains generic implementations for various CCSDS (Consultative Committee for Space Data Systems) and ECSS (European Cooperation for Space Standardization) packet standards.

Currently, this includes the following components:

Install

You can install this package from PyPI

Linux:

python3 -m pip install spacepackets

Windows:

py -m pip install spacepackets

Examples

You can find all examples listed here in the example folder as well.

ECSS PUS Packets

This examples shows how to generate PUS packets using the PUS ping telecommand and a PUS ping telemetry reply:

from spacepackets.ecss.tc import PusTelecommand
from spacepackets.ecss.tm import PusTelemetry
from spacepackets.util import get_printable_data_string, PrintFormats


def main():
    print("-- PUS packet examples --")
    ping_cmd = PusTelecommand(service=17, subservice=1, apid=0x01)
    cmd_as_bytes = ping_cmd.pack()
    print_string = get_printable_data_string(
        print_format=PrintFormats.HEX, data=cmd_as_bytes
    )
    print(f"Ping telecommand [17,1]: {print_string}")

    ping_reply = PusTelemetry(service=17, subservice=2, apid=0x01)
    tm_as_bytes = ping_reply.pack()
    print_string = get_printable_data_string(
        print_format=PrintFormats.HEX, data=tm_as_bytes
    )
    print(f"Ping reply [17,2]: {print_string}")


if __name__ == "__main__":
    main()

CCSDS Space Packet

This example shows how to generate a space packet header:

from spacepackets.ccsds.spacepacket import SpacePacketHeader, PacketTypes
from spacepackets.util import get_printable_data_string, PrintFormats


def main():
    print("-- Space Packet examples --")
    spacepacket_header = SpacePacketHeader(
        packet_type=PacketTypes.TC, apid=0x01, source_sequence_count=0, data_length=0
    )
    header_as_bytes = spacepacket_header.pack()
    print_string = get_printable_data_string(
        print_format=PrintFormats.HEX, data=header_as_bytes
    )
    print(f"Space packet header: {print_string}")


if __name__ == "__main__":
    main()

USLP Frames

This example shows how to generate a simple variable length USLP frame containing a simple space packet:

from spacepackets.uslp.header import (
    PrimaryHeader,
    SourceOrDestField,
    ProtocolCommandFlag,
    BypassSequenceControlFlag,
)
from spacepackets.uslp.frame import (
    TransferFrame,
    TransferFrameDataField,
    TfdzConstructionRules,
    UslpProtocolIdentifier,
)
from spacepackets.ccsds.spacepacket import SpacePacketHeader, PacketTypes, SequenceFlags

SPACECRAFT_ID = 0x73


def main():
    print("-- USLP frame example --")
    frame_header = PrimaryHeader(
        scid=SPACECRAFT_ID,
        map_id=0,
        vcid=1,
        src_dest=SourceOrDestField.SOURCE,
        frame_len=0,
        vcf_count_len=0,
        op_ctrl_flag=False,
        prot_ctrl_cmd_flag=ProtocolCommandFlag.USER_DATA,
        bypass_seq_ctrl_flag=BypassSequenceControlFlag.SEQ_CTRLD_QOS,
    )
    data = bytearray([1, 2, 3, 4])
    # Wrap the data into a space packet
    space_packet_wrapper = SpacePacketHeader(
        packet_type=PacketTypes.TC,
        sequence_flags=SequenceFlags.UNSEGMENTED,
        apid=SPACECRAFT_ID,
        data_length=len(data) - 1,
        source_sequence_count=0,
    )
    tfdz = space_packet_wrapper.pack() + data
    tfdf = TransferFrameDataField(
        tfdz_cnstr_rules=TfdzConstructionRules.VpNoSegmentation,
        uslp_ident=UslpProtocolIdentifier.SPACE_PACKETS_ENCAPSULATION_PACKETS,
        tfdz=tfdz,
    )
    var_frame = TransferFrame(header=frame_header, tfdf=tfdf)
    var_frame_packed = var_frame.pack()
    print(
        f"USLP variable length frame without FECF, and Operation Control Field containing a "
        f"simple space packet: {var_frame_packed.hex(sep=',')}"
    )


if __name__ == "__main__":
    main()

Tests

All tests are provided in the tests folder and can be run with coverage information by running

coverage run -m pytest

provided that pytest and coverage were installed with

python3 -m pip install coverage pytest