fprime-gds 4.0.2a1__tar.gz → 4.0.2a3__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 (334) hide show
  1. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/PKG-INFO +1 -1
  2. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/ch_decoder.py +1 -1
  3. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/event_decoder.py +1 -1
  4. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/pkt_decoder.py +1 -1
  5. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/distributor/distributor.py +1 -1
  6. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/cmd_encoder.py +1 -1
  7. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/encoder.py +1 -1
  8. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/seq_writer.py +1 -1
  9. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/base_commands.py +1 -1
  10. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/channels.py +1 -1
  11. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/command_send.py +1 -1
  12. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/events.py +1 -1
  13. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/handlers.py +56 -0
  14. {fprime_gds-4.0.2a1/src/fprime_gds/common/pipeline → fprime_gds-4.0.2a3/src/fprime_gds/common/models}/dictionaries.py +24 -0
  15. fprime_gds-4.0.2a3/src/fprime_gds/common/pipeline/publishing.py +111 -0
  16. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/standard.py +12 -21
  17. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/api.py +8 -1
  18. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/config_manager.py +1 -1
  19. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/apps.py +59 -14
  20. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/cli.py +28 -5
  21. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/fprime_cli.py +1 -1
  22. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/run_deployment.py +19 -6
  23. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/PKG-INFO +1 -1
  24. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/SOURCES.txt +2 -3
  25. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/distributor/test_distributor.py +1 -1
  26. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_ch_encoder.py +2 -0
  27. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_event_encoder.py +2 -0
  28. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_pkt_encoder.py +2 -0
  29. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/api_unit_test.py +10 -2
  30. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_run_deployment.py +3 -1
  31. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/test_plugins.py +58 -21
  32. fprime_gds-4.0.2a1/src/fprime_gds/common/models/common/channel_telemetry.py +0 -174
  33. fprime_gds-4.0.2a1/src/fprime_gds/common/models/common/event.py +0 -121
  34. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  35. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/codeql/security-pack.yml +0 -0
  36. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/excludes.txt +0 -0
  37. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/expect.txt +0 -0
  38. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/patterns.txt +0 -0
  39. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/pull_request_template.md +0 -0
  40. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/resources/RefTopologyAppDictionary.xml +0 -0
  41. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/codeql-security-scan.yml +0 -0
  42. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/fprime-gds-tests.yml +0 -0
  43. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/gds-cli-tests.yml +0 -0
  44. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/publish.yml +0 -0
  45. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/spelling.yml +0 -0
  46. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.gitignore +0 -0
  47. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/Doxyfile +0 -0
  48. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/LICENSE.txt +0 -0
  49. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/NOTICE.txt +0 -0
  50. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/README.md +0 -0
  51. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/configs/__init__.py +0 -0
  52. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/README.md +0 -0
  53. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/_static/css/rtd_width.css +0 -0
  54. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/conf.py +0 -0
  55. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/gendoc.bash +0 -0
  56. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/index.rst +0 -0
  57. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/examples/simple_sequence.bin +0 -0
  58. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/examples/simple_sequence.seq +0 -0
  59. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/pyproject.toml +0 -0
  60. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/setup.cfg +0 -0
  61. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/setup.py +0 -0
  62. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fastentrypoints.py +0 -0
  63. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/__init__.py +0 -0
  64. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/__init__.py +0 -0
  65. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/__init__.py +0 -0
  66. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
  67. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/base.py +0 -0
  68. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
  69. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
  70. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
  71. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
  72. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
  73. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
  74. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
  75. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/checksum.py +0 -0
  76. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/framing.py +0 -0
  77. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ground.py +0 -0
  78. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/updown.py +0 -0
  79. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/controllers/__init__.py +0 -0
  80. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/__init__.py +0 -0
  81. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/ch_data.py +0 -0
  82. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
  83. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/event_data.py +0 -0
  84. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/exceptions.py +0 -0
  85. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/file_data.py +0 -0
  86. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
  87. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/sys_data.py +0 -0
  88. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/__init__.py +0 -0
  89. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/decoder.py +0 -0
  90. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
  91. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/distributor/__init__.py +0 -0
  92. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/__init__.py +0 -0
  93. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
  94. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
  95. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
  96. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
  97. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
  98. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/__init__.py +0 -0
  99. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/downlinker.py +0 -0
  100. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/helpers.py +0 -0
  101. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/uplinker.py +0 -0
  102. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/README.md +0 -0
  103. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/SPEC.md +0 -0
  104. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/__init__.py +0 -0
  105. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
  106. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/bytecode/directives.py +0 -0
  107. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/codegen.py +0 -0
  108. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/grammar.lark +0 -0
  109. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/main.py +0 -0
  110. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/parser.py +0 -0
  111. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
  112. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
  113. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
  114. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/__init__.py +0 -0
  115. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/chrono.py +0 -0
  116. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/history.py +0 -0
  117. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/ram.py +0 -0
  118. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/test.py +0 -0
  119. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/__init__.py +0 -0
  120. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
  121. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
  122. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
  123. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
  124. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
  125. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
  126. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
  127. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
  128. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/json_loader.py +0 -0
  129. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
  130. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
  131. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
  132. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
  133. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/__init__.py +0 -0
  134. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/data_logger.py +0 -0
  135. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/test_logger.py +0 -0
  136. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/__init__.py +0 -0
  137. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/common/__init__.py +0 -0
  138. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/common/command.py +0 -0
  139. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/parsers/__init__.py +0 -0
  140. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
  141. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/__init__.py +0 -0
  142. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/encoding.py +0 -0
  143. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/files.py +0 -0
  144. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/histories.py +0 -0
  145. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/router.py +0 -0
  146. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/__init__.py +0 -0
  147. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/ch_template.py +0 -0
  148. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/cmd_template.py +0 -0
  149. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/data_template.py +0 -0
  150. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/event_template.py +0 -0
  151. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/pkt_template.py +0 -0
  152. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/prm_template.py +0 -0
  153. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
  154. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
  155. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
  156. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/README.md +0 -0
  157. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/__init__.py +0 -0
  158. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/params.py +0 -0
  159. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/seqgen.py +0 -0
  160. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/transport.py +0 -0
  161. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/__init__.py +0 -0
  162. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
  163. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/event_severity.py +0 -0
  164. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/string_util.py +0 -0
  165. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/zmq_transport.py +0 -0
  166. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/__init__.py +0 -0
  167. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/comm.py +0 -0
  168. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/data_product_writer.py +0 -0
  169. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/dictionary_merge.py +0 -0
  170. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/tcpserver.py +0 -0
  171. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/utils.py +0 -0
  172. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/__init__.py +0 -0
  173. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/app.py +0 -0
  174. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/channels.py +0 -0
  175. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/commands.py +0 -0
  176. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/components.py +0 -0
  177. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/default_settings.py +0 -0
  178. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/errors.py +0 -0
  179. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/events.py +0 -0
  180. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/json.py +0 -0
  181. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/logs.py +0 -0
  182. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/requirements.txt +0 -0
  183. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/resource.py +0 -0
  184. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/sequence.py +0 -0
  185. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
  186. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
  187. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
  188. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
  189. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
  190. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
  191. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
  192. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
  193. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
  194. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
  195. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
  196. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
  197. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
  198. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
  199. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
  200. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
  201. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
  202. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
  203. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
  204. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
  205. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
  206. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
  207. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
  208. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
  209. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
  210. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
  211. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
  212. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
  213. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
  214. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
  215. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
  216. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
  217. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
  218. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
  219. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
  220. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
  221. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
  222. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
  223. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
  224. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
  225. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
  226. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
  227. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
  228. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
  229. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
  230. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/css/fprime.css +0 -0
  231. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
  232. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/favicon.ico +0 -0
  233. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/error.svg +0 -0
  234. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/logo.svg +0 -0
  235. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/success.svg +0 -0
  236. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/index.html +0 -0
  237. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/config.js +0 -0
  238. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/datastore.js +0 -0
  239. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/gds.js +0 -0
  240. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/json.js +0 -0
  241. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/loader.js +0 -0
  242. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/performance.js +0 -0
  243. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/settings.js +0 -0
  244. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/uploader.js +0 -0
  245. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/validate.js +0 -0
  246. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
  247. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
  248. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
  249. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
  250. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
  251. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
  252. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
  253. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
  254. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
  255. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
  256. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
  257. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
  258. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
  259. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
  260. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
  261. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
  262. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
  263. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
  264. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
  265. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
  266. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
  267. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
  268. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
  269. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
  270. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
  271. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
  272. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
  273. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
  274. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
  275. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
  276. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
  277. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
  278. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
  279. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
  280. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
  281. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/stats.py +0 -0
  282. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/updown.py +0 -0
  283. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/__init__.py +0 -0
  284. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/definitions.py +0 -0
  285. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/system.py +0 -0
  286. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/version.py +0 -0
  287. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
  288. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/entry_points.txt +0 -0
  289. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/requires.txt +0 -0
  290. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/top_level.txt +0 -0
  291. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
  292. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
  293. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
  294. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -0
  295. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
  296. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
  297. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
  298. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
  299. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
  300. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
  301. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
  302. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
  303. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
  304. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
  305. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
  306. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
  307. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
  308. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
  309. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
  310. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
  311. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
  312. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
  313. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
  314. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/utils/test_string_util.py +0 -0
  315. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/.gitignore +0 -0
  316. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
  317. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
  318. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
  319. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
  320. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
  321. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
  322. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
  323. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
  324. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
  325. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
  326. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
  327. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
  328. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
  329. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
  330. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
  331. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
  332. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_utils.py +0 -0
  333. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/sample/dictionary.xml +0 -0
  334. {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/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.2a1
3
+ Version: 4.0.2a3
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:
@@ -41,7 +41,7 @@ class ChDecoder(Decoder):
41
41
 
42
42
  if config is None:
43
43
  # Retrieve singleton for the configs
44
- config = config_manager.ConfigManager().get_instance()
44
+ config = config_manager.ConfigManager.get_instance()
45
45
 
46
46
  self.__dict = ch_dict
47
47
  self.id_obj = config.get_type("FwChanIdType")
@@ -43,7 +43,7 @@ class EventDecoder(decoder.Decoder):
43
43
 
44
44
  if config is None:
45
45
  # Retrieve defaults for the configs
46
- config = config_manager.ConfigManager().get_instance()
46
+ config = config_manager.ConfigManager.get_instance()
47
47
 
48
48
  self.__dict = event_dict
49
49
  self.id_obj = config.get_type("FwEventIdType")
@@ -41,7 +41,7 @@ class PktDecoder(ChDecoder):
41
41
  An initialized PktDecoder object
42
42
  """
43
43
  if config is None:
44
- config = config_manager.ConfigManager().get_instance()
44
+ config = config_manager.ConfigManager.get_instance()
45
45
  super().__init__(ch_dict, config)
46
46
 
47
47
  self.__dict = pkt_name_dict
@@ -45,7 +45,7 @@ class Distributor(DataHandler):
45
45
  """
46
46
  if config is None:
47
47
  # Retrieve singleton for the configs, or defaults if singleton unused
48
- config = config_manager.ConfigManager().get_instance()
48
+ config = config_manager.ConfigManager.get_instance()
49
49
 
50
50
  self.__decoders = {key.name: [] for key in list(data_desc_type.DataDescType)}
51
51
 
@@ -68,7 +68,7 @@ class CmdEncoder(encoder.Encoder):
68
68
  """
69
69
 
70
70
  if config is None:
71
- config = config_manager.ConfigManager().get_instance()
71
+ config = config_manager.ConfigManager.get_instance()
72
72
  super().__init__(config)
73
73
 
74
74
  self.len_obj = self.config.get_type("msg_len")
@@ -49,7 +49,7 @@ class Encoder(
49
49
  super().__init__()
50
50
  if config is None:
51
51
  # Retrieve defaults for the configs
52
- config = ConfigManager()
52
+ config = ConfigManager.get_instance()
53
53
  self.config = config
54
54
 
55
55
  def data_callback(self, data, sender=None):
@@ -24,7 +24,7 @@ class SeqBinaryWriter:
24
24
  Constructor
25
25
  """
26
26
  if config is None:
27
- config = config_manager.ConfigManager().get_instance()
27
+ config = config_manager.ConfigManager.get_instance()
28
28
 
29
29
  self.__fd = None
30
30
  self.__timebase = timebase
@@ -10,7 +10,7 @@ from typing import Iterable
10
10
 
11
11
  import fprime_gds.common.gds_cli.filtering_utils as filtering_utils
12
12
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
13
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
13
+ from fprime_gds.common.models.dictionaries import Dictionaries
14
14
  from fprime_gds.common.testing_fw import predicates
15
15
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
16
16
  from fprime_gds.executables.cli import StandardPipelineParser
@@ -7,7 +7,7 @@ from typing import Iterable
7
7
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
8
8
  from fprime_gds.common.data_types.ch_data import ChData
9
9
  from fprime_gds.common.gds_cli.base_commands import QueryHistoryCommand
10
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
10
+ from fprime_gds.common.models.dictionaries import Dictionaries
11
11
  from fprime_gds.common.testing_fw import predicates
12
12
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
13
13
 
@@ -9,7 +9,7 @@ from fprime.common.models.serialize.type_exceptions import NotInitializedExcepti
9
9
 
10
10
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
11
11
  from fprime_gds.common.gds_cli.base_commands import BaseCommand
12
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
12
+ from fprime_gds.common.models.dictionaries import Dictionaries
13
13
  from fprime_gds.common.templates.cmd_template import CmdTemplate
14
14
  from fprime_gds.common.testing_fw import predicates
15
15
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
@@ -7,7 +7,7 @@ from typing import Iterable
7
7
  import fprime_gds.common.gds_cli.test_api_utils as test_api_utils
8
8
  from fprime_gds.common.data_types.event_data import EventData
9
9
  from fprime_gds.common.gds_cli.base_commands import QueryHistoryCommand
10
- from fprime_gds.common.pipeline.dictionaries import Dictionaries
10
+ from fprime_gds.common.models.dictionaries import Dictionaries
11
11
  from fprime_gds.common.testing_fw import predicates
12
12
  from fprime_gds.common.testing_fw.api import IntegrationTestAPI
13
13
 
@@ -37,6 +37,13 @@ class DataHandlerPlugin(DataHandler, abc.ABC):
37
37
  data types it handles (whereas DataHandler leaves that up to the registration call). Users shall concretely subclass
38
38
  this class with their own data handling functionality.
39
39
  """
40
+ def __init__(self, **kwargs):
41
+ """ Initialize """
42
+ self.publisher = None
43
+
44
+ def set_publisher(self, publisher):
45
+ """ Set publishing pipeline """
46
+ self.publisher = publisher
40
47
 
41
48
  @abc.abstractmethod
42
49
  def get_handled_descriptors() -> List[str]:
@@ -113,3 +120,52 @@ class HandlerRegistrar(abc.ABC):
113
120
  """
114
121
  for registrant in self._registrants:
115
122
  registrant.data_callback(data, sender)
123
+
124
+
125
+ class MappedRegistrar(abc.ABC):
126
+ """ Class to register a mapping """
127
+
128
+ def __init__(self):
129
+ """ Initialize an empty registrant list """
130
+ super().__init__()
131
+ self._registrants = {}
132
+
133
+ def register(self, id, registrant):
134
+ """
135
+ Register a registrant with this registrar associated with the ID. Will be stored and called back when asked to
136
+ send data to all the handlers registered at the id
137
+
138
+ :param id: id to register to
139
+ :param registrant: handler to register
140
+ """
141
+ self._registrants[id] = self._registrants.get(id, HandlerRegistrar())
142
+ self._registrants[id].register(registrant)
143
+
144
+ def deregister(self, id, registrant):
145
+ """
146
+ Remove a registrant from the registrar such that it will not be called back later. Note: ignores invalid
147
+ removals by trapping the error, as the desired effect is already satisfied.
148
+
149
+ :param id: id to register to
150
+ :param registrant: registrant to remove
151
+ :return: True if found, False if not. May safely be ignored.
152
+ """
153
+ try:
154
+ self._registrants[id].deregister(registrant)
155
+ return True
156
+ except (ValueError, KeyError):
157
+ return False
158
+
159
+ def send_to_all(self, id, data, sender=None):
160
+ """
161
+ Sends the given data to all registrants at id.
162
+
163
+ :param id: id to send to
164
+ :param data: data to send back to registrants
165
+ :param sender: (optional) sender to pass to data_callback
166
+ """
167
+ try:
168
+ self._registrants[id].send_to_all(data, sender)
169
+ except KeyError:
170
+ print("KeyERROR")
171
+ pass
@@ -49,6 +49,9 @@ class Dictionaries:
49
49
  self._fw_type_name_dict = None
50
50
  self._versions = None
51
51
  self._metadata = None
52
+ self._dictionary_path = None
53
+ self._packet_spec_path = None
54
+ self._packet_set_name = None
52
55
 
53
56
  def load_dictionaries(self, dictionary, packet_spec, packet_set_name):
54
57
  """
@@ -57,7 +60,13 @@ class Dictionaries:
57
60
 
58
61
  :param dictionary: dictionary path used for loading dictionaries
59
62
  :param packet_spec: specification for packets, or None, for packetized telemetry
63
+ :param packet_set_name: name of packet set in case multiple are available
60
64
  """
65
+ # Update the "from" values
66
+ self._dictionary_path = dictionary
67
+ self._packet_spec_path = packet_spec
68
+ self._packet_set_name = packet_set_name
69
+
61
70
  if Path(dictionary).is_file() and ".json" in Path(dictionary).suffixes:
62
71
  # Events
63
72
  json_event_loader = (
@@ -203,6 +212,21 @@ class Dictionaries:
203
212
  for legacy reasons. New code should use the metadata property."""
204
213
  return self._metadata
205
214
 
215
+ @property
216
+ def dictionary_path(self):
217
+ """ Dictionary Path """
218
+ return self._dictionary_path
219
+
220
+ @property
221
+ def packet_spec_path(self):
222
+ """ Dictionary Path """
223
+ return self._packet_spec_path
224
+
225
+ @property
226
+ def packet_set_name(self):
227
+ """ Dictionary Path """
228
+ return self._packet_set_name
229
+
206
230
  @property
207
231
  def packet(self):
208
232
  """Packet dictionary"""
@@ -0,0 +1,111 @@
1
+ """
2
+ publishing.py:
3
+
4
+ This file contains a basic publishing pipeline. It reads and writes data bound for the GDS.
5
+
6
+ :author: lestarch
7
+ """
8
+
9
+
10
+ from typing import Type
11
+
12
+ from fprime_gds.common.data_types.ch_data import ChData
13
+ from fprime_gds.common.data_types.event_data import EventData
14
+ from fprime_gds.common.encoders.ch_encoder import ChEncoder
15
+ from fprime_gds.common.encoders.event_encoder import EventEncoder
16
+ from fprime_gds.common.transport import RoutingTag, ThreadedTCPSocketClient
17
+ from fprime_gds.common.utils.config_manager import ConfigManager
18
+
19
+ from fprime_gds.common.handlers import DataHandler, MappedRegistrar
20
+ from ..models import dictionaries
21
+
22
+
23
+ class PublishingPipeline(DataHandler, MappedRegistrar):
24
+ """ Pipeline for publishing
25
+
26
+ This pipeline sets up the following process:
27
+
28
+ Data -> Encoder -> Client -> <wire>
29
+ """
30
+ DEFAULT_ENCODERS = {
31
+ "FW_PACKET_LOG": EventEncoder,
32
+ "FW_PACKET_TELEM": ChEncoder
33
+ }
34
+
35
+ def __init__(self):
36
+ """
37
+ Set core variables to None or their composition handlers.
38
+ """
39
+ super().__init__()
40
+ self.client_socket = None
41
+
42
+ self._dictionaries = dictionaries.Dictionaries()
43
+ self._transport_type = ThreadedTCPSocketClient
44
+
45
+ def setup(self, dictionaries):
46
+ """ Set up the publishing pipeline """
47
+ self._dictionaries = dictionaries
48
+ self.client_socket = self.__transport_type()
49
+ config = ConfigManager.get_instance()
50
+
51
+ for id, encoder_class in self.DEFAULT_ENCODERS.items():
52
+ encoder_instance = encoder_class(config=config)
53
+ encoder_instance.register(self.client_socket)
54
+ self.register(id, encoder_instance)
55
+
56
+ def data_callback(self, data, sender=None):
57
+ """ Publish data """
58
+ if isinstance(data, ChData):
59
+ self.send_to_all("FW_PACKET_TELEM", data)
60
+ elif isinstance(data, EventData):
61
+ self.send_to_all("FW_PACKET_LOG", data)
62
+ return super().data_callback(data, sender)
63
+
64
+ def publish_channel(self, name, value, time):
65
+ """ Publish channel value using name, time, and value
66
+
67
+ Looks up the channel template in the dictionary and constructs a new channel object given the time and value.
68
+ This ChData object is then sent into the outgoing "publish" pipeline.
69
+
70
+ """
71
+ template = self._dictionaries.channel_name[name]
72
+ copied_value_object = template.get_type_obj()(value)
73
+ copied_value_object.val = value
74
+ object = ChData(copied_value_object, time, template)
75
+ return self.data_callback(object, self)
76
+
77
+ @property
78
+ def transport_implementation(self):
79
+ """Get implementation type for transport"""
80
+ return self.__transport_type
81
+
82
+ @transport_implementation.setter
83
+ def transport_implementation(self, transport_type: Type[None]):
84
+ """Set the implementation type for transport"""
85
+ assert (
86
+ self.client_socket is None
87
+ ), "Cannot setup transport implementation type after setup"
88
+ self.__transport_type = transport_type
89
+
90
+
91
+ def connect(
92
+ self, connection_uri, incoming_tag=RoutingTag.GUI, outgoing_tag=RoutingTag.GUI
93
+ ):
94
+ """Connects to the middleware layer
95
+
96
+ Connect to the middleware layer. This connection needs to identify if the object is a a FSW or GUI client. The
97
+ default connection acts as a GUI client sending back to the GUI.
98
+
99
+ Args:
100
+ connection_uri: URI of the connection to make
101
+ incoming_tag: this pipeline will act as supplied tag (GUI, FSW). Default: GUI
102
+ outgoing_tag: this pipeline will produce data for supplied tag (FSW, GUI). Default: FSW
103
+ """
104
+ self.client_socket.connect(connection_uri, incoming_tag, outgoing_tag)
105
+
106
+ def disconnect(self):
107
+ """ Disconnect from the client socket """
108
+ if self.client_socket is not None:
109
+ self.client_socket.disconnect()
110
+
111
+
@@ -23,7 +23,7 @@ from fprime_gds.common.transport import RoutingTag, ThreadedTCPSocketClient
23
23
  from fprime_gds.common.utils.config_manager import ConfigManager
24
24
 
25
25
  # Local imports for the sake of composition
26
- from . import dictionaries, encoding, files, histories
26
+ from . import encoding, files, histories
27
27
 
28
28
 
29
29
  class StandardPipeline:
@@ -49,7 +49,7 @@ class StandardPipeline:
49
49
  self.up_store = None
50
50
  self.down_store = None
51
51
 
52
- self.__dictionaries = dictionaries.Dictionaries()
52
+ self.__dictionaries = None
53
53
  self.__coders = encoding.EncodingDecoding()
54
54
  self.__histories = histories.Histories()
55
55
  self.__filing = files.Filing()
@@ -58,11 +58,9 @@ class StandardPipeline:
58
58
  def setup(
59
59
  self,
60
60
  config: ConfigManager,
61
- dictionary,
61
+ dictionaries,
62
62
  file_store,
63
63
  logging_prefix=None,
64
- packet_spec=None,
65
- packet_set_name=None,
66
64
  data_logging_enabled=True
67
65
  ):
68
66
  """
@@ -70,14 +68,13 @@ class StandardPipeline:
70
68
  patterns. This allows just registering the consumers, and invoking 'setup' all other of the GDS support layer.
71
69
 
72
70
  :param config: config object used when constructing the pipeline.
73
- :param dictionary: dictionary path. Used to setup loading of dictionaries.
71
+ :param dictionaries: dictionary path. Used to setup loading of dictionaries.
74
72
  :param file_store: uplink/downlink storage directory
75
73
  :param logging_prefix: logging prefix. Defaults to not logging at all.
76
74
  :param packet_spec: location of packetized telemetry XML specification.
77
75
  """
78
- assert (
79
- dictionary is not None and Path(dictionary).is_file()
80
- ), f"Dictionary {dictionary} does not exist"
76
+ self.distributor = fprime_gds.common.distributor.distributor.Distributor(config)
77
+ self.client_socket = self.__transport_type()
81
78
  # File storage configuration for uplink and downlink
82
79
  self.up_store = Path(file_store) / "fprime-uplink"
83
80
  self.down_store = Path(file_store) / "fprime-downlink"
@@ -88,18 +85,7 @@ class StandardPipeline:
88
85
  raise PermissionError(
89
86
  f"{file_store} is not writable. Fix permissions or change storage directory with --file-storage-directory."
90
87
  )
91
- self.dictionary_path = Path(dictionary)
92
- # Loads the distributor and client socket
93
- self.distributor = fprime_gds.common.distributor.distributor.Distributor(config)
94
- self.client_socket = self.__transport_type()
95
- # Setup dictionaries encoders and decoders
96
- self.dictionaries.load_dictionaries(
97
- self.dictionary_path, packet_spec, packet_set_name
98
- )
99
- # Update config to use Fw types defined in the JSON dictionary
100
- if self.dictionaries.fw_type_name:
101
- for fw_type_name, fw_type in self.dictionaries.fw_type_name.items():
102
- config.set("types", fw_type_name, fw_type)
88
+ self.__dictionaries = dictionaries
103
89
  self.coders.setup_coders(
104
90
  self.dictionaries, self.distributor, self.client_socket, config
105
91
  )
@@ -253,3 +239,8 @@ class StandardPipeline:
253
239
  :return: filing compositions
254
240
  """
255
241
  return self.__filing
242
+
243
+ @property
244
+ def dictionaries(self):
245
+ """ Dictionaries member """
246
+ return self.__dictionaries
@@ -71,7 +71,7 @@ class IntegrationTestAPI(DataHandler):
71
71
 
72
72
  # Copy dictionaries and binary file to output directory
73
73
  if logpath is not None:
74
- base_dir = Path(self.pipeline.dictionary_path).parents[1]
74
+ base_dir = Path(self.dictionaries.dictionary_path).parents[1]
75
75
  for subdir in ["bin", "dict"]:
76
76
  dir_path = base_dir / subdir
77
77
  if dir_path.is_dir():
@@ -85,6 +85,13 @@ class IntegrationTestAPI(DataHandler):
85
85
  # Used by the data_callback method to detect if events have been received out of order.
86
86
  self.last_evr = None
87
87
 
88
+ @property
89
+ def dictionaries(self):
90
+ """ Return the dictionaries """
91
+ # Pipeline should not be exposed to the user, but it stores the dictionary
92
+ # thus delegate to it.
93
+ return self.pipeline.dictionaries
94
+
88
95
  def setup(self):
89
96
  """Set up the API, assumes pipeline is now setup"""
90
97
  self.pipeline.coders.register_event_consumer(self)
@@ -40,7 +40,7 @@ class ConfigBadTypeException(Exception):
40
40
  config_name (string): Name of the config containing the bad type
41
41
  type_str (string): Bad type string that caused the error
42
42
  """
43
- print(f"Invalid type string {type_str} read in configuration {config_name}")
43
+ super().__init__(f"Invalid type string {type_str} read in configuration {config_name}")
44
44
 
45
45
 
46
46
  class ConfigManager(configparser.ConfigParser):
@@ -14,8 +14,8 @@ command line that will be spun into its own process.
14
14
  import subprocess
15
15
  import sys
16
16
  from abc import ABC, abstractmethod
17
- from argparse import Namespace
18
- from typing import final, List, Dict, Tuple, Type
17
+ import argparse
18
+ from typing import final, List, Dict, Tuple, Type, Optional
19
19
 
20
20
  from fprime_gds.plugin.definitions import gds_plugin_specification, gds_plugin
21
21
  from fprime_gds.plugin.system import Plugins
@@ -23,10 +23,13 @@ from fprime_gds.executables.cli import (
23
23
  CompositeParser,
24
24
  ParserBase,
25
25
  BareArgumentParser,
26
+ MiddleWareParser,
27
+ DictionaryParser,
26
28
  StandardPipelineParser,
27
29
  PluginArgumentParser,
28
30
  )
29
31
  from fprime_gds.common.pipeline.standard import StandardPipeline
32
+ from fprime_gds.common.pipeline.publishing import PublishingPipeline
30
33
 
31
34
 
32
35
  class GdsBaseFunction(ABC):
@@ -40,7 +43,7 @@ class GdsBaseFunction(ABC):
40
43
  """
41
44
 
42
45
  @abstractmethod
43
- def run(self):
46
+ def run(self, parsed_args):
44
47
  """Run the start-up function
45
48
 
46
49
  Run the start-up function unconstrained by the limitations of running in a dedicated subprocess.
@@ -110,13 +113,13 @@ class GdsApp(GdsBaseFunction):
110
113
  self.process = None
111
114
  self.arguments = arguments
112
115
 
113
- def run(self):
116
+ def run(self, parsed_args):
114
117
  """Run the application as an isolated process
115
118
 
116
119
  GdsFunction objects require an implementation of the `run` command. This implementation will take the arguments
117
120
  provided from `get_process_invocation` function and supplies them as an invocation of the isolated subprocess.
118
121
  """
119
- invocation_arguments = self.get_process_invocation()
122
+ invocation_arguments = self.get_process_invocation(parsed_args)
120
123
  self.process = subprocess.Popen(invocation_arguments)
121
124
 
122
125
  def wait(self, timeout=None):
@@ -137,7 +140,9 @@ class GdsApp(GdsBaseFunction):
137
140
  return self.process.returncode
138
141
 
139
142
  @abstractmethod
140
- def get_process_invocation(self) -> List[str]:
143
+ def get_process_invocation(
144
+ self, namespace: Optional[argparse.Namespace] = None
145
+ ) -> List[str]:
141
146
  """Run the start-up function
142
147
 
143
148
  Run the start-up function unconstrained by the limitations of running in a dedicated subprocess.
@@ -199,6 +204,18 @@ class GdsStandardApp(GdsApp):
199
204
  dictionary of flag tuple to argparse kwargs
200
205
  """
201
206
  return {}
207
+
208
+ @classmethod
209
+ def get_additional_cli_parsers(cls) -> List[ParserBase]:
210
+ """ Supply a list of CLI parser objects
211
+
212
+ Supply a list of CLI parser objects to the CLI system. This allows use of full ParserBase objects instead of
213
+ the more restrictive dictionary approach seen in get_additional_arguments.
214
+
215
+ Returns:
216
+ list of parser objects as passed to ParserBase
217
+ """
218
+ return []
202
219
 
203
220
  @classmethod
204
221
  def init(cls):
@@ -230,7 +247,7 @@ class GdsStandardApp(GdsApp):
230
247
  """Start function to contain behavior based in standard pipeline"""
231
248
  raise NotImplementedError()
232
249
 
233
- def get_process_invocation(self):
250
+ def get_process_invocation(self, namespace=None):
234
251
  """Return the process invocation for this class' main
235
252
 
236
253
  The process invocation of this application is to run cls.main and supply it a reproduced version of the
@@ -247,7 +264,8 @@ class GdsStandardApp(GdsApp):
247
264
  composite_parser = CompositeParser(
248
265
  [self.get_cli_parser(), StandardPipelineParser]
249
266
  )
250
- namespace, _, _ = ParserBase.parse_known_args([composite_parser])
267
+ if namespace is None:
268
+ namespace, _, _ = ParserBase.parse_known_args([composite_parser], client=True)
251
269
  args = composite_parser.reproduce_cli_args(namespace)
252
270
  return [sys.executable, "-c", f"import {module}\n{module}.{cls}.main()"] + args
253
271
 
@@ -261,32 +279,39 @@ class GdsStandardApp(GdsApp):
261
279
  []
262
280
  ) # Disable plugin system unless specified through init
263
281
  # In the case where `init` sets up the plugin system, we want to pass the assertion
264
- # triggered by the code above that turns it off in the not-setup case.
282
+ # triggered by the code above that turns it off in the not-setup case.
265
283
  except AssertionError:
266
284
  pass
267
285
  plugin_name = getattr(cls, "get_name", lambda: cls.__name__)()
286
+ plugin_composite = CompositeParser([cls.get_cli_parser()] + cls.get_additional_cli_parsers())
287
+
268
288
  parsed_arguments, _ = ParserBase.parse_args(
269
- [cls.get_cli_parser(), StandardPipelineParser, PluginArgumentParser],
289
+ [ StandardPipelineParser, PluginArgumentParser, plugin_composite],
270
290
  f"{plugin_name}: a standard app plugin",
291
+ client=True,
271
292
  )
272
293
  pipeline = StandardPipeline()
273
- # Turn off history and filing
294
+ # Turn off history, file handling, and logging
274
295
  pipeline.histories.implementation = None
275
296
  pipeline.filing = None
297
+ parsed_arguments.disable_data_logging = True
276
298
  pipeline = StandardPipelineParser.pipeline_factory(
277
299
  parsed_arguments, pipeline
278
300
  )
279
301
  application = cls(
280
- **cls.get_cli_parser().extract_arguments(parsed_arguments)
302
+ **cls.get_cli_parser().extract_arguments(parsed_arguments),
303
+ namespace=parsed_arguments,
304
+
281
305
  )
282
306
  application.start(pipeline)
283
307
  sys.exit(0)
284
308
  except Exception as e:
285
309
  print(f"[ERROR] Error launching {cls.__name__}: {e}", file=sys.stderr)
286
- raise
287
310
  sys.exit(148)
288
311
 
289
312
 
313
+
314
+
290
315
  @gds_plugin(GdsApp)
291
316
  class CustomDataHandlers(GdsStandardApp):
292
317
  """Run an app that registers all custom data handlers
@@ -294,10 +319,25 @@ class CustomDataHandlers(GdsStandardApp):
294
319
  A GdsApp plugin, built using the GdsStandardApp helper, that uses the provided standard pipeline to register each
295
320
  custom DataHandler plugin as a consumer of the appropriate type.
296
321
  """
322
+ PLUGIN_PARSER = CompositeParser([MiddleWareParser, DictionaryParser])
297
323
 
298
- def __init__(self, **kwargs):
324
+ def __init__(self, namespace, **kwargs):
299
325
  """Required __init__ implementation"""
300
326
  super().__init__(**kwargs)
327
+ self.connection_transport = namespace.connection_transport
328
+ self.connection_uri = namespace.connection_uri
329
+ self.dictionaries = namespace.dictionaries
330
+
331
+ @classmethod
332
+ def get_additional_arguments(cls):
333
+ """ Supplies additional arguments needed """
334
+ return {}
335
+
336
+ @classmethod
337
+ def get_additional_cli_parsers(cls):
338
+ """ Requires MiddleWareParser and Dictionary Parser"""
339
+ return [cls.PLUGIN_PARSER]
340
+
301
341
 
302
342
  @classmethod
303
343
  def init(cls):
@@ -312,10 +352,15 @@ class CustomDataHandlers(GdsStandardApp):
312
352
  "FW_PACKET_FILE": pipeline.coders.register_file_consumer,
313
353
  "FW_PACKET_PACKETIZED_TLM": pipeline.coders.register_packet_consumer,
314
354
  }
355
+ self.publisher = PublishingPipeline()
356
+ self.publisher.transport_implementation = self.connection_transport
357
+ self.publisher.setup(self.dictionaries)
358
+ self.publisher.connect(self.connection_uri)
315
359
 
316
360
  data_handlers = Plugins.system().get_feature_classes("data_handler")
317
361
  for data_handler_class in data_handlers:
318
362
  data_handler = data_handler_class()
363
+ data_handler.set_publisher(self.publisher)
319
364
  descriptors = data_handler.get_handled_descriptors()
320
365
  for descriptor in descriptors:
321
366
  DESCRIPTOR_TO_FUNCTION.get(descriptor, lambda discard: discard)(