fprime-gds 3.6.2a1__tar.gz → 4.0.0a1__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 (322) hide show
  1. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/actions/spelling/expect.txt +22 -0
  2. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/workflows/fprime-gds-tests.yml +1 -1
  3. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/workflows/gds-cli-tests.yml +1 -1
  4. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/PKG-INFO +17 -19
  5. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/README.md +14 -17
  6. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/pyproject.toml +2 -0
  7. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/ch_decoder.py +1 -1
  8. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/event_decoder.py +2 -1
  9. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/pkt_decoder.py +1 -1
  10. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/distributor/distributor.py +2 -2
  11. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/ch_encoder.py +2 -2
  12. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/cmd_encoder.py +2 -2
  13. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/event_encoder.py +2 -2
  14. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/pkt_encoder.py +2 -2
  15. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/seq_writer.py +2 -2
  16. fprime_gds-4.0.0a1/src/fprime_gds/common/fpy/serialize_bytecode.py +229 -0
  17. fprime_gds-4.0.0a1/src/fprime_gds/common/fpy/types.py +203 -0
  18. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/base_commands.py +1 -1
  19. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/handlers.py +39 -0
  20. fprime_gds-4.0.0a1/src/fprime_gds/common/loaders/fw_type_json_loader.py +54 -0
  21. fprime_gds-4.0.0a1/src/fprime_gds/common/loaders/pkt_json_loader.py +121 -0
  22. fprime_gds-4.0.0a1/src/fprime_gds/common/loaders/prm_json_loader.py +85 -0
  23. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/dictionaries.py +21 -4
  24. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/encoding.py +19 -0
  25. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/histories.py +4 -0
  26. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/standard.py +16 -2
  27. fprime_gds-4.0.0a1/src/fprime_gds/common/templates/prm_template.py +81 -0
  28. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/testing_fw/api.py +42 -0
  29. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/testing_fw/pytest_integration.py +25 -2
  30. fprime_gds-4.0.0a1/src/fprime_gds/common/tools/README.md +34 -0
  31. fprime_gds-4.0.0a1/src/fprime_gds/common/tools/params.py +246 -0
  32. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/utils/config_manager.py +6 -6
  33. fprime_gds-4.0.0a1/src/fprime_gds/executables/apps.py +323 -0
  34. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/cli.py +280 -122
  35. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/comm.py +5 -2
  36. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/fprime_cli.py +3 -3
  37. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/run_deployment.py +10 -3
  38. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/channel.js +1 -1
  39. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/event.js +1 -1
  40. fprime_gds-4.0.0a1/src/fprime_gds/plugin/__init__.py +0 -0
  41. fprime_gds-4.0.0a1/src/fprime_gds/plugin/definitions.py +149 -0
  42. fprime_gds-4.0.0a1/src/fprime_gds/plugin/system.py +338 -0
  43. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/PKG-INFO +17 -19
  44. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/SOURCES.txt +14 -0
  45. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/entry_points.txt +2 -0
  46. fprime_gds-4.0.0a1/test/fprime_gds/common/fpy/integrated_tests.py +273 -0
  47. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +1008 -338
  48. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/loaders/test_json_loader.py +46 -0
  49. fprime_gds-4.0.0a1/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  50. fprime_gds-4.0.0a1/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +5 -0
  51. fprime_gds-4.0.0a1/test/fprime_gds/common/tools/input/simple_paramdb.json +5 -0
  52. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/resources/simple_dictionary.json +12 -0
  53. fprime_gds-4.0.0a1/test/fprime_gds/common/tools/test_paramdb_gen.py +39 -0
  54. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/test_plugins.py +167 -75
  55. fprime_gds-3.6.2a1/src/fprime_gds/executables/apps.py +0 -150
  56. fprime_gds-3.6.2a1/src/fprime_gds/plugin/definitions.py +0 -71
  57. fprime_gds-3.6.2a1/src/fprime_gds/plugin/system.py +0 -225
  58. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  59. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/actions/codeql/security-pack.yml +0 -0
  60. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/actions/spelling/excludes.txt +0 -0
  61. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/actions/spelling/patterns.txt +0 -0
  62. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/pull_request_template.md +0 -0
  63. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  64. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/workflows/codeql-security-scan.yml +0 -0
  65. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/workflows/publish.yml +0 -0
  66. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.github/workflows/spelling.yml +0 -0
  67. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/.gitignore +0 -0
  68. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/Doxyfile +0 -0
  69. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/LICENSE.txt +0 -0
  70. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/NOTICE.txt +0 -0
  71. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/configs/__init__.py +0 -0
  72. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/docs/README.md +0 -0
  73. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/docs/_static/css/rtd_width.css +0 -0
  74. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/docs/conf.py +0 -0
  75. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/docs/gendoc.bash +0 -0
  76. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/docs/index.rst +0 -0
  77. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/examples/simple_sequence.bin +0 -0
  78. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/examples/simple_sequence.seq +0 -0
  79. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/setup.cfg +0 -0
  80. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/setup.py +0 -0
  81. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fastentrypoints.py +0 -0
  82. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/__init__.py +0 -0
  83. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/__init__.py +0 -0
  84. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/__init__.py +0 -0
  85. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  86. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  87. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  88. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
  89. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/checksum.py +0 -0
  90. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/framing.py +0 -0
  91. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/ground.py +0 -0
  92. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/communication/updown.py +0 -0
  93. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/controllers/__init__.py +0 -0
  94. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/__init__.py +0 -0
  95. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  96. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  97. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/event_data.py +0 -0
  98. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  99. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/file_data.py +0 -0
  100. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  101. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  102. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/__init__.py +0 -0
  103. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/decoder.py +0 -0
  104. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  105. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/distributor/__init__.py +0 -0
  106. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/__init__.py +0 -0
  107. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/encoder.py +0 -0
  108. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  109. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  110. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/files/__init__.py +0 -0
  111. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/files/downlinker.py +0 -0
  112. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/files/helpers.py +0 -0
  113. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/files/uplinker.py +0 -0
  114. {fprime_gds-3.6.2a1/src/fprime_gds/common/gds_cli → fprime_gds-4.0.0a1/src/fprime_gds/common/fpy}/__init__.py +0 -0
  115. {fprime_gds-3.6.2a1/src/fprime_gds/common/history → fprime_gds-4.0.0a1/src/fprime_gds/common/gds_cli}/__init__.py +0 -0
  116. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/channels.py +0 -0
  117. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
  118. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/events.py +0 -0
  119. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  120. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  121. {fprime_gds-3.6.2a1/src/fprime_gds/common/loaders → fprime_gds-4.0.0a1/src/fprime_gds/common/history}/__init__.py +0 -0
  122. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/history/chrono.py +0 -0
  123. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/history/history.py +0 -0
  124. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/history/ram.py +0 -0
  125. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/history/test.py +0 -0
  126. {fprime_gds-3.6.2a1/src/fprime_gds/common/models → fprime_gds-4.0.0a1/src/fprime_gds/common/loaders}/__init__.py +0 -0
  127. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  128. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  129. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  130. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  131. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  132. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  133. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  134. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  135. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  136. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  137. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/logger/__init__.py +0 -0
  138. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/logger/data_logger.py +0 -0
  139. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/logger/test_logger.py +0 -0
  140. {fprime_gds-3.6.2a1/src/fprime_gds/common/models/common → fprime_gds-4.0.0a1/src/fprime_gds/common/models}/__init__.py +0 -0
  141. {fprime_gds-3.6.2a1/src/fprime_gds/common/parsers → fprime_gds-4.0.0a1/src/fprime_gds/common/models/common}/__init__.py +0 -0
  142. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/models/common/channel_telemetry.py +0 -0
  143. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/models/common/command.py +0 -0
  144. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/models/common/event.py +0 -0
  145. {fprime_gds-3.6.2a1/src/fprime_gds/common/pipeline → fprime_gds-4.0.0a1/src/fprime_gds/common/parsers}/__init__.py +0 -0
  146. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  147. {fprime_gds-3.6.2a1/src/fprime_gds/common/templates → fprime_gds-4.0.0a1/src/fprime_gds/common/pipeline}/__init__.py +0 -0
  148. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/files.py +0 -0
  149. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/pipeline/router.py +0 -0
  150. {fprime_gds-3.6.2a1/src/fprime_gds/common/testing_fw → fprime_gds-4.0.0a1/src/fprime_gds/common/templates}/__init__.py +0 -0
  151. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/templates/ch_template.py +0 -0
  152. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  153. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/templates/data_template.py +0 -0
  154. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/templates/event_template.py +0 -0
  155. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  156. {fprime_gds-3.6.2a1/src/fprime_gds/common/tools → fprime_gds-4.0.0a1/src/fprime_gds/common/testing_fw}/__init__.py +0 -0
  157. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  158. {fprime_gds-3.6.2a1/src/fprime_gds/common/utils → fprime_gds-4.0.0a1/src/fprime_gds/common/tools}/__init__.py +0 -0
  159. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/tools/seqgen.py +0 -0
  160. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/transport.py +0 -0
  161. {fprime_gds-3.6.2a1/src/fprime_gds/executables → fprime_gds-4.0.0a1/src/fprime_gds/common/utils}/__init__.py +0 -0
  162. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
  163. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/utils/event_severity.py +0 -0
  164. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/utils/string_util.py +0 -0
  165. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/common/zmq_transport.py +0 -0
  166. {fprime_gds-3.6.2a1/src/fprime_gds/flask → fprime_gds-4.0.0a1/src/fprime_gds/executables}/__init__.py +0 -0
  167. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/data_product_writer.py +0 -0
  168. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/tcpserver.py +0 -0
  169. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/executables/utils.py +0 -0
  170. {fprime_gds-3.6.2a1/src/fprime_gds/plugin → fprime_gds-4.0.0a1/src/fprime_gds/flask}/__init__.py +0 -0
  171. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/app.py +0 -0
  172. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/channels.py +0 -0
  173. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/commands.py +0 -0
  174. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/components.py +0 -0
  175. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/default_settings.py +0 -0
  176. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/errors.py +0 -0
  177. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/events.py +0 -0
  178. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/json.py +0 -0
  179. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/logs.py +0 -0
  180. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/requirements.txt +0 -0
  181. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/resource.py +0 -0
  182. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/sequence.py +0 -0
  183. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  184. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  185. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  186. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  187. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  188. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  189. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  190. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  191. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  192. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  193. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  194. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  195. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  196. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  197. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  198. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  199. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  200. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  201. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  202. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  203. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  204. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  205. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  206. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  207. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  208. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  209. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  210. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  211. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  212. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  213. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  214. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  215. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  216. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  217. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  218. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  219. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  220. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  221. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  222. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  223. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  224. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  225. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  226. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  227. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  228. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  229. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  230. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/favicon.ico +0 -0
  231. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/img/error.svg +0 -0
  232. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  233. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/img/success.svg +0 -0
  234. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/index.html +0 -0
  235. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/config.js +0 -0
  236. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  237. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/gds.js +0 -0
  238. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/json.js +0 -0
  239. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/loader.js +0 -0
  240. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/performance.js +0 -0
  241. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/settings.js +0 -0
  242. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  243. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/validate.js +0 -0
  244. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  245. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  246. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  247. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  248. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
  249. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  250. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  251. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  252. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  253. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  254. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  255. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  256. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  257. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  258. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  259. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  260. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  261. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  262. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  263. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  264. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  265. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  266. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  267. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  268. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  269. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  270. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  271. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  272. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  273. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  274. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  275. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  276. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  277. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/stats.py +0 -0
  278. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/flask/updown.py +0 -0
  279. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds/version.py +0 -0
  280. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  281. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/requires.txt +0 -0
  282. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/src/fprime_gds.egg-info/top_level.txt +0 -0
  283. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  284. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
  285. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
  286. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
  287. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
  288. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  289. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  290. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  291. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  292. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  293. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
  294. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  295. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  296. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  297. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  298. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  299. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  300. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  301. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  302. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/.gitignore +0 -0
  303. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  304. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  305. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  306. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  307. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  308. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  309. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  310. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  311. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  312. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  313. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  314. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  315. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  316. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  317. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  318. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  319. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/test_run_deployment.py +0 -0
  320. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/executables/test_utils.py +0 -0
  321. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/fprime_gds/sample/dictionary.xml +0 -0
  322. {fprime_gds-3.6.2a1 → fprime_gds-4.0.0a1}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -23,6 +23,7 @@ autosectionlabel
23
23
  backface
24
24
  batchmode
25
25
  baudrate
26
+ BBBBBHI
26
27
  bcolors
27
28
  BGR
28
29
  Biberstein
@@ -31,6 +32,7 @@ bitmaps
31
32
  breadcrumb
32
33
  Btns
33
34
  BUGLIST
35
+ calcsize
34
36
  calibri
35
37
  callergraph
36
38
  callgraph
@@ -49,6 +51,7 @@ classdocs
49
51
  clearfix
50
52
  cls
51
53
  cmdhist
54
+ cmt
52
55
  CODEFILE
53
56
  COLORSTYLE
54
57
  colorwheel
@@ -59,10 +62,12 @@ configs
59
62
  Consolas
60
63
  creatingdocsetswithdoxygen
61
64
  csum
65
+ ctx
62
66
  curateable
63
67
  curated
64
68
  curating
65
69
  customise
70
+ cuz
66
71
  daringfireball
67
72
  dataobjects
68
73
  dblclick
@@ -136,9 +141,13 @@ FONTSIZE
136
141
  fpp
137
142
  fprime
138
143
  fptable
144
+ fpy
145
+ fpybc
146
+ fqn
139
147
  fsw
140
148
  gdiplus
141
149
  getbootstrap
150
+ getoption
142
151
  github
143
152
  grayscales
144
153
  gse
@@ -161,6 +170,7 @@ htags
161
170
  hyperlinks
162
171
  idct
163
172
  idl
173
+ idx
164
174
  ieeetr
165
175
  ified
166
176
  ifun
@@ -171,18 +181,22 @@ intlimits
171
181
  ip
172
182
  ipc
173
183
  ipp
184
+ issuecomment
174
185
  itcl
175
186
  ixx
176
187
  janamian
188
+ jawest
177
189
  Jdk
178
190
  jpl
179
191
  JSO
180
192
  jsonable
181
193
  jsonified
182
194
  jsonify
195
+ junitxml
183
196
  keepalive
184
197
  keyify
185
198
  kinda
199
+ leisher
186
200
  lestarch
187
201
  levelname
188
202
  Lezer
@@ -195,6 +209,7 @@ logdir
195
209
  logpath
196
210
  logselect
197
211
  luxon
212
+ LVAR
198
213
  makeindex
199
214
  MAKEVAR
200
215
  marijnh
@@ -235,9 +250,11 @@ oring
235
250
  osexc
236
251
  OSX
237
252
  outputfile
253
+ Packetize
238
254
  packetized
239
255
  Paetz
240
256
  PARAMDOC
257
+ paramdb
241
258
  passthrough
242
259
  pb
243
260
  pdflatex
@@ -248,6 +265,7 @@ plantuml
248
265
  PNGs
249
266
  preds
250
267
  prm
268
+ prmdb
251
269
  procs
252
270
  PROGRAMLISTING
253
271
  projectbrief
@@ -305,6 +323,7 @@ sss
305
323
  Ssymbols
306
324
  stackoverflow
307
325
  startuml
326
+ subcmd
308
327
  subgrouping
309
328
  subhist
310
329
  subhistory
@@ -322,6 +341,7 @@ Theif
322
341
  thtcp
323
342
  thudp
324
343
  timebase
344
+ timectx
325
345
  timescales
326
346
  timespan
327
347
  timestep
@@ -375,6 +395,8 @@ xapian
375
395
  xhttp
376
396
  xl
377
397
  xmit
398
+ xmlpath
378
399
  xy
379
400
  zeromq
380
401
  zmq
402
+ zimri
@@ -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"]
16
+ python-version: ["3.8", "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"]
19
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
20
20
 
21
21
  steps:
22
22
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 3.6.2a1
3
+ Version: 4.0.0a1
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:
@@ -240,10 +240,11 @@ Requires-Dist: Jinja2>=2.11.3
240
240
  Requires-Dist: openpyxl>=3.0.10
241
241
  Requires-Dist: pyserial>=3.5
242
242
  Requires-Dist: pydantic>=2.6
243
+ Dynamic: license-file
243
244
 
244
245
  # F´ GDS
245
246
 
246
- **Note:** This README describes GDS internals. Refer to the [user's guide](https://nasa.github.io/fprime/UsersGuide/gds/gds-introduction.html) for instructions on how to use the GDS.
247
+ **Note:** This README describes GDS internals. Refer to the [ Documentation](https://fprime.jpl.nasa.gov/latest/docs/user-manual/overview/gds-introduction/) for instructions on how to use the GDS.
247
248
 
248
249
  Issues should be reported here: [File an issue](https://github.com/nasa/fprime/issues/new/choose)
249
250
 
@@ -268,7 +269,8 @@ output data type included. Command data objects are created in the command panel
268
269
  the command encoder registered to that panel. Encoders take a data object and turn it into binary
269
270
  data that can be sent to the F´ deployment. The binary data is then passed to the TCP client
270
271
  which is registered to the encoder. Finally, the TCP client send the data back to the TCP server and
271
- the F´ deployment. ![The layout of the GDS](https://github.com/nasa/fprime/blob/devel/docs/UsersGuide/media/gds_layout.jpg)
272
+ the F´ deployment.
273
+ ![The layout of the GDS](https://raw.githubusercontent.com/nasa/fprime/refs/heads/devel/docs/img/gds_layout.jpg)
272
274
 
273
275
  All of these objects are created and registered to other objects when the GDS
274
276
  is initialized. Thus, all of the structure of the GDS is created in one place,
@@ -285,15 +287,11 @@ commands and registering consumers to the GDS decoders. The Standard Pipeline ca
285
287
  [here](src/fprime_gds/common/pipeline/standard.py).
286
288
 
287
289
  ### GDS Integration Test API
288
- The Integration Test API is a tool that provides the ability to write integration-level tests for an
289
- F´ deployment using the GDS. The tool provides history searches/asserts, command sending, a
290
- detailed test log, sub-histories and convenient access to GDS data objects. The test API comes with
291
- separate [documentation](https://github.com/nasa/fprime/blob/master/docs/UsersGuide/dev/testAPI/markdown/contents.md) and its own [user
292
- guide](https://github.com/nasa/fprime/blob/master/docs/UsersGuide/dev/testAPI/user_guide.md) and is built on top of the Standard Pipeline.
290
+ The Integration Test API is a tool that provides the ability to write integration-level tests for an F´ deployment using the GDS. The tool provides history searches/asserts, command sending, a detailed test log, sub-histories and convenient access to GDS data objects. The test API comes with its own [user guide](https://fprime.jpl.nasa.gov/latest/docs/user-manual/gds/gds-test-api-guide/) and is built on top of the Standard Pipeline.
293
291
 
294
292
  ## GDS GUI Usage
295
293
 
296
- A guide for how to use the GDS is available in the [fprime documentation](https://nasa.github.io/fprime/UsersGuide/gds/gds-introduction.html)
294
+ A guide for how to use the GDS is available in the [F Prime documentation](https://fprime.jpl.nasa.gov/latest/docs/user-manual/overview/gds-introduction)
297
295
 
298
296
  ## Classes
299
297
  The GDS back end is composed of several different data processing units. For
@@ -316,8 +314,15 @@ that descriptor. Descriptor types include events, channels, packets, etc (a full
316
314
  enumeration can be found in (src/utils/data_desc_type.py). The binary data that
317
315
  the descriptor receives should be of the form:
318
316
 
319
- | Length (4 bytes) | Type Descriptor (4 bytes) | Message Data |
320
- | ---------------- | ------------------------- | ------------ |
317
+ ```mermaid
318
+ ---
319
+ title: "Binary format received by Distributors"
320
+ ---
321
+ packet-beta
322
+ 0-31: "Length [4 bytes]"
323
+ 32-63: "Type Descriptor [4 bytes]"
324
+ 64-95: "Message Data [variable length]"
325
+ ```
321
326
 
322
327
  The distributor should then pass only the message data along to the decoders.
323
328
 
@@ -433,10 +438,3 @@ pip install doxypypy
433
438
 
434
439
  Next, make `docs/py_filter` available in your system path however you see fit.
435
440
  Now you can run `doxygen Doxyfile` in the root directory to generate documentation in `docs/doxy/index.html`
436
-
437
- ## Notes
438
- - Currently, the models/common directory has command.py, event.py, and
439
- channel.py. These files must be present in order for the python dictionaries
440
- to be properly imported. However, they are empty and not used in the GDS.
441
- When we switch fully to XML dictionaries, these can go away.
442
-
@@ -1,6 +1,6 @@
1
1
  # F´ GDS
2
2
 
3
- **Note:** This README describes GDS internals. Refer to the [user's guide](https://nasa.github.io/fprime/UsersGuide/gds/gds-introduction.html) for instructions on how to use the GDS.
3
+ **Note:** This README describes GDS internals. Refer to the [ Documentation](https://fprime.jpl.nasa.gov/latest/docs/user-manual/overview/gds-introduction/) for instructions on how to use the GDS.
4
4
 
5
5
  Issues should be reported here: [File an issue](https://github.com/nasa/fprime/issues/new/choose)
6
6
 
@@ -25,7 +25,8 @@ output data type included. Command data objects are created in the command panel
25
25
  the command encoder registered to that panel. Encoders take a data object and turn it into binary
26
26
  data that can be sent to the F´ deployment. The binary data is then passed to the TCP client
27
27
  which is registered to the encoder. Finally, the TCP client send the data back to the TCP server and
28
- the F´ deployment. ![The layout of the GDS](https://github.com/nasa/fprime/blob/devel/docs/UsersGuide/media/gds_layout.jpg)
28
+ the F´ deployment.
29
+ ![The layout of the GDS](https://raw.githubusercontent.com/nasa/fprime/refs/heads/devel/docs/img/gds_layout.jpg)
29
30
 
30
31
  All of these objects are created and registered to other objects when the GDS
31
32
  is initialized. Thus, all of the structure of the GDS is created in one place,
@@ -42,15 +43,11 @@ commands and registering consumers to the GDS decoders. The Standard Pipeline ca
42
43
  [here](src/fprime_gds/common/pipeline/standard.py).
43
44
 
44
45
  ### GDS Integration Test API
45
- The Integration Test API is a tool that provides the ability to write integration-level tests for an
46
- F´ deployment using the GDS. The tool provides history searches/asserts, command sending, a
47
- detailed test log, sub-histories and convenient access to GDS data objects. The test API comes with
48
- separate [documentation](https://github.com/nasa/fprime/blob/master/docs/UsersGuide/dev/testAPI/markdown/contents.md) and its own [user
49
- guide](https://github.com/nasa/fprime/blob/master/docs/UsersGuide/dev/testAPI/user_guide.md) and is built on top of the Standard Pipeline.
46
+ The Integration Test API is a tool that provides the ability to write integration-level tests for an F´ deployment using the GDS. The tool provides history searches/asserts, command sending, a detailed test log, sub-histories and convenient access to GDS data objects. The test API comes with its own [user guide](https://fprime.jpl.nasa.gov/latest/docs/user-manual/gds/gds-test-api-guide/) and is built on top of the Standard Pipeline.
50
47
 
51
48
  ## GDS GUI Usage
52
49
 
53
- A guide for how to use the GDS is available in the [fprime documentation](https://nasa.github.io/fprime/UsersGuide/gds/gds-introduction.html)
50
+ A guide for how to use the GDS is available in the [F Prime documentation](https://fprime.jpl.nasa.gov/latest/docs/user-manual/overview/gds-introduction)
54
51
 
55
52
  ## Classes
56
53
  The GDS back end is composed of several different data processing units. For
@@ -73,8 +70,15 @@ that descriptor. Descriptor types include events, channels, packets, etc (a full
73
70
  enumeration can be found in (src/utils/data_desc_type.py). The binary data that
74
71
  the descriptor receives should be of the form:
75
72
 
76
- | Length (4 bytes) | Type Descriptor (4 bytes) | Message Data |
77
- | ---------------- | ------------------------- | ------------ |
73
+ ```mermaid
74
+ ---
75
+ title: "Binary format received by Distributors"
76
+ ---
77
+ packet-beta
78
+ 0-31: "Length [4 bytes]"
79
+ 32-63: "Type Descriptor [4 bytes]"
80
+ 64-95: "Message Data [variable length]"
81
+ ```
78
82
 
79
83
  The distributor should then pass only the message data along to the decoders.
80
84
 
@@ -190,10 +194,3 @@ pip install doxypypy
190
194
 
191
195
  Next, make `docs/py_filter` available in your system path however you see fit.
192
196
  Now you can run `doxygen Doxyfile` in the root directory to generate documentation in `docs/doxy/index.html`
193
-
194
- ## Notes
195
- - Currently, the models/common directory has command.py, event.py, and
196
- channel.py. These files must be present in order for the python dictionaries
197
- to be properly imported. However, they are empty and not used in the GDS.
198
- When we switch fully to XML dictionaries, these can go away.
199
-
@@ -61,6 +61,8 @@ fprime-cli = "fprime_gds.executables.fprime_cli:main"
61
61
  fprime-seqgen = "fprime_gds.common.tools.seqgen:main"
62
62
  fprime-dp-write = "fprime_gds.executables.data_product_writer:main"
63
63
  fprime-gds = "fprime_gds.executables.run_deployment:main"
64
+ fprime-prm-write = "fprime_gds.common.tools.params:main"
65
+ fprime-fpy-bytecode = "fprime_gds.common.fpy.serialize_bytecode:main"
64
66
 
65
67
  # For Pytest fixtures
66
68
  [project.entry-points."pytest11"]
@@ -44,7 +44,7 @@ class ChDecoder(Decoder):
44
44
  config = config_manager.ConfigManager().get_instance()
45
45
 
46
46
  self.__dict = ch_dict
47
- self.id_obj = config.get_type("ch_id")
47
+ self.id_obj = config.get_type("FwChanIdType")
48
48
 
49
49
  def decode_api(self, data):
50
50
  """
@@ -19,6 +19,7 @@ from fprime.common.models.serialize.type_exceptions import TypeException
19
19
 
20
20
  from fprime_gds.common.data_types import event_data
21
21
  from fprime_gds.common.decoders import decoder
22
+ from fprime_gds.common.decoders.decoder import DecodingException
22
23
  from fprime_gds.common.utils import config_manager
23
24
 
24
25
 
@@ -43,7 +44,7 @@ class EventDecoder(decoder.Decoder):
43
44
  config = config_manager.ConfigManager().get_instance()
44
45
 
45
46
  self.__dict = event_dict
46
- self.id_obj = config.get_type("event_id")
47
+ self.id_obj = config.get_type("FwEventIdType")
47
48
 
48
49
  def decode_api(self, data):
49
50
  """
@@ -45,7 +45,7 @@ class PktDecoder(ChDecoder):
45
45
  super().__init__(ch_dict, config)
46
46
 
47
47
  self.__dict = pkt_name_dict
48
- self.id_obj = config.get_type("pkt_id")
48
+ self.id_obj = config.get_type("FwTlmPacketizeIdType")
49
49
 
50
50
  def decode_api(self, data):
51
51
  """
@@ -57,7 +57,7 @@ class Distributor(DataHandler):
57
57
  self.key_frame = int(config.get("framing", "key_val"), 16)
58
58
  self.key_obj = config.get_type("key_val")
59
59
  self.len_obj = config.get_type("msg_len")
60
- self.desc_obj = config.get_type("msg_desc")
60
+ self.desc_obj = config.get_type("FwPacketDescriptorType")
61
61
 
62
62
  # NOTE we could use either the type of the object or an enum as the type argument.
63
63
  # It should indicate what the decoder decodes.
@@ -204,4 +204,4 @@ class Distributor(DataHandler):
204
204
  try:
205
205
  d.data_callback(msg)
206
206
  except DecodingException as dexc:
207
- LOGGER.warning("Decoding error occurred: %s. Skipping.", dexc)
207
+ LOGGER.warning("Decoding error occurred: %s. Skipping.", dexc)
@@ -57,8 +57,8 @@ class ChEncoder(Encoder):
57
57
  super().__init__(config)
58
58
 
59
59
  self.len_obj = self.config.get_type("msg_len")
60
- self.desc_obj = self.config.get_type("msg_desc")
61
- self.id_obj = self.config.get_type("ch_id")
60
+ self.desc_obj = self.config.get_type("FwPacketDescriptorType")
61
+ self.id_obj = self.config.get_type("FwChanIdType")
62
62
 
63
63
  def encode_api(self, data):
64
64
  """
@@ -72,8 +72,8 @@ class CmdEncoder(encoder.Encoder):
72
72
  super().__init__(config)
73
73
 
74
74
  self.len_obj = self.config.get_type("msg_len")
75
- self.desc_obj = self.config.get_type("msg_desc")
76
- self.opcode_obj = self.config.get_type("op_code")
75
+ self.desc_obj = self.config.get_type("FwPacketDescriptorType")
76
+ self.opcode_obj = self.config.get_type("FwOpcodeType")
77
77
 
78
78
  def encode_api(self, data):
79
79
  """
@@ -61,8 +61,8 @@ class EventEncoder(Encoder):
61
61
  super().__init__(config)
62
62
 
63
63
  self.len_obj = self.config.get_type("msg_len")
64
- self.desc_obj = self.config.get_type("msg_desc")
65
- self.id_obj = self.config.get_type("event_id")
64
+ self.desc_obj = self.config.get_type("FwPacketDescriptorType")
65
+ self.id_obj = self.config.get_type("FwEventIdType")
66
66
 
67
67
  def encode_api(self, data):
68
68
  """
@@ -61,8 +61,8 @@ class PktEncoder(Encoder):
61
61
  super().__init__(config)
62
62
 
63
63
  self.len_obj = self.config.get_type("msg_len")
64
- self.desc_obj = self.config.get_type("msg_desc")
65
- self.id_obj = self.config.get_type("pkt_id")
64
+ self.desc_obj = self.config.get_type("FwPacketDescriptorType")
65
+ self.id_obj = self.config.get_type("FwTlmPacketizeIdType")
66
66
 
67
67
  def encode_api(self, data):
68
68
  """
@@ -28,8 +28,8 @@ class SeqBinaryWriter:
28
28
 
29
29
  self.__fd = None
30
30
  self.__timebase = timebase
31
- self.desc_obj = config.get_type("msg_desc")
32
- self.opcode_obj = config.get_type("op_code")
31
+ self.desc_obj = config.get_type("FwPacketDescriptorType")
32
+ self.opcode_obj = config.get_type("FwOpcodeType")
33
33
  self.len_obj = config.get_type("msg_len")
34
34
 
35
35
  def open(self, filename):
@@ -0,0 +1,229 @@
1
+ from __future__ import annotations
2
+ from dataclasses import astuple
3
+ import inspect
4
+ import json
5
+ from pathlib import Path
6
+ from argparse import ArgumentParser
7
+ import struct
8
+ import zlib
9
+ from fprime_gds.common.fpy.types import (
10
+ StatementTemplate,
11
+ StatementData,
12
+ Header,
13
+ Footer,
14
+ HEADER_FORMAT,
15
+ FOOTER_FORMAT,
16
+ StatementType,
17
+ FPY_DIRECTIVES,
18
+ BytecodeParseContext,
19
+ get_type_obj_for,
20
+ )
21
+ from fprime_gds.common.loaders.ch_json_loader import ChJsonLoader
22
+ from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader
23
+ from fprime.common.models.serialize.numerical_types import (
24
+ U8Type,
25
+ )
26
+
27
+ from fprime_gds.common.loaders.prm_json_loader import PrmJsonLoader
28
+
29
+
30
+ def serialize_statement(stmt: StatementData) -> bytes:
31
+ """converts a StatementData object into bytes that the FpySequencer can read"""
32
+ # see https://github.com/nasa/fprime/issues/3023#issuecomment-2693051677
33
+ # TODO replace this with actual documentation
34
+
35
+ # type: U8 (0 if directive, 1 if cmd)
36
+ # opcode: FwOpcodeType (default U32)
37
+ # argBufSize: FwSizeStoreType (default U16)
38
+ # argBuf: X bytes
39
+
40
+ output = bytes()
41
+ output += U8Type(stmt.template.statement_type.value).serialize()
42
+ output += get_type_obj_for("FwOpcodeType")(stmt.template.opcode).serialize()
43
+
44
+ arg_bytes = bytes()
45
+ for arg in stmt.arg_values:
46
+ arg_bytes += arg.serialize()
47
+
48
+ output += get_type_obj_for("FwSizeStoreType")(len(arg_bytes)).serialize()
49
+ output += arg_bytes
50
+
51
+ return output
52
+
53
+
54
+ def parse_str_as_statement(
55
+ stmt: str, templates: list[StatementTemplate], context: BytecodeParseContext
56
+ ) -> StatementData:
57
+ """Converts a human-readable line of bytecode into a StatementData instance, given a list of
58
+ possible statement templates"""
59
+ name = stmt.split()[0]
60
+ args = stmt[len(name) :]
61
+
62
+ args = json.loads("[" + args + "]")
63
+
64
+ matching_template = [t for t in templates if t.name == name]
65
+ if len(matching_template) != 1:
66
+ # no unique match
67
+ if len(matching_template) == 0:
68
+ raise RuntimeError("Could not find command or directive " + str(name))
69
+ raise RuntimeError(
70
+ "Found multiple commands or directives with name " + str(name)
71
+ )
72
+ matching_template = matching_template[0]
73
+
74
+ arg_values = []
75
+ if len(args) < len(matching_template.args):
76
+ raise RuntimeError(
77
+ "Missing arguments for statement "
78
+ + str(matching_template.name)
79
+ + ": "
80
+ + str(matching_template.args[len(args) :])
81
+ )
82
+ if len(args) > len(matching_template.args):
83
+ raise RuntimeError(
84
+ "Extra arguments for"
85
+ + str(matching_template.name)
86
+ + ": "
87
+ + str(args[len(matching_template.args) :])
88
+ )
89
+ for index, arg_json in enumerate(args):
90
+ arg_type = matching_template.args[index]
91
+ if inspect.isclass(arg_type):
92
+ # it's a type. instantiate it with the json
93
+ arg_value = arg_type(arg_json)
94
+ else:
95
+ # it's a function. give it the json and the ctx
96
+ arg_value = arg_type(arg_json, context)
97
+ arg_values.append(arg_value)
98
+
99
+ return StatementData(matching_template, arg_values)
100
+
101
+
102
+ def main():
103
+ arg_parser = ArgumentParser()
104
+ arg_parser.add_argument(
105
+ "input", type=Path, help="The path to the input .fpybc file"
106
+ )
107
+
108
+ arg_parser.add_argument(
109
+ "-d",
110
+ "--dictionary",
111
+ type=Path,
112
+ help="The JSON topology dictionary to compile against",
113
+ required=True,
114
+ )
115
+
116
+ arg_parser.add_argument(
117
+ "-o",
118
+ "--output",
119
+ type=Path,
120
+ help="The output .bin file path. Defaults to the input file path with a .bin extension",
121
+ default=None,
122
+ )
123
+
124
+ args = arg_parser.parse_args()
125
+
126
+ if not args.input.exists():
127
+ print("Input file", args.input, "does not exist")
128
+ exit(1)
129
+
130
+ if not args.dictionary.exists():
131
+ print("Dictionary file", args.dictionary, "does not exist")
132
+ exit(1)
133
+
134
+ serialize_bytecode(args.input, args.dictionary, args.output)
135
+
136
+
137
+ def serialize_bytecode(input: Path, dictionary: Path, output: Path = None):
138
+ """Given an input .fpybc file, and a dictionary .json file, converts the
139
+ bytecode file into binary and writes it to the output file. If the output file
140
+ is None, writes it to the input file with a .bin extension"""
141
+ cmd_json_dict_loader = CmdJsonLoader(str(dictionary))
142
+ (_, cmd_name_dict, _) = cmd_json_dict_loader.construct_dicts(
143
+ str(dictionary)
144
+ )
145
+
146
+ stmt_templates = []
147
+ stmt_templates.extend(FPY_DIRECTIVES)
148
+ for cmd_template in cmd_name_dict.values():
149
+ stmt_template = StatementTemplate(
150
+ StatementType.CMD,
151
+ cmd_template.opcode,
152
+ cmd_template.get_full_name(),
153
+ [arg[2] for arg in cmd_template.arguments],
154
+ )
155
+ stmt_templates.append(stmt_template)
156
+
157
+ tlm_json_loader = ChJsonLoader(str(dictionary))
158
+ (_, tlm_name_dict, _) = tlm_json_loader.construct_dicts(
159
+ str(dictionary)
160
+ )
161
+
162
+ prm_json_loader = PrmJsonLoader(str(dictionary))
163
+ (_, prm_name_dict, _) = prm_json_loader.construct_dicts(
164
+ str(dictionary)
165
+ )
166
+
167
+ context = BytecodeParseContext()
168
+ context.types = cmd_json_dict_loader.parsed_types
169
+ context.channels = tlm_name_dict
170
+ context.params = prm_name_dict
171
+
172
+ input_lines = input.read_text().splitlines()
173
+ input_lines = [line.strip() for line in input_lines]
174
+ # remove comments and empty lines
175
+ input_lines = [
176
+ line for line in input_lines if not line.startswith(";") and len(line) > 0
177
+ ]
178
+
179
+ goto_tags = {}
180
+ stmt_idx = 0
181
+ statement_strs: list[str] = []
182
+ for stmt in input_lines:
183
+ if stmt.endswith(":"):
184
+ # it's a goto tag
185
+ goto_tags[stmt[:-1]] = stmt_idx
186
+ else:
187
+ statement_strs.append(stmt)
188
+ stmt_idx += 1
189
+
190
+ context.goto_tags = goto_tags
191
+
192
+ statements: list[StatementData] = []
193
+ for stmt_idx, stmt in enumerate(statement_strs):
194
+ try:
195
+ stmt_data = parse_str_as_statement(stmt, stmt_templates, context)
196
+ statements.append(stmt_data)
197
+ except BaseException as e:
198
+ raise RuntimeError(
199
+ "Exception while parsing statement index " + str(stmt_idx) + ": " + stmt
200
+ ) from e
201
+
202
+ # perform some checks for things we know will fail
203
+ for stmt in statements:
204
+ if stmt.template.name == "GOTO":
205
+ if stmt.arg_values[0].val > len(statements):
206
+ raise RuntimeError(
207
+ f"GOTO index is outside the valid range for this sequence (was {stmt.arg_values[0].val}, should be <{len(statements)})"
208
+ )
209
+
210
+ output_bytes = bytes()
211
+
212
+ for stmt in statements:
213
+ output_bytes += serialize_statement(stmt)
214
+
215
+ header = Header(0, 0, 0, 1, 0, len(statements), len(output_bytes))
216
+ output_bytes = struct.pack(HEADER_FORMAT, *astuple(header)) + output_bytes
217
+
218
+ crc = zlib.crc32(output_bytes) % (1 << 32)
219
+ footer = Footer(crc)
220
+ output_bytes += struct.pack(FOOTER_FORMAT, *astuple(footer))
221
+
222
+ if output is None:
223
+ output = input.with_suffix(".bin")
224
+
225
+ output.write_bytes(output_bytes)
226
+
227
+
228
+ if __name__ == "__main__":
229
+ main()