fprime-gds 4.0.0a2__tar.gz → 4.0.0a3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/actions/spelling/expect.txt +5 -0
  2. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/actions/spelling/patterns.txt +3 -0
  3. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/workflows/fprime-gds-tests.yml +1 -1
  4. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/workflows/gds-cli-tests.yml +1 -1
  5. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/PKG-INFO +5 -3
  6. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/pyproject.toml +5 -3
  7. fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/apid.py +19 -0
  8. fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/chain.py +106 -0
  9. fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/space_data_link.py +196 -0
  10. fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/space_packet.py +130 -0
  11. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/framing.py +27 -32
  12. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/data_desc_type.py +6 -1
  13. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/cli.py +1 -0
  14. fprime_gds-4.0.0a3/src/fprime_gds/plugin/__init__.py +0 -0
  15. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/plugin/system.py +2 -1
  16. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/PKG-INFO +5 -3
  17. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/SOURCES.txt +7 -0
  18. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/requires.txt +2 -0
  19. fprime_gds-4.0.0a3/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +90 -0
  20. fprime_gds-4.0.0a3/test/fprime_gds/common/communication/ccsds/test_space_packet.py +109 -0
  21. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/actions/codeql/security-pack.yml +0 -0
  23. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/actions/spelling/excludes.txt +0 -0
  24. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/pull_request_template.md +0 -0
  25. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  26. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/workflows/codeql-security-scan.yml +0 -0
  27. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/workflows/publish.yml +0 -0
  28. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.github/workflows/spelling.yml +0 -0
  29. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/.gitignore +0 -0
  30. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/Doxyfile +0 -0
  31. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/LICENSE.txt +0 -0
  32. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/NOTICE.txt +0 -0
  33. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/README.md +0 -0
  34. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/configs/__init__.py +0 -0
  35. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/docs/README.md +0 -0
  36. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/docs/_static/css/rtd_width.css +0 -0
  37. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/docs/conf.py +0 -0
  38. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/docs/gendoc.bash +0 -0
  39. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/docs/index.rst +0 -0
  40. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/examples/simple_sequence.bin +0 -0
  41. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/examples/simple_sequence.seq +0 -0
  42. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/setup.cfg +0 -0
  43. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/setup.py +0 -0
  44. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fastentrypoints.py +0 -0
  45. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/__init__.py +0 -0
  46. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/__init__.py +0 -0
  47. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/__init__.py +0 -0
  48. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  49. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  50. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  51. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
  52. {fprime_gds-4.0.0a2/src/fprime_gds/common/controllers → fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds}/__init__.py +0 -0
  53. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/checksum.py +0 -0
  54. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/ground.py +0 -0
  55. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/updown.py +0 -0
  56. {fprime_gds-4.0.0a2/src/fprime_gds/common/data_types → fprime_gds-4.0.0a3/src/fprime_gds/common/controllers}/__init__.py +0 -0
  57. {fprime_gds-4.0.0a2/src/fprime_gds/common/decoders → fprime_gds-4.0.0a3/src/fprime_gds/common/data_types}/__init__.py +0 -0
  58. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  59. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  60. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/event_data.py +0 -0
  61. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  62. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/file_data.py +0 -0
  63. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  64. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  65. {fprime_gds-4.0.0a2/src/fprime_gds/common/distributor → fprime_gds-4.0.0a3/src/fprime_gds/common/decoders}/__init__.py +0 -0
  66. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
  67. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/decoder.py +0 -0
  68. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
  69. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  70. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
  71. {fprime_gds-4.0.0a2/src/fprime_gds/common/encoders → fprime_gds-4.0.0a3/src/fprime_gds/common/distributor}/__init__.py +0 -0
  72. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/distributor/distributor.py +0 -0
  73. {fprime_gds-4.0.0a2/src/fprime_gds/common/files → fprime_gds-4.0.0a3/src/fprime_gds/common/encoders}/__init__.py +0 -0
  74. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
  75. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
  76. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/encoder.py +0 -0
  77. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
  78. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  79. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
  80. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
  81. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  82. {fprime_gds-4.0.0a2/src/fprime_gds/common/fpy → fprime_gds-4.0.0a3/src/fprime_gds/common/files}/__init__.py +0 -0
  83. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/downlinker.py +0 -0
  84. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/helpers.py +0 -0
  85. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/uplinker.py +0 -0
  86. {fprime_gds-4.0.0a2/src/fprime_gds/common/gds_cli → fprime_gds-4.0.0a3/src/fprime_gds/common/fpy}/__init__.py +0 -0
  87. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/fpy/serialize_bytecode.py +0 -0
  88. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/fpy/types.py +0 -0
  89. {fprime_gds-4.0.0a2/src/fprime_gds/common/history → fprime_gds-4.0.0a3/src/fprime_gds/common/gds_cli}/__init__.py +0 -0
  90. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
  91. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/channels.py +0 -0
  92. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
  93. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/events.py +0 -0
  94. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  95. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  96. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/handlers.py +0 -0
  97. {fprime_gds-4.0.0a2/src/fprime_gds/common/loaders → fprime_gds-4.0.0a3/src/fprime_gds/common/history}/__init__.py +0 -0
  98. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/chrono.py +0 -0
  99. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/history.py +0 -0
  100. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/ram.py +0 -0
  101. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/test.py +0 -0
  102. {fprime_gds-4.0.0a2/src/fprime_gds/common/models → fprime_gds-4.0.0a3/src/fprime_gds/common/loaders}/__init__.py +0 -0
  103. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  104. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  105. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  106. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  107. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  108. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  109. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  110. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
  111. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  112. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
  113. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  114. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
  115. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  116. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/__init__.py +0 -0
  117. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/data_logger.py +0 -0
  118. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/test_logger.py +0 -0
  119. {fprime_gds-4.0.0a2/src/fprime_gds/common/models/common → fprime_gds-4.0.0a3/src/fprime_gds/common/models}/__init__.py +0 -0
  120. {fprime_gds-4.0.0a2/src/fprime_gds/common/parsers → fprime_gds-4.0.0a3/src/fprime_gds/common/models/common}/__init__.py +0 -0
  121. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/channel_telemetry.py +0 -0
  122. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/command.py +0 -0
  123. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/event.py +0 -0
  124. {fprime_gds-4.0.0a2/src/fprime_gds/common/pipeline → fprime_gds-4.0.0a3/src/fprime_gds/common/parsers}/__init__.py +0 -0
  125. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  126. {fprime_gds-4.0.0a2/src/fprime_gds/common/templates → fprime_gds-4.0.0a3/src/fprime_gds/common/pipeline}/__init__.py +0 -0
  127. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/dictionaries.py +0 -0
  128. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/encoding.py +0 -0
  129. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/files.py +0 -0
  130. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/histories.py +0 -0
  131. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/router.py +0 -0
  132. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/standard.py +0 -0
  133. {fprime_gds-4.0.0a2/src/fprime_gds/common/testing_fw → fprime_gds-4.0.0a3/src/fprime_gds/common/templates}/__init__.py +0 -0
  134. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/ch_template.py +0 -0
  135. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  136. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/data_template.py +0 -0
  137. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/event_template.py +0 -0
  138. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  139. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/prm_template.py +0 -0
  140. {fprime_gds-4.0.0a2/src/fprime_gds/common/tools → fprime_gds-4.0.0a3/src/fprime_gds/common/testing_fw}/__init__.py +0 -0
  141. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/api.py +0 -0
  142. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  143. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
  144. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/README.md +0 -0
  145. {fprime_gds-4.0.0a2/src/fprime_gds/common/utils → fprime_gds-4.0.0a3/src/fprime_gds/common/tools}/__init__.py +0 -0
  146. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/params.py +0 -0
  147. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/seqgen.py +0 -0
  148. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/transport.py +0 -0
  149. {fprime_gds-4.0.0a2/src/fprime_gds/executables → fprime_gds-4.0.0a3/src/fprime_gds/common/utils}/__init__.py +0 -0
  150. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/config_manager.py +0 -0
  151. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/event_severity.py +0 -0
  152. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/string_util.py +0 -0
  153. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/common/zmq_transport.py +0 -0
  154. {fprime_gds-4.0.0a2/src/fprime_gds/flask → fprime_gds-4.0.0a3/src/fprime_gds/executables}/__init__.py +0 -0
  155. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/apps.py +0 -0
  156. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/comm.py +0 -0
  157. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/data_product_writer.py +0 -0
  158. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/fprime_cli.py +0 -0
  159. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/run_deployment.py +0 -0
  160. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/tcpserver.py +0 -0
  161. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/utils.py +0 -0
  162. {fprime_gds-4.0.0a2/src/fprime_gds/plugin → fprime_gds-4.0.0a3/src/fprime_gds/flask}/__init__.py +0 -0
  163. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/app.py +0 -0
  164. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/channels.py +0 -0
  165. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/commands.py +0 -0
  166. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/components.py +0 -0
  167. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/default_settings.py +0 -0
  168. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/errors.py +0 -0
  169. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/events.py +0 -0
  170. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/json.py +0 -0
  171. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/logs.py +0 -0
  172. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/requirements.txt +0 -0
  173. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/resource.py +0 -0
  174. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/sequence.py +0 -0
  175. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  176. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  177. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  178. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  179. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  180. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  181. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  182. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  183. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  184. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  185. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  186. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  187. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  188. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  189. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  190. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  191. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  192. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  193. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  194. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  195. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  196. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  197. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  198. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  199. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  200. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  201. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  202. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  203. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  204. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  205. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  206. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  207. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  208. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  209. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  210. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  211. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  212. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  213. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  214. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  215. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  216. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  217. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  218. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  219. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  220. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  221. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  222. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/favicon.ico +0 -0
  223. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/error.svg +0 -0
  224. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  225. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/success.svg +0 -0
  226. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/index.html +0 -0
  227. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/config.js +0 -0
  228. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  229. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/gds.js +0 -0
  230. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/json.js +0 -0
  231. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/loader.js +0 -0
  232. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/performance.js +0 -0
  233. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/settings.js +0 -0
  234. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  235. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/validate.js +0 -0
  236. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
  237. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  238. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  239. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  240. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  241. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
  242. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
  243. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  244. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  245. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  246. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  247. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  248. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  249. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  250. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  251. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  252. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  253. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  254. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  255. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  256. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  257. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  258. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  259. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  260. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  261. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  262. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  263. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  264. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  265. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  266. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  267. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  268. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  269. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  270. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  271. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/stats.py +0 -0
  272. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/updown.py +0 -0
  273. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/plugin/definitions.py +0 -0
  274. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds/version.py +0 -0
  275. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  276. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/entry_points.txt +0 -0
  277. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/top_level.txt +0 -0
  278. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  279. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
  280. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
  281. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
  282. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
  283. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/fpy/integrated_tests.py +0 -0
  284. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  285. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  286. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  287. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  288. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
  289. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
  290. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  291. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
  292. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  293. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  294. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  295. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  296. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
  297. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  298. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
  299. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  300. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
  301. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  302. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  303. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
  304. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  305. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/.gitignore +0 -0
  306. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  307. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  308. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  309. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  310. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  311. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  312. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  313. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  314. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  315. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  316. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  317. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  318. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  319. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  320. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  321. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  322. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_run_deployment.py +0 -0
  323. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_utils.py +0 -0
  324. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/sample/dictionary.xml +0 -0
  325. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/fprime_gds/test_plugins.py +0 -0
  326. {fprime_gds-4.0.0a2 → fprime_gds-4.0.0a3}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -39,6 +39,7 @@ callgraph
39
39
  cata
40
40
  CCB
41
41
  CCFF
42
+ ccsds
42
43
  Cdioux
43
44
  cdn
44
45
  cdxoefg
@@ -303,6 +304,7 @@ rollup
303
304
  rpaetz
304
305
  rst
305
306
  saba
307
+ scid
306
308
  sdd
307
309
  searchdata
308
310
  Segoe
@@ -318,6 +320,7 @@ SMAP
318
320
  Smath
319
321
  SNDHWM
320
322
  sorttable
323
+ spacepacket
321
324
  squashify
322
325
  sss
323
326
  Ssymbols
@@ -376,6 +379,8 @@ usec
376
379
  useconds
377
380
  usepackage
378
381
  usr
382
+ vcid
383
+ VCP
379
384
  vh
380
385
  vhd
381
386
  vhdl
@@ -44,3 +44,6 @@ value="(?:[0-9a-f]{1,2} )*"
44
44
 
45
45
  # Ignore any text between inline back-ticks
46
46
  `(.*?)`
47
+
48
+ # Python struct packing patterns
49
+ ["\']([<>])[xcbB?hHiIlLqQnNefdspP]+["\']
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
16
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
17
17
 
18
18
  steps:
19
19
  - uses: actions/checkout@v4
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  strategy:
18
18
  matrix:
19
- python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
19
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
20
20
 
21
21
  steps:
22
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 4.0.0a2
3
+ Version: 4.0.0a3
4
4
  Summary: F Prime Flight Software Ground Data System layer
5
5
  Author-email: Michael Starch <Michael.D.Starch@jpl.nasa.gov>, Thomas Boyer-Chammard <Thomas.Boyer.Chammard@jpl.nasa.gov>
6
6
  License:
@@ -216,15 +216,15 @@ Classifier: Operating System :: Unix
216
216
  Classifier: Operating System :: POSIX
217
217
  Classifier: Programming Language :: Python
218
218
  Classifier: Programming Language :: Python :: 3
219
- Classifier: Programming Language :: Python :: 3.8
220
219
  Classifier: Programming Language :: Python :: 3.9
221
220
  Classifier: Programming Language :: Python :: 3.10
222
221
  Classifier: Programming Language :: Python :: 3.11
223
222
  Classifier: Programming Language :: Python :: 3.12
223
+ Classifier: Programming Language :: Python :: 3.13
224
224
  Classifier: Programming Language :: Python :: Implementation :: CPython
225
225
  Classifier: Programming Language :: Python :: Implementation :: PyPy
226
226
  Classifier: License :: OSI Approved :: Apache Software License
227
- Requires-Python: >=3.8
227
+ Requires-Python: >=3.9
228
228
  Description-Content-Type: text/markdown
229
229
  License-File: LICENSE.txt
230
230
  License-File: NOTICE.txt
@@ -241,6 +241,8 @@ Requires-Dist: openpyxl>=3.0.10
241
241
  Requires-Dist: pyserial>=3.5
242
242
  Requires-Dist: pydantic>=2.6
243
243
  Requires-Dist: PyYAML>=6.0.2
244
+ Requires-Dist: spacepackets>=0.28.0
245
+ Requires-Dist: crc>=7.0.0
244
246
  Dynamic: license-file
245
247
 
246
248
  # F´ GDS
@@ -7,7 +7,7 @@ name = "fprime-gds"
7
7
  dynamic = ["version"]
8
8
  description = "F Prime Flight Software Ground Data System layer"
9
9
  readme = "README.md"
10
- requires-python = ">=3.8"
10
+ requires-python = ">=3.9"
11
11
  license = {file = "LICENSE.txt"}
12
12
  keywords = ["fprime", "embedded", "nasa", "flight", "software"]
13
13
  authors = [
@@ -21,11 +21,11 @@ classifiers = [
21
21
  "Operating System :: POSIX",
22
22
  "Programming Language :: Python",
23
23
  "Programming Language :: Python :: 3",
24
- "Programming Language :: Python :: 3.8",
25
24
  "Programming Language :: Python :: 3.9",
26
25
  "Programming Language :: Python :: 3.10",
27
26
  "Programming Language :: Python :: 3.11",
28
27
  "Programming Language :: Python :: 3.12",
28
+ "Programming Language :: Python :: 3.13",
29
29
  "Programming Language :: Python :: Implementation :: CPython",
30
30
  "Programming Language :: Python :: Implementation :: PyPy",
31
31
  "License :: OSI Approved :: Apache Software License",
@@ -43,7 +43,9 @@ dependencies = [
43
43
  "openpyxl>=3.0.10",
44
44
  "pyserial>=3.5",
45
45
  "pydantic>=2.6",
46
- "PyYAML>=6.0.2"
46
+ "PyYAML>=6.0.2",
47
+ "spacepackets>=0.28.0",
48
+ "crc>=7.0.0"
47
49
  ]
48
50
 
49
51
  [project.urls]
@@ -0,0 +1,19 @@
1
+ """ ccsds.apid: APID mapping functions for F´ data """
2
+ from fprime_gds.common.utils.data_desc_type import DataDescType
3
+ from fprime.common.models.serialize.numerical_types import U32Type
4
+
5
+ class APID(object):
6
+ """ APID implementations """
7
+ #TODO: use the DataDescType configured by loading the dictionary
8
+
9
+ @classmethod
10
+ def from_type(cls, data_type: DataDescType):
11
+ """ Map from data description type to APID """
12
+ return data_type.value
13
+
14
+ @classmethod
15
+ def from_data(cls, data):
16
+ """ Map from data bytes to APID """
17
+ u32_type = U32Type()
18
+ u32_type.deserialize(data, offset=0)
19
+ return cls.from_type(DataDescType(u32_type.val))
@@ -0,0 +1,106 @@
1
+ """ fprime_encryption.framing.chain: implementation of a chained framer/deframer """
2
+ from abc import ABC, abstractmethod
3
+ from functools import reduce
4
+ from typing import Any, Dict, List, Type
5
+ from fprime_gds.common.communication.framing import FramerDeframer
6
+ from fprime_gds.common.communication.ccsds.space_data_link import SpaceDataLinkFramerDeframer
7
+ from fprime_gds.common.communication.ccsds.space_packet import SpacePacketFramerDeframer
8
+ from fprime_gds.plugin.definitions import gds_plugin
9
+
10
+
11
+
12
+ class ChainedFramerDeframer(FramerDeframer, ABC):
13
+ """ Framer/deframer that is a composite of chained framer/deframers
14
+
15
+ This Framer/Deframer will wrap a set of framer/deframers where the result of the frame and deframe options will pass
16
+ from one to the other subsequently. The order is specified via the framing path and deframing will use the reverse
17
+ order from specified.
18
+ """
19
+ def __init__(self, **kwargs):
20
+ """ Initialize the chained framer/deframer from a framing-ordered set of children """
21
+ frame_order_framer_deframers = [
22
+ composite(**self.get_argument_subset(composite, kwargs))
23
+ for composite in self.get_composites()
24
+ ]
25
+ self.framers = frame_order_framer_deframers[::1]
26
+ self.deframers = frame_order_framer_deframers[::-1]
27
+
28
+ @classmethod
29
+ @abstractmethod
30
+ def get_composites(cls) -> List[Type[FramerDeframer]]:
31
+ """ Return a list of composites
32
+ Innermost FramerDeframer should be first in the list. """
33
+ raise NotImplementedError(f"Subclasses of {cls.__name__} must implement get_composites")
34
+
35
+ @staticmethod
36
+ def get_argument_subset(composite: Type[FramerDeframer], argument_dictionary: Dict[str, Any]) -> Dict[str, Any]:
37
+ """ Get an argument subset that is needed by composite
38
+
39
+ For the composite, find the set of arguments that is needed by this composite and pull those out of the complete
40
+ argument dictionary.
41
+
42
+ Args:
43
+ composite: class of a subtype of FramerDeframer
44
+ argument_dictionary: dictionary of all input arguments
45
+ """
46
+ if not hasattr(composite, "get_arguments"):
47
+ return {}
48
+ needed_arguments = composite.get_arguments()
49
+ needed_argument_destinations = [
50
+ description["destination"] if "destination" in description else
51
+ [dash_dash for dash_dash in flag if dash_dash.startswith("--")][0].lstrip("-").replace("-", "_")
52
+ for flag, description in needed_arguments.items()
53
+ ]
54
+ return {name: argument_dictionary[name] for name in needed_argument_destinations}
55
+
56
+ @classmethod
57
+ def get_arguments(cls):
58
+ """ Arguments to request from the CLI """
59
+ all_arguments = {}
60
+ for composite in cls.get_composites():
61
+ all_arguments.update(composite.get_arguments() if hasattr(composite, "get_arguments") else {})
62
+ return all_arguments
63
+
64
+ @classmethod
65
+ def check_arguments(cls, **kwargs):
66
+ """ Check arguments from the CLI """
67
+ for composite in cls.get_composites():
68
+ subset_arguments = cls.get_argument_subset(composite, kwargs)
69
+ if hasattr(composite, "check_arguments"):
70
+ composite.check_arguments(**subset_arguments)
71
+
72
+ def deframe(self, data, no_copy=False):
73
+ """ Deframe via a chain of children deframers """
74
+ packet = data[:] if not no_copy else data
75
+ remaining = None
76
+ discarded = b""
77
+
78
+ for deframer in self.deframers:
79
+ new_packet, new_remaining, new_discarded = deframer.deframe(packet, True)
80
+ discarded += new_discarded
81
+ remaining = new_remaining if remaining is None else remaining
82
+ packet = new_packet
83
+ return packet, remaining, discarded
84
+
85
+ def frame(self, data):
86
+ """ Frame via a chain of children framers """
87
+ return reduce(lambda framed_data, framer: framer.frame(framed_data), self.framers, data)
88
+
89
+
90
+ @gds_plugin(FramerDeframer)
91
+ class SpacePacketSpaceDataLinkFramerDeframer(ChainedFramerDeframer):
92
+ """ Space Data Link Protocol framing and deframing that has a data unit of Space Packets as the central """
93
+
94
+ @classmethod
95
+ def get_composites(cls) -> List[Type[FramerDeframer]]:
96
+ """ Return the composite list of this chain
97
+ Innermost FramerDeframer should be first in the list. """
98
+ return [
99
+ SpacePacketFramerDeframer,
100
+ SpaceDataLinkFramerDeframer
101
+ ]
102
+
103
+ @classmethod
104
+ def get_name(cls):
105
+ """ Name of this implementation provided to CLI """
106
+ return "space-packet-space-data-link"
@@ -0,0 +1,196 @@
1
+ """F Prime Framer/Deframer Implementation of the CCSDS Space Data Link (TC/TM) Protocols"""
2
+ import sys
3
+ import struct
4
+ import copy
5
+
6
+ from fprime_gds.common.communication.framing import FramerDeframer
7
+ from fprime_gds.plugin.definitions import gds_plugin_implementation
8
+
9
+ import crc
10
+
11
+
12
+ class SpaceDataLinkFramerDeframer(FramerDeframer):
13
+ """CCSDS Framer/Deframer Implementation for the TC (uplink / framing) and TM (downlink / deframing)
14
+ protocols. This FramerDeframer is used for framing TC data for uplink and deframing TM data for downlink.
15
+ """
16
+
17
+ SEQUENCE_NUMBER_MAXIMUM = 256
18
+ TC_HEADER_SIZE = 5
19
+ TM_HEADER_SIZE = 6
20
+ TM_FIXED_FRAME_SIZE = 1024
21
+ TM_TRAILER_SIZE = 2
22
+ TC_TRAILER_SIZE = 2
23
+
24
+ # As per CCSDS standard, use CRC-16 CCITT config with init value
25
+ # all 1s and final XOR value of 0x0000
26
+ CRC_CCITT_CONFIG = crc.Configuration(
27
+ width=16,
28
+ polynomial=0x1021,
29
+ init_value=0xFFFF,
30
+ final_xor_value=0x0000,
31
+ )
32
+ CRC_CALCULATOR = crc.Calculator(CRC_CCITT_CONFIG)
33
+
34
+ def __init__(self, scid, vcid):
35
+ """ """
36
+ self.scid = scid
37
+ self.vcid = vcid
38
+ self.sequence_number = 0
39
+
40
+ def frame(self, data):
41
+ """Frame the supplied data in a TC frame"""
42
+ space_packet_bytes = data
43
+ # CCSDS TC protocol defines the length token as number of bytes in full frame, minus 1
44
+ # so we add to packet size the size of the header and trailer and subtract 1
45
+ length = (
46
+ len(space_packet_bytes) + self.TC_HEADER_SIZE + self.TC_TRAILER_SIZE - 1
47
+ )
48
+ assert length < (pow(2, 10) - 1), "Length too-large for CCSDS format"
49
+
50
+ # CCSDS TC Header:
51
+ # 2b - 00 - TF version number
52
+ # 1b - 0/1 - 0 enable FARM checks, 1 bypass FARM
53
+ # 1b - 0/1 - 0 = data (Type-D), 1 = control information (Type-C)
54
+ # 2b - 00 - Reserved
55
+ # 10b - XX - Spacecraft id
56
+ # 6b - XX - Virtual Channel ID
57
+ # 10b - XX - Frame length
58
+ # 8b - XX - Frame sequence number
59
+
60
+ # First 16 bits:
61
+ header_val1_u16 = (
62
+ (0 << 14) | # TF version number (2 bits)
63
+ (1 << 13) | # Bypass FARM (1 bit)
64
+ (0 << 12) | # Type-D (1 bit)
65
+ (0 << 10) | # Reserved (2 bits)
66
+ ((self.scid & 0x3FF)) # SCID (10 bits)
67
+ )
68
+ # Second 16 bits:
69
+ header_val2_u16 = (
70
+ ((self.vcid & 0x3F) << 10) | # VCID (6 bits)
71
+ (length & 0x3FF) # Frame length (10 bits)
72
+ )
73
+ # 8 bit sequence number - always 0 in bypass FARM mode
74
+ header_val3_u8 = 0
75
+ header_bytes = struct.pack(">HHB", header_val1_u16, header_val2_u16, header_val3_u8)
76
+ full_bytes_no_crc = header_bytes + space_packet_bytes
77
+ assert (
78
+ len(header_bytes) == self.TC_HEADER_SIZE
79
+ ), "CCSDS primary header must be 5 octets long"
80
+ assert len(full_bytes_no_crc) == self.TC_HEADER_SIZE + len(
81
+ data
82
+ ), "Malformed packet generated"
83
+
84
+ full_bytes = full_bytes_no_crc + struct.pack(
85
+ ">H", self.CRC_CALCULATOR.checksum(full_bytes_no_crc)
86
+ )
87
+ return full_bytes
88
+
89
+ def get_sequence_number(self):
90
+ """Get the sequence number and increment - used for TM deframing
91
+
92
+ This function will return the current sequence number and then increment the sequence number for the next round.
93
+
94
+ Return:
95
+ current sequence number
96
+ """
97
+ sequence = self.sequence_number
98
+ self.sequence_number = (self.sequence_number + 1) % self.SEQUENCE_NUMBER_MAXIMUM
99
+ return sequence
100
+
101
+ def deframe(self, data, no_copy=False):
102
+ """Deframe TM frames"""
103
+ discarded = b""
104
+ if not no_copy:
105
+ data = copy.copy(data)
106
+ # Continue until there is not enough data for the header, or until a packet is found (return)
107
+ while len(data) >= self.TM_FIXED_FRAME_SIZE:
108
+ # Read header information
109
+ sc_and_channel_ids = struct.unpack_from(">H", data)
110
+ spacecraft_id = (sc_and_channel_ids[0] & 0x3FF0) >> 4
111
+ virtual_channel_id = (sc_and_channel_ids[0] & 0x000E) >> 1
112
+ # Check if the header is correct with regards to expected spacecraft and VC IDs
113
+ if spacecraft_id != self.scid or virtual_channel_id != self.vcid:
114
+ # If the header is invalid, rotate away a Byte and keep processing
115
+ discarded += data[0:1]
116
+ data = data[1:]
117
+ continue
118
+ # Spacecraft ID and Virtual Channel ID match, so we look at end of frame for CRC
119
+ crc_offset = self.TM_FIXED_FRAME_SIZE - self.TM_TRAILER_SIZE
120
+ transmitted_crc = struct.unpack_from(">H", data, crc_offset)[0]
121
+ if transmitted_crc == self.CRC_CALCULATOR.checksum(data[:crc_offset]):
122
+ # CRC is valid, so we return the deframed data
123
+ deframed_data_len = (
124
+ self.TM_FIXED_FRAME_SIZE
125
+ - self.TM_TRAILER_SIZE
126
+ - self.TM_HEADER_SIZE
127
+ )
128
+ deframed = struct.unpack_from(
129
+ f">{deframed_data_len}s", data, self.TM_HEADER_SIZE
130
+ )[0]
131
+ # Consume the fixed size frame
132
+ data = data[self.TM_FIXED_FRAME_SIZE :]
133
+ return deframed, data, discarded
134
+
135
+ print(
136
+ "[WARNING] Checksum validation failed.",
137
+ file=sys.stderr,
138
+ )
139
+ # Bad checksum, rotate 1 and keep looking for non-garbage
140
+ discarded += data[0:1]
141
+ data = data[1:]
142
+ continue
143
+ return None, data, discarded
144
+
145
+ @classmethod
146
+ def get_arguments(cls):
147
+ """Arguments to request from the CLI"""
148
+ return {
149
+ ("--scid",): {
150
+ "type": lambda input_arg: int(input_arg, 0),
151
+ "help": "Spacecraft ID",
152
+ "default": 0x44,
153
+ "required": False,
154
+ },
155
+ ("--vcid",): {
156
+ "type": lambda input_arg: int(input_arg, 0),
157
+ "help": "Virtual channel ID",
158
+ "default": 1,
159
+ "required": False,
160
+ },
161
+ }
162
+
163
+ @classmethod
164
+ def check_arguments(cls, scid, vcid):
165
+ """Check arguments from the CLI
166
+
167
+ Confirms that the input arguments are valid for this framer/deframer.
168
+
169
+ Args:
170
+ scid: spacecraft id
171
+ vcid: virtual channel id
172
+ """
173
+ if scid is None:
174
+ raise TypeError(f"Spacecraft ID not specified")
175
+ if scid < 0:
176
+ raise TypeError(f"Spacecraft ID {scid} is negative")
177
+ if scid > 0x3FF:
178
+ raise TypeError(f"Spacecraft ID {scid} is larger than {0x3FF}")
179
+
180
+ if vcid is None:
181
+ raise TypeError(f"Virtual Channel ID not specified")
182
+ if vcid < 0:
183
+ raise TypeError(f"Virtual Channel ID {vcid} is negative")
184
+ if vcid > 0x3F:
185
+ raise TypeError(f"Virtual Channel ID {vcid} is larger than {0x3FF}")
186
+
187
+ @classmethod
188
+ def get_name(cls):
189
+ """Name of this implementation provided to CLI"""
190
+ return "raw-space-data-link"
191
+
192
+ @classmethod
193
+ @gds_plugin_implementation
194
+ def register_framing_plugin(cls):
195
+ """Register the MyPlugin plugin"""
196
+ return cls
@@ -0,0 +1,130 @@
1
+ """F Prime Framer/Deframer Implementation of the CCSDS Space Packet Protocol"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import struct
6
+ import copy
7
+
8
+ from spacepackets.ccsds.spacepacket import SpacePacketHeader, PacketType, SpacePacket
9
+
10
+ from fprime_gds.common.communication.framing import FramerDeframer
11
+ from fprime_gds.plugin.definitions import gds_plugin_implementation, gds_plugin
12
+ from fprime_gds.common.utils.data_desc_type import DataDescType
13
+
14
+ from .apid import APID
15
+ import logging
16
+
17
+ LOGGER = logging.getLogger("framing")
18
+ LOGGER.setLevel(logging.DEBUG)
19
+
20
+
21
+ @gds_plugin(FramerDeframer)
22
+ class SpacePacketFramerDeframer(FramerDeframer):
23
+ """Concrete implementation of FramerDeframer supporting SpacePacket protocol
24
+
25
+ This implementation is registered as a "framing" plugin to support encryption within the GDS layer.
26
+ """
27
+
28
+ SEQUENCE_COUNT_MAXIMUM = 16384 # 2^14
29
+ HEADER_SIZE = 6
30
+ IDLE_APID = 0x7FF # max 11 bit value per protocol specification
31
+
32
+ def __init__(self):
33
+ # self.sequence_number = 0
34
+ # Map APID to sequence counts
35
+ self.apid_to_sequence_count_map = dict()
36
+ for key in DataDescType:
37
+ self.apid_to_sequence_count_map[key.value] = 0
38
+
39
+ def frame(self, data):
40
+ """Frame the supplied data in Space Packet"""
41
+ # The protocol defines length token to be number of bytes minus 1
42
+ data_length_token = len(data) - 1
43
+ apid = APID.from_data(data)
44
+ space_header = SpacePacketHeader(
45
+ packet_type=PacketType.TC,
46
+ apid=apid,
47
+ seq_count=self.get_sequence_count(apid),
48
+ data_len=data_length_token,
49
+ )
50
+ space_packet = SpacePacket(space_header, sec_header=None, user_data=data)
51
+ return space_packet.pack()
52
+
53
+ def deframe(self, data, no_copy=False):
54
+ """Deframe the supplied data according to Space Packet protocol"""
55
+ discarded = b""
56
+ if data is None:
57
+ return None, None, discarded
58
+ if not no_copy:
59
+ data = copy.copy(data)
60
+ # Deframe all packets until there is not enough data for a header
61
+ while len(data) >= self.HEADER_SIZE:
62
+ # Read header information including start token and size and check if we have enough for the total size
63
+ try:
64
+ sp_header = SpacePacketHeader.unpack(data)
65
+ except ValueError:
66
+ # If the header is invalid, rotate away a byte and keep processing
67
+ discarded += data[0:1]
68
+ data = data[1:]
69
+ continue
70
+ if sp_header.ccsds_version != 0 or sp_header.packet_type != PacketType.TM:
71
+ # Space Packet version is specified as 0 per protocol
72
+ discarded += data[0:1]
73
+ data = data[1:]
74
+ continue
75
+ # Skip Idle Packets as they are not meaningful
76
+ if sp_header.apid == self.IDLE_APID:
77
+ data = data[sp_header.packet_len :]
78
+ continue
79
+ # Check sequence count and warn if not expected value (don't drop the packet)
80
+ if sp_header.seq_count != self.get_sequence_count(sp_header.apid):
81
+ LOGGER.warning(
82
+ f"APID {sp_header.apid} received sequence count: {sp_header.seq_count}"
83
+ f" (expected: {self.get_sequence_count(sp_header.apid)})"
84
+ )
85
+ # Set the sequence count to the next expected value (consider missing packets have been lost)
86
+ self.apid_to_sequence_count_map[sp_header.apid] = (
87
+ sp_header.seq_count + 1
88
+ )
89
+ # If the pool is large enough to read the whole packet, then read it
90
+ if len(data) >= sp_header.packet_len:
91
+ deframed = struct.unpack_from(
92
+ # data_len is number of bytes minus 1 per SpacePacket spec
93
+ f">{sp_header.data_len + 1}s",
94
+ data,
95
+ self.HEADER_SIZE,
96
+ )[0]
97
+ data = data[sp_header.packet_len :]
98
+ LOGGER.debug(f"Deframed packet: {sp_header}")
99
+ return deframed, data, discarded
100
+ else:
101
+ # If we don't have enough data, then break out of the loop
102
+ break
103
+ return None, data, discarded
104
+
105
+ def get_sequence_count(self, apid: int):
106
+ """Get the sequence number and increment
107
+
108
+ This function will return the current sequence number and then increment the sequence number for the next round.
109
+ Should an APID not be registered already, it will be initialized to 0.
110
+
111
+ Return:
112
+ current sequence number
113
+ """
114
+ # If APID is not registered, initialize it to 0
115
+ sequence = self.apid_to_sequence_count_map.get(apid, 0)
116
+ self.apid_to_sequence_count_map[apid] = (
117
+ sequence + 1
118
+ ) % self.SEQUENCE_COUNT_MAXIMUM
119
+ return sequence
120
+
121
+ @classmethod
122
+ def get_name(cls):
123
+ """Name of this implementation provided to CLI"""
124
+ return "raw-space-packet"
125
+
126
+ @classmethod
127
+ @gds_plugin_implementation
128
+ def register_framing_plugin(cls):
129
+ """Register the MyPlugin plugin"""
130
+ return cls