Skip to content

Commit

Permalink
added USLP example
Browse files Browse the repository at this point in the history
  • Loading branch information
robamu committed Feb 12, 2022
1 parent 4119327 commit 8819145
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 28 deletions.
110 changes: 86 additions & 24 deletions README.md
Expand Up @@ -54,27 +54,25 @@ from spacepackets.util import get_printable_data_string, PrintFormats


def main():
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}')
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()
main()

```

## CCSDS Space Packet
Expand All @@ -87,19 +85,84 @@ 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

```py
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,
apid=0x01,
sequence_flags=SequenceFlags.UNSEGMENTED,
apid=SPACECRAFT_ID,
data_length=len(data) - 1,
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}')
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
Expand All @@ -116,4 +179,3 @@ provided that `pytest` and `coverage` were installed with
```sh
python3 -m pip install coverage pytest
```

1 change: 1 addition & 0 deletions examples/example_pus.py
Expand Up @@ -4,6 +4,7 @@


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(
Expand Down
1 change: 1 addition & 0 deletions examples/example_spacepacket.py
Expand Up @@ -3,6 +3,7 @@


def main():
print("-- Space Packet examples --")
spacepacket_header = SpacePacketHeader(
packet_type=PacketTypes.TC, apid=0x01, source_sequence_count=0, data_length=0
)
Expand Down
55 changes: 55 additions & 0 deletions examples/example_uslp.py
@@ -0,0 +1,55 @@
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()
3 changes: 2 additions & 1 deletion spacepackets/ccsds/spacepacket.py
Expand Up @@ -40,7 +40,8 @@ def __init__(
than 11 bits, deciaml 2074 or hex 0x7ff
:param source_sequence_count: Sequence counter, should not be larger than 0x3fff or
decimal 16383
:param data_length: Should not be largen than 65535 bytes
:param data_length: Contains a length count C that equals one fewer than the length of the
packet data field. Should not be larger than 65535 bytes
:param packet_version:
:param secondary_header_flag:
:param sequence_flags:
Expand Down
6 changes: 3 additions & 3 deletions spacepackets/uslp/frame.py
Expand Up @@ -328,9 +328,9 @@ def __init__(
self,
header: FrameHeaderT,
tfdf: TransferFrameDataField,
insert_zone: Optional[bytes],
op_ctrl_field: Optional[bytes],
fecf: Optional[bytes],
insert_zone: Optional[bytes] = None,
op_ctrl_field: Optional[bytes] = None,
fecf: Optional[bytes] = None,
):
self.header = header
self.tfdf = tfdf
Expand Down

0 comments on commit 8819145

Please sign in to comment.