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.
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/PKG-INFO +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/ch_decoder.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/event_decoder.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/pkt_decoder.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/distributor/distributor.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/cmd_encoder.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/encoder.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/seq_writer.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/base_commands.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/channels.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/command_send.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/events.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/handlers.py +56 -0
- {fprime_gds-4.0.2a1/src/fprime_gds/common/pipeline → fprime_gds-4.0.2a3/src/fprime_gds/common/models}/dictionaries.py +24 -0
- fprime_gds-4.0.2a3/src/fprime_gds/common/pipeline/publishing.py +111 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/standard.py +12 -21
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/api.py +8 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/config_manager.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/apps.py +59 -14
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/cli.py +28 -5
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/fprime_cli.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/run_deployment.py +19 -6
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/PKG-INFO +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/SOURCES.txt +2 -3
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/distributor/test_distributor.py +1 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_ch_encoder.py +2 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_event_encoder.py +2 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/encoders/test_pkt_encoder.py +2 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/api_unit_test.py +10 -2
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_run_deployment.py +3 -1
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/test_plugins.py +58 -21
- fprime_gds-4.0.2a1/src/fprime_gds/common/models/common/channel_telemetry.py +0 -174
- fprime_gds-4.0.2a1/src/fprime_gds/common/models/common/event.py +0 -121
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/codeql/security-pack.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/excludes.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/expect.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/actions/spelling/patterns.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/pull_request_template.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/resources/RefTopologyAppDictionary.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/codeql-security-scan.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/fprime-gds-tests.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/gds-cli-tests.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/publish.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.github/workflows/spelling.yml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/.gitignore +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/Doxyfile +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/LICENSE.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/NOTICE.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/README.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/configs/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/README.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/_static/css/rtd_width.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/conf.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/gendoc.bash +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/docs/index.rst +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/examples/simple_sequence.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/examples/simple_sequence.seq +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/pyproject.toml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/setup.cfg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/setup.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fastentrypoints.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/base.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/checksum.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/framing.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/ground.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/communication/updown.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/controllers/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/ch_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/event_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/exceptions.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/file_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/data_types/sys_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/decoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/distributor/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/downlinker.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/helpers.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/files/uplinker.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/README.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/SPEC.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/bytecode/directives.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/codegen.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/grammar.lark +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/main.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/fpy/parser.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/chrono.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/history.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/ram.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/history/test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/data_logger.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/logger/test_logger.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/common/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/models/common/command.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/parsers/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/encoding.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/files.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/histories.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/pipeline/router.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/ch_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/cmd_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/data_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/event_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/pkt_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/templates/prm_template.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/README.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/params.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/tools/seqgen.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/transport.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/event_severity.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/utils/string_util.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/common/zmq_transport.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/comm.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/data_product_writer.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/dictionary_merge.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/tcpserver.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/executables/utils.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/app.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/channels.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/commands.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/components.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/default_settings.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/errors.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/events.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/json.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/logs.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/requirements.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/resource.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/sequence.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
- {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
- {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
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
- {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
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/css/fprime.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/favicon.ico +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/error.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/logo.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/img/success.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/index.html +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/config.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/datastore.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/gds.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/json.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/loader.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/performance.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/settings.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/uploader.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/validate.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/stats.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/flask/updown.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/__init__.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/definitions.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/plugin/system.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds/version.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/entry_points.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/requires.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/src/fprime_gds.egg-info/top_level.txt +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/common/utils/test_string_util.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/.gitignore +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/executables/test_utils.py +0 -0
- {fprime_gds-4.0.2a1 → fprime_gds-4.0.2a3}/test/fprime_gds/sample/dictionary.xml +0 -0
- {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.
|
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
|
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
|
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
|
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
|
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
|
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")
|
@@ -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.
|
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.
|
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.
|
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.
|
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
|
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 =
|
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
|
-
|
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
|
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
|
-
|
79
|
-
|
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.
|
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.
|
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
|
-
|
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
|
-
|
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(
|
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
|
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
|
-
[
|
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
|
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)(
|