fprime-gds 3.4.2__tar.gz → 3.4.4a1__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-3.4.2 → fprime-gds-3.4.4a1}/.github/actions/spelling/excludes.txt +1 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/actions/spelling/expect.txt +3 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/PKG-INFO +2 -2
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/pyproject.toml +5 -1
- fprime-gds-3.4.4a1/src/fprime_gds/common/communication/adapters/base.py +89 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/adapters/ip.py +23 -5
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/adapters/uart.py +20 -7
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/checksum.py +1 -3
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/framing.py +53 -4
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/xml_loader.py +5 -1
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/zmq_transport.py +33 -18
- fprime-gds-3.4.4a1/src/fprime_gds/executables/apps.py +150 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/cli.py +219 -65
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/comm.py +14 -17
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/run_deployment.py +55 -14
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/utils.py +1 -1
- fprime-gds-3.4.4a1/src/fprime_gds/plugin/__init__.py +0 -0
- fprime-gds-3.4.4a1/src/fprime_gds/plugin/definitions.py +71 -0
- fprime-gds-3.4.4a1/src/fprime_gds/plugin/system.py +225 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/PKG-INFO +2 -2
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/SOURCES.txt +6 -1
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/requires.txt +1 -1
- fprime-gds-3.4.4a1/test/fprime_gds/sample/dictionary.xml +1522 -0
- fprime-gds-3.4.4a1/test/fprime_gds/test_plugins.py +327 -0
- fprime-gds-3.4.2/pytest.ini +0 -3
- fprime-gds-3.4.2/src/fprime_gds/common/communication/adapters/base.py +0 -117
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/actions/codeql/security-pack.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/actions/spelling/patterns.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/pull_request_template.md +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/resources/RefTopologyAppDictionary.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/workflows/codeql-security-scan.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/workflows/fprime-gds-tests.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/workflows/gds-cli-tests.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/workflows/publish.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.github/workflows/spelling.yml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/.gitignore +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/Doxyfile +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/LICENSE.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/NOTICE.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/README.md +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/configs/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/docs/README.md +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/docs/_static/css/rtd_width.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/docs/conf.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/docs/gendoc.bash +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/docs/index.rst +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/examples/simple_sequence.bin +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/examples/simple_sequence.seq +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/setup.cfg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/setup.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fastentrypoints.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/ground.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/updown.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/controllers/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/ch_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/event_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/exceptions.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/file_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/data_types/sys_data.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/decoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/distributor/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/distributor/distributor.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/files/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/files/downlinker.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/files/helpers.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/files/uplinker.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/channels.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/events.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/handlers.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/history/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/history/chrono.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/history/history.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/history/ram.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/history/test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/ch_py_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/cmd_py_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/event_py_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/loaders/python_loader.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/logger/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/logger/data_logger.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/logger/test_logger.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/models/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/models/common/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/models/common/channel_telemetry.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/models/common/command.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/models/common/event.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/parsers/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/dictionaries.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/encoding.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/files.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/histories.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/router.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/pipeline/standard.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/ch_template.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/cmd_template.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/data_template.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/event_template.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/templates/pkt_template.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/testing_fw/api.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/tools/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/tools/seqgen.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/transport.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/utils/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/utils/config_manager.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/utils/event_severity.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/utils/string_util.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/fprime_cli.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/executables/tcpserver.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/__init__.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/app.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/channels.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/commands.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/components.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/default_settings.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/errors.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/events.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/json.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/logs.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/requirements.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/resource.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/sequence.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/css/fprime.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/favicon.ico +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/img/error.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/img/logo.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/img/success.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/index.html +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/config.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/datastore.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/gds.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/loader.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/performance.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/settings.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/uploader.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/validate.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/stats.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/flask/updown.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/version.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/entry_points.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds.egg-info/top_level.txt +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/common/utils/test_string_util.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/executables/test_run_deployment.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/fprime_gds/executables/test_utils.py +0 -0
- {fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fprime-gds
|
3
|
-
Version: 3.4.
|
3
|
+
Version: 3.4.4a1
|
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:
|
@@ -234,7 +234,7 @@ Requires-Dist: pyzmq>=24.0.1
|
|
234
234
|
Requires-Dist: pexpect>=4.8.0
|
235
235
|
Requires-Dist: pytest>=6.2.4
|
236
236
|
Requires-Dist: flask_restful>=0.3.8
|
237
|
-
Requires-Dist: fprime-tools>=3.
|
237
|
+
Requires-Dist: fprime-tools>=3.4.3
|
238
238
|
Requires-Dist: argcomplete>=1.12.3
|
239
239
|
Requires-Dist: Jinja2>=2.11.3
|
240
240
|
Requires-Dist: openpyxl>=3.0.10
|
@@ -37,7 +37,7 @@ dependencies = [
|
|
37
37
|
"pexpect>=4.8.0",
|
38
38
|
"pytest>=6.2.4",
|
39
39
|
"flask_restful>=0.3.8",
|
40
|
-
"fprime-tools>=3.
|
40
|
+
"fprime-tools>=3.4.3",
|
41
41
|
"argcomplete>=1.12.3",
|
42
42
|
"Jinja2>=2.11.3",
|
43
43
|
"openpyxl>=3.0.10",
|
@@ -85,3 +85,7 @@ fprime_test_api = "fprime_gds.common.testing_fw.pytest_integration"
|
|
85
85
|
# - https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
|
86
86
|
# - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html#src-layout
|
87
87
|
####
|
88
|
+
[tool.pytest.ini_options]
|
89
|
+
markers =[
|
90
|
+
"gds_cli"
|
91
|
+
]
|
@@ -0,0 +1,89 @@
|
|
1
|
+
"""
|
2
|
+
base.py:
|
3
|
+
|
4
|
+
This file specifies the base-adapter for the F prime comm-layer. This class defines the basic methods needed to interact
|
5
|
+
with various wire formats as they are supported by the F prime comm-layer. This file defines a single abstract base
|
6
|
+
class representing the core features of the adapter class that must be implemented by every implementation of the
|
7
|
+
adapter for use with the comm-layer.
|
8
|
+
|
9
|
+
@author lestarch
|
10
|
+
"""
|
11
|
+
import abc
|
12
|
+
from typing import Type
|
13
|
+
from fprime_gds.plugin.definitions import gds_plugin_implementation, gds_plugin_specification
|
14
|
+
|
15
|
+
|
16
|
+
class BaseAdapter(abc.ABC):
|
17
|
+
"""
|
18
|
+
Base adapter for adapting the communications layer. This essentially breaks down to providing the ability to read
|
19
|
+
data from, and write to the necessary wire-format. The children of this class must at least implement the 'read' and
|
20
|
+
'write' functions to ensure that data can be read and written. 'open' and 'close' are also provided as a helper to
|
21
|
+
the subclass implementer to place resource initialization and release code, however; these implementations are
|
22
|
+
defaulted not overridden.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def open(self):
|
26
|
+
"""Null default implementation"""
|
27
|
+
|
28
|
+
def close(self):
|
29
|
+
"""Null default implementation"""
|
30
|
+
|
31
|
+
@abc.abstractmethod
|
32
|
+
def read(self, timeout=0.500):
|
33
|
+
"""
|
34
|
+
Read from the interface. Must be overridden by the child adapter. Throw no fatal errors, reconnect instead. This
|
35
|
+
call is expected to block waiting on incoming data.
|
36
|
+
|
37
|
+
:param size: maximum size of data to read before breaking
|
38
|
+
:param timeout: timeout for the block, default: 0.500 (500ms) as blocking w/o timeout may be uninterruptible
|
39
|
+
:return: byte array of data, or b'' if no data was read
|
40
|
+
"""
|
41
|
+
|
42
|
+
@abc.abstractmethod
|
43
|
+
def write(self, frame):
|
44
|
+
"""
|
45
|
+
Write to the interface. Must be overridden by the child adapter. Throw no fatal errors, reconnect instead.
|
46
|
+
|
47
|
+
:param frame: framed data to uplink
|
48
|
+
:return: True if data sent through adapter, False otherwise
|
49
|
+
"""
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
@gds_plugin_specification
|
53
|
+
def register_communication_plugin(cls) -> Type["BaseAdapter"]:
|
54
|
+
"""Register a communications adapter
|
55
|
+
|
56
|
+
Plugin hook for registering a plugin that supplies an adapter to the communications interface (radio, uart, i2c,
|
57
|
+
etc). This interface is expected to read and write bytes from a wire and will be provided to the framing system.
|
58
|
+
|
59
|
+
Note: users should return the class, not an instance of the class. Needed arguments for instantiation are
|
60
|
+
determined from class methods, solicited via the command line, and provided at construction time to the chosen
|
61
|
+
instantiation.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
BaseAdapter subclass
|
65
|
+
"""
|
66
|
+
raise NotImplementedError()
|
67
|
+
|
68
|
+
|
69
|
+
class NoneAdapter(BaseAdapter):
|
70
|
+
""" None adapter used to turn off the comm script """
|
71
|
+
|
72
|
+
@classmethod
|
73
|
+
def get_name(cls):
|
74
|
+
""" Get name of the non-adapter """
|
75
|
+
return "none"
|
76
|
+
|
77
|
+
def read(self, timeout=0.500):
|
78
|
+
""" Raise exception if this is called"""
|
79
|
+
raise NotImplementedError()
|
80
|
+
|
81
|
+
def write(self, frame):
|
82
|
+
""" Raise exception if this is called"""
|
83
|
+
raise NotImplementedError()
|
84
|
+
|
85
|
+
@classmethod
|
86
|
+
@gds_plugin_implementation
|
87
|
+
def register_communication_plugin(cls):
|
88
|
+
""" Register this as a plugin """
|
89
|
+
return cls
|
@@ -18,6 +18,8 @@ import time
|
|
18
18
|
import fprime_gds.common.communication.adapters.base
|
19
19
|
import fprime_gds.common.logger
|
20
20
|
|
21
|
+
from fprime_gds.plugin.definitions import gds_plugin_implementation
|
22
|
+
|
21
23
|
LOGGER = logging.getLogger("ip_adapter")
|
22
24
|
|
23
25
|
|
@@ -114,7 +116,7 @@ class IpAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
114
116
|
|
115
117
|
def write(self, frame):
|
116
118
|
"""
|
117
|
-
Send a given framed bit of data by sending it out the serial interface. It will attempt to reconnect if there
|
119
|
+
Send a given framed bit of data by sending it out the serial interface. It will attempt to reconnect if there
|
118
120
|
was a problem previously. This function will return true on success, or false on error.
|
119
121
|
|
120
122
|
:param frame: framed data packet to send out
|
@@ -151,6 +153,11 @@ class IpAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
151
153
|
self.write(IpAdapter.KEEPALIVE_DATA)
|
152
154
|
time.sleep(interval)
|
153
155
|
|
156
|
+
@classmethod
|
157
|
+
def get_name(cls):
|
158
|
+
""" Get the name of this adapter """
|
159
|
+
return "ip"
|
160
|
+
|
154
161
|
@classmethod
|
155
162
|
def get_arguments(cls):
|
156
163
|
"""
|
@@ -163,13 +170,13 @@ class IpAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
163
170
|
"dest": "address",
|
164
171
|
"type": str,
|
165
172
|
"default": "0.0.0.0",
|
166
|
-
"help": "Address of the IP adapter server.
|
173
|
+
"help": "Address of the IP adapter server.",
|
167
174
|
},
|
168
175
|
("--ip-port",): {
|
169
176
|
"dest": "port",
|
170
177
|
"type": int,
|
171
178
|
"default": 50000,
|
172
|
-
"help": "Port of the IP adapter server.
|
179
|
+
"help": "Port of the IP adapter server.",
|
173
180
|
},
|
174
181
|
("--ip-client",): {
|
175
182
|
# dest is "server" since it is handled in BaseAdapter.construct_adapter and passed with the same
|
@@ -182,14 +189,25 @@ class IpAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
182
189
|
}
|
183
190
|
|
184
191
|
@classmethod
|
185
|
-
|
192
|
+
@gds_plugin_implementation
|
193
|
+
def register_communication_plugin(cls):
|
194
|
+
""" Register this as a communication plugin """
|
195
|
+
return cls
|
196
|
+
|
197
|
+
@classmethod
|
198
|
+
def check_arguments(cls, address, port, server=True):
|
186
199
|
"""
|
187
200
|
Code that should check arguments of this adapter. If there is a problem with this code, then a "ValueError"
|
188
201
|
should be raised describing the problem with these arguments.
|
189
202
|
|
190
203
|
:param args: arguments as dictionary
|
191
204
|
"""
|
192
|
-
|
205
|
+
try:
|
206
|
+
if server:
|
207
|
+
check_port(address, port)
|
208
|
+
except OSError as os_error:
|
209
|
+
raise ValueError(f"{os_error}")
|
210
|
+
|
193
211
|
|
194
212
|
|
195
213
|
class IpHandler(abc.ABC):
|
{fprime-gds-3.4.2 → fprime-gds-3.4.4a1}/src/fprime_gds/common/communication/adapters/uart.py
RENAMED
@@ -15,6 +15,8 @@ from serial.tools import list_ports
|
|
15
15
|
|
16
16
|
import fprime_gds.common.communication.adapters.base
|
17
17
|
|
18
|
+
from fprime_gds.plugin.definitions import gds_plugin_implementation
|
19
|
+
|
18
20
|
LOGGER = logging.getLogger("serial_adapter")
|
19
21
|
|
20
22
|
|
@@ -151,18 +153,29 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
151
153
|
"dest": "device",
|
152
154
|
"type": str,
|
153
155
|
"default": default,
|
154
|
-
"help": "UART device representing the FSW.
|
156
|
+
"help": "UART device representing the FSW.",
|
155
157
|
},
|
156
158
|
("--uart-baud",): {
|
157
159
|
"dest": "baud",
|
158
160
|
"type": int,
|
159
161
|
"default": 9600,
|
160
|
-
"help": "Baud rate of the serial device.
|
162
|
+
"help": "Baud rate of the serial device.",
|
161
163
|
},
|
162
164
|
}
|
163
165
|
|
164
166
|
@classmethod
|
165
|
-
def
|
167
|
+
def get_name(cls):
|
168
|
+
""" Get name of the adapter """
|
169
|
+
return "uart"
|
170
|
+
|
171
|
+
@classmethod
|
172
|
+
@gds_plugin_implementation
|
173
|
+
def register_communication_plugin(cls):
|
174
|
+
""" Register this as a communication plugin """
|
175
|
+
return cls
|
176
|
+
|
177
|
+
@classmethod
|
178
|
+
def check_arguments(cls, device, baud):
|
166
179
|
"""
|
167
180
|
Code that should check arguments of this adapter. If there is a problem with this code, then a "ValueError"
|
168
181
|
should be raised describing the problem with these arguments.
|
@@ -170,16 +183,16 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
170
183
|
:param args: arguments as dictionary
|
171
184
|
"""
|
172
185
|
ports = map(lambda info: info.device, list_ports.comports(include_links=True))
|
173
|
-
if
|
174
|
-
msg = f"Serial port '{
|
186
|
+
if device not in ports:
|
187
|
+
msg = f"Serial port '{device}' not valid. Available ports: {ports}"
|
175
188
|
raise ValueError(
|
176
189
|
msg
|
177
190
|
)
|
178
191
|
# Note: baud rate may not *always* work. These are a superset
|
179
192
|
try:
|
180
|
-
baud = int(
|
193
|
+
baud = int(baud)
|
181
194
|
except ValueError:
|
182
|
-
msg = f"Serial baud rate '{
|
195
|
+
msg = f"Serial baud rate '{baud}' not integer. Use one of: {SerialAdapter.BAUDS}"
|
183
196
|
raise ValueError(
|
184
197
|
msg
|
185
198
|
)
|
@@ -11,7 +11,6 @@ def crc_calculation(data: bytes):
|
|
11
11
|
return zlib.crc32(data) & 0xFFFFFFFF
|
12
12
|
|
13
13
|
|
14
|
-
CHECKSUM_SELECTION = "crc32"
|
15
14
|
CHECKSUM_MAPPING = {
|
16
15
|
"fixed": lambda data: 0xCAFECAFE,
|
17
16
|
"crc32": crc_calculation,
|
@@ -19,8 +18,7 @@ CHECKSUM_MAPPING = {
|
|
19
18
|
}
|
20
19
|
|
21
20
|
|
22
|
-
def calculate_checksum(data: bytes):
|
21
|
+
def calculate_checksum(data: bytes, selected_checksum: str):
|
23
22
|
"""Calculates the checksum of bytes"""
|
24
|
-
selected_checksum = CHECKSUM_SELECTION
|
25
23
|
hash_fn = CHECKSUM_MAPPING.get(selected_checksum, CHECKSUM_MAPPING.get("default"))
|
26
24
|
return hash_fn(data)
|
@@ -15,8 +15,10 @@ import abc
|
|
15
15
|
import copy
|
16
16
|
import struct
|
17
17
|
import sys
|
18
|
+
from typing import Type
|
18
19
|
|
19
|
-
from .checksum import calculate_checksum
|
20
|
+
from .checksum import calculate_checksum, CHECKSUM_MAPPING
|
21
|
+
from fprime_gds.plugin.definitions import gds_plugin_implementation, gds_plugin_specification
|
20
22
|
|
21
23
|
|
22
24
|
class FramerDeframer(abc.ABC):
|
@@ -70,6 +72,24 @@ class FramerDeframer(abc.ABC):
|
|
70
72
|
return packets, data, discarded_aggregate
|
71
73
|
packets.append(packet)
|
72
74
|
|
75
|
+
@classmethod
|
76
|
+
@gds_plugin_specification
|
77
|
+
def register_framing_plugin(cls) -> Type["FramerDeframer"]:
|
78
|
+
"""Register a plugin to provide framing capabilities
|
79
|
+
|
80
|
+
Plugin hook for registering a plugin that supplies a FramerDeframer implementation. Implementors of this hook must
|
81
|
+
return a non-abstract subclass of FramerDeframer. This class will be provided as a framing implementation option
|
82
|
+
that users may select via command line arguments.
|
83
|
+
|
84
|
+
Note: users should return the class, not an instance of the class. Needed arguments for instantiation are
|
85
|
+
determined from class methods, solicited via the command line, and provided at construction time to the chosen
|
86
|
+
instantiation.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
FramerDeframer subclass
|
90
|
+
"""
|
91
|
+
raise NotImplementedError()
|
92
|
+
|
73
93
|
|
74
94
|
class FpFramerDeframer(FramerDeframer):
|
75
95
|
"""
|
@@ -97,10 +117,11 @@ class FpFramerDeframer(FramerDeframer):
|
|
97
117
|
HEADER_FORMAT = None
|
98
118
|
START_TOKEN = None
|
99
119
|
|
100
|
-
def __init__(self):
|
120
|
+
def __init__(self, checksum_type):
|
101
121
|
"""Sets constants on construction."""
|
102
122
|
# Setup the constants as soon as possible.
|
103
123
|
FpFramerDeframer.set_constants()
|
124
|
+
self.checksum = checksum_type
|
104
125
|
|
105
126
|
@classmethod
|
106
127
|
def set_constants(cls):
|
@@ -134,7 +155,7 @@ class FpFramerDeframer(FramerDeframer):
|
|
134
155
|
FpFramerDeframer.HEADER_FORMAT, FpFramerDeframer.START_TOKEN, len(data)
|
135
156
|
)
|
136
157
|
framed += data
|
137
|
-
framed += struct.pack(">I", calculate_checksum(framed))
|
158
|
+
framed += struct.pack(">I", calculate_checksum(framed, self.checksum))
|
138
159
|
return framed
|
139
160
|
|
140
161
|
def deframe(self, data, no_copy=False):
|
@@ -176,7 +197,8 @@ class FpFramerDeframer(FramerDeframer):
|
|
176
197
|
)
|
177
198
|
# If the checksum is valid, return the packet. Otherwise continue to rotate
|
178
199
|
if check == calculate_checksum(
|
179
|
-
data[: data_size + FpFramerDeframer.HEADER_SIZE]
|
200
|
+
data[: data_size + FpFramerDeframer.HEADER_SIZE],
|
201
|
+
self.checksum
|
180
202
|
):
|
181
203
|
data = data[total_size:]
|
182
204
|
return deframed, data, discarded
|
@@ -192,6 +214,33 @@ class FpFramerDeframer(FramerDeframer):
|
|
192
214
|
return None, data, discarded
|
193
215
|
return None, data, discarded
|
194
216
|
|
217
|
+
@classmethod
|
218
|
+
def get_name(cls):
|
219
|
+
""" Get the name of this plugin """
|
220
|
+
return "fprime"
|
221
|
+
|
222
|
+
@classmethod
|
223
|
+
def get_arguments(cls):
|
224
|
+
""" Get arguments for the framer/deframer """
|
225
|
+
return {("--comm-checksum-type",): {
|
226
|
+
"dest": "checksum_type",
|
227
|
+
"action": "store",
|
228
|
+
"type": str,
|
229
|
+
"help": "Setup the checksum algorithm. [default: %(default)s]",
|
230
|
+
"choices": [
|
231
|
+
item
|
232
|
+
for item in CHECKSUM_MAPPING.keys()
|
233
|
+
if item != "default"
|
234
|
+
],
|
235
|
+
"default": "crc32",
|
236
|
+
}}
|
237
|
+
|
238
|
+
@classmethod
|
239
|
+
@gds_plugin_implementation
|
240
|
+
def register_framing_plugin(cls):
|
241
|
+
""" Register a bad plugin """
|
242
|
+
return cls
|
243
|
+
|
195
244
|
|
196
245
|
class TcpServerFramerDeframer(FramerDeframer):
|
197
246
|
"""
|
@@ -49,6 +49,7 @@ class XmlLoader(dict_loader.DictLoader):
|
|
49
49
|
|
50
50
|
ENUM_SECT = "enums"
|
51
51
|
ENUM_TYPE_TAG = "type"
|
52
|
+
ENUM_SERIALIZE_TYPE_TAG = "serialize_type"
|
52
53
|
ENUM_ELEM_NAME_TAG = "name"
|
53
54
|
ENUM_ELEM_VAL_TAG = "value"
|
54
55
|
ENUM_ELEM_DESC_TAG = "description"
|
@@ -202,6 +203,9 @@ class XmlLoader(dict_loader.DictLoader):
|
|
202
203
|
for enum in enum_section:
|
203
204
|
# Check enum name
|
204
205
|
if enum.get(self.ENUM_TYPE_TAG) == enum_name:
|
206
|
+
# Get serialize/representation type, if present
|
207
|
+
serialize_type = enum.get(self.ENUM_SERIALIZE_TYPE_TAG, "I32")
|
208
|
+
|
205
209
|
# Go through all possible values of the enum
|
206
210
|
members = {}
|
207
211
|
for item in enum:
|
@@ -209,7 +213,7 @@ class XmlLoader(dict_loader.DictLoader):
|
|
209
213
|
item_val = int(item.get(self.ENUM_ELEM_VAL_TAG))
|
210
214
|
members[item_name] = item_val
|
211
215
|
|
212
|
-
enum_obj = EnumType.construct_type(enum_name, members)
|
216
|
+
enum_obj = EnumType.construct_type(enum_name, members, serialize_type)
|
213
217
|
|
214
218
|
self.enums[enum_name] = enum_obj
|
215
219
|
return enum_obj
|
@@ -9,6 +9,7 @@ replace the ThreadedTcpServer for several reasons as described below.
|
|
9
9
|
|
10
10
|
@author lestarch
|
11
11
|
"""
|
12
|
+
|
12
13
|
import logging
|
13
14
|
import struct
|
14
15
|
from typing import Tuple
|
@@ -24,6 +25,7 @@ from fprime_gds.common.transport import (
|
|
24
25
|
|
25
26
|
LOGGER = logging.getLogger("transport")
|
26
27
|
|
28
|
+
|
27
29
|
class ZmqWrapper(object):
|
28
30
|
"""Handler for ZMQ functions for use in other objects"""
|
29
31
|
|
@@ -50,7 +52,9 @@ class ZmqWrapper(object):
|
|
50
52
|
sub_topic: subscription topic used to filter incoming messages
|
51
53
|
pub_topic: publication topic supplied for remote subscription filters
|
52
54
|
"""
|
53
|
-
assert
|
55
|
+
assert (
|
56
|
+
len(transport_url) == 2
|
57
|
+
), f"Must supply a pair of URLs for ZeroMQ not '{transport_url}'"
|
54
58
|
self.pub_topic = pub_topic
|
55
59
|
self.sub_topic = sub_topic
|
56
60
|
self.transport_url = transport_url
|
@@ -78,8 +82,12 @@ class ZmqWrapper(object):
|
|
78
82
|
The connection is made using self.transport_url, and as such, this must be configured before running. This is
|
79
83
|
intended to be called on the sending thread.
|
80
84
|
"""
|
81
|
-
assert
|
82
|
-
|
85
|
+
assert (
|
86
|
+
self.transport_url is not None and len(self.transport_url) == 2
|
87
|
+
), "Must configure before connecting"
|
88
|
+
assert (
|
89
|
+
self.zmq_socket_outgoing is None
|
90
|
+
), "Cannot connect outgoing multiple times"
|
83
91
|
assert self.pub_topic is not None, "Must configure sockets before connecting"
|
84
92
|
self.zmq_socket_outgoing = self.context.socket(zmq.PUB)
|
85
93
|
self.zmq_socket_outgoing.setsockopt(zmq.SNDHWM, 0)
|
@@ -93,7 +101,7 @@ class ZmqWrapper(object):
|
|
93
101
|
self.zmq_socket_outgoing.connect(self.transport_url[0])
|
94
102
|
|
95
103
|
def connect_incoming(self):
|
96
|
-
"""
|
104
|
+
"""Sets up a ZeroMQ connection for incoming data
|
97
105
|
|
98
106
|
ZeroMQ allows multiple connections to a single endpoint. This only affects incoming connections as sockets must
|
99
107
|
be created on their owning threads. This will connect the ZeroMQ topology and if self.server is set, will bind
|
@@ -102,8 +110,12 @@ class ZmqWrapper(object):
|
|
102
110
|
The connection is made using self.transport_url, and as such, this must be configured before running. This is
|
103
111
|
intended to be called on the receiving thread.
|
104
112
|
"""
|
105
|
-
assert
|
106
|
-
|
113
|
+
assert (
|
114
|
+
self.transport_url is not None and len(self.transport_url) == 2
|
115
|
+
), "Must configure before connecting"
|
116
|
+
assert (
|
117
|
+
self.zmq_socket_incoming is None
|
118
|
+
), "Cannot connect incoming multiple times"
|
107
119
|
assert self.sub_topic is not None, "Must configure sockets before connecting"
|
108
120
|
self.zmq_socket_incoming = self.context.socket(zmq.SUB)
|
109
121
|
self.zmq_socket_incoming.setsockopt(zmq.RCVHWM, 0)
|
@@ -125,7 +137,7 @@ class ZmqWrapper(object):
|
|
125
137
|
self.zmq_socket_incoming.close()
|
126
138
|
|
127
139
|
def terminate(self):
|
128
|
-
"""
|
140
|
+
"""Terminate the ZeroMQ context"""
|
129
141
|
self.context.term()
|
130
142
|
|
131
143
|
def recv(self, timeout=None):
|
@@ -162,11 +174,14 @@ class ZmqClient(ThreadedTransportClient):
|
|
162
174
|
self.zmq = ZmqWrapper()
|
163
175
|
|
164
176
|
def connect(
|
165
|
-
self,
|
177
|
+
self,
|
178
|
+
transport_url: Tuple[str],
|
179
|
+
sub_routing: RoutingTag,
|
180
|
+
pub_routing: RoutingTag,
|
166
181
|
):
|
167
182
|
"""Connects to the ZeroMQ network"""
|
168
183
|
self.zmq.configure(transport_url, sub_routing.value, pub_routing.value)
|
169
|
-
self.zmq.connect_outgoing()
|
184
|
+
self.zmq.connect_outgoing() # Outgoing socket, for clients, exists on the current thread
|
170
185
|
super().connect(transport_url, sub_routing, pub_routing)
|
171
186
|
|
172
187
|
def disconnect(self):
|
@@ -176,16 +191,18 @@ class ZmqClient(ThreadedTransportClient):
|
|
176
191
|
|
177
192
|
def send(self, data):
|
178
193
|
"""Send data via ZeroMQ"""
|
179
|
-
if data[:4] == b
|
194
|
+
if data[:4] == b"ZZZZ":
|
180
195
|
data = data[4:]
|
181
|
-
self.zmq.send(
|
196
|
+
self.zmq.send(
|
197
|
+
data
|
198
|
+
) # Must strip out ZZZZ as that is a ThreadedTcpServer only property
|
182
199
|
|
183
200
|
def recv(self, timeout=None):
|
184
201
|
"""Receives data from ZeroMQ"""
|
185
202
|
return self.zmq.recv(timeout)
|
186
203
|
|
187
204
|
def recv_thread(self):
|
188
|
-
"""
|
205
|
+
"""Overrides the recv_thread method
|
189
206
|
|
190
207
|
Overrides the recv_thread method of the superclass such that the ZeroMQ socket may be created/destroyed
|
191
208
|
before/after the main recv loop.
|
@@ -203,11 +220,11 @@ class ZmqGround(GroundHandler):
|
|
203
220
|
to the display and processing layer(s). This effectively acts as the "FSW" side of that interface as it
|
204
221
|
frames/deframes packets heading to that layer.
|
205
222
|
|
206
|
-
Since there is likely only one communications client to the FSW users should
|
223
|
+
Since there is likely only one communications client to the FSW users should instantiate with server=True
|
207
224
|
to ensure that it binds to resources for the network. This is not forced in case of multiple FSW connections.
|
208
225
|
"""
|
209
226
|
|
210
|
-
def __init__(self, transport_url):
|
227
|
+
def __init__(self, transport_url, server=True):
|
211
228
|
"""Initialize this interface with the transport_url needed to connect
|
212
229
|
|
213
230
|
Args:
|
@@ -217,6 +234,8 @@ class ZmqGround(GroundHandler):
|
|
217
234
|
self.zmq = ZmqWrapper()
|
218
235
|
self.transport_url = transport_url
|
219
236
|
self.timeout = 10
|
237
|
+
if server:
|
238
|
+
self.zmq.make_server()
|
220
239
|
|
221
240
|
def open(self):
|
222
241
|
"""Open this ground interface. Delegates to the connect method
|
@@ -242,10 +261,6 @@ class ZmqGround(GroundHandler):
|
|
242
261
|
self.zmq.disconnect_outgoing()
|
243
262
|
self.zmq.terminate()
|
244
263
|
|
245
|
-
def make_server(self):
|
246
|
-
"""Makes it into a server"""
|
247
|
-
self.zmq.make_server()
|
248
|
-
|
249
264
|
def receive_all(self):
|
250
265
|
"""Receive all available packets
|
251
266
|
|