fprime-gds 4.0.2a2__tar.gz → 4.0.2a4__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.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/expect.txt +32 -19
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/PKG-INFO +1 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/pyproject.toml +2 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/distributor/distributor.py +9 -6
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/README.md +204 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/SPEC.md +183 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/bytecode/assembler.py +62 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/bytecode/directives.py +816 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/codegen.py +1464 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/grammar.lark +44 -9
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/main.py +63 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/model.py +799 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/parser.py +29 -34
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/test_helpers.py +119 -0
- fprime_gds-4.0.2a4/src/fprime_gds/common/fpy/types.py +563 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/dictionaries.py +23 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/standard.py +5 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/api.py +8 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/cli.py +9 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/run_deployment.py +2 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/app.py +17 -2
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/default_settings.py +1 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/index.html +7 -4
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/config.js +9 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/channel.js +16 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/event.js +1 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/fp-row.js +25 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/PKG-INFO +1 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/SOURCES.txt +7 -1
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/entry_points.txt +2 -1
- fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/RefTopologyDictionary.json +13174 -0
- fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/disabled_test_generated_seqs.py +149 -0
- fprime_gds-4.0.2a4/test/fprime_gds/common/fpy/test_seqs.py +1321 -0
- fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/README.md +0 -56
- fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/SPEC.md +0 -69
- fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/bytecode/directives.py +0 -490
- fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/codegen.py +0 -1687
- fprime_gds-4.0.2a2/src/fprime_gds/common/fpy/main.py +0 -40
- fprime_gds-4.0.2a2/test/fprime_gds/common/fpy/disabled_test_compiler.py +0 -765
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/codeql/security-pack.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/excludes.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/actions/spelling/patterns.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/pull_request_template.md +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/resources/RefTopologyAppDictionary.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/codeql-security-scan.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/fprime-gds-tests.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/gds-cli-tests.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/publish.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.github/workflows/spelling.yml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/.gitignore +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/Doxyfile +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/LICENSE.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/NOTICE.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/README.md +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/configs/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/README.md +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/_static/css/rtd_width.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/conf.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/gendoc.bash +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/docs/index.rst +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/examples/simple_sequence.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/examples/simple_sequence.seq +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/setup.cfg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/setup.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fastentrypoints.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/base.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/ip.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/adapters/uart.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/apid.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/chain.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/space_data_link.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ccsds/space_packet.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/checksum.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/framing.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/ground.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/communication/updown.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/controllers/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/ch_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/cmd_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/event_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/exceptions.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/file_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/pkt_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/data_types/sys_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/ch_decoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/decoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/event_decoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/file_decoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/decoders/pkt_decoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/distributor/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/ch_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/cmd_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/event_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/file_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/pkt_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/encoders/seq_writer.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/File Decoder Documentation.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/downlinker.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/helpers.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/files/uplinker.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/fpy/bytecode/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/base_commands.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/channels.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/command_send.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/events.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/filtering_utils.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/gds_cli/test_api_utils.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/handlers.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/chrono.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/history.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/ram.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/history/test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/ch_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/ch_xml_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/cmd_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/cmd_xml_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/dict_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/event_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/event_xml_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/fw_type_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/pkt_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/pkt_xml_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/prm_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/loaders/xml_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/data_logger.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/logger/test_logger.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/common/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/models/common/command.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/parsers/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/parsers/seq_file_parser.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/encoding.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/files.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/histories.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/publishing.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/pipeline/router.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/ch_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/cmd_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/data_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/event_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/pkt_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/templates/prm_template.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/predicates.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/testing_fw/pytest_integration.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/README.md +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/params.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/tools/seqgen.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/transport.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/config_manager.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/data_desc_type.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/event_severity.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/utils/string_util.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/common/zmq_transport.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/apps.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/comm.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/data_product_writer.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/dictionary_merge.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/fprime_cli.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/tcpserver.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/executables/utils.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/channels.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/commands.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/components.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/errors.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/events.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/json.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/logs.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/requirements.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/resource.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/sequence.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/.gitignore +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/misc.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/modules.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/static.iml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/.idea/vcs.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/advanced-settings/addon-templates.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/advanced-settings/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/channel-render-template.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/channel-render/channel-render.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/addon-templates.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/config.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-streaming.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/chartjs-plugin-zoom.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/modified-vendor/flat.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/sibling.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/chart.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/chartjs-adapter-luxon.min.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/chart-display/vendor/hammer.min.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/argument-templates.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/arguments.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-history-template.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-history.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-input-template.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-input.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-string-template.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/commanding/command-string.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/dictionary/addon-templates.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/dictionary/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/enabled.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/image-display/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/image-display/dashboard.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/README.md +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/addon-templates.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/addon.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/autocomplete.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/lint.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/code-mirror.es.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/.gitignore +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/index.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/language.grammer +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/package.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/addons/sequencer/third/rollup/rollup.config.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/css/fprime.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/css/fpstyle.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/favicon.ico +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/error.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/logo.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/img/success.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/datastore.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/gds.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/json.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/loader.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/performance.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/settings.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/uploader.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/validate.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard-box.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard-row.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/dashboard.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/downlink.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/fptable.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/log.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/tabetc.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/uplink.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/js/vue-support/utils.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/all.min.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/bootstrap.min.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/css/vue-select.css +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/luxon.min.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/sorttable.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/v-runtime-template.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/vue-select.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/js/vue.min.js +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.eot +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.ttf +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-brands-400.woff2 +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.eot +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.ttf +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-regular-400.woff2 +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.eot +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.svg +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.ttf +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/static/third-party/webfonts/fa-solid-900.woff2 +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/stats.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/flask/updown.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/__init__.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/definitions.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/plugin/system.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds/version.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/dependency_links.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/requires.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/src/fprime_gds.egg-info/top_level.txt +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/communication/ccsds/test_space_data_link.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/communication/ccsds/test_space_packet.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/data_types/test_cmd_data.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/distributor/test_distributor.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_ch_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_event_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/encoders/test_pkt_encoder.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/gds_cli/filtering_utils_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/gds_cli/utils_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/history/chronohistory_unit_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/history/testhistory_unit_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/loaders/resources/RefTopologyDictionary.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/loaders/test_json_loader.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/UnitTestDictionary.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/api_unit_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/logs/.gitignore +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/testing_fw/predicate_unit_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/expected/simple_expected.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/expected/simple_paramdb.dat +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_bad_paramdb.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_bad_sequence.seq +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_paramdb.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/input/simple_sequence.seq +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/resources/simple_dictionary.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/resources/simple_dictionary.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/seqgen_unit_test.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/tools/test_paramdb_gen.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/common/utils/test_string_util.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/.gitignore +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/dictionary.json +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeBool.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeComplex.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeDataArray.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeEnum.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeF32.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeF64.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeFppArray.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI16.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI32.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI64.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeI8.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU32.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU32Array.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/dp_writer_data/makeU8Array.bin +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_data_product_writer.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_run_deployment.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/executables/test_utils.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/sample/dictionary.xml +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/fprime_gds/test_plugins.py +0 -0
- {fprime_gds-4.0.2a2 → fprime_gds-4.0.2a4}/test/gui/GUI_Test_Procedure.md +0 -0
@@ -29,6 +29,7 @@ BGR
|
|
29
29
|
Biberstein
|
30
30
|
bibtex
|
31
31
|
bitmaps
|
32
|
+
bitwidth
|
32
33
|
breadcrumb
|
33
34
|
Btns
|
34
35
|
BUGLIST
|
@@ -84,7 +85,7 @@ deframed
|
|
84
85
|
deframer
|
85
86
|
deframing
|
86
87
|
DEPRECATEDLIST
|
87
|
-
|
88
|
+
DESER
|
88
89
|
Deserial
|
89
90
|
deserializes
|
90
91
|
dests
|
@@ -136,26 +137,27 @@ fastentrypoints
|
|
136
137
|
fbuild
|
137
138
|
fd
|
138
139
|
FEEDNAME
|
139
|
-
|
140
|
+
feq
|
140
141
|
FFCC
|
141
142
|
FFFF
|
142
|
-
|
143
|
-
|
143
|
+
fge
|
144
|
+
fgt
|
144
145
|
fileurl
|
145
146
|
Firefox
|
146
|
-
|
147
|
+
fle
|
147
148
|
focusring
|
148
|
-
|
149
|
+
fne
|
149
150
|
FONTNAME
|
150
151
|
FONTPATH
|
151
152
|
FONTSIZE
|
152
|
-
|
153
|
+
fpext
|
153
154
|
fpp
|
155
|
+
fpow
|
154
156
|
fprime
|
155
157
|
fptable
|
156
|
-
|
157
|
-
|
158
|
-
|
158
|
+
fptosi
|
159
|
+
fptoui
|
160
|
+
fptrunc
|
159
161
|
fpy
|
160
162
|
fpybc
|
161
163
|
fqn
|
@@ -188,11 +190,11 @@ idk
|
|
188
190
|
idl
|
189
191
|
idx
|
190
192
|
ieeetr
|
191
|
-
|
193
|
+
ieq
|
192
194
|
ified
|
193
195
|
ifun
|
194
196
|
IH
|
195
|
-
|
197
|
+
ine
|
196
198
|
inprogress
|
197
199
|
intersphinx
|
198
200
|
intlimits
|
@@ -201,6 +203,7 @@ ipc
|
|
201
203
|
ipp
|
202
204
|
issuecomment
|
203
205
|
itcl
|
206
|
+
itrunc
|
204
207
|
ixx
|
205
208
|
janamian
|
206
209
|
jawest
|
@@ -228,7 +231,7 @@ logdir
|
|
228
231
|
logpath
|
229
232
|
logselect
|
230
233
|
luxon
|
231
|
-
|
234
|
+
lvar
|
232
235
|
makeindex
|
233
236
|
MAKEVAR
|
234
237
|
marijnh
|
@@ -278,6 +281,7 @@ paramdb
|
|
278
281
|
passthrough
|
279
282
|
pb
|
280
283
|
pdflatex
|
284
|
+
pemdas
|
281
285
|
PERLMOD
|
282
286
|
pkts
|
283
287
|
plainnat
|
@@ -316,6 +320,7 @@ recuring
|
|
316
320
|
recvd
|
317
321
|
recvs
|
318
322
|
reder
|
323
|
+
referenceable
|
319
324
|
removeit
|
320
325
|
reqparse
|
321
326
|
riverbankcomputing
|
@@ -326,27 +331,31 @@ rst
|
|
326
331
|
saba
|
327
332
|
scid
|
328
333
|
sdd
|
334
|
+
sdiv
|
329
335
|
searchdata
|
330
336
|
Segoe
|
331
337
|
seqfile
|
332
338
|
seqgen
|
333
339
|
serializables
|
334
340
|
serialutil
|
335
|
-
|
336
|
-
|
341
|
+
sge
|
342
|
+
sgt
|
337
343
|
showinitializer
|
338
344
|
sideeffect
|
345
|
+
siext
|
339
346
|
SIGALRM
|
340
|
-
|
347
|
+
signedness
|
348
|
+
sitofp
|
341
349
|
sizeb
|
350
|
+
sle
|
342
351
|
SMAP
|
343
352
|
Smath
|
353
|
+
smod
|
344
354
|
smth
|
345
355
|
SNDHWM
|
346
356
|
sorttable
|
347
357
|
spacepacket
|
348
358
|
squashify
|
349
|
-
sreg
|
350
359
|
sss
|
351
360
|
Ssymbols
|
352
361
|
stackoverflow
|
@@ -393,11 +402,13 @@ typedef
|
|
393
402
|
uart
|
394
403
|
ucf
|
395
404
|
udp
|
396
|
-
|
405
|
+
udiv
|
406
|
+
uge
|
397
407
|
UIs
|
398
|
-
|
408
|
+
uitofp
|
399
409
|
uk
|
400
410
|
ul
|
411
|
+
umod
|
401
412
|
UNINIT
|
402
413
|
updown
|
403
414
|
upfiles
|
@@ -416,6 +427,7 @@ viewcode
|
|
416
427
|
vle
|
417
428
|
vname
|
418
429
|
VRuntime
|
430
|
+
vuejs
|
419
431
|
vw
|
420
432
|
Watney
|
421
433
|
webified
|
@@ -432,4 +444,5 @@ xmlpath
|
|
432
444
|
xy
|
433
445
|
zeromq
|
434
446
|
zmq
|
447
|
+
ziext
|
435
448
|
zimri
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: fprime-gds
|
3
|
-
Version: 4.0.
|
3
|
+
Version: 4.0.2a4
|
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:
|
@@ -66,7 +66,8 @@ fprime-seqgen = "fprime_gds.common.tools.seqgen:main"
|
|
66
66
|
fprime-dp-write = "fprime_gds.executables.data_product_writer:main"
|
67
67
|
fprime-gds = "fprime_gds.executables.run_deployment:main"
|
68
68
|
fprime-prm-write = "fprime_gds.common.tools.params:main"
|
69
|
-
fprime-fpyc = "fprime_gds.common.fpy.main:
|
69
|
+
fprime-fpyc = "fprime_gds.common.fpy.main:compile_main"
|
70
|
+
fprime-fpy-model = "fprime_gds.common.fpy.main:model_main"
|
70
71
|
fprime-merge-dictionary = "fprime_gds.executables.dictionary_merge:main"
|
71
72
|
|
72
73
|
# For Pytest fixtures
|
@@ -16,6 +16,7 @@ descriptor header will be passed on to the registered objects.
|
|
16
16
|
|
17
17
|
import logging
|
18
18
|
|
19
|
+
from fprime.common.models.serialize.type_exceptions import DeserializeException
|
19
20
|
from fprime_gds.common.decoders.decoder import DecodingException
|
20
21
|
from fprime_gds.common.handlers import DataHandler
|
21
22
|
from fprime_gds.common.utils import config_manager, data_desc_type
|
@@ -147,7 +148,6 @@ class Distributor(DataHandler):
|
|
147
148
|
# | ... | |
|
148
149
|
# | .. | |
|
149
150
|
# . :
|
150
|
-
|
151
151
|
offset = 0
|
152
152
|
|
153
153
|
# Parse length
|
@@ -199,13 +199,16 @@ class Distributor(DataHandler):
|
|
199
199
|
), "Leftover data is not equivalent to the remaining data in buffer"
|
200
200
|
|
201
201
|
for raw_msg in raw_msgs:
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
202
|
+
try:
|
203
|
+
(length, data_desc, msg) = self.parse_raw_msg_api(raw_msg)
|
204
|
+
data_desc_key = data_desc_type.DataDescType(data_desc).name
|
205
|
+
except DeserializeException as deserialize_exception:
|
206
|
+
LOGGER.warning(f"Invalid message: {deserialize_exception}")
|
207
|
+
return
|
208
|
+
decoders = self.__decoders.get(data_desc_key, None)
|
207
209
|
if not decoders:
|
208
210
|
LOGGER.warning(f"No decoder registered for: {data_desc_key}")
|
211
|
+
return
|
209
212
|
|
210
213
|
for d in decoders:
|
211
214
|
try:
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# Fpy Guide
|
2
|
+
|
3
|
+
Fpy is an easy to learn, powerful spacecraft scripting language backed by decades of JPL heritage. It is designed to work with the FPrime flight software framework. The syntax is inspired by Python, and it compiles to an efficient binary format.
|
4
|
+
|
5
|
+
This guide is a quick overview of the most important features of Fpy. It should be easy to follow for someone who has used Python and FPrime before.
|
6
|
+
|
7
|
+
## 1. Compiling and Running a Sequence
|
8
|
+
|
9
|
+
First, make sure `fprime-gds` is installed.
|
10
|
+
|
11
|
+
Fpy sequences are suffixed with `.fpy`. Let's make a test sequence that dispatches a no-op:
|
12
|
+
```py
|
13
|
+
# hash denotes a comment
|
14
|
+
# assume this file is named "test.fpy"
|
15
|
+
|
16
|
+
# use the full name of the no-op command:
|
17
|
+
CdhCore.cmdDisp.CMD_NO_OP() # empty parentheses indicate no arguments
|
18
|
+
```
|
19
|
+
|
20
|
+
You can compile it with `fprime-fpyc test.fpy --dictionary Ref/build-artifacts/Linux/dict/RefTopologyDictionary.json`
|
21
|
+
|
22
|
+
Make sure your deployment topology has an instance of the `Svc.FpySequencer` component. You can run the sequence by passing it in as an argument to the `Svc.FpySequencer.RUN` command.
|
23
|
+
|
24
|
+
## 2. Variables and Basic Types
|
25
|
+
|
26
|
+
Fpy supports statically-typed, mutable local variables. You can change their value, but the type of the variable can't change.
|
27
|
+
|
28
|
+
This is how you declare a variable, and change its value:
|
29
|
+
```py
|
30
|
+
unsigned_var: U8 = 0
|
31
|
+
# this is a variable named unsigned_var with a type of unsigned 8-bit integer and a value of 0
|
32
|
+
|
33
|
+
unsigned_var = 123
|
34
|
+
# now it has a value of 123
|
35
|
+
```
|
36
|
+
|
37
|
+
For types, Fpy has most of the same basic ones that FPP does:
|
38
|
+
* Signed integers: `I8, I16, I32, I64`
|
39
|
+
* Unsigned integers: `U8, U16, U32, U64`
|
40
|
+
* Floats: `F32, F64`
|
41
|
+
* Boolean: `bool`
|
42
|
+
|
43
|
+
Float literals are denoted with a decimal point (`5.0`, `0.123`) and Boolean literals have a capitalized first letter: `True`, `False`. There is no way to differentiate between signed and unsigned integer literals, so the compiler looks at where the literal is used to determine the signedness.
|
44
|
+
|
45
|
+
Note there is currently no built-in `string` type. See [Strings](#13-strings).
|
46
|
+
|
47
|
+
## 3. Dictionary Types
|
48
|
+
|
49
|
+
Fpy also has access to all structs, arrays and enums in the FPrime dictionary:
|
50
|
+
```py
|
51
|
+
# you can access enum constants by name:
|
52
|
+
enum_var: Fw.Success = Fw.Success.SUCCESS
|
53
|
+
|
54
|
+
# you can construct arrays:
|
55
|
+
array_var: Ref.DpDemo.U32Array = Ref.DpDemo.U32Array(0, 1, 2, 3, 4)
|
56
|
+
|
57
|
+
# you can construct structs:
|
58
|
+
struct_var: Ref.SignalPair = Ref.SignalPair(0.0, 1.0)
|
59
|
+
```
|
60
|
+
|
61
|
+
In general, the syntax for instantiating a struct or array type is `Full.Type.Name(arg, ..., arg)`.
|
62
|
+
|
63
|
+
## 4. Math
|
64
|
+
You can do basic math and store the result in variables in Fpy:
|
65
|
+
```py
|
66
|
+
pemdas: F32 = 1 - 2 + 3 * 4 + 10 / 5 * 2 # == 15.0
|
67
|
+
```
|
68
|
+
|
69
|
+
Fpy supports the following math operations:
|
70
|
+
* Basic arithmetic: `+, -, *, /`
|
71
|
+
* Modulo: `%`
|
72
|
+
* Exponentiation: `**`
|
73
|
+
* Floor division: `//`
|
74
|
+
* Natural logarithm: `log(x)`
|
75
|
+
|
76
|
+
The behavior of these operators is designed to mimic Python. Note that **division always returns a float**. This means that `5 / 2 == 2.5`, not `2`. This may be confusing coming from C++, but it is consistent with Python.
|
77
|
+
|
78
|
+
## 5. Variable Arguments to Commands
|
79
|
+
|
80
|
+
Where this really gets interesting is when you pass variables or expressions into commands:
|
81
|
+
```py
|
82
|
+
# this is a command that takes an F32
|
83
|
+
Ref.recvBuffComp.PARAMETER4_PRM_SET(1 - 2 + 3 * 4 + 10 / 5 * 2)
|
84
|
+
# alternatively:
|
85
|
+
param4: F32 = 15.0
|
86
|
+
Ref.recvBuffComp.PARAMETER4_PRM_SET(param4)
|
87
|
+
```
|
88
|
+
|
89
|
+
The same syntax works with the [`sleep`](#11-relative-and-absolute-sleep), [`exit`](#12-exit-macro), and `log` macros.
|
90
|
+
|
91
|
+
There are some restrictions on passing string values, or complex types containing string values, to commands. See [Strings](#13-strings).
|
92
|
+
|
93
|
+
## 6. Getting Telemetry Channels
|
94
|
+
|
95
|
+
Fpy supports getting the value of telemetry channels:
|
96
|
+
```py
|
97
|
+
cmds_dispatched: U32 = CdhCore.cmdDisp.CommandsDispatched
|
98
|
+
|
99
|
+
signal_pair: Ref.SignalPair = Ref.SG1.PairOutput
|
100
|
+
```
|
101
|
+
|
102
|
+
It's important to note that if your component hasn't written telemetry to the telemetry database (`TlmPacketizer` or `TlmChan`) in a while, the value the sequence sees may be old. Make sure to regularly write your telemetry!
|
103
|
+
|
104
|
+
## 7. Getting Parameters
|
105
|
+
|
106
|
+
Fpy supports getting the value of parameters:
|
107
|
+
```py
|
108
|
+
prm_3: U8 = Ref.sendBuffComp.parameter3
|
109
|
+
```
|
110
|
+
|
111
|
+
A significant limitation of this is that it will only return the value most recently saved to the parameter database. This means you must command `_PRM_SAVE` before the sequence will see the new value.
|
112
|
+
|
113
|
+
## 8. Conditionals
|
114
|
+
Fpy supports comparison operators:
|
115
|
+
```py
|
116
|
+
value: bool = 1 > 2 and (3 + 4) != 5
|
117
|
+
```
|
118
|
+
* Inequalities: `>, <, >=, <=`
|
119
|
+
* Equalities: `==, !=`
|
120
|
+
* Boolean functions: `and, or, not`
|
121
|
+
|
122
|
+
|
123
|
+
The inequality operators can compare two numbers of any type together. The equality operators, in addition to comparing numbers, can check for equality between two of the same complex type:
|
124
|
+
```py
|
125
|
+
record1: Svc.DpRecord = Svc.DpRecord(0, 1, 2, 3, 4, 5, Fw.DpState.UNTRANSMITTED)
|
126
|
+
record2: Svc.DpRecord = Svc.DpRecord(0, 1, 2, 3, 4, 5, Fw.DpState.UNTRANSMITTED)
|
127
|
+
records_equal: bool = record1 == record2 # == True
|
128
|
+
```
|
129
|
+
## 9. If/elif/else
|
130
|
+
|
131
|
+
You can branch off of conditionals with `if`, `elif` and `else`:
|
132
|
+
```py
|
133
|
+
random_value: I8 = 4 # chosen by fair dice roll. guaranteed to be random
|
134
|
+
|
135
|
+
if random_value < 0:
|
136
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("won't happen")
|
137
|
+
elif random_value > 0 and random_value <= 6:
|
138
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("should happen!")
|
139
|
+
else:
|
140
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("uh oh...")
|
141
|
+
```
|
142
|
+
|
143
|
+
This is particularly useful for checking telemetry channel values:
|
144
|
+
```py
|
145
|
+
# dispatch a no-op
|
146
|
+
CdhCore.cmdDisp.CMD_NO_OP()
|
147
|
+
# the commands dispatched count should be >= 1
|
148
|
+
if CdhCore.cmdDisp.CommandsDispatched >= 1:
|
149
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("should happen")
|
150
|
+
```
|
151
|
+
|
152
|
+
## 10. Getting Struct Members and Array Items
|
153
|
+
|
154
|
+
You can access members of structs by name, or array elements by index:
|
155
|
+
```py
|
156
|
+
# access struct members with "." syntax
|
157
|
+
signal_pair_time: F32 = Ref.SG1.PairOutput.time
|
158
|
+
|
159
|
+
# access array elements with "[]" syntax
|
160
|
+
com_queue_depth_0: U32 = ComCcsds.comQueue.comQueueDepth[0]
|
161
|
+
```
|
162
|
+
|
163
|
+
You cannot reassign struct members or array elements however:
|
164
|
+
```py
|
165
|
+
# Ref.SignalPair is a struct type
|
166
|
+
signal_pair: Ref.SignalPair = Ref.SG1.PairOutput
|
167
|
+
# compiler error:
|
168
|
+
signal_pair.time = 0.2
|
169
|
+
|
170
|
+
# Svc.ComQueueDepth is an array type
|
171
|
+
com_queue_depth: Svc.ComQueueDepth = ComCcsds.comQueue.comQueueDepth
|
172
|
+
# compiler error:
|
173
|
+
com_queue_depth[0] = 1
|
174
|
+
```
|
175
|
+
|
176
|
+
## 11. Relative and Absolute Sleep
|
177
|
+
You can pause the execution of a sequence for a relative duration, or until an absolute time:
|
178
|
+
```py
|
179
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("second 0")
|
180
|
+
# sleep for 1 second and 0 microseconds
|
181
|
+
sleep(1, 0)
|
182
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("second 1")
|
183
|
+
|
184
|
+
|
185
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("today")
|
186
|
+
# sleep until 12345678900 seconds and 0 microseconds after the epoch
|
187
|
+
sleep_until(0, 0, 12345678900, 0)
|
188
|
+
CdhCore.cmdDisp.CMD_NO_OP_STRING("much later")
|
189
|
+
```
|
190
|
+
|
191
|
+
Make sure that the `Svc.FpySequencer.checkTimers` port is connected to a rate group. The sequencer only checks if a sleep is done when the port is called, so the more frequently you call it, the more accurate the wakeup time.
|
192
|
+
|
193
|
+
## 12. Exit Macro
|
194
|
+
You can end the execution of the sequence early by calling the `exit` macro:
|
195
|
+
```py
|
196
|
+
# exit takes a boolean argument
|
197
|
+
# True means "end the sequence without an error"
|
198
|
+
exit(True)
|
199
|
+
# False means "end the sequence and raise an error"
|
200
|
+
exit(False)
|
201
|
+
```
|
202
|
+
|
203
|
+
## 13. Strings
|
204
|
+
Fpy does not support a fully-fledged `string` type yet. You can pass a string literal as an argument to a command, but you cannot pass a string from a telemetry channel. You also cannot store a string in a variable, or perform any string manipulation. These features will be added in a later Fpy update.
|
@@ -0,0 +1,183 @@
|
|
1
|
+
Nothing type is a type whose set of values is an empty set
|
2
|
+
Unit type is a type whose set of values is a set with one element
|
3
|
+
BIG question: what if we made an arbitrary precision int type? and float type?
|
4
|
+
|
5
|
+
# Types
|
6
|
+
|
7
|
+
The following types are built into Fpy, and the developer can directly refer to them by name:
|
8
|
+
* Numeric types: `U8, U16, U32, U64, I8, I16, I32, I64, F32, F64`
|
9
|
+
* Boolean type: `bool`
|
10
|
+
* Time type: `Fw.Time`
|
11
|
+
|
12
|
+
In addition, the developer can directly refer to any displayable type defined in FPP via its fully-qualified name. This includes user-defined structs, arrays and enums.
|
13
|
+
|
14
|
+
There are some types which exist in Fpy but cannot be directly referenced by name by the developer. These are the internal *Int*, and *String* types. See [literals](#literals).
|
15
|
+
|
16
|
+
## Structs
|
17
|
+
You can instantiate a new struct at runtime by calling its constructor. A struct's constructor is a function with the same name as the type, with arguments corresponding to the type and position of the struct's members. For example, a struct defined as:
|
18
|
+
```
|
19
|
+
module Fw {
|
20
|
+
struct Example {
|
21
|
+
intValue: U8
|
22
|
+
boolValue: bool
|
23
|
+
}
|
24
|
+
}
|
25
|
+
```
|
26
|
+
can be constructed in Fpy like:
|
27
|
+
```
|
28
|
+
Fw.Example(0, True)
|
29
|
+
```
|
30
|
+
|
31
|
+
|
32
|
+
# Literals
|
33
|
+
The following literals are supported by Fpy:
|
34
|
+
* Integer literals: `123`, `-456_879`
|
35
|
+
* Float literals: `0.123`, `1e-5`
|
36
|
+
* String literals: `"hello world"`, `'example string'`
|
37
|
+
* Boolean literals: `True` and `False`
|
38
|
+
|
39
|
+
## Integer literals
|
40
|
+
Integer literals are strings matching:
|
41
|
+
```
|
42
|
+
DEC_NUMBER: "1".."9" ("_"? "0".."9" )*
|
43
|
+
| "0" ("_"? "0" )* /(?![1-9])/
|
44
|
+
```
|
45
|
+
|
46
|
+
The first rule of this syntax allows for integers without leading zeroes, separated by underscores. So this is okay:
|
47
|
+
```
|
48
|
+
123_456
|
49
|
+
```
|
50
|
+
but this is not:
|
51
|
+
```
|
52
|
+
0123_456
|
53
|
+
```
|
54
|
+
|
55
|
+
The second rule allows you to write any number of zeroes, separated by underscores:
|
56
|
+
```
|
57
|
+
00_000_0
|
58
|
+
```
|
59
|
+
|
60
|
+
Integer literals have a internal type *Int*, which is not directly referenceable by the user. The *Int* type supports integers of arbitrary size.
|
61
|
+
|
62
|
+
## Float literals
|
63
|
+
Float literals are strings matching:
|
64
|
+
```
|
65
|
+
FLOAT_NUMBER: _SPECIAL_DEC _EXP | DECIMAL _EXP?
|
66
|
+
```
|
67
|
+
where `_SPECIAL_DEC`, `_EXP` and `DECIMAL` are defined as:
|
68
|
+
|
69
|
+
```
|
70
|
+
_SPECIAL_DEC: "0".."9" ("_"? "0".."9")*
|
71
|
+
_EXP: ("e"|"E") ["+" | "-"] _SPECIAL_DEC
|
72
|
+
DECIMAL: "." _SPECIAL_DEC | _SPECIAL_DEC "." _SPECIAL_DEC?
|
73
|
+
```
|
74
|
+
|
75
|
+
A `FLOAT_NUMBER` can be any string of digits suffixed with an exponent, like these:
|
76
|
+
```
|
77
|
+
1e-5
|
78
|
+
100_200e10
|
79
|
+
```
|
80
|
+
|
81
|
+
or it can be a `DECIMAL` optionally suffixed by an exponent, like these:
|
82
|
+
```
|
83
|
+
1.
|
84
|
+
2.123
|
85
|
+
100.5e+10
|
86
|
+
```
|
87
|
+
|
88
|
+
Float literals are of type `F64`.
|
89
|
+
|
90
|
+
## String literals
|
91
|
+
String literals are strings matching:
|
92
|
+
```
|
93
|
+
STRING: /("(?!"").*?(?<!\\)(\\\\)*?"|'(?!'').*?(?<!\\)(\\\\)*?')/i
|
94
|
+
```
|
95
|
+
|
96
|
+
They have a internal type *String*, which is not directly referenceable by the user. The *String* type supports strings of arbitrary length.
|
97
|
+
|
98
|
+
# Functions
|
99
|
+
Functions have arguments and a return type. You can call a function like:
|
100
|
+
```
|
101
|
+
function_name(arg_1, arg_2, arg_3)
|
102
|
+
```
|
103
|
+
|
104
|
+
## Commands
|
105
|
+
|
106
|
+
|
107
|
+
# Type conversion
|
108
|
+
|
109
|
+
Type conversion is the process of converting an expression from one type to another. It can either be implicit, in which case it is called coercion, or explicit, in which case it is called casting.
|
110
|
+
|
111
|
+
## Coercion
|
112
|
+
Coercion happens when an expression of type *A* is used in a syntactic element which requires an expression of type *B*. For example, functions, operators and variable assignments all require specific input types, so type coercion happens in each of these.
|
113
|
+
|
114
|
+
When type coercion happens, the following type conversion rules are applied:
|
115
|
+
|
116
|
+
1. Expressions of any integer type can be converted to any signed or unsigned integer or float type.
|
117
|
+
2. Expressions of any float type can be converted to any float type.
|
118
|
+
3. Expressions of internal type *String* can be converted to any string type.
|
119
|
+
|
120
|
+
TODO try out with forcing type casting--see what the FF's think
|
121
|
+
TODO require explicit narrowing casts? or have a compiler warning?
|
122
|
+
TODO consider float to int conversion?
|
123
|
+
TODO consider adding constants
|
124
|
+
|
125
|
+
If no rule matches, then the compiler raises an error.
|
126
|
+
|
127
|
+
There is currently no support for converting non-internal string expressions to other string expressions.
|
128
|
+
|
129
|
+
# Operators
|
130
|
+
|
131
|
+
Fpy supports the following operators:
|
132
|
+
* Basic arithmetic: `+, -, *, /`
|
133
|
+
* Modulo: `%`
|
134
|
+
* Exponentiation: `**`
|
135
|
+
* Floor division: `//`
|
136
|
+
* Boolean: `and, or, not`
|
137
|
+
* Comparison: `<, >, <=, >=, ==, !=`
|
138
|
+
|
139
|
+
Each time an operator is used, an intermediate type must be picked and both args must be converted to that type.
|
140
|
+
|
141
|
+
## Behavior of operators
|
142
|
+
|
143
|
+
### Addition (`+`)
|
144
|
+
### Subtraction (`-`)
|
145
|
+
### Multiplication (`*`)
|
146
|
+
### Division (`/`)
|
147
|
+
### Modulo (`%`)
|
148
|
+
### Exponentiation (`**`)
|
149
|
+
### Floor division (`//`)
|
150
|
+
### And (`and`)
|
151
|
+
### Or (`or`)
|
152
|
+
### Not (`not`)
|
153
|
+
|
154
|
+
|
155
|
+
## Intermediate types
|
156
|
+
|
157
|
+
Intermediate types are picked via the following rules:
|
158
|
+
|
159
|
+
1. The intermediate type of Boolean operators is always `bool`.
|
160
|
+
2. The intermediate type of `==` and `!=` may be any type, so long as the left and right hand sides are the same type. If both are numeric then continue.
|
161
|
+
3. If either argument is non-numeric, raise an error.
|
162
|
+
4. If the operator is `/` or `**`, the intermediate type is always `F64`.
|
163
|
+
5. If either argument is a float, the intermediate type is `F64`.
|
164
|
+
6. If either argument is an unsigned integer, the intermediate type is `U64`.
|
165
|
+
7. Otherwise, the intermediate type is `I64`.
|
166
|
+
|
167
|
+
If the expressions given to the operator are not of the intermediate type, type coercion rules are applied.
|
168
|
+
|
169
|
+
## Result type
|
170
|
+
|
171
|
+
The result type is the type of the value produced by the operator.
|
172
|
+
1. For numeric operators, the result type is the intermediate type.
|
173
|
+
2. For boolean and comparison operators, the result type is `bool`.
|
174
|
+
|
175
|
+
Normal type coercion rules apply to the result, of course. Once the operator has produced a value, it may be coerced into some other type depending on context.
|
176
|
+
|
177
|
+
|
178
|
+
# Macros
|
179
|
+
|
180
|
+
## exit
|
181
|
+
## log
|
182
|
+
## sleep
|
183
|
+
## sleep_until
|
@@ -0,0 +1,62 @@
|
|
1
|
+
from dataclasses import astuple, dataclass
|
2
|
+
import struct
|
3
|
+
import zlib
|
4
|
+
from fprime_gds.common.fpy.bytecode.directives import Directive
|
5
|
+
from pathlib import Path
|
6
|
+
|
7
|
+
HEADER_FORMAT = "!BBBBBHI"
|
8
|
+
HEADER_SIZE = struct.calcsize(HEADER_FORMAT)
|
9
|
+
|
10
|
+
|
11
|
+
@dataclass
|
12
|
+
class Header:
|
13
|
+
majorVersion: int
|
14
|
+
minorVersion: int
|
15
|
+
patchVersion: int
|
16
|
+
schemaVersion: int
|
17
|
+
argumentCount: int
|
18
|
+
statementCount: int
|
19
|
+
bodySize: int
|
20
|
+
|
21
|
+
|
22
|
+
FOOTER_FORMAT = "!I"
|
23
|
+
FOOTER_SIZE = struct.calcsize(FOOTER_FORMAT)
|
24
|
+
|
25
|
+
SCHEMA_VERSION = 2
|
26
|
+
|
27
|
+
|
28
|
+
@dataclass
|
29
|
+
class Footer:
|
30
|
+
crc: int
|
31
|
+
|
32
|
+
|
33
|
+
def serialize_directives(dirs: list[Directive], output: Path):
|
34
|
+
output_bytes = bytes()
|
35
|
+
|
36
|
+
for dir in dirs:
|
37
|
+
output_bytes += dir.serialize()
|
38
|
+
|
39
|
+
header = Header(0, 0, 0, SCHEMA_VERSION, 0, len(dirs), len(output_bytes))
|
40
|
+
output_bytes = struct.pack(HEADER_FORMAT, *astuple(header)) + output_bytes
|
41
|
+
|
42
|
+
crc = zlib.crc32(output_bytes) % (1 << 32)
|
43
|
+
footer = Footer(crc)
|
44
|
+
output_bytes += struct.pack(FOOTER_FORMAT, *astuple(footer))
|
45
|
+
output.write_bytes(output_bytes)
|
46
|
+
|
47
|
+
|
48
|
+
def deserialize_directives(bytes: bytes) -> list[Directive]:
|
49
|
+
header = Header(*struct.unpack_from(HEADER_FORMAT, bytes))
|
50
|
+
|
51
|
+
dirs = []
|
52
|
+
idx = 0
|
53
|
+
offset = HEADER_SIZE
|
54
|
+
while idx < header.statementCount:
|
55
|
+
offset_and_dir = Directive.deserialize(bytes, offset)
|
56
|
+
if offset_and_dir is None:
|
57
|
+
raise RuntimeError("Unable to deserialize sequence")
|
58
|
+
offset, dir = offset_and_dir
|
59
|
+
dirs.append(dir)
|
60
|
+
idx += 1
|
61
|
+
|
62
|
+
return dirs
|