fprime-gds 4.0.2a2__tar.gz → 4.0.2a4__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 (344) hide show
  1. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/expect.txt +32 -19
  2. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/PKG-INFO +1 -1
  3. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/pyproject.toml +2 -1
  4. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/distributor/distributor.py +9 -6
  5. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/README.md +204 -0
  6. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/SPEC.md +183 -0
  7. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/bytecode/assembler.py +62 -0
  8. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/bytecode/directives.py +816 -0
  9. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/codegen.py +1464 -0
  10. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/grammar.lark +44 -9
  11. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/main.py +63 -0
  12. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/model.py +799 -0
  13. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/parser.py +29 -34
  14. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/test_helpers.py +119 -0
  15. fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/types.py +563 -0
  16. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/dictionaries.py +23 -0
  17. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/standard.py +5 -0
  18. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/api.py +8 -1
  19. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/cli.py +9 -0
  20. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/run_deployment.py +2 -0
  21. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/app.py +17 -2
  22. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/default_settings.py +1 -0
  23. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/index.html +7 -4
  24. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/config.js +9 -1
  25. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/channel.js +16 -0
  26. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/event.js +1 -0
  27. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +25 -1
  28. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/PKG-INFO +1 -1
  29. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/SOURCES.txt +7 -1
  30. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/entry_points.txt +2 -1
  31. fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/RefTopologyDictionary.json +13174 -0
  32. fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/disabled_test_generated_seqs.py +149 -0
  33. fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/test_seqs.py +1321 -0
  34. fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/README.md +0 -56
  35. fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/SPEC.md +0 -69
  36. fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/bytecode/directives.py +0 -490
  37. fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/codegen.py +0 -1687
  38. fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/main.py +0 -40
  39. fprime_gds-4.0.2a2/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -765
  40. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/codeql/security-pack.yml +0 -0
  42. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/excludes.txt +0 -0
  43. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/patterns.txt +0 -0
  44. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/pull_request_template.md +0 -0
  45. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  46. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/codeql-security-scan.yml +0 -0
  47. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/fprime-gds-tests.yml +0 -0
  48. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/gds-cli-tests.yml +0 -0
  49. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/publish.yml +0 -0
  50. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/spelling.yml +0 -0
  51. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.gitignore +0 -0
  52. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/Doxyfile +0 -0
  53. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/LICENSE.txt +0 -0
  54. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/NOTICE.txt +0 -0
  55. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/README.md +0 -0
  56. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/configs/__init__.py +0 -0
  57. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/README.md +0 -0
  58. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/_static/css/rtd_width.css +0 -0
  59. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/conf.py +0 -0
  60. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/gendoc.bash +0 -0
  61. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/index.rst +0 -0
  62. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/examples/simple_sequence.bin +0 -0
  63. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/examples/simple_sequence.seq +0 -0
  64. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/setup.cfg +0 -0
  65. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/setup.py +0 -0
  66. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fastentrypoints.py +0 -0
  67. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/__init__.py +0 -0
  68. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/__init__.py +0 -0
  69. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/__init__.py +0 -0
  70. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  71. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  72. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  73. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
  74. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
  75. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
  76. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
  77. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
  78. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
  79. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/checksum.py +0 -0
  80. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/framing.py +0 -0
  81. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ground.py +0 -0
  82. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/updown.py +0 -0
  83. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/controllers/__init__.py +0 -0
  84. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/__init__.py +0 -0
  85. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  86. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  87. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/event_data.py +0 -0
  88. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  89. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/file_data.py +0 -0
  90. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  91. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  92. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/__init__.py +0 -0
  93. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
  94. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/decoder.py +0 -0
  95. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
  96. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  97. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
  98. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/distributor/__init__.py +0 -0
  99. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/__init__.py +0 -0
  100. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
  101. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
  102. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/encoder.py +0 -0
  103. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
  104. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  105. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
  106. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
  107. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  108. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/__init__.py +0 -0
  109. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/downlinker.py +0 -0
  110. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/helpers.py +0 -0
  111. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/uplinker.py +0 -0
  112. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/__init__.py +0 -0
  113. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
  114. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
  115. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
  116. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/channels.py +0 -0
  117. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
  118. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/events.py +0 -0
  119. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  120. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  121. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/handlers.py +0 -0
  122. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/__init__.py +0 -0
  123. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/chrono.py +0 -0
  124. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/history.py +0 -0
  125. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/ram.py +0 -0
  126. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/test.py +0 -0
  127. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/__init__.py +0 -0
  128. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  129. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  130. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  131. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  132. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  133. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  134. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  135. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
  136. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  137. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
  138. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  139. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
  140. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  141. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/__init__.py +0 -0
  142. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/data_logger.py +0 -0
  143. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/test_logger.py +0 -0
  144. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/__init__.py +0 -0
  145. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/common/__init__.py +0 -0
  146. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/common/command.py +0 -0
  147. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/parsers/__init__.py +0 -0
  148. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  149. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/__init__.py +0 -0
  150. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/encoding.py +0 -0
  151. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/files.py +0 -0
  152. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/histories.py +0 -0
  153. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/publishing.py +0 -0
  154. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/router.py +0 -0
  155. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/__init__.py +0 -0
  156. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/ch_template.py +0 -0
  157. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  158. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/data_template.py +0 -0
  159. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/event_template.py +0 -0
  160. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  161. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/prm_template.py +0 -0
  162. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
  163. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  164. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
  165. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/README.md +0 -0
  166. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/__init__.py +0 -0
  167. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/params.py +0 -0
  168. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/seqgen.py +0 -0
  169. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/transport.py +0 -0
  170. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/__init__.py +0 -0
  171. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/config_manager.py +0 -0
  172. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
  173. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/event_severity.py +0 -0
  174. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/string_util.py +0 -0
  175. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/zmq_transport.py +0 -0
  176. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/__init__.py +0 -0
  177. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/apps.py +0 -0
  178. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/comm.py +0 -0
  179. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/data_product_writer.py +0 -0
  180. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/dictionary_merge.py +0 -0
  181. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/fprime_cli.py +0 -0
  182. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/tcpserver.py +0 -0
  183. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/utils.py +0 -0
  184. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/__init__.py +0 -0
  185. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/channels.py +0 -0
  186. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/commands.py +0 -0
  187. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/components.py +0 -0
  188. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/errors.py +0 -0
  189. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/events.py +0 -0
  190. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/json.py +0 -0
  191. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/logs.py +0 -0
  192. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/requirements.txt +0 -0
  193. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/resource.py +0 -0
  194. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/sequence.py +0 -0
  195. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  196. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  197. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  198. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  199. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  200. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  201. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  202. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  203. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  204. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  205. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  206. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  207. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  208. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  209. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  210. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  211. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  212. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  213. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  214. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  215. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  216. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  217. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  218. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  219. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  220. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  221. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  222. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  223. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  224. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  225. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  226. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  227. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  228. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  229. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  230. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  231. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  232. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  233. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  234. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  235. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  236. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  237. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  238. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  239. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  240. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  241. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  242. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/favicon.ico +0 -0
  243. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/error.svg +0 -0
  244. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  245. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/success.svg +0 -0
  246. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  247. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/gds.js +0 -0
  248. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/json.js +0 -0
  249. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/loader.js +0 -0
  250. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/performance.js +0 -0
  251. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/settings.js +0 -0
  252. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  253. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/validate.js +0 -0
  254. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  255. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  256. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  257. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  258. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  259. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  260. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  261. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  262. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  263. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  264. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  265. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  266. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  267. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  268. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  269. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  270. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  271. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  272. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  273. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  274. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  275. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  276. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  277. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  278. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  279. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  280. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  281. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  282. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  283. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  284. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  285. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  286. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/stats.py +0 -0
  287. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/updown.py +0 -0
  288. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/__init__.py +0 -0
  289. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/definitions.py +0 -0
  290. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/system.py +0 -0
  291. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/version.py +0 -0
  292. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  293. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/requires.txt +0 -0
  294. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/top_level.txt +0 -0
  295. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
  296. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
  297. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  298. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
  299. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
  300. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
  301. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
  302. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  303. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  304. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  305. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  306. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
  307. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
  308. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  309. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
  310. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  311. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  312. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  313. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  314. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
  315. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  316. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
  317. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  318. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
  319. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  320. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  321. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
  322. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  323. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/.gitignore +0 -0
  324. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  325. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  326. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  327. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  328. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  329. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  330. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  331. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  332. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  333. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  334. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  335. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  336. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  337. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  338. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  339. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  340. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_run_deployment.py +0 -0
  341. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_utils.py +0 -0
  342. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/sample/dictionary.xml +0 -0
  343. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/test_plugins.py +0 -0
  344. {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -29,6 +29,7 @@ BGR
29
29
  Biberstein
30
30
  bibtex
31
31
  bitmaps
32
+ bitwidth
32
33
  breadcrumb
33
34
  Btns
34
35
  BUGLIST
@@ -84,7 +85,7 @@ deframed
84
85
  deframer
85
86
  deframing
86
87
  DEPRECATEDLIST
87
- deser
88
+ DESER
88
89
  Deserial
89
90
  deserializes
90
91
  dests
@@ -136,26 +137,27 @@ fastentrypoints
136
137
  fbuild
137
138
  fd
138
139
  FEEDNAME
139
- FEQ
140
+ feq
140
141
  FFCC
141
142
  FFFF
142
- FGE
143
- FGT
143
+ fge
144
+ fgt
144
145
  fileurl
145
146
  Firefox
146
- FLE
147
+ fle
147
148
  focusring
148
- FNE
149
+ fne
149
150
  FONTNAME
150
151
  FONTPATH
151
152
  FONTSIZE
152
- FPEXT
153
+ fpext
153
154
  fpp
155
+ fpow
154
156
  fprime
155
157
  fptable
156
- FPTOSI
157
- FPTOUI
158
- FPTRUNC
158
+ fptosi
159
+ fptoui
160
+ fptrunc
159
161
  fpy
160
162
  fpybc
161
163
  fqn
@@ -188,11 +190,11 @@ idk
188
190
  idl
189
191
  idx
190
192
  ieeetr
191
- IEQ
193
+ ieq
192
194
  ified
193
195
  ifun
194
196
  IH
195
- INE
197
+ ine
196
198
  inprogress
197
199
  intersphinx
198
200
  intlimits
@@ -201,6 +203,7 @@ ipc
201
203
  ipp
202
204
  issuecomment
203
205
  itcl
206
+ itrunc
204
207
  ixx
205
208
  janamian
206
209
  jawest
@@ -228,7 +231,7 @@ logdir
228
231
  logpath
229
232
  logselect
230
233
  luxon
231
- LVAR
234
+ lvar
232
235
  makeindex
233
236
  MAKEVAR
234
237
  marijnh
@@ -278,6 +281,7 @@ paramdb
278
281
  passthrough
279
282
  pb
280
283
  pdflatex
284
+ pemdas
281
285
  PERLMOD
282
286
  pkts
283
287
  plainnat
@@ -316,6 +320,7 @@ recuring
316
320
  recvd
317
321
  recvs
318
322
  reder
323
+ referenceable
319
324
  removeit
320
325
  reqparse
321
326
  riverbankcomputing
@@ -326,27 +331,31 @@ rst
326
331
  saba
327
332
  scid
328
333
  sdd
334
+ sdiv
329
335
  searchdata
330
336
  Segoe
331
337
  seqfile
332
338
  seqgen
333
339
  serializables
334
340
  serialutil
335
- SGE
336
- SGT
341
+ sge
342
+ sgt
337
343
  showinitializer
338
344
  sideeffect
345
+ siext
339
346
  SIGALRM
340
- SITOFP
347
+ signedness
348
+ sitofp
341
349
  sizeb
350
+ sle
342
351
  SMAP
343
352
  Smath
353
+ smod
344
354
  smth
345
355
  SNDHWM
346
356
  sorttable
347
357
  spacepacket
348
358
  squashify
349
- sreg
350
359
  sss
351
360
  Ssymbols
352
361
  stackoverflow
@@ -393,11 +402,13 @@ typedef
393
402
  uart
394
403
  ucf
395
404
  udp
396
- UGE
405
+ udiv
406
+ uge
397
407
  UIs
398
- UITOFP
408
+ uitofp
399
409
  uk
400
410
  ul
411
+ umod
401
412
  UNINIT
402
413
  updown
403
414
  upfiles
@@ -416,6 +427,7 @@ viewcode
416
427
  vle
417
428
  vname
418
429
  VRuntime
430
+ vuejs
419
431
  vw
420
432
  Watney
421
433
  webified
@@ -432,4 +444,5 @@ xmlpath
432
444
  xy
433
445
  zeromq
434
446
  zmq
447
+ ziext
435
448
  zimri
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 4.0.2a2
3
+ Version: 4.0.2a4
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:
@@ -66,7 +66,8 @@ fprime-seqgen = "fprime_gds.common.tools.seqgen:main"
66
66
  fprime-dp-write = "fprime_gds.executables.data_product_writer:main"
67
67
  fprime-gds = "fprime_gds.executables.run_deployment:main"
68
68
  fprime-prm-write = "fprime_gds.common.tools.params:main"
69
- fprime-fpyc = "fprime_gds.common.fpy.main:main"
69
+ fprime-fpyc = "fprime_gds.common.fpy.main:compile_main"
70
+ fprime-fpy-model = "fprime_gds.common.fpy.main:model_main"
70
71
  fprime-merge-dictionary = "fprime_gds.executables.dictionary_merge:main"
71
72
 
72
73
  # For Pytest fixtures
@@ -16,6 +16,7 @@ descriptor header will be passed on to the registered objects.
16
16
 
17
17
  import logging
18
18
 
19
+ from fprime.common.models.serialize.type_exceptions import DeserializeException
19
20
  from fprime_gds.common.decoders.decoder import DecodingException
20
21
  from fprime_gds.common.handlers import DataHandler
21
22
  from fprime_gds.common.utils import config_manager, data_desc_type
@@ -147,7 +148,6 @@ class Distributor(DataHandler):
147
148
  # | ... | |
148
149
  # | .. | |
149
150
  # . :
150
-
151
151
  offset = 0
152
152
 
153
153
  # Parse length
@@ -199,13 +199,16 @@ class Distributor(DataHandler):
199
199
  ), "Leftover data is not equivalent to the remaining data in buffer"
200
200
 
201
201
  for raw_msg in raw_msgs:
202
- (length, data_desc, msg) = self.parse_raw_msg_api(raw_msg)
203
-
204
- data_desc_key = data_desc_type.DataDescType(data_desc).name
205
- decoders = self.__decoders[data_desc_key]
206
-
202
+ try:
203
+ (length, data_desc, msg) = self.parse_raw_msg_api(raw_msg)
204
+ data_desc_key = data_desc_type.DataDescType(data_desc).name
205
+ except DeserializeException as deserialize_exception:
206
+ LOGGER.warning(f"Invalid message: {deserialize_exception}")
207
+ return
208
+ decoders = self.__decoders.get(data_desc_key, None)
207
209
  if not decoders:
208
210
  LOGGER.warning(f"No decoder registered for: {data_desc_key}")
211
+ return
209
212
 
210
213
  for d in decoders:
211
214
  try:
@@ -0,0 +1,204 @@
1
+ # Fpy Guide
2
+
3
+ Fpy is an easy to learn, powerful spacecraft scripting language backed by decades of JPL heritage. It is designed to work with the FPrime flight software framework. The syntax is inspired by Python, and it compiles to an efficient binary format.
4
+
5
+ This guide is a quick overview of the most important features of Fpy. It should be easy to follow for someone who has used Python and FPrime before.
6
+
7
+ ## 1. Compiling and Running a Sequence
8
+
9
+ First, make sure `fprime-gds` is installed.
10
+
11
+ Fpy sequences are suffixed with `.fpy`. Let's make a test sequence that dispatches a no-op:
12
+ ```py
13
+ # hash denotes a comment
14
+ # assume this file is named "test.fpy"
15
+
16
+ # use the full name of the no-op command:
17
+ CdhCore.cmdDisp.CMD_NO_OP() # empty parentheses indicate no arguments
18
+ ```
19
+
20
+ You can compile it with `fprime-fpyc test.fpy --dictionary Ref/build-artifacts/Linux/dict/RefTopologyDictionary.json`
21
+
22
+ Make sure your deployment topology has an instance of the `Svc.FpySequencer` component. You can run the sequence by passing it in as an argument to the `Svc.FpySequencer.RUN` command.
23
+
24
+ ## 2. Variables and Basic Types
25
+
26
+ Fpy supports statically-typed, mutable local variables. You can change their value, but the type of the variable can't change.
27
+
28
+ This is how you declare a variable, and change its value:
29
+ ```py
30
+ unsigned_var: U8 = 0
31
+ # this is a variable named unsigned_var with a type of unsigned 8-bit integer and a value of 0
32
+
33
+ unsigned_var = 123
34
+ # now it has a value of 123
35
+ ```
36
+
37
+ For types, Fpy has most of the same basic ones that FPP does:
38
+ * Signed integers: `I8, I16, I32, I64`
39
+ * Unsigned integers: `U8, U16, U32, U64`
40
+ * Floats: `F32, F64`
41
+ * Boolean: `bool`
42
+
43
+ Float literals are denoted with a decimal point (`5.0`, `0.123`) and Boolean literals have a capitalized first letter: `True`, `False`. There is no way to differentiate between signed and unsigned integer literals, so the compiler looks at where the literal is used to determine the signedness.
44
+
45
+ Note there is currently no built-in `string` type. See [Strings](#13-strings).
46
+
47
+ ## 3. Dictionary Types
48
+
49
+ Fpy also has access to all structs, arrays and enums in the FPrime dictionary:
50
+ ```py
51
+ # you can access enum constants by name:
52
+ enum_var: Fw.Success = Fw.Success.SUCCESS
53
+
54
+ # you can construct arrays:
55
+ array_var: Ref.DpDemo.U32Array = Ref.DpDemo.U32Array(0, 1, 2, 3, 4)
56
+
57
+ # you can construct structs:
58
+ struct_var: Ref.SignalPair = Ref.SignalPair(0.0, 1.0)
59
+ ```
60
+
61
+ In general, the syntax for instantiating a struct or array type is `Full.Type.Name(arg, ..., arg)`.
62
+
63
+ ## 4. Math
64
+ You can do basic math and store the result in variables in Fpy:
65
+ ```py
66
+ pemdas: F32 = 1 - 2 + 3 * 4 + 10 / 5 * 2 # == 15.0
67
+ ```
68
+
69
+ Fpy supports the following math operations:
70
+ * Basic arithmetic: `+, -, *, /`
71
+ * Modulo: `%`
72
+ * Exponentiation: `**`
73
+ * Floor division: `//`
74
+ * Natural logarithm: `log(x)`
75
+
76
+ The behavior of these operators is designed to mimic Python. Note that **division always returns a float**. This means that `5 / 2 == 2.5`, not `2`. This may be confusing coming from C++, but it is consistent with Python.
77
+
78
+ ## 5. Variable Arguments to Commands
79
+
80
+ Where this really gets interesting is when you pass variables or expressions into commands:
81
+ ```py
82
+ # this is a command that takes an F32
83
+ Ref.recvBuffComp.PARAMETER4_PRM_SET(1 - 2 + 3 * 4 + 10 / 5 * 2)
84
+ # alternatively:
85
+ param4: F32 = 15.0
86
+ Ref.recvBuffComp.PARAMETER4_PRM_SET(param4)
87
+ ```
88
+
89
+ The same syntax works with the [`sleep`](#11-relative-and-absolute-sleep), [`exit`](#12-exit-macro), and `log` macros.
90
+
91
+ There are some restrictions on passing string values, or complex types containing string values, to commands. See [Strings](#13-strings).
92
+
93
+ ## 6. Getting Telemetry Channels
94
+
95
+ Fpy supports getting the value of telemetry channels:
96
+ ```py
97
+ cmds_dispatched: U32 = CdhCore.cmdDisp.CommandsDispatched
98
+
99
+ signal_pair: Ref.SignalPair = Ref.SG1.PairOutput
100
+ ```
101
+
102
+ It's important to note that if your component hasn't written telemetry to the telemetry database (`TlmPacketizer` or `TlmChan`) in a while, the value the sequence sees may be old. Make sure to regularly write your telemetry!
103
+
104
+ ## 7. Getting Parameters
105
+
106
+ Fpy supports getting the value of parameters:
107
+ ```py
108
+ prm_3: U8 = Ref.sendBuffComp.parameter3
109
+ ```
110
+
111
+ A significant limitation of this is that it will only return the value most recently saved to the parameter database. This means you must command `_PRM_SAVE` before the sequence will see the new value.
112
+
113
+ ## 8. Conditionals
114
+ Fpy supports comparison operators:
115
+ ```py
116
+ value: bool = 1 > 2 and (3 + 4) != 5
117
+ ```
118
+ * Inequalities: `>, <, >=, <=`
119
+ * Equalities: `==, !=`
120
+ * Boolean functions: `and, or, not`
121
+
122
+
123
+ The inequality operators can compare two numbers of any type together. The equality operators, in addition to comparing numbers, can check for equality between two of the same complex type:
124
+ ```py
125
+ record1: Svc.DpRecord = Svc.DpRecord(0, 1, 2, 3, 4, 5, Fw.DpState.UNTRANSMITTED)
126
+ record2: Svc.DpRecord = Svc.DpRecord(0, 1, 2, 3, 4, 5, Fw.DpState.UNTRANSMITTED)
127
+ records_equal: bool = record1 == record2 # == True
128
+ ```
129
+ ## 9. If/elif/else
130
+
131
+ You can branch off of conditionals with `if`, `elif` and `else`:
132
+ ```py
133
+ random_value: I8 = 4 # chosen by fair dice roll. guaranteed to be random
134
+
135
+ if random_value < 0:
136
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("won't happen")
137
+ elif random_value > 0 and random_value <= 6:
138
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("should happen!")
139
+ else:
140
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("uh oh...")
141
+ ```
142
+
143
+ This is particularly useful for checking telemetry channel values:
144
+ ```py
145
+ # dispatch a no-op
146
+ CdhCore.cmdDisp.CMD_NO_OP()
147
+ # the commands dispatched count should be >= 1
148
+ if CdhCore.cmdDisp.CommandsDispatched >= 1:
149
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("should happen")
150
+ ```
151
+
152
+ ## 10. Getting Struct Members and Array Items
153
+
154
+ You can access members of structs by name, or array elements by index:
155
+ ```py
156
+ # access struct members with "." syntax
157
+ signal_pair_time: F32 = Ref.SG1.PairOutput.time
158
+
159
+ # access array elements with "[]" syntax
160
+ com_queue_depth_0: U32 = ComCcsds.comQueue.comQueueDepth[0]
161
+ ```
162
+
163
+ You cannot reassign struct members or array elements however:
164
+ ```py
165
+ # Ref.SignalPair is a struct type
166
+ signal_pair: Ref.SignalPair = Ref.SG1.PairOutput
167
+ # compiler error:
168
+ signal_pair.time = 0.2
169
+
170
+ # Svc.ComQueueDepth is an array type
171
+ com_queue_depth: Svc.ComQueueDepth = ComCcsds.comQueue.comQueueDepth
172
+ # compiler error:
173
+ com_queue_depth[0] = 1
174
+ ```
175
+
176
+ ## 11. Relative and Absolute Sleep
177
+ You can pause the execution of a sequence for a relative duration, or until an absolute time:
178
+ ```py
179
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("second 0")
180
+ # sleep for 1 second and 0 microseconds
181
+ sleep(1, 0)
182
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("second 1")
183
+
184
+
185
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("today")
186
+ # sleep until 12345678900 seconds and 0 microseconds after the epoch
187
+ sleep_until(0, 0, 12345678900, 0)
188
+ CdhCore.cmdDisp.CMD_NO_OP_STRING("much later")
189
+ ```
190
+
191
+ Make sure that the `Svc.FpySequencer.checkTimers` port is connected to a rate group. The sequencer only checks if a sleep is done when the port is called, so the more frequently you call it, the more accurate the wakeup time.
192
+
193
+ ## 12. Exit Macro
194
+ You can end the execution of the sequence early by calling the `exit` macro:
195
+ ```py
196
+ # exit takes a boolean argument
197
+ # True means "end the sequence without an error"
198
+ exit(True)
199
+ # False means "end the sequence and raise an error"
200
+ exit(False)
201
+ ```
202
+
203
+ ## 13. Strings
204
+ Fpy does not support a fully-fledged `string` type yet. You can pass a string literal as an argument to a command, but you cannot pass a string from a telemetry channel. You also cannot store a string in a variable, or perform any string manipulation. These features will be added in a later Fpy update.
@@ -0,0 +1,183 @@
1
+ Nothing type is a type whose set of values is an empty set
2
+ Unit type is a type whose set of values is a set with one element
3
+ BIG question: what if we made an arbitrary precision int type? and float type?
4
+
5
+ # Types
6
+
7
+ The following types are built into Fpy, and the developer can directly refer to them by name:
8
+ * Numeric types: `U8, U16, U32, U64, I8, I16, I32, I64, F32, F64`
9
+ * Boolean type: `bool`
10
+ * Time type: `Fw.Time`
11
+
12
+ In addition, the developer can directly refer to any displayable type defined in FPP via its fully-qualified name. This includes user-defined structs, arrays and enums.
13
+
14
+ There are some types which exist in Fpy but cannot be directly referenced by name by the developer. These are the internal *Int*, and *String* types. See [literals](#literals).
15
+
16
+ ## Structs
17
+ You can instantiate a new struct at runtime by calling its constructor. A struct's constructor is a function with the same name as the type, with arguments corresponding to the type and position of the struct's members. For example, a struct defined as:
18
+ ```
19
+ module Fw {
20
+ struct Example {
21
+ intValue: U8
22
+ boolValue: bool
23
+ }
24
+ }
25
+ ```
26
+ can be constructed in Fpy like:
27
+ ```
28
+ Fw.Example(0, True)
29
+ ```
30
+
31
+
32
+ # Literals
33
+ The following literals are supported by Fpy:
34
+ * Integer literals: `123`, `-456_879`
35
+ * Float literals: `0.123`, `1e-5`
36
+ * String literals: `"hello world"`, `'example string'`
37
+ * Boolean literals: `True` and `False`
38
+
39
+ ## Integer literals
40
+ Integer literals are strings matching:
41
+ ```
42
+ DEC_NUMBER: "1".."9" ("_"? "0".."9" )*
43
+ | "0" ("_"? "0" )* /(?![1-9])/
44
+ ```
45
+
46
+ The first rule of this syntax allows for integers without leading zeroes, separated by underscores. So this is okay:
47
+ ```
48
+ 123_456
49
+ ```
50
+ but this is not:
51
+ ```
52
+ 0123_456
53
+ ```
54
+
55
+ The second rule allows you to write any number of zeroes, separated by underscores:
56
+ ```
57
+ 00_000_0
58
+ ```
59
+
60
+ Integer literals have a internal type *Int*, which is not directly referenceable by the user. The *Int* type supports integers of arbitrary size.
61
+
62
+ ## Float literals
63
+ Float literals are strings matching:
64
+ ```
65
+ FLOAT_NUMBER: _SPECIAL_DEC _EXP | DECIMAL _EXP?
66
+ ```
67
+ where `_SPECIAL_DEC`, `_EXP` and `DECIMAL` are defined as:
68
+
69
+ ```
70
+ _SPECIAL_DEC: "0".."9" ("_"? "0".."9")*
71
+ _EXP: ("e"|"E") ["+" | "-"] _SPECIAL_DEC
72
+ DECIMAL: "." _SPECIAL_DEC | _SPECIAL_DEC "." _SPECIAL_DEC?
73
+ ```
74
+
75
+ A `FLOAT_NUMBER` can be any string of digits suffixed with an exponent, like these:
76
+ ```
77
+ 1e-5
78
+ 100_200e10
79
+ ```
80
+
81
+ or it can be a `DECIMAL` optionally suffixed by an exponent, like these:
82
+ ```
83
+ 1.
84
+ 2.123
85
+ 100.5e+10
86
+ ```
87
+
88
+ Float literals are of type `F64`.
89
+
90
+ ## String literals
91
+ String literals are strings matching:
92
+ ```
93
+ STRING: /("(?!"").*?(?<!\\)(\\\\)*?"|'(?!'').*?(?<!\\)(\\\\)*?')/i
94
+ ```
95
+
96
+ They have a internal type *String*, which is not directly referenceable by the user. The *String* type supports strings of arbitrary length.
97
+
98
+ # Functions
99
+ Functions have arguments and a return type. You can call a function like:
100
+ ```
101
+ function_name(arg_1, arg_2, arg_3)
102
+ ```
103
+
104
+ ## Commands
105
+
106
+
107
+ # Type conversion
108
+
109
+ Type conversion is the process of converting an expression from one type to another. It can either be implicit, in which case it is called coercion, or explicit, in which case it is called casting.
110
+
111
+ ## Coercion
112
+ Coercion happens when an expression of type *A* is used in a syntactic element which requires an expression of type *B*. For example, functions, operators and variable assignments all require specific input types, so type coercion happens in each of these.
113
+
114
+ When type coercion happens, the following type conversion rules are applied:
115
+
116
+ 1. Expressions of any integer type can be converted to any signed or unsigned integer or float type.
117
+ 2. Expressions of any float type can be converted to any float type.
118
+ 3. Expressions of internal type *String* can be converted to any string type.
119
+
120
+ TODO try out with forcing type casting--see what the FF's think
121
+ TODO require explicit narrowing casts? or have a compiler warning?
122
+ TODO consider float to int conversion?
123
+ TODO consider adding constants
124
+
125
+ If no rule matches, then the compiler raises an error.
126
+
127
+ There is currently no support for converting non-internal string expressions to other string expressions.
128
+
129
+ # Operators
130
+
131
+ Fpy supports the following operators:
132
+ * Basic arithmetic: `+, -, *, /`
133
+ * Modulo: `%`
134
+ * Exponentiation: `**`
135
+ * Floor division: `//`
136
+ * Boolean: `and, or, not`
137
+ * Comparison: `<, >, <=, >=, ==, !=`
138
+
139
+ Each time an operator is used, an intermediate type must be picked and both args must be converted to that type.
140
+
141
+ ## Behavior of operators
142
+
143
+ ### Addition (`+`)
144
+ ### Subtraction (`-`)
145
+ ### Multiplication (`*`)
146
+ ### Division (`/`)
147
+ ### Modulo (`%`)
148
+ ### Exponentiation (`**`)
149
+ ### Floor division (`//`)
150
+ ### And (`and`)
151
+ ### Or (`or`)
152
+ ### Not (`not`)
153
+
154
+
155
+ ## Intermediate types
156
+
157
+ Intermediate types are picked via the following rules:
158
+
159
+ 1. The intermediate type of Boolean operators is always `bool`.
160
+ 2. The intermediate type of `==` and `!=` may be any type, so long as the left and right hand sides are the same type. If both are numeric then continue.
161
+ 3. If either argument is non-numeric, raise an error.
162
+ 4. If the operator is `/` or `**`, the intermediate type is always `F64`.
163
+ 5. If either argument is a float, the intermediate type is `F64`.
164
+ 6. If either argument is an unsigned integer, the intermediate type is `U64`.
165
+ 7. Otherwise, the intermediate type is `I64`.
166
+
167
+ If the expressions given to the operator are not of the intermediate type, type coercion rules are applied.
168
+
169
+ ## Result type
170
+
171
+ The result type is the type of the value produced by the operator.
172
+ 1. For numeric operators, the result type is the intermediate type.
173
+ 2. For boolean and comparison operators, the result type is `bool`.
174
+
175
+ Normal type coercion rules apply to the result, of course. Once the operator has produced a value, it may be coerced into some other type depending on context.
176
+
177
+
178
+ # Macros
179
+
180
+ ## exit
181
+ ## log
182
+ ## sleep
183
+ ## sleep_until
@@ -0,0 +1,62 @@
1
+ from dataclasses import astuple, dataclass
2
+ import struct
3
+ import zlib
4
+ from fprime_gds.common.fpy.bytecode.directives import Directive
5
+ from pathlib import Path
6
+
7
+ HEADER_FORMAT = "!BBBBBHI"
8
+ HEADER_SIZE = struct.calcsize(HEADER_FORMAT)
9
+
10
+
11
+ @dataclass
12
+ class Header:
13
+ majorVersion: int
14
+ minorVersion: int
15
+ patchVersion: int
16
+ schemaVersion: int
17
+ argumentCount: int
18
+ statementCount: int
19
+ bodySize: int
20
+
21
+
22
+ FOOTER_FORMAT = "!I"
23
+ FOOTER_SIZE = struct.calcsize(FOOTER_FORMAT)
24
+
25
+ SCHEMA_VERSION = 2
26
+
27
+
28
+ @dataclass
29
+ class Footer:
30
+ crc: int
31
+
32
+
33
+ def serialize_directives(dirs: list[Directive], output: Path):
34
+ output_bytes = bytes()
35
+
36
+ for dir in dirs:
37
+ output_bytes += dir.serialize()
38
+
39
+ header = Header(0, 0, 0, SCHEMA_VERSION, 0, len(dirs), len(output_bytes))
40
+ output_bytes = struct.pack(HEADER_FORMAT, *astuple(header)) + output_bytes
41
+
42
+ crc = zlib.crc32(output_bytes) % (1 << 32)
43
+ footer = Footer(crc)
44
+ output_bytes += struct.pack(FOOTER_FORMAT, *astuple(footer))
45
+ output.write_bytes(output_bytes)
46
+
47
+
48
+ def deserialize_directives(bytes: bytes) -> list[Directive]:
49
+ header = Header(*struct.unpack_from(HEADER_FORMAT, bytes))
50
+
51
+ dirs = []
52
+ idx = 0
53
+ offset = HEADER_SIZE
54
+ while idx < header.statementCount:
55
+ offset_and_dir = Directive.deserialize(bytes, offset)
56
+ if offset_and_dir is None:
57
+ raise RuntimeError("Unable to deserialize sequence")
58
+ offset, dir = offset_and_dir
59
+ dirs.append(dir)
60
+ idx += 1
61
+
62
+ return dirs