fprime-gds 4.0.0a1__tar.gz → 4.0.0a2__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 (319) hide show
  1. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/PKG-INFO +2 -1
  2. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/pyproject.toml +2 -1
  3. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/adapters/uart.py +34 -25
  4. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/cli.py +163 -3
  5. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/run_deployment.py +2 -1
  6. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/PKG-INFO +2 -1
  7. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/requires.txt +1 -0
  8. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  9. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/actions/codeql/security-pack.yml +0 -0
  10. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/actions/spelling/excludes.txt +0 -0
  11. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/actions/spelling/expect.txt +0 -0
  12. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/actions/spelling/patterns.txt +0 -0
  13. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/pull_request_template.md +0 -0
  14. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  15. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/workflows/codeql-security-scan.yml +0 -0
  16. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/workflows/fprime-gds-tests.yml +0 -0
  17. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/workflows/gds-cli-tests.yml +0 -0
  18. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/workflows/publish.yml +0 -0
  19. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.github/workflows/spelling.yml +0 -0
  20. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/.gitignore +0 -0
  21. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/Doxyfile +0 -0
  22. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/LICENSE.txt +0 -0
  23. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/NOTICE.txt +0 -0
  24. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/README.md +0 -0
  25. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/configs/__init__.py +0 -0
  26. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/docs/README.md +0 -0
  27. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/docs/_static/css/rtd_width.css +0 -0
  28. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/docs/conf.py +0 -0
  29. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/docs/gendoc.bash +0 -0
  30. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/docs/index.rst +0 -0
  31. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/examples/simple_sequence.bin +0 -0
  32. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/examples/simple_sequence.seq +0 -0
  33. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/setup.cfg +0 -0
  34. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/setup.py +0 -0
  35. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fastentrypoints.py +0 -0
  36. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/__init__.py +0 -0
  37. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/__init__.py +0 -0
  38. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/__init__.py +0 -0
  39. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  40. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  41. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  42. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/checksum.py +0 -0
  43. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/framing.py +0 -0
  44. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/ground.py +0 -0
  45. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/communication/updown.py +0 -0
  46. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/controllers/__init__.py +0 -0
  47. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/__init__.py +0 -0
  48. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  49. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  50. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/event_data.py +0 -0
  51. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  52. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/file_data.py +0 -0
  53. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  54. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  55. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/__init__.py +0 -0
  56. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
  57. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/decoder.py +0 -0
  58. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
  59. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  60. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
  61. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/distributor/__init__.py +0 -0
  62. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/distributor/distributor.py +0 -0
  63. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/__init__.py +0 -0
  64. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
  65. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
  66. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/encoder.py +0 -0
  67. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
  68. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  69. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
  70. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
  71. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  72. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/files/__init__.py +0 -0
  73. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/files/downlinker.py +0 -0
  74. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/files/helpers.py +0 -0
  75. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/files/uplinker.py +0 -0
  76. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/fpy/__init__.py +0 -0
  77. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/fpy/serialize_bytecode.py +0 -0
  78. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/fpy/types.py +0 -0
  79. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
  80. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
  81. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/channels.py +0 -0
  82. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
  83. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/events.py +0 -0
  84. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  85. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  86. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/handlers.py +0 -0
  87. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/history/__init__.py +0 -0
  88. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/history/chrono.py +0 -0
  89. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/history/history.py +0 -0
  90. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/history/ram.py +0 -0
  91. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/history/test.py +0 -0
  92. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/__init__.py +0 -0
  93. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  94. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  95. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  96. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  97. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  98. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  99. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  100. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
  101. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  102. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
  103. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  104. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
  105. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  106. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/logger/__init__.py +0 -0
  107. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/logger/data_logger.py +0 -0
  108. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/logger/test_logger.py +0 -0
  109. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/models/__init__.py +0 -0
  110. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/models/common/__init__.py +0 -0
  111. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/models/common/channel_telemetry.py +0 -0
  112. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/models/common/command.py +0 -0
  113. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/models/common/event.py +0 -0
  114. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/parsers/__init__.py +0 -0
  115. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  116. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/__init__.py +0 -0
  117. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/dictionaries.py +0 -0
  118. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/encoding.py +0 -0
  119. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/files.py +0 -0
  120. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/histories.py +0 -0
  121. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/router.py +0 -0
  122. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/pipeline/standard.py +0 -0
  123. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/__init__.py +0 -0
  124. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/ch_template.py +0 -0
  125. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  126. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/data_template.py +0 -0
  127. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/event_template.py +0 -0
  128. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  129. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/templates/prm_template.py +0 -0
  130. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
  131. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/testing_fw/api.py +0 -0
  132. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  133. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
  134. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/tools/README.md +0 -0
  135. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/tools/__init__.py +0 -0
  136. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/tools/params.py +0 -0
  137. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/tools/seqgen.py +0 -0
  138. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/transport.py +0 -0
  139. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/utils/__init__.py +0 -0
  140. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/utils/config_manager.py +0 -0
  141. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
  142. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/utils/event_severity.py +0 -0
  143. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/utils/string_util.py +0 -0
  144. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/common/zmq_transport.py +0 -0
  145. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/__init__.py +0 -0
  146. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/apps.py +0 -0
  147. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/comm.py +0 -0
  148. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/data_product_writer.py +0 -0
  149. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/fprime_cli.py +0 -0
  150. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/tcpserver.py +0 -0
  151. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/executables/utils.py +0 -0
  152. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/__init__.py +0 -0
  153. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/app.py +0 -0
  154. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/channels.py +0 -0
  155. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/commands.py +0 -0
  156. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/components.py +0 -0
  157. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/default_settings.py +0 -0
  158. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/errors.py +0 -0
  159. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/events.py +0 -0
  160. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/json.py +0 -0
  161. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/logs.py +0 -0
  162. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/requirements.txt +0 -0
  163. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/resource.py +0 -0
  164. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/sequence.py +0 -0
  165. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  166. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  167. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  168. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  169. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  170. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  171. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  172. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  173. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  174. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  175. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  176. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  177. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  178. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  179. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  180. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  181. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  182. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  183. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  184. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  185. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  186. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  187. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  188. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  189. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  190. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  191. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  192. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  193. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  194. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  195. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  196. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  197. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  198. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  199. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  200. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  201. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  202. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  203. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  204. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  205. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  206. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  207. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  208. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  209. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  210. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  211. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  212. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/favicon.ico +0 -0
  213. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/img/error.svg +0 -0
  214. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  215. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/img/success.svg +0 -0
  216. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/index.html +0 -0
  217. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/config.js +0 -0
  218. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  219. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/gds.js +0 -0
  220. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/json.js +0 -0
  221. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/loader.js +0 -0
  222. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/performance.js +0 -0
  223. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/settings.js +0 -0
  224. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  225. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/validate.js +0 -0
  226. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
  227. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  228. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  229. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  230. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  231. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
  232. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
  233. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  234. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  235. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  236. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  237. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  238. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  239. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  240. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  241. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  242. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  243. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  244. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  245. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  246. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  247. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  248. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  249. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  250. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  251. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  252. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  253. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  254. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  255. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  256. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  257. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  258. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  259. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  260. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  261. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/stats.py +0 -0
  262. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/flask/updown.py +0 -0
  263. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/plugin/__init__.py +0 -0
  264. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/plugin/definitions.py +0 -0
  265. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/plugin/system.py +0 -0
  266. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds/version.py +0 -0
  267. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/SOURCES.txt +0 -0
  268. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  269. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/entry_points.txt +0 -0
  270. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/src/fprime_gds.egg-info/top_level.txt +0 -0
  271. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  272. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
  273. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
  274. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
  275. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
  276. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/fpy/integrated_tests.py +0 -0
  277. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  278. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  279. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  280. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  281. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
  282. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
  283. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  284. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
  285. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  286. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  287. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  288. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  289. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
  290. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  291. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
  292. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  293. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
  294. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  295. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  296. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
  297. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  298. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/.gitignore +0 -0
  299. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  300. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  301. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  302. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  303. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  304. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  305. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  306. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  307. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  308. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  309. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  310. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  311. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  312. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  313. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  314. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  315. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/test_run_deployment.py +0 -0
  316. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/executables/test_utils.py +0 -0
  317. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/sample/dictionary.xml +0 -0
  318. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/fprime_gds/test_plugins.py +0 -0
  319. {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a2}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 4.0.0a1
3
+ Version: 4.0.0a2
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,6 +240,7 @@ 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
+ Requires-Dist: PyYAML>=6.0.2
243
244
  Dynamic: license-file
244
245
 
245
246
  # F´ GDS
@@ -42,7 +42,8 @@ dependencies = [
42
42
  "Jinja2>=2.11.3",
43
43
  "openpyxl>=3.0.10",
44
44
  "pyserial>=3.5",
45
- "pydantic>=2.6"
45
+ "pydantic>=2.6",
46
+ "PyYAML>=6.0.2"
46
47
  ]
47
48
 
48
49
  [project.urls]
@@ -59,7 +59,7 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
59
59
  4000000,
60
60
  ]
61
61
 
62
- def __init__(self, device, baud):
62
+ def __init__(self, device, baud, skip_check):
63
63
  """
64
64
  Initialize the serial adapter using the default settings. This does not open the serial port, but sets up all
65
65
  the internal variables used when opening the device.
@@ -77,9 +77,14 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
77
77
  Opens the serial port based on previously supplied settings. If the port is already open, then close it first.
78
78
  Then open the port up again.
79
79
  """
80
- self.close()
81
- self.serial = serial.Serial(self.device, self.baud)
82
- return self.serial is not None
80
+ try:
81
+ self.close()
82
+ self.serial = serial.Serial(self.device, self.baud)
83
+ return self.serial is not None
84
+ except serial.serialutil.SerialException as exc:
85
+ LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
86
+ self.close()
87
+ return False
83
88
 
84
89
  def close(self):
85
90
  """
@@ -100,12 +105,11 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
100
105
  :return: True, when data was sent through the UART. False otherwise.
101
106
  """
102
107
  try:
103
- if self.serial is None:
104
- self.open()
105
- written = self.serial.write(frame)
106
- # Not believed to be possible to not send everything without getting a timeout exception
107
- assert written == len(frame)
108
- return True
108
+ if self.serial is not None or self.open():
109
+ written = self.serial.write(frame)
110
+ # Not believed to be possible to not send everything without getting a timeout exception
111
+ assert written == len(frame)
112
+ return True
109
113
  except serial.serialutil.SerialException as exc:
110
114
  LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
111
115
  self.close()
@@ -121,17 +125,16 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
121
125
  """
122
126
  data = b""
123
127
  try:
124
- if self.serial is None:
125
- self.open()
126
- # Read as much data as possible, while ensuring to block if no data is available at this time. Note: as much
127
- # data is read as possible to avoid a long-return time to this call. Minimum data to read is one byte in
128
- # order to block this function while data is incoming.
129
- self.serial.timeout = timeout
130
- data = self.serial.read(1) # Force a block for at least 1 character
131
- while self.serial.in_waiting:
132
- data += self.serial.read(
133
- self.serial.in_waiting
134
- ) # Drain the incoming data queue
128
+ if self.serial is not None or self.open():
129
+ # Read as much data as possible, while ensuring to block if no data is available at this time. Note: as much
130
+ # data is read as possible to avoid a long-return time to this call. Minimum data to read is one byte in
131
+ # order to block this function while data is incoming.
132
+ self.serial.timeout = timeout
133
+ data = self.serial.read(1) # Force a block for at least 1 character
134
+ while self.serial.in_waiting:
135
+ data += self.serial.read(
136
+ self.serial.in_waiting
137
+ ) # Drain the incoming data queue
135
138
  except serial.serialutil.SerialException as exc:
136
139
  LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
137
140
  self.close()
@@ -161,6 +164,12 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
161
164
  "default": 9600,
162
165
  "help": "Baud rate of the serial device.",
163
166
  },
167
+ ("--uart-skip-port-check",): {
168
+ "dest": "skip_check",
169
+ "default": False,
170
+ "action": "store_true",
171
+ "help": "Skip checking that the port exists"
172
+ }
164
173
  }
165
174
 
166
175
  @classmethod
@@ -175,20 +184,20 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
175
184
  return cls
176
185
 
177
186
  @classmethod
178
- def check_arguments(cls, device, baud):
187
+ def check_arguments(cls, device, baud, skip_check):
179
188
  """
180
189
  Code that should check arguments of this adapter. If there is a problem with this code, then a "ValueError"
181
190
  should be raised describing the problem with these arguments.
182
191
 
183
192
  :param args: arguments as dictionary
184
193
  """
185
- ports = map(lambda info: info.device, list_ports.comports(include_links=True))
186
- if device not in ports:
194
+ ports = list(map(lambda info: info.device, list_ports.comports(include_links=True)))
195
+ if not skip_check and device not in ports:
187
196
  msg = f"Serial port '{device}' not valid. Available ports: {ports}"
188
197
  raise ValueError(
189
198
  msg
190
199
  )
191
- # Note: baud rate may not *always* work. These are a superset
200
+ # Note: baud rate may not *always* work. These are a superset.
192
201
  try:
193
202
  baud = int(baud)
194
203
  except ValueError:
@@ -19,6 +19,9 @@ import os
19
19
  import platform
20
20
  import re
21
21
  import sys
22
+
23
+ import yaml
24
+
22
25
  from abc import ABC, abstractmethod
23
26
  from pathlib import Path
24
27
  from typing import Any, Dict, List, Tuple
@@ -185,8 +188,32 @@ class ParserBase(ABC):
185
188
  Returns: namespace with processed results of arguments.
186
189
  """
187
190
 
188
- @staticmethod
191
+ @classmethod
192
+ def parse_known_args(
193
+ cls,
194
+ parser_classes,
195
+ description="No tool description provided",
196
+ arguments=None,
197
+ **kwargs,
198
+ ):
199
+ """Parse and post-process arguments
200
+
201
+ Create a parser for the given application using the description provided. This will then add all specified
202
+ ParserBase subclasses' get_parser output as parent parses for the created parser. Then all of the handle
203
+ arguments methods will be called, and the final namespace will be returned. This will allow unknown arguments
204
+ which are returned as the last tuple result.
205
+
206
+ Args:
207
+ parser_classes: a list of ParserBase subclasses that will be used to
208
+ description: description passed ot the argument parser
209
+ arguments: arguments to process, None to use command line input
210
+ Returns: namespace with all parsed arguments from all provided ParserBase subclasses
211
+ """
212
+ return cls._parse_args(parser_classes, description, arguments, use_parse_known=True, **kwargs)
213
+
214
+ @classmethod
189
215
  def parse_args(
216
+ cls,
190
217
  parser_classes,
191
218
  description="No tool description provided",
192
219
  arguments=None,
@@ -194,20 +221,53 @@ class ParserBase(ABC):
194
221
  ):
195
222
  """Parse and post-process arguments
196
223
 
224
+ Create a parser for the given application using the description provided. This will then add all specified
225
+ ParserBase subclasses' get_parser output as parent parses for the created parser. Then all of the handle
226
+ arguments methods will be called, and the final namespace will be returned. This does not allow unknown
227
+ arguments.
228
+
229
+ Args:
230
+ parser_classes: a list of ParserBase subclasses that will be used to
231
+ description: description passed ot the argument parser
232
+ arguments: arguments to process, None to use command line input
233
+ Returns: namespace with all parsed arguments from all provided ParserBase subclasses
234
+ """
235
+ return cls._parse_args(parser_classes, description, arguments, **kwargs)
236
+
237
+
238
+ @staticmethod
239
+ def _parse_args(
240
+ parser_classes,
241
+ description="No tool description provided",
242
+ arguments=None,
243
+ use_parse_known=False,
244
+ **kwargs,
245
+ ):
246
+ """Parse and post-process arguments helper
247
+
197
248
  Create a parser for the given application using the description provided. This will then add all specified
198
249
  ParserBase subclasses' get_parser output as parent parses for the created parser. Then all of the handle
199
250
  arguments methods will be called, and the final namespace will be returned.
200
251
 
252
+ This takes a function that will take in a parser and return the parsing function to call on arguments.
253
+
201
254
  Args:
255
+ parse_function_processor: takes a parser, returns the parse function to call
202
256
  parser_classes: a list of ParserBase subclasses that will be used to
203
257
  description: description passed ot the argument parser
204
258
  arguments: arguments to process, None to use command line input
259
+ use_parse_known: use parse_known_arguments from argparse
260
+
205
261
  Returns: namespace with all parsed arguments from all provided ParserBase subclasses
206
262
  """
207
263
  composition = CompositeParser(parser_classes, description)
208
264
  parser = composition.get_parser()
209
265
  try:
210
- args_ns = parser.parse_args(arguments)
266
+ if use_parse_known:
267
+ args_ns, *unknowns = parser.parse_known_args(arguments)
268
+ else:
269
+ args_ns = parser.parse_args(arguments)
270
+ unknowns = []
211
271
  args_ns = composition.handle_arguments(args_ns, **kwargs)
212
272
  except ValueError as ver:
213
273
  print(f"[ERROR] Failed to parse arguments: {ver}", file=sys.stderr)
@@ -216,7 +276,7 @@ class ParserBase(ABC):
216
276
  except Exception as exc:
217
277
  print(f"[ERROR] {exc}", file=sys.stderr)
218
278
  sys.exit(-1)
219
- return args_ns, parser
279
+ return args_ns, parser, *unknowns
220
280
 
221
281
  @staticmethod
222
282
  def find_in(token, deploy, is_file=True):
@@ -236,6 +296,106 @@ class ParserBase(ABC):
236
296
  return None
237
297
 
238
298
 
299
+ class ConfigDrivenParser(ParserBase):
300
+ """ Parser that allows options from configuration and command line
301
+
302
+ This parser reads a configuration file (if supplied) and uses the values to drive the inputs to arguments. Command
303
+ line arguments will still take precedence over the configured values.
304
+ """
305
+ DEFAULT_CONFIGURATION_PATH = Path("fprime-gds.yml")
306
+
307
+ @classmethod
308
+ def set_default_configuration(cls, path: Path):
309
+ """ Set path for (global) default configuration file
310
+
311
+ Set the path for default configuration file. If unset, will use 'fprime-gds.yml'. Set to None to disable default
312
+ configuration.
313
+ """
314
+ cls.DEFAULT_CONFIGURATION_PATH = path
315
+
316
+ @classmethod
317
+ def parse_args(
318
+ cls,
319
+ parser_classes,
320
+ description="No tool description provided",
321
+ arguments=None,
322
+ **kwargs,
323
+ ):
324
+ """ Parse and post-process arguments using inputs and config
325
+
326
+ Parse the arguments in two stages: first parse the configuration data, ignoring unknown inputs, then parse the
327
+ full argument set with the supplied configuration to fill in additional options.
328
+
329
+ Args:
330
+ parser_classes: a list of ParserBase subclasses that will be used to
331
+ description: description passed ot the argument parser
332
+ arguments: arguments to process, None to use command line input
333
+ Returns: namespace with all parsed arguments from all provided ParserBase subclasses
334
+ """
335
+ arguments = sys.argv[1:] if arguments is None else arguments
336
+
337
+ # Help should spill all the arguments, so delegate to the normal parsing flow including
338
+ # this and supplied parsers
339
+ if "-h" in arguments or "--help" in arguments:
340
+ parsers = [ConfigDrivenParser] + parser_classes
341
+ ParserBase.parse_args(parsers, description, arguments, **kwargs)
342
+ sys.exit(0)
343
+
344
+ # Custom flow involving parsing the arguments of this parser first, then passing the configured values
345
+ # as part of the argument source
346
+ ns_config, _, remaining = ParserBase.parse_known_args([ConfigDrivenParser], description, arguments, **kwargs)
347
+ config_options = ns_config.config_values.get("command-line-options", {})
348
+ config_args = cls.flatten_options(config_options)
349
+ # Argparse allows repeated (overridden) arguments, thus the CLI override is accomplished by providing
350
+ # remaining arguments after the configured ones
351
+ ns_full, parser = ParserBase.parse_args(parser_classes, description, config_args + remaining, **kwargs)
352
+ ns_final = argparse.Namespace(**vars(ns_config), **vars(ns_full))
353
+ return ns_final, parser
354
+
355
+ @staticmethod
356
+ def flatten_options(configured_options):
357
+ """ Flatten options down to arguments """
358
+ flattened = []
359
+ for option, value in configured_options.items():
360
+ flattened.append(f"--{option}")
361
+ if value is not None:
362
+ flattened.extend(value if isinstance(value, (list, tuple)) else [f"{value}"])
363
+ return flattened
364
+
365
+ def get_arguments(self) -> Dict[Tuple[str, ...], Dict[str, Any]]:
366
+ """Arguments needed for config processing"""
367
+ return {
368
+ ("-c", "--config"): {
369
+ "dest": "config",
370
+ "required": False,
371
+ "default": self.DEFAULT_CONFIGURATION_PATH,
372
+ "type": Path,
373
+ "help": f"Argument configuration file path.",
374
+ }
375
+ }
376
+
377
+ def handle_arguments(self, args, **kwargs):
378
+ """ Handle the arguments
379
+
380
+ Loads the configuration file specified and fills in the `config_values` attribute of the namespace with the
381
+ loaded configuration dictionary.
382
+ """
383
+ args.config_values = {}
384
+ # Specified but non-existent config file is a hard error
385
+ if ("-c" in sys.argv[1:] or "--config" in sys.argv[1:]) and not args.config.exists():
386
+ raise ValueError(f"Specified configuration file '{args.config}' does not exist")
387
+ # Read configuration if the file was set and exists
388
+ if args.config is not None and args.config.exists():
389
+ print(f"[INFO] Reading command-line configuration from: {args.config}")
390
+ with open(args.config, "r") as file_handle:
391
+ try:
392
+ loaded = yaml.safe_load(file_handle)
393
+ args.config_values = loaded if loaded is not None else {}
394
+ except Exception as exc:
395
+ raise ValueError(f"Malformed configuration {args.config}: {exc}", exc)
396
+ return args
397
+
398
+
239
399
  class DetectionParser(ParserBase):
240
400
  """Parser that detects items from a root/directory or deployment"""
241
401
 
@@ -9,6 +9,7 @@ import webbrowser
9
9
 
10
10
  from fprime_gds.executables.cli import (
11
11
  BinaryDeployment,
12
+ ConfigDrivenParser,
12
13
  CommParser,
13
14
  GdsParser,
14
15
  ParserBase,
@@ -37,7 +38,7 @@ def parse_args():
37
38
  PluginArgumentParser,
38
39
  ]
39
40
  # Parse the arguments, and refine through all handlers
40
- args, parser = ParserBase.parse_args(arg_handlers, "Run F prime deployment and GDS")
41
+ args, parser = ConfigDrivenParser.parse_args(arg_handlers, "Run F prime deployment and GDS")
41
42
  return args
42
43
 
43
44
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fprime-gds
3
- Version: 4.0.0a1
3
+ Version: 4.0.0a2
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,6 +240,7 @@ 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
+ Requires-Dist: PyYAML>=6.0.2
243
244
  Dynamic: license-file
244
245
 
245
246
  # F´ GDS
@@ -10,3 +10,4 @@ Jinja2>=2.11.3
10
10
  openpyxl>=3.0.10
11
11
  pyserial>=3.5
12
12
  pydantic>=2.6
13
+ PyYAML>=6.0.2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes