fprime-gds 4.0.0a1__tar.gz → 4.0.0a3__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.0a1 → fprime_gds-4.0.0a3}/.github/actions/spelling/expect.txt +5 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/actions/spelling/patterns.txt +3 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/workflows/fprime-gds-tests.yml +1 -1
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/workflows/gds-cli-tests.yml +1 -1
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/PKG-INFO +6 -3
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/pyproject.toml +6 -3
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/uart.py +34 -25
- fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/apid.py +19 -0
- fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/chain.py +106 -0
- fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/space_data_link.py +196 -0
- fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds/space_packet.py +130 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/framing.py +27 -32
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/data_desc_type.py +6 -1
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/cli.py +164 -3
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/run_deployment.py +2 -1
- fprime_gds-4.0.0a3/src/fprime_gds/plugin/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/plugin/system.py +2 -1
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/PKG-INFO +6 -3
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/SOURCES.txt +7 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/requires.txt +3 -0
- fprime_gds-4.0.0a3/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +90 -0
- fprime_gds-4.0.0a3/test/fprime_gds/common/communication/ccsds/test_space_packet.py +109 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/actions/codeql/security-pack.yml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/actions/spelling/excludes.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/pull_request_template.md +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/resources/RefTopologyAppDictionary.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/workflows/codeql-security-scan.yml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/workflows/publish.yml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.github/workflows/spelling.yml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/.gitignore +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/Doxyfile +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/LICENSE.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/NOTICE.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/README.md +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/configs/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/docs/README.md +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/docs/_static/css/rtd_width.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/docs/conf.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/docs/gendoc.bash +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/docs/index.rst +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/examples/simple_sequence.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/examples/simple_sequence.seq +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/setup.cfg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/setup.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fastentrypoints.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/base.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/controllers → fprime_gds-4.0.0a3/src/fprime_gds/common/communication/ccsds}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/checksum.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/ground.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/updown.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/data_types → fprime_gds-4.0.0a3/src/fprime_gds/common/controllers}/__init__.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/decoders → fprime_gds-4.0.0a3/src/fprime_gds/common/data_types}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/ch_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/event_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/exceptions.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/file_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/data_types/sys_data.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/distributor → fprime_gds-4.0.0a3/src/fprime_gds/common/decoders}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/decoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/encoders → fprime_gds-4.0.0a3/src/fprime_gds/common/distributor}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/distributor/distributor.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/files → fprime_gds-4.0.0a3/src/fprime_gds/common/encoders}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/fpy → fprime_gds-4.0.0a3/src/fprime_gds/common/files}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/downlinker.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/helpers.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/files/uplinker.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/gds_cli → fprime_gds-4.0.0a3/src/fprime_gds/common/fpy}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/fpy/serialize_bytecode.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/fpy/types.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/history → fprime_gds-4.0.0a3/src/fprime_gds/common/gds_cli}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/channels.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/events.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/handlers.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/loaders → fprime_gds-4.0.0a3/src/fprime_gds/common/history}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/chrono.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/history.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/ram.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/history/test.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/models → fprime_gds-4.0.0a3/src/fprime_gds/common/loaders}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/data_logger.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/logger/test_logger.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/models/common → fprime_gds-4.0.0a3/src/fprime_gds/common/models}/__init__.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/parsers → fprime_gds-4.0.0a3/src/fprime_gds/common/models/common}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/channel_telemetry.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/command.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/models/common/event.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/pipeline → fprime_gds-4.0.0a3/src/fprime_gds/common/parsers}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/templates → fprime_gds-4.0.0a3/src/fprime_gds/common/pipeline}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/dictionaries.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/encoding.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/files.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/histories.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/router.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/pipeline/standard.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/testing_fw → fprime_gds-4.0.0a3/src/fprime_gds/common/templates}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/ch_template.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/cmd_template.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/data_template.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/event_template.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/pkt_template.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/templates/prm_template.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/tools → fprime_gds-4.0.0a3/src/fprime_gds/common/testing_fw}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/api.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/README.md +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/common/utils → fprime_gds-4.0.0a3/src/fprime_gds/common/tools}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/params.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/tools/seqgen.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/transport.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/executables → fprime_gds-4.0.0a3/src/fprime_gds/common/utils}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/config_manager.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/event_severity.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/utils/string_util.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/zmq_transport.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/flask → fprime_gds-4.0.0a3/src/fprime_gds/executables}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/apps.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/comm.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/data_product_writer.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/fprime_cli.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/tcpserver.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/executables/utils.py +0 -0
- {fprime_gds-4.0.0a1/src/fprime_gds/plugin → fprime_gds-4.0.0a3/src/fprime_gds/flask}/__init__.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/app.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/channels.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/commands.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/components.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/default_settings.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/errors.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/events.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/json.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/logs.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/requirements.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/resource.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/sequence.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/css/fprime.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/favicon.ico +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/error.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/logo.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/img/success.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/index.html +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/config.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/datastore.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/gds.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/json.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/loader.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/performance.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/settings.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/uploader.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/validate.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/channel.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/event.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/stats.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/flask/updown.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/plugin/definitions.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/version.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/entry_points.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds.egg-info/top_level.txt +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/fpy/integrated_tests.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/common/utils/test_string_util.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/.gitignore +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_run_deployment.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/executables/test_utils.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/sample/dictionary.xml +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/fprime_gds/test_plugins.py +0 -0
- {fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -39,6 +39,7 @@ callgraph
|
|
39
39
|
cata
|
40
40
|
CCB
|
41
41
|
CCFF
|
42
|
+
ccsds
|
42
43
|
Cdioux
|
43
44
|
cdn
|
44
45
|
cdxoefg
|
@@ -303,6 +304,7 @@ rollup
|
|
303
304
|
rpaetz
|
304
305
|
rst
|
305
306
|
saba
|
307
|
+
scid
|
306
308
|
sdd
|
307
309
|
searchdata
|
308
310
|
Segoe
|
@@ -318,6 +320,7 @@ SMAP
|
|
318
320
|
Smath
|
319
321
|
SNDHWM
|
320
322
|
sorttable
|
323
|
+
spacepacket
|
321
324
|
squashify
|
322
325
|
sss
|
323
326
|
Ssymbols
|
@@ -376,6 +379,8 @@ usec
|
|
376
379
|
useconds
|
377
380
|
usepackage
|
378
381
|
usr
|
382
|
+
vcid
|
383
|
+
VCP
|
379
384
|
vh
|
380
385
|
vhd
|
381
386
|
vhdl
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: fprime-gds
|
3
|
-
Version: 4.0.
|
3
|
+
Version: 4.0.0a3
|
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:
|
@@ -216,15 +216,15 @@ Classifier: Operating System :: Unix
|
|
216
216
|
Classifier: Operating System :: POSIX
|
217
217
|
Classifier: Programming Language :: Python
|
218
218
|
Classifier: Programming Language :: Python :: 3
|
219
|
-
Classifier: Programming Language :: Python :: 3.8
|
220
219
|
Classifier: Programming Language :: Python :: 3.9
|
221
220
|
Classifier: Programming Language :: Python :: 3.10
|
222
221
|
Classifier: Programming Language :: Python :: 3.11
|
223
222
|
Classifier: Programming Language :: Python :: 3.12
|
223
|
+
Classifier: Programming Language :: Python :: 3.13
|
224
224
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
225
225
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
226
226
|
Classifier: License :: OSI Approved :: Apache Software License
|
227
|
-
Requires-Python: >=3.
|
227
|
+
Requires-Python: >=3.9
|
228
228
|
Description-Content-Type: text/markdown
|
229
229
|
License-File: LICENSE.txt
|
230
230
|
License-File: NOTICE.txt
|
@@ -240,6 +240,9 @@ Requires-Dist: Jinja2>=2.11.3
|
|
240
240
|
Requires-Dist: openpyxl>=3.0.10
|
241
241
|
Requires-Dist: pyserial>=3.5
|
242
242
|
Requires-Dist: pydantic>=2.6
|
243
|
+
Requires-Dist: PyYAML>=6.0.2
|
244
|
+
Requires-Dist: spacepackets>=0.28.0
|
245
|
+
Requires-Dist: crc>=7.0.0
|
243
246
|
Dynamic: license-file
|
244
247
|
|
245
248
|
# F´ GDS
|
@@ -7,7 +7,7 @@ name = "fprime-gds"
|
|
7
7
|
dynamic = ["version"]
|
8
8
|
description = "F Prime Flight Software Ground Data System layer"
|
9
9
|
readme = "README.md"
|
10
|
-
requires-python = ">=3.
|
10
|
+
requires-python = ">=3.9"
|
11
11
|
license = {file = "LICENSE.txt"}
|
12
12
|
keywords = ["fprime", "embedded", "nasa", "flight", "software"]
|
13
13
|
authors = [
|
@@ -21,11 +21,11 @@ classifiers = [
|
|
21
21
|
"Operating System :: POSIX",
|
22
22
|
"Programming Language :: Python",
|
23
23
|
"Programming Language :: Python :: 3",
|
24
|
-
"Programming Language :: Python :: 3.8",
|
25
24
|
"Programming Language :: Python :: 3.9",
|
26
25
|
"Programming Language :: Python :: 3.10",
|
27
26
|
"Programming Language :: Python :: 3.11",
|
28
27
|
"Programming Language :: Python :: 3.12",
|
28
|
+
"Programming Language :: Python :: 3.13",
|
29
29
|
"Programming Language :: Python :: Implementation :: CPython",
|
30
30
|
"Programming Language :: Python :: Implementation :: PyPy",
|
31
31
|
"License :: OSI Approved :: Apache Software License",
|
@@ -42,7 +42,10 @@ dependencies = [
|
|
42
42
|
"Jinja2>=2.11.3",
|
43
43
|
"openpyxl>=3.0.10",
|
44
44
|
"pyserial>=3.5",
|
45
|
-
"pydantic>=2.6"
|
45
|
+
"pydantic>=2.6",
|
46
|
+
"PyYAML>=6.0.2",
|
47
|
+
"spacepackets>=0.28.0",
|
48
|
+
"crc>=7.0.0"
|
46
49
|
]
|
47
50
|
|
48
51
|
[project.urls]
|
{fprime_gds-4.0.0a1 → fprime_gds-4.0.0a3}/src/fprime_gds/common/communication/adapters/uart.py
RENAMED
@@ -59,7 +59,7 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
59
59
|
4000000,
|
60
60
|
]
|
61
61
|
|
62
|
-
def __init__(self, device, baud):
|
62
|
+
def __init__(self, device, baud, skip_check):
|
63
63
|
"""
|
64
64
|
Initialize the serial adapter using the default settings. This does not open the serial port, but sets up all
|
65
65
|
the internal variables used when opening the device.
|
@@ -77,9 +77,14 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
77
77
|
Opens the serial port based on previously supplied settings. If the port is already open, then close it first.
|
78
78
|
Then open the port up again.
|
79
79
|
"""
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
try:
|
81
|
+
self.close()
|
82
|
+
self.serial = serial.Serial(self.device, self.baud)
|
83
|
+
return self.serial is not None
|
84
|
+
except serial.serialutil.SerialException as exc:
|
85
|
+
LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
|
86
|
+
self.close()
|
87
|
+
return False
|
83
88
|
|
84
89
|
def close(self):
|
85
90
|
"""
|
@@ -100,12 +105,11 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
100
105
|
:return: True, when data was sent through the UART. False otherwise.
|
101
106
|
"""
|
102
107
|
try:
|
103
|
-
if self.serial is None:
|
104
|
-
self.
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
return True
|
108
|
+
if self.serial is not None or self.open():
|
109
|
+
written = self.serial.write(frame)
|
110
|
+
# Not believed to be possible to not send everything without getting a timeout exception
|
111
|
+
assert written == len(frame)
|
112
|
+
return True
|
109
113
|
except serial.serialutil.SerialException as exc:
|
110
114
|
LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
|
111
115
|
self.close()
|
@@ -121,17 +125,16 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
121
125
|
"""
|
122
126
|
data = b""
|
123
127
|
try:
|
124
|
-
if self.serial is None:
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
) # Drain the incoming data queue
|
128
|
+
if self.serial is not None or self.open():
|
129
|
+
# Read as much data as possible, while ensuring to block if no data is available at this time. Note: as much
|
130
|
+
# data is read as possible to avoid a long-return time to this call. Minimum data to read is one byte in
|
131
|
+
# order to block this function while data is incoming.
|
132
|
+
self.serial.timeout = timeout
|
133
|
+
data = self.serial.read(1) # Force a block for at least 1 character
|
134
|
+
while self.serial.in_waiting:
|
135
|
+
data += self.serial.read(
|
136
|
+
self.serial.in_waiting
|
137
|
+
) # Drain the incoming data queue
|
135
138
|
except serial.serialutil.SerialException as exc:
|
136
139
|
LOGGER.warning("Serial exception caught: %s. Reconnecting.", (str(exc)))
|
137
140
|
self.close()
|
@@ -161,6 +164,12 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
161
164
|
"default": 9600,
|
162
165
|
"help": "Baud rate of the serial device.",
|
163
166
|
},
|
167
|
+
("--uart-skip-port-check",): {
|
168
|
+
"dest": "skip_check",
|
169
|
+
"default": False,
|
170
|
+
"action": "store_true",
|
171
|
+
"help": "Skip checking that the port exists"
|
172
|
+
}
|
164
173
|
}
|
165
174
|
|
166
175
|
@classmethod
|
@@ -175,20 +184,20 @@ class SerialAdapter(fprime_gds.common.communication.adapters.base.BaseAdapter):
|
|
175
184
|
return cls
|
176
185
|
|
177
186
|
@classmethod
|
178
|
-
def check_arguments(cls, device, baud):
|
187
|
+
def check_arguments(cls, device, baud, skip_check):
|
179
188
|
"""
|
180
189
|
Code that should check arguments of this adapter. If there is a problem with this code, then a "ValueError"
|
181
190
|
should be raised describing the problem with these arguments.
|
182
191
|
|
183
192
|
:param args: arguments as dictionary
|
184
193
|
"""
|
185
|
-
ports = map(lambda info: info.device, list_ports.comports(include_links=True))
|
186
|
-
if device not in ports:
|
194
|
+
ports = list(map(lambda info: info.device, list_ports.comports(include_links=True)))
|
195
|
+
if not skip_check and device not in ports:
|
187
196
|
msg = f"Serial port '{device}' not valid. Available ports: {ports}"
|
188
197
|
raise ValueError(
|
189
198
|
msg
|
190
199
|
)
|
191
|
-
# Note: baud rate may not *always* work. These are a superset
|
200
|
+
# Note: baud rate may not *always* work. These are a superset.
|
192
201
|
try:
|
193
202
|
baud = int(baud)
|
194
203
|
except ValueError:
|
@@ -0,0 +1,19 @@
|
|
1
|
+
""" ccsds.apid: APID mapping functions for F´ data """
|
2
|
+
from fprime_gds.common.utils.data_desc_type import DataDescType
|
3
|
+
from fprime.common.models.serialize.numerical_types import U32Type
|
4
|
+
|
5
|
+
class APID(object):
|
6
|
+
""" APID implementations """
|
7
|
+
#TODO: use the DataDescType configured by loading the dictionary
|
8
|
+
|
9
|
+
@classmethod
|
10
|
+
def from_type(cls, data_type: DataDescType):
|
11
|
+
""" Map from data description type to APID """
|
12
|
+
return data_type.value
|
13
|
+
|
14
|
+
@classmethod
|
15
|
+
def from_data(cls, data):
|
16
|
+
""" Map from data bytes to APID """
|
17
|
+
u32_type = U32Type()
|
18
|
+
u32_type.deserialize(data, offset=0)
|
19
|
+
return cls.from_type(DataDescType(u32_type.val))
|
@@ -0,0 +1,106 @@
|
|
1
|
+
""" fprime_encryption.framing.chain: implementation of a chained framer/deframer """
|
2
|
+
from abc import ABC, abstractmethod
|
3
|
+
from functools import reduce
|
4
|
+
from typing import Any, Dict, List, Type
|
5
|
+
from fprime_gds.common.communication.framing import FramerDeframer
|
6
|
+
from fprime_gds.common.communication.ccsds.space_data_link import SpaceDataLinkFramerDeframer
|
7
|
+
from fprime_gds.common.communication.ccsds.space_packet import SpacePacketFramerDeframer
|
8
|
+
from fprime_gds.plugin.definitions import gds_plugin
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
class ChainedFramerDeframer(FramerDeframer, ABC):
|
13
|
+
""" Framer/deframer that is a composite of chained framer/deframers
|
14
|
+
|
15
|
+
This Framer/Deframer will wrap a set of framer/deframers where the result of the frame and deframe options will pass
|
16
|
+
from one to the other subsequently. The order is specified via the framing path and deframing will use the reverse
|
17
|
+
order from specified.
|
18
|
+
"""
|
19
|
+
def __init__(self, **kwargs):
|
20
|
+
""" Initialize the chained framer/deframer from a framing-ordered set of children """
|
21
|
+
frame_order_framer_deframers = [
|
22
|
+
composite(**self.get_argument_subset(composite, kwargs))
|
23
|
+
for composite in self.get_composites()
|
24
|
+
]
|
25
|
+
self.framers = frame_order_framer_deframers[::1]
|
26
|
+
self.deframers = frame_order_framer_deframers[::-1]
|
27
|
+
|
28
|
+
@classmethod
|
29
|
+
@abstractmethod
|
30
|
+
def get_composites(cls) -> List[Type[FramerDeframer]]:
|
31
|
+
""" Return a list of composites
|
32
|
+
Innermost FramerDeframer should be first in the list. """
|
33
|
+
raise NotImplementedError(f"Subclasses of {cls.__name__} must implement get_composites")
|
34
|
+
|
35
|
+
@staticmethod
|
36
|
+
def get_argument_subset(composite: Type[FramerDeframer], argument_dictionary: Dict[str, Any]) -> Dict[str, Any]:
|
37
|
+
""" Get an argument subset that is needed by composite
|
38
|
+
|
39
|
+
For the composite, find the set of arguments that is needed by this composite and pull those out of the complete
|
40
|
+
argument dictionary.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
composite: class of a subtype of FramerDeframer
|
44
|
+
argument_dictionary: dictionary of all input arguments
|
45
|
+
"""
|
46
|
+
if not hasattr(composite, "get_arguments"):
|
47
|
+
return {}
|
48
|
+
needed_arguments = composite.get_arguments()
|
49
|
+
needed_argument_destinations = [
|
50
|
+
description["destination"] if "destination" in description else
|
51
|
+
[dash_dash for dash_dash in flag if dash_dash.startswith("--")][0].lstrip("-").replace("-", "_")
|
52
|
+
for flag, description in needed_arguments.items()
|
53
|
+
]
|
54
|
+
return {name: argument_dictionary[name] for name in needed_argument_destinations}
|
55
|
+
|
56
|
+
@classmethod
|
57
|
+
def get_arguments(cls):
|
58
|
+
""" Arguments to request from the CLI """
|
59
|
+
all_arguments = {}
|
60
|
+
for composite in cls.get_composites():
|
61
|
+
all_arguments.update(composite.get_arguments() if hasattr(composite, "get_arguments") else {})
|
62
|
+
return all_arguments
|
63
|
+
|
64
|
+
@classmethod
|
65
|
+
def check_arguments(cls, **kwargs):
|
66
|
+
""" Check arguments from the CLI """
|
67
|
+
for composite in cls.get_composites():
|
68
|
+
subset_arguments = cls.get_argument_subset(composite, kwargs)
|
69
|
+
if hasattr(composite, "check_arguments"):
|
70
|
+
composite.check_arguments(**subset_arguments)
|
71
|
+
|
72
|
+
def deframe(self, data, no_copy=False):
|
73
|
+
""" Deframe via a chain of children deframers """
|
74
|
+
packet = data[:] if not no_copy else data
|
75
|
+
remaining = None
|
76
|
+
discarded = b""
|
77
|
+
|
78
|
+
for deframer in self.deframers:
|
79
|
+
new_packet, new_remaining, new_discarded = deframer.deframe(packet, True)
|
80
|
+
discarded += new_discarded
|
81
|
+
remaining = new_remaining if remaining is None else remaining
|
82
|
+
packet = new_packet
|
83
|
+
return packet, remaining, discarded
|
84
|
+
|
85
|
+
def frame(self, data):
|
86
|
+
""" Frame via a chain of children framers """
|
87
|
+
return reduce(lambda framed_data, framer: framer.frame(framed_data), self.framers, data)
|
88
|
+
|
89
|
+
|
90
|
+
@gds_plugin(FramerDeframer)
|
91
|
+
class SpacePacketSpaceDataLinkFramerDeframer(ChainedFramerDeframer):
|
92
|
+
""" Space Data Link Protocol framing and deframing that has a data unit of Space Packets as the central """
|
93
|
+
|
94
|
+
@classmethod
|
95
|
+
def get_composites(cls) -> List[Type[FramerDeframer]]:
|
96
|
+
""" Return the composite list of this chain
|
97
|
+
Innermost FramerDeframer should be first in the list. """
|
98
|
+
return [
|
99
|
+
SpacePacketFramerDeframer,
|
100
|
+
SpaceDataLinkFramerDeframer
|
101
|
+
]
|
102
|
+
|
103
|
+
@classmethod
|
104
|
+
def get_name(cls):
|
105
|
+
""" Name of this implementation provided to CLI """
|
106
|
+
return "space-packet-space-data-link"
|
@@ -0,0 +1,196 @@
|
|
1
|
+
"""F Prime Framer/Deframer Implementation of the CCSDS Space Data Link (TC/TM) Protocols"""
|
2
|
+
import sys
|
3
|
+
import struct
|
4
|
+
import copy
|
5
|
+
|
6
|
+
from fprime_gds.common.communication.framing import FramerDeframer
|
7
|
+
from fprime_gds.plugin.definitions import gds_plugin_implementation
|
8
|
+
|
9
|
+
import crc
|
10
|
+
|
11
|
+
|
12
|
+
class SpaceDataLinkFramerDeframer(FramerDeframer):
|
13
|
+
"""CCSDS Framer/Deframer Implementation for the TC (uplink / framing) and TM (downlink / deframing)
|
14
|
+
protocols. This FramerDeframer is used for framing TC data for uplink and deframing TM data for downlink.
|
15
|
+
"""
|
16
|
+
|
17
|
+
SEQUENCE_NUMBER_MAXIMUM = 256
|
18
|
+
TC_HEADER_SIZE = 5
|
19
|
+
TM_HEADER_SIZE = 6
|
20
|
+
TM_FIXED_FRAME_SIZE = 1024
|
21
|
+
TM_TRAILER_SIZE = 2
|
22
|
+
TC_TRAILER_SIZE = 2
|
23
|
+
|
24
|
+
# As per CCSDS standard, use CRC-16 CCITT config with init value
|
25
|
+
# all 1s and final XOR value of 0x0000
|
26
|
+
CRC_CCITT_CONFIG = crc.Configuration(
|
27
|
+
width=16,
|
28
|
+
polynomial=0x1021,
|
29
|
+
init_value=0xFFFF,
|
30
|
+
final_xor_value=0x0000,
|
31
|
+
)
|
32
|
+
CRC_CALCULATOR = crc.Calculator(CRC_CCITT_CONFIG)
|
33
|
+
|
34
|
+
def __init__(self, scid, vcid):
|
35
|
+
""" """
|
36
|
+
self.scid = scid
|
37
|
+
self.vcid = vcid
|
38
|
+
self.sequence_number = 0
|
39
|
+
|
40
|
+
def frame(self, data):
|
41
|
+
"""Frame the supplied data in a TC frame"""
|
42
|
+
space_packet_bytes = data
|
43
|
+
# CCSDS TC protocol defines the length token as number of bytes in full frame, minus 1
|
44
|
+
# so we add to packet size the size of the header and trailer and subtract 1
|
45
|
+
length = (
|
46
|
+
len(space_packet_bytes) + self.TC_HEADER_SIZE + self.TC_TRAILER_SIZE - 1
|
47
|
+
)
|
48
|
+
assert length < (pow(2, 10) - 1), "Length too-large for CCSDS format"
|
49
|
+
|
50
|
+
# CCSDS TC Header:
|
51
|
+
# 2b - 00 - TF version number
|
52
|
+
# 1b - 0/1 - 0 enable FARM checks, 1 bypass FARM
|
53
|
+
# 1b - 0/1 - 0 = data (Type-D), 1 = control information (Type-C)
|
54
|
+
# 2b - 00 - Reserved
|
55
|
+
# 10b - XX - Spacecraft id
|
56
|
+
# 6b - XX - Virtual Channel ID
|
57
|
+
# 10b - XX - Frame length
|
58
|
+
# 8b - XX - Frame sequence number
|
59
|
+
|
60
|
+
# First 16 bits:
|
61
|
+
header_val1_u16 = (
|
62
|
+
(0 << 14) | # TF version number (2 bits)
|
63
|
+
(1 << 13) | # Bypass FARM (1 bit)
|
64
|
+
(0 << 12) | # Type-D (1 bit)
|
65
|
+
(0 << 10) | # Reserved (2 bits)
|
66
|
+
((self.scid & 0x3FF)) # SCID (10 bits)
|
67
|
+
)
|
68
|
+
# Second 16 bits:
|
69
|
+
header_val2_u16 = (
|
70
|
+
((self.vcid & 0x3F) << 10) | # VCID (6 bits)
|
71
|
+
(length & 0x3FF) # Frame length (10 bits)
|
72
|
+
)
|
73
|
+
# 8 bit sequence number - always 0 in bypass FARM mode
|
74
|
+
header_val3_u8 = 0
|
75
|
+
header_bytes = struct.pack(">HHB", header_val1_u16, header_val2_u16, header_val3_u8)
|
76
|
+
full_bytes_no_crc = header_bytes + space_packet_bytes
|
77
|
+
assert (
|
78
|
+
len(header_bytes) == self.TC_HEADER_SIZE
|
79
|
+
), "CCSDS primary header must be 5 octets long"
|
80
|
+
assert len(full_bytes_no_crc) == self.TC_HEADER_SIZE + len(
|
81
|
+
data
|
82
|
+
), "Malformed packet generated"
|
83
|
+
|
84
|
+
full_bytes = full_bytes_no_crc + struct.pack(
|
85
|
+
">H", self.CRC_CALCULATOR.checksum(full_bytes_no_crc)
|
86
|
+
)
|
87
|
+
return full_bytes
|
88
|
+
|
89
|
+
def get_sequence_number(self):
|
90
|
+
"""Get the sequence number and increment - used for TM deframing
|
91
|
+
|
92
|
+
This function will return the current sequence number and then increment the sequence number for the next round.
|
93
|
+
|
94
|
+
Return:
|
95
|
+
current sequence number
|
96
|
+
"""
|
97
|
+
sequence = self.sequence_number
|
98
|
+
self.sequence_number = (self.sequence_number + 1) % self.SEQUENCE_NUMBER_MAXIMUM
|
99
|
+
return sequence
|
100
|
+
|
101
|
+
def deframe(self, data, no_copy=False):
|
102
|
+
"""Deframe TM frames"""
|
103
|
+
discarded = b""
|
104
|
+
if not no_copy:
|
105
|
+
data = copy.copy(data)
|
106
|
+
# Continue until there is not enough data for the header, or until a packet is found (return)
|
107
|
+
while len(data) >= self.TM_FIXED_FRAME_SIZE:
|
108
|
+
# Read header information
|
109
|
+
sc_and_channel_ids = struct.unpack_from(">H", data)
|
110
|
+
spacecraft_id = (sc_and_channel_ids[0] & 0x3FF0) >> 4
|
111
|
+
virtual_channel_id = (sc_and_channel_ids[0] & 0x000E) >> 1
|
112
|
+
# Check if the header is correct with regards to expected spacecraft and VC IDs
|
113
|
+
if spacecraft_id != self.scid or virtual_channel_id != self.vcid:
|
114
|
+
# If the header is invalid, rotate away a Byte and keep processing
|
115
|
+
discarded += data[0:1]
|
116
|
+
data = data[1:]
|
117
|
+
continue
|
118
|
+
# Spacecraft ID and Virtual Channel ID match, so we look at end of frame for CRC
|
119
|
+
crc_offset = self.TM_FIXED_FRAME_SIZE - self.TM_TRAILER_SIZE
|
120
|
+
transmitted_crc = struct.unpack_from(">H", data, crc_offset)[0]
|
121
|
+
if transmitted_crc == self.CRC_CALCULATOR.checksum(data[:crc_offset]):
|
122
|
+
# CRC is valid, so we return the deframed data
|
123
|
+
deframed_data_len = (
|
124
|
+
self.TM_FIXED_FRAME_SIZE
|
125
|
+
- self.TM_TRAILER_SIZE
|
126
|
+
- self.TM_HEADER_SIZE
|
127
|
+
)
|
128
|
+
deframed = struct.unpack_from(
|
129
|
+
f">{deframed_data_len}s", data, self.TM_HEADER_SIZE
|
130
|
+
)[0]
|
131
|
+
# Consume the fixed size frame
|
132
|
+
data = data[self.TM_FIXED_FRAME_SIZE :]
|
133
|
+
return deframed, data, discarded
|
134
|
+
|
135
|
+
print(
|
136
|
+
"[WARNING] Checksum validation failed.",
|
137
|
+
file=sys.stderr,
|
138
|
+
)
|
139
|
+
# Bad checksum, rotate 1 and keep looking for non-garbage
|
140
|
+
discarded += data[0:1]
|
141
|
+
data = data[1:]
|
142
|
+
continue
|
143
|
+
return None, data, discarded
|
144
|
+
|
145
|
+
@classmethod
|
146
|
+
def get_arguments(cls):
|
147
|
+
"""Arguments to request from the CLI"""
|
148
|
+
return {
|
149
|
+
("--scid",): {
|
150
|
+
"type": lambda input_arg: int(input_arg, 0),
|
151
|
+
"help": "Spacecraft ID",
|
152
|
+
"default": 0x44,
|
153
|
+
"required": False,
|
154
|
+
},
|
155
|
+
("--vcid",): {
|
156
|
+
"type": lambda input_arg: int(input_arg, 0),
|
157
|
+
"help": "Virtual channel ID",
|
158
|
+
"default": 1,
|
159
|
+
"required": False,
|
160
|
+
},
|
161
|
+
}
|
162
|
+
|
163
|
+
@classmethod
|
164
|
+
def check_arguments(cls, scid, vcid):
|
165
|
+
"""Check arguments from the CLI
|
166
|
+
|
167
|
+
Confirms that the input arguments are valid for this framer/deframer.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
scid: spacecraft id
|
171
|
+
vcid: virtual channel id
|
172
|
+
"""
|
173
|
+
if scid is None:
|
174
|
+
raise TypeError(f"Spacecraft ID not specified")
|
175
|
+
if scid < 0:
|
176
|
+
raise TypeError(f"Spacecraft ID {scid} is negative")
|
177
|
+
if scid > 0x3FF:
|
178
|
+
raise TypeError(f"Spacecraft ID {scid} is larger than {0x3FF}")
|
179
|
+
|
180
|
+
if vcid is None:
|
181
|
+
raise TypeError(f"Virtual Channel ID not specified")
|
182
|
+
if vcid < 0:
|
183
|
+
raise TypeError(f"Virtual Channel ID {vcid} is negative")
|
184
|
+
if vcid > 0x3F:
|
185
|
+
raise TypeError(f"Virtual Channel ID {vcid} is larger than {0x3FF}")
|
186
|
+
|
187
|
+
@classmethod
|
188
|
+
def get_name(cls):
|
189
|
+
"""Name of this implementation provided to CLI"""
|
190
|
+
return "raw-space-data-link"
|
191
|
+
|
192
|
+
@classmethod
|
193
|
+
@gds_plugin_implementation
|
194
|
+
def register_framing_plugin(cls):
|
195
|
+
"""Register the MyPlugin plugin"""
|
196
|
+
return cls
|