cosmos 4.2.4-java → 4.5.0-java
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.
- checksums.yaml +4 -4
- data/.dockerignore +2 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
- data/.gitignore +2 -0
- data/.travis.yml +6 -6
- data/Dockerfile +69 -0
- data/Gemfile +1 -1
- data/Manifest.txt +130 -46
- data/README.md +9 -0
- data/Rakefile +57 -0
- data/appveyor.yml +18 -7
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
- data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
- data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
- data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
- data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
- data/autohotkey/procedures/collect.rb +2 -2
- data/autohotkey/procedures/collect_util.rb +1 -1
- data/autohotkey/procedures/script_test.rb +1 -1
- data/autohotkey/tools/CmdSenderAHK2 +18 -0
- data/autohotkey/tools/cmd_sender.ahk +34 -6
- data/autohotkey/tools/cmd_sender2.ahk +4 -0
- data/autohotkey/tools/cmd_sequence.ahk +36 -22
- data/autohotkey/tools/cmd_sequence2.ahk +1 -1
- data/autohotkey/tools/config_editor.ahk +5 -5
- data/autohotkey/tools/launcher.ahk +1 -0
- data/autohotkey/tools/limits_monitor.ahk +1 -1
- data/autohotkey/tools/packet_viewer.ahk +7 -6
- data/autohotkey/tools/script_runner.ahk +16 -4
- data/autohotkey/tools/test_runner.ahk +8 -8
- data/bin/cosmos +38 -1
- data/bin/cstol_converter +1 -1
- data/bin/dart_util +0 -0
- data/bin/rubysloc +73 -28
- data/bin/xtce_converter +1 -1
- data/cosmos.gemspec +7 -9
- data/data/config/_interfaces.yaml +4 -0
- data/data/config/cmd_sequence.yaml +14 -0
- data/data/config/command_modifiers.yaml +16 -1
- data/data/config/housekeeping_params.yaml +14 -0
- data/data/config/interface_modifiers.yaml +14 -2
- data/data/config/item_modifiers.yaml +11 -1
- data/data/config/launcher.yaml +12 -2
- data/data/config/param_item_modifiers.yaml +7 -2
- data/data/config/parameter_modifiers.yaml +20 -0
- data/data/config/screen.yaml +2 -0
- data/data/config/script_runner.yaml +9 -0
- data/data/config/system.yaml +152 -28
- data/data/config/table_manager.yaml +7 -0
- data/data/config/target.yaml +12 -0
- data/data/config/telemetry_modifiers.yaml +19 -2
- data/data/config/test_runner.yaml +10 -9
- data/data/config/widgets.yaml +174 -11
- data/data/crc.txt +428 -415
- data/demo/Gemfile +1 -1
- data/demo/Launcher.bat +1 -9
- data/demo/Launcher2.bat +1 -0
- data/demo/LauncherMini.bat +1 -0
- data/demo/Rakefile +2 -0
- data/demo/config/dart/Gemfile +2 -7
- data/demo/config/data/crc.txt +243 -219
- data/demo/config/system/system.txt +42 -3
- data/demo/config/system/system2.txt +34 -5
- data/demo/config/system/system_alt_ports.txt +80 -0
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +5 -4
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +12 -7
- data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
- data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
- data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
- data/demo/config/targets/INST/screens/adcs.txt +2 -2
- data/demo/config/targets/INST/screens/block.txt +1 -1
- data/demo/config/targets/INST/screens/commanding.txt +1 -1
- data/demo/config/targets/INST/screens/ground.txt +27 -5
- data/demo/config/targets/INST/screens/ground_error.gif +0 -0
- data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
- data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
- data/demo/config/targets/INST/screens/limits.txt +69 -31
- data/demo/config/targets/INST/screens/other.txt +13 -3
- data/demo/config/targets/INST/screens/params.txt +54 -0
- data/demo/config/targets/INST/screens/satellite.gif +0 -0
- data/demo/config/targets/INST/target.txt +1 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
- data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
- data/demo/config/tools/script_runner/script_runner.txt +1 -2
- data/demo/config/tools/test_runner/test_runner.txt +3 -1
- data/demo/lib/example_background_task.rb +1 -0
- data/demo/procedures/cosmos_api_test.rb +26 -22
- data/demo/procedures/interactive.rb +22 -0
- data/demo/procedures/local_screen_example.rb +51 -0
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
- data/ext/cosmos/ext/packet/packet.c +6 -77
- data/ext/mkrf_conf.rb +2 -2
- data/extensions/vscode/.gitignore +4 -0
- data/extensions/vscode/.vscode/launch.json +32 -0
- data/extensions/vscode/.vscode/settings.json +13 -0
- data/extensions/vscode/.vscode/tasks.json +79 -0
- data/extensions/vscode/License.txt +879 -0
- data/extensions/vscode/README.md +9 -0
- data/extensions/vscode/client/License.txt +879 -0
- data/extensions/vscode/client/README.md +39 -0
- data/extensions/vscode/client/cosmos.configuration.json +23 -0
- data/extensions/vscode/client/images/icon.png +0 -0
- data/extensions/vscode/client/package-lock.json +414 -0
- data/extensions/vscode/client/package.json +105 -0
- data/extensions/vscode/client/src/extension.ts +132 -0
- data/extensions/vscode/client/src/screen_preview.rb +25 -0
- data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
- data/extensions/vscode/client/tsconfig.json +17 -0
- data/extensions/vscode/package-lock.json +26 -0
- data/extensions/vscode/package.json +35 -0
- data/extensions/vscode/server/License.txt +879 -0
- data/extensions/vscode/server/package-lock.json +236 -0
- data/extensions/vscode/server/package.json +29 -0
- data/extensions/vscode/server/src/server.ts +59 -0
- data/extensions/vscode/server/tsconfig.json +16 -0
- data/install/Gemfile +1 -1
- data/install/Launcher.bat +1 -9
- data/install/config/dart/Gemfile +3 -8
- data/install/config/data/crc.txt +148 -132
- data/install/config/system/system.txt +36 -3
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
- data/lib/cosmos/config/config_parser.rb +4 -5
- data/lib/cosmos/conversions.rb +2 -0
- data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
- data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
- data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
- data/lib/cosmos/core_ext/time.rb +3 -1
- data/lib/cosmos/dart/config/boot.rb +1 -1
- data/lib/cosmos/dart/config/database.yml +2 -0
- data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
- data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
- data/lib/cosmos/dart/lib/dart_common.rb +13 -6
- data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
- data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
- data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
- data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
- data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
- data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
- data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
- data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
- data/lib/cosmos/dart/processes/dart.rb +4 -2
- data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
- data/lib/cosmos/dart/processes/dart_ingester.rb +40 -1
- data/lib/cosmos/dart/processes/dart_master.rb +44 -0
- data/lib/cosmos/dart/processes/dart_util.rb +119 -4
- data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
- data/lib/cosmos/gui/dialogs/details_dialog.rb +44 -29
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
- data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +11 -10
- data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
- data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
- data/lib/cosmos/gui/qt.rb +13 -2
- data/lib/cosmos/gui/qt_tool.rb +71 -43
- data/lib/cosmos/gui/text/ruby_editor.rb +91 -49
- data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
- data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
- data/lib/cosmos/gui/utilities/script_module_gui.rb +117 -91
- data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
- data/lib/cosmos/interfaces.rb +2 -0
- data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
- data/lib/cosmos/interfaces/interface.rb +9 -1
- data/lib/cosmos/interfaces/linc_interface.rb +3 -3
- data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
- data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
- data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
- data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
- data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +9 -4
- data/lib/cosmos/interfaces/serial_interface.rb +7 -1
- data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
- data/lib/cosmos/interfaces/stream_interface.rb +1 -1
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +13 -13
- data/lib/cosmos/io/json_drb.rb +16 -12
- data/lib/cosmos/io/json_drb_object.rb +7 -2
- data/lib/cosmos/io/json_drb_rack.rb +25 -5
- data/lib/cosmos/io/json_rpc.rb +1 -1
- data/lib/cosmos/io/posix_serial_driver.rb +60 -22
- data/lib/cosmos/io/serial_driver.rb +11 -8
- data/lib/cosmos/io/win32_serial_driver.rb +31 -3
- data/lib/cosmos/packet_logs/packet_log_reader.rb +71 -28
- data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
- data/lib/cosmos/packets/commands.rb +30 -9
- data/lib/cosmos/packets/packet.rb +105 -34
- data/lib/cosmos/packets/packet_config.rb +60 -10
- data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
- data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
- data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
- data/lib/cosmos/packets/parsers/xtce_parser.rb +5 -4
- data/lib/cosmos/packets/structure.rb +32 -4
- data/lib/cosmos/packets/structure_item.rb +5 -1
- data/lib/cosmos/packets/telemetry.rb +30 -4
- data/lib/cosmos/script/api_shared.rb +22 -10
- data/lib/cosmos/script/extract.rb +1 -1
- data/lib/cosmos/script/limits.rb +4 -0
- data/lib/cosmos/script/script.rb +29 -20
- data/lib/cosmos/script/scripting.rb +16 -14
- data/lib/cosmos/script/telemetry.rb +3 -1
- data/lib/cosmos/script/tools.rb +18 -8
- data/lib/cosmos/streams/serial_stream.rb +11 -6
- data/lib/cosmos/system/system.rb +214 -76
- data/lib/cosmos/system/target.rb +39 -9
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +116 -55
- data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
- data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +54 -340
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +74 -52
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +40 -333
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +44 -15
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +8 -1
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +18 -20
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +9 -6
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
- data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
- data/lib/cosmos/tools/config_editor/config_editor.rb +181 -94
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +10 -9
- data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +57 -47
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
- data/lib/cosmos/tools/data_viewer/dump_component.rb +3 -9
- data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +68 -42
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
- data/lib/cosmos/tools/launcher/launcher.rb +2 -1
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +59 -41
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +64 -59
- data/lib/cosmos/tools/script_runner/script_runner.rb +198 -123
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +87 -35
- data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
- data/lib/cosmos/tools/table_manager/table_manager.rb +48 -45
- data/lib/cosmos/tools/test_runner/test.rb +5 -2
- data/lib/cosmos/tools/test_runner/test_runner.rb +61 -38
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +24 -12
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +48 -48
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +5 -8
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +94 -91
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +27 -26
- data/lib/cosmos/tools/tlm_viewer/screen.rb +76 -14
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +51 -34
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +3 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +3 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +60 -47
- data/lib/cosmos/top_level.rb +37 -13
- data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
- data/lib/cosmos/version.rb +5 -5
- data/lib/cosmos/win32/excel.rb +81 -24
- data/make_gems.sh +10 -0
- data/run_gui_tests.bat +1 -0
- data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
- data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
- data/spec/core_ext/socket_spec.rb +1 -1
- data/spec/core_ext/time_spec.rb +4 -0
- data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/spec/install/yaml_docs_spec.rb +132 -0
- data/spec/interfaces/linc_interface_spec.rb +1 -1
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
- data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
- data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
- data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
- data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
- data/spec/io/json_drb_rack_spec.rb +166 -0
- data/spec/io/json_drb_spec.rb +14 -0
- data/spec/io/json_rpc_spec.rb +4 -5
- data/spec/io/posix_serial_driver_spec.rb +81 -0
- data/spec/io/serial_driver_spec.rb +15 -13
- data/spec/io/win32_serial_driver_spec.rb +33 -3
- data/spec/packet_logs/packet_log_reader_spec.rb +106 -52
- data/spec/packets/commands_spec.rb +22 -0
- data/spec/packets/packet_config_spec.rb +29 -16
- data/spec/packets/packet_item_spec.rb +2 -2
- data/spec/packets/packet_spec.rb +39 -6
- data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
- data/spec/packets/parsers/macro_parser_spec.rb +36 -36
- data/spec/packets/parsers/state_parser_spec.rb +69 -11
- data/spec/packets/structure_spec.rb +93 -2
- data/spec/packets/telemetry_spec.rb +63 -10
- data/spec/script/extract_spec.rb +4 -1
- data/spec/script/script_spec.rb +2 -3
- data/spec/script/scripting_spec.rb +2 -1
- data/spec/script/tools_spec.rb +0 -1
- data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
- data/spec/system/system_spec.rb +187 -4
- data/spec/system/target_spec.rb +62 -1
- data/spec/tools/cmd_tlm_server/api_spec.rb +29 -21
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
- data/spec/top_level/top_level_spec.rb +29 -5
- data/spec/utilities/message_log_spec.rb +6 -3
- data/tasks/gemfile_stats.rake +38 -14
- data/test/performance/config/system/system.txt +0 -0
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
- data/test/performance/procedures/cosmos_api_test.rb +1 -1
- data/test/performance/tools/identify_performance.rb +82 -0
- metadata +146 -62
- data/lib/cosmos/dart/Gemfile +0 -69
|
@@ -24,7 +24,8 @@ module Cosmos
|
|
|
24
24
|
read_polling_period = 0.01,
|
|
25
25
|
read_max_length = 1000,
|
|
26
26
|
flow_control = :NONE,
|
|
27
|
-
data_bits = 8
|
|
27
|
+
data_bits = 8,
|
|
28
|
+
struct = [])
|
|
28
29
|
|
|
29
30
|
# Verify Parameters
|
|
30
31
|
port_name = '\\\\.\\' + port_name if port_name =~ /^COM[0-9]{2,3}$/
|
|
@@ -78,10 +79,37 @@ module Cosmos
|
|
|
78
79
|
# 0x03 - RTS_CONTROL_TOGGLE - Specifies that the RTS line will be high if bytes are available for transmission. After all buffered bytes have been sent, the RTS line will be low.
|
|
79
80
|
dcb.write('fRtsControl', 0x03)
|
|
80
81
|
end
|
|
82
|
+
# Allow the end user to write arbitrary values into the Windows DCB structure
|
|
83
|
+
unless struct.empty?
|
|
84
|
+
struct.each do |key, value|
|
|
85
|
+
dcb.write(key, value.to_i)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
81
88
|
Win32.set_comm_state(@handle, dcb)
|
|
82
89
|
|
|
83
|
-
# Configure Timeouts
|
|
84
|
-
|
|
90
|
+
# Configure Timeouts, the WinAPI structure is COMMTIMEOUTS:
|
|
91
|
+
# DWORD ReadIntervalTimeout;
|
|
92
|
+
# DWORD ReadTotalTimeoutMultiplier;
|
|
93
|
+
# DWORD ReadTotalTimeoutConstant;
|
|
94
|
+
# DWORD WriteTotalTimeoutMultiplier;
|
|
95
|
+
# DWORD WriteTotalTimeoutConstant;
|
|
96
|
+
# 0xFFFFFFFF, 0, 0 specifies that the read operation is to return immediately
|
|
97
|
+
# with the bytes that have already been received, even if no bytes have been received.
|
|
98
|
+
# The WriteTotalTimeoutMultiplier is multiplied by the number of bytes to be written
|
|
99
|
+
# and the WriteTotalTimeoutConstant is added to that total (both are in milliseconds).
|
|
100
|
+
bits_per_symbol = data_bits + 1 # 1 start bit
|
|
101
|
+
case stop_bits
|
|
102
|
+
when Win32::ONESTOPBIT
|
|
103
|
+
bits_per_symbol += 1
|
|
104
|
+
when Win32::TWOSTOPBITS
|
|
105
|
+
bits_per_symbol += 2
|
|
106
|
+
end
|
|
107
|
+
case parity
|
|
108
|
+
when Win32::ODDPARITY, Win32::EVENPARITY
|
|
109
|
+
bits_per_symbol += 1
|
|
110
|
+
end
|
|
111
|
+
delay = (1000.0 / (baud_rate / bits_per_symbol.to_f)).ceil
|
|
112
|
+
Win32.set_comm_timeouts(@handle, 0xFFFFFFFF, 0, 0, delay, 1000)
|
|
85
113
|
end
|
|
86
114
|
|
|
87
115
|
# (see SerialDriver#close)
|
|
@@ -35,6 +35,18 @@ module Cosmos
|
|
|
35
35
|
COSMOS1_LOG_TYPE_RANGE = 6..8
|
|
36
36
|
COSMOS1_CONFIGURATION_NAME_RANGE = 10..41
|
|
37
37
|
|
|
38
|
+
# COSMOS 4.3+ log file header definition
|
|
39
|
+
COSMOS4_MARKER = 'COSMOS4_'
|
|
40
|
+
COSMOS4_HEADER_LENGTH = COSMOS2_HEADER_LENGTH
|
|
41
|
+
COSMOS4_MARKER_RANGE = COSMOS2_MARKER_RANGE
|
|
42
|
+
COSMOS4_LOG_TYPE_RANGE = COSMOS2_LOG_TYPE_RANGE
|
|
43
|
+
COSMOS4_CONFIGURATION_NAME_RANGE = COSMOS2_CONFIGURATION_NAME_RANGE
|
|
44
|
+
COSMOS4_HOSTNAME_RANGE = COSMOS2_HOSTNAME_RANGE
|
|
45
|
+
COSMOS4_STORED_FLAG_MASK = 0x80
|
|
46
|
+
COSMOS4_EXTRA_FLAG_MASK = 0x40
|
|
47
|
+
|
|
48
|
+
MAX_READ_SIZE = 1000000000
|
|
49
|
+
|
|
38
50
|
# Create a new log file reader
|
|
39
51
|
def initialize
|
|
40
52
|
reset()
|
|
@@ -62,10 +74,10 @@ module Cosmos
|
|
|
62
74
|
packet = read(identify_and_define)
|
|
63
75
|
break unless packet
|
|
64
76
|
|
|
65
|
-
|
|
66
|
-
if
|
|
67
|
-
next if start_time and
|
|
68
|
-
break if end_time and
|
|
77
|
+
time = packet.packet_time
|
|
78
|
+
if time
|
|
79
|
+
next if start_time and time < start_time
|
|
80
|
+
break if end_time and time > end_time
|
|
69
81
|
end
|
|
70
82
|
|
|
71
83
|
yield packet
|
|
@@ -115,6 +127,8 @@ module Cosmos
|
|
|
115
127
|
reset()
|
|
116
128
|
@filename = filename
|
|
117
129
|
@file = BufferedFile.open(@filename, 'rb')
|
|
130
|
+
@max_read_size = @file.size
|
|
131
|
+
@max_read_size = MAX_READ_SIZE if @max_read_size > MAX_READ_SIZE
|
|
118
132
|
@bytes_read = 0
|
|
119
133
|
return read_file_header()
|
|
120
134
|
rescue => err
|
|
@@ -133,12 +147,12 @@ module Cosmos
|
|
|
133
147
|
# @return [Packet]
|
|
134
148
|
def read(identify_and_define = true)
|
|
135
149
|
# Read the Packet Header
|
|
136
|
-
success, target_name, packet_name, received_time = read_entry_header()
|
|
150
|
+
success, target_name, packet_name, received_time, stored, extra = read_entry_header()
|
|
137
151
|
return nil unless success
|
|
138
152
|
|
|
139
153
|
# Read Packet Data
|
|
140
|
-
packet_data = @file.read_length_bytes(4)
|
|
141
|
-
return nil unless packet_data and packet_data.length
|
|
154
|
+
packet_data = @file.read_length_bytes(4, @max_read_size)
|
|
155
|
+
return nil unless packet_data and packet_data.length >= 0
|
|
142
156
|
|
|
143
157
|
if identify_and_define
|
|
144
158
|
packet = identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
|
|
@@ -147,6 +161,8 @@ module Cosmos
|
|
|
147
161
|
packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
|
|
148
162
|
packet.set_received_time_fast(received_time)
|
|
149
163
|
end
|
|
164
|
+
packet.stored = stored
|
|
165
|
+
packet.extra = extra
|
|
150
166
|
|
|
151
167
|
# Auto change configuration on SYSTEM META
|
|
152
168
|
if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
|
|
@@ -231,11 +247,13 @@ module Cosmos
|
|
|
231
247
|
|
|
232
248
|
def reset
|
|
233
249
|
@file = nil
|
|
250
|
+
@max_read_size = MAX_READ_SIZE
|
|
234
251
|
@filename = nil
|
|
235
252
|
@log_type = :TLM
|
|
236
253
|
@configuration_name = nil
|
|
237
254
|
@hostname = nil
|
|
238
|
-
@
|
|
255
|
+
@mode = 4
|
|
256
|
+
@file_header_length = COSMOS4_HEADER_LENGTH
|
|
239
257
|
end
|
|
240
258
|
|
|
241
259
|
# This is best effort. May return unidentified/undefined packets
|
|
@@ -257,7 +275,7 @@ module Cosmos
|
|
|
257
275
|
end
|
|
258
276
|
packet.buffer = packet_data
|
|
259
277
|
packet.set_received_time_fast(received_time)
|
|
260
|
-
rescue
|
|
278
|
+
rescue Exception => error
|
|
261
279
|
# Could not find a definition for this packet
|
|
262
280
|
Logger.instance.error "Unknown packet #{target_name} #{packet_name}"
|
|
263
281
|
packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
|
|
@@ -269,10 +287,15 @@ module Cosmos
|
|
|
269
287
|
|
|
270
288
|
# Should return if successfully switched to requested configuration
|
|
271
289
|
def read_file_header
|
|
272
|
-
header = @file.read(
|
|
273
|
-
if header and header.length ==
|
|
274
|
-
if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
|
|
275
|
-
# Found COSMOS 2 File Header
|
|
290
|
+
header = @file.read(COSMOS4_HEADER_LENGTH)
|
|
291
|
+
if header and header.length == COSMOS4_HEADER_LENGTH
|
|
292
|
+
if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER or header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
|
|
293
|
+
# Found COSMOS 2/4 File Header
|
|
294
|
+
if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER
|
|
295
|
+
@mode = 4
|
|
296
|
+
else
|
|
297
|
+
@mode = 2
|
|
298
|
+
end
|
|
276
299
|
@log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
|
|
277
300
|
raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
|
|
278
301
|
@configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
|
|
@@ -283,6 +306,7 @@ module Cosmos
|
|
|
283
306
|
return false, error # Did not successfully change to requested configuration name
|
|
284
307
|
elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
|
|
285
308
|
# Found COSMOS 1 File Header
|
|
309
|
+
@mode = 1
|
|
286
310
|
@log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
|
|
287
311
|
raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
|
|
288
312
|
@configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
|
|
@@ -297,29 +321,48 @@ module Cosmos
|
|
|
297
321
|
raise "COSMOS file header not found on packet log"
|
|
298
322
|
end
|
|
299
323
|
else
|
|
300
|
-
raise "Failed to read at least #{
|
|
324
|
+
raise "Failed to read at least #{COSMOS4_HEADER_LENGTH} bytes from packet log"
|
|
301
325
|
end
|
|
302
326
|
end
|
|
303
327
|
|
|
304
328
|
def read_entry_header
|
|
329
|
+
stored = false
|
|
330
|
+
extra = nil
|
|
331
|
+
|
|
332
|
+
if @mode == 4
|
|
333
|
+
# Read Flags
|
|
334
|
+
flags = @file.read(1)
|
|
335
|
+
return [nil, nil, nil, nil, nil, nil] if flags.nil? or flags.length != 1
|
|
336
|
+
flags = flags.unpack('C')[0]
|
|
337
|
+
|
|
338
|
+
stored = true if (flags & COSMOS4_STORED_FLAG_MASK) != 0
|
|
339
|
+
|
|
340
|
+
if (flags & COSMOS4_EXTRA_FLAG_MASK) != 0
|
|
341
|
+
# Read Extra data
|
|
342
|
+
extra_data = @file.read_length_bytes(4, @max_read_size)
|
|
343
|
+
return [nil, nil, nil, nil, nil, nil] unless extra_data and extra_data.length > 0
|
|
344
|
+
extra = JSON.parse(extra_data)
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
305
348
|
# Read Received Time
|
|
306
349
|
time_seconds = @file.read(4)
|
|
307
|
-
return [nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
|
|
350
|
+
return [nil, nil, nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
|
|
308
351
|
time_seconds = time_seconds.unpack('N')[0]
|
|
309
352
|
time_microseconds = @file.read(4)
|
|
310
|
-
return [nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
|
|
353
|
+
return [nil, nil, nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
|
|
311
354
|
time_microseconds = time_microseconds.unpack('N')[0]
|
|
312
355
|
received_time = Time.at(time_seconds, time_microseconds).sys
|
|
313
356
|
|
|
314
357
|
# Read Target Name
|
|
315
358
|
target_name = @file.read_length_bytes(1)
|
|
316
|
-
return [nil, nil, nil, nil] unless target_name and target_name.length > 0
|
|
359
|
+
return [nil, nil, nil, nil, nil, nil] unless target_name and target_name.length > 0
|
|
317
360
|
|
|
318
361
|
# Read Packet Name
|
|
319
362
|
packet_name = @file.read_length_bytes(1)
|
|
320
|
-
return [nil, nil, nil, nil] unless packet_name and packet_name.length > 0
|
|
363
|
+
return [nil, nil, nil, nil, nil, nil] unless packet_name and packet_name.length > 0
|
|
321
364
|
|
|
322
|
-
return [true, target_name, packet_name, received_time]
|
|
365
|
+
return [true, target_name, packet_name, received_time, stored, extra]
|
|
323
366
|
end
|
|
324
367
|
|
|
325
368
|
def test
|
|
@@ -331,7 +374,7 @@ module Cosmos
|
|
|
331
374
|
begin
|
|
332
375
|
# Try to read the packet header
|
|
333
376
|
# This will fail with file read errors and invalid timestamps
|
|
334
|
-
success, target_name, packet_name, _ = read_entry_header()
|
|
377
|
+
success, target_name, packet_name, _, _, _ = read_entry_header()
|
|
335
378
|
if success
|
|
336
379
|
if target_name !~ File::NON_ASCII_PRINTABLE and packet_name !~ File::NON_ASCII_PRINTABLE
|
|
337
380
|
packet_data_length = @file.read(4)
|
|
@@ -402,17 +445,17 @@ module Cosmos
|
|
|
402
445
|
# Read the first packet in the log
|
|
403
446
|
first_packet = first()
|
|
404
447
|
raise "Error reading first packet" unless first
|
|
405
|
-
raise "First Packet does not contain a packet received time" unless first_packet.
|
|
448
|
+
raise "First Packet does not contain a packet received time" unless first_packet.packet_time
|
|
406
449
|
|
|
407
450
|
# Read the last packet in the log
|
|
408
451
|
file_size = size()
|
|
409
452
|
last_packet = last()
|
|
410
453
|
raise "Search failed looking for last packet" unless last_packet
|
|
411
|
-
raise "Last Packet does not contain a packet received time" unless last_packet.
|
|
454
|
+
raise "Last Packet does not contain a packet received time" unless last_packet.packet_time
|
|
412
455
|
|
|
413
|
-
if time >= first_packet.
|
|
456
|
+
if time >= first_packet.packet_time and time <= last_packet.packet_time
|
|
414
457
|
# Guess at where to start looking for time in log
|
|
415
|
-
percentage = (time - first_packet.
|
|
458
|
+
percentage = (time - first_packet.packet_time) / (last_packet.packet_time - first_packet.packet_time)
|
|
416
459
|
offset = (percentage * file_size.to_f).to_i
|
|
417
460
|
offset = @file_header_length if offset < @file_header_length
|
|
418
461
|
@file.seek(offset, IO::SEEK_SET)
|
|
@@ -420,10 +463,10 @@ module Cosmos
|
|
|
420
463
|
# Move backwards until a packet before the time is found
|
|
421
464
|
while true
|
|
422
465
|
packet = search(-1, :BEFORE)
|
|
423
|
-
break if !packet or packet.
|
|
466
|
+
break if !packet or packet.packet_time <= time
|
|
424
467
|
|
|
425
468
|
# Guess again
|
|
426
|
-
percentage = 1.0 - ((packet.
|
|
469
|
+
percentage = 1.0 - ((packet.packet_time - time) / (packet.packet_time - first_packet.packet_time))
|
|
427
470
|
offset = (percentage * @file.pos.to_f).to_i
|
|
428
471
|
offset = @file_header_length if offset < @file_header_length
|
|
429
472
|
@file.seek(offset, IO::SEEK_SET)
|
|
@@ -434,7 +477,7 @@ module Cosmos
|
|
|
434
477
|
position = @file.pos
|
|
435
478
|
packet = read(false)
|
|
436
479
|
raise "Search failed looking for packet after time" unless packet
|
|
437
|
-
if packet.
|
|
480
|
+
if packet.packet_time >= time
|
|
438
481
|
# Back up this packet so the read can get it because we want it
|
|
439
482
|
@file.seek(position, IO::SEEK_SET)
|
|
440
483
|
break
|
|
@@ -442,7 +485,7 @@ module Cosmos
|
|
|
442
485
|
end
|
|
443
486
|
|
|
444
487
|
else
|
|
445
|
-
if time > last_packet.
|
|
488
|
+
if time > last_packet.packet_time
|
|
446
489
|
# File is entirely before time, so jump to the end
|
|
447
490
|
@file.seek(0, IO::SEEK_END)
|
|
448
491
|
else
|
|
@@ -311,7 +311,7 @@ module Cosmos
|
|
|
311
311
|
|
|
312
312
|
def build_file_header(configuration_name = System.configuration_name)
|
|
313
313
|
hostname = Socket.gethostname.to_s
|
|
314
|
-
file_header = "
|
|
314
|
+
file_header = "COSMOS4_#{@log_type}_#{configuration_name.ljust(32, ' ')[0..31]}_"
|
|
315
315
|
file_header << hostname.ljust(83)
|
|
316
316
|
return file_header
|
|
317
317
|
end
|
|
@@ -322,6 +322,18 @@ module Cosmos
|
|
|
322
322
|
# This is an optimization to avoid creating a new entry_header object
|
|
323
323
|
# each time we create an entry_header which we do a LOT!
|
|
324
324
|
@entry_header.clear
|
|
325
|
+
flags = 0
|
|
326
|
+
flags |= PacketLogReader::COSMOS4_STORED_FLAG_MASK if packet.stored
|
|
327
|
+
extra = packet.extra
|
|
328
|
+
if extra
|
|
329
|
+
flags |= PacketLogReader::COSMOS4_EXTRA_FLAG_MASK
|
|
330
|
+
extra = extra.to_json
|
|
331
|
+
end
|
|
332
|
+
@entry_header << [flags].pack('C'.freeze)
|
|
333
|
+
if extra
|
|
334
|
+
@entry_header << [extra.length].pack('N'.freeze)
|
|
335
|
+
@entry_header << extra
|
|
336
|
+
end
|
|
325
337
|
@entry_header << [received_time.tv_sec].pack('N'.freeze)
|
|
326
338
|
@entry_header << [received_time.tv_usec].pack('N'.freeze)
|
|
327
339
|
target_name = packet.target_name
|
|
@@ -90,6 +90,8 @@ module Cosmos
|
|
|
90
90
|
target_names = target_names() unless target_names
|
|
91
91
|
|
|
92
92
|
target_names.each do |target_name|
|
|
93
|
+
target_name = target_name.to_s.upcase
|
|
94
|
+
|
|
93
95
|
target_packets = nil
|
|
94
96
|
begin
|
|
95
97
|
target_packets = packets(target_name)
|
|
@@ -98,18 +100,35 @@ module Cosmos
|
|
|
98
100
|
next
|
|
99
101
|
end
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
target = System.targets[target_name]
|
|
104
|
+
if target and target.cmd_unique_id_mode
|
|
105
|
+
# Iterate through the packets and see if any represent the buffer
|
|
106
|
+
target_packets.each do |packet_name, packet|
|
|
107
|
+
if packet.identify?(packet_data)
|
|
108
|
+
identified_packet = packet
|
|
109
|
+
break
|
|
110
|
+
end
|
|
109
111
|
end
|
|
112
|
+
else
|
|
113
|
+
# Do a hash lookup to quickly identify the packet
|
|
114
|
+
if target_packets.length > 0
|
|
115
|
+
packet = target_packets.first[1]
|
|
116
|
+
key = packet.read_id_values(packet_data)
|
|
117
|
+
hash = @config.cmd_id_value_hash[target_name]
|
|
118
|
+
identified_packet = hash[key]
|
|
119
|
+
identified_packet = hash['CATCHALL'.freeze] unless identified_packet
|
|
120
|
+
end
|
|
110
121
|
end
|
|
111
122
|
|
|
112
|
-
|
|
123
|
+
if identified_packet
|
|
124
|
+
identified_packet = identified_packet.clone
|
|
125
|
+
identified_packet.received_time = nil
|
|
126
|
+
identified_packet.stored = false
|
|
127
|
+
identified_packet.extra = nil
|
|
128
|
+
identified_packet.received_count = 0
|
|
129
|
+
identified_packet.buffer = packet_data
|
|
130
|
+
break
|
|
131
|
+
end
|
|
113
132
|
end
|
|
114
133
|
|
|
115
134
|
return identified_packet
|
|
@@ -141,6 +160,8 @@ module Cosmos
|
|
|
141
160
|
|
|
142
161
|
# Set time, parameters, and restore defaults
|
|
143
162
|
command.received_time = Time.now.sys
|
|
163
|
+
command.stored = false
|
|
164
|
+
command.extra = nil
|
|
144
165
|
command.given_values = params
|
|
145
166
|
command.restore_defaults(command.buffer(false), params.keys)
|
|
146
167
|
command.raw = raw
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# as published by the Free Software Foundation; version 3 with
|
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
|
10
10
|
|
|
11
|
-
require 'digest
|
|
11
|
+
require 'digest'
|
|
12
12
|
require 'cosmos/packets/structure'
|
|
13
13
|
require 'cosmos/packets/packet_item'
|
|
14
14
|
require 'cosmos/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
|
|
@@ -19,7 +19,8 @@ module Cosmos
|
|
|
19
19
|
# Packet adds is the ability to apply formatting to PacketItem values as well
|
|
20
20
|
# as managing PacketItem's limit states.
|
|
21
21
|
class Packet < Structure
|
|
22
|
-
RESERVED_ITEM_NAMES = ['RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
|
|
22
|
+
RESERVED_ITEM_NAMES = ['PACKET_TIMESECONDS'.freeze, 'PACKET_TIMEFORMATTED'.freeze, 'RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
|
|
23
|
+
CATCH_ALL_STATE = 'ANY'
|
|
23
24
|
|
|
24
25
|
# @return [String] Name of the target this packet is associated with
|
|
25
26
|
attr_reader :target_name
|
|
@@ -66,6 +67,12 @@ module Cosmos
|
|
|
66
67
|
# @return [Boolean] Whether or not this is a 'abstract' packet
|
|
67
68
|
attr_accessor :abstract
|
|
68
69
|
|
|
70
|
+
# @return [Boolean] Whether or not this was a stored packet
|
|
71
|
+
attr_accessor :stored
|
|
72
|
+
|
|
73
|
+
# @return [Hash] Extra data to be logged/transferred with packet
|
|
74
|
+
attr_accessor :extra
|
|
75
|
+
|
|
69
76
|
# Valid format types
|
|
70
77
|
VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
|
|
71
78
|
|
|
@@ -100,6 +107,8 @@ module Cosmos
|
|
|
100
107
|
@meta = nil
|
|
101
108
|
@hidden = false
|
|
102
109
|
@disabled = false
|
|
110
|
+
@stored = false
|
|
111
|
+
@extra = nil
|
|
103
112
|
end
|
|
104
113
|
|
|
105
114
|
# Sets the target name this packet is associated with. Unidentified packets
|
|
@@ -177,37 +186,70 @@ module Cosmos
|
|
|
177
186
|
@read_conversion_cache.clear if @read_conversion_cache
|
|
178
187
|
@received_count
|
|
179
188
|
end
|
|
189
|
+
|
|
190
|
+
end # if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
|
|
191
|
+
|
|
192
|
+
# Tries to identify if a buffer represents the currently defined packet. It
|
|
193
|
+
# does this by iterating over all the packet items that were created with
|
|
194
|
+
# an ID value and checking whether that ID value is present at the correct
|
|
195
|
+
# location in the buffer.
|
|
196
|
+
#
|
|
197
|
+
# Incorrectly sized buffers will still positively identify if there is
|
|
198
|
+
# enough data to match the ID values. This is to allow incorrectly sized
|
|
199
|
+
# packets to still be processed as well as possible given the incorrectly
|
|
200
|
+
# sized data.
|
|
201
|
+
#
|
|
202
|
+
# @param buffer [String] Raw buffer of binary data
|
|
203
|
+
# @return [Boolean] Whether or not the buffer of data is this packet
|
|
204
|
+
def identify?(buffer)
|
|
205
|
+
return false unless buffer
|
|
206
|
+
return true unless @id_items
|
|
180
207
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
# Incorrectly sized buffers will still positively identify if there is
|
|
187
|
-
# enough data to match the ID values. This is to allow incorrectly sized
|
|
188
|
-
# packets to still be processed as well as possible given the incorrectly
|
|
189
|
-
# sized data.
|
|
190
|
-
#
|
|
191
|
-
# @param buffer [String] Raw buffer of binary data
|
|
192
|
-
# @return [Boolean] Whether or not the buffer of data is this packet
|
|
193
|
-
def identify?(buffer)
|
|
194
|
-
return false unless buffer
|
|
195
|
-
return true unless @id_items
|
|
196
|
-
|
|
197
|
-
@id_items.each do |item|
|
|
198
|
-
begin
|
|
199
|
-
value = read_item(item, :RAW, buffer)
|
|
200
|
-
rescue Exception
|
|
201
|
-
value = nil
|
|
202
|
-
end
|
|
203
|
-
return false if item.id_value != value
|
|
208
|
+
@id_items.each do |item|
|
|
209
|
+
begin
|
|
210
|
+
value = read_item(item, :RAW, buffer)
|
|
211
|
+
rescue Exception
|
|
212
|
+
value = nil
|
|
204
213
|
end
|
|
214
|
+
return false if item.id_value != value
|
|
215
|
+
end
|
|
205
216
|
|
|
206
|
-
|
|
217
|
+
true
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Reads the values from a buffer at the position of each id_item defined
|
|
221
|
+
# in the packet.
|
|
222
|
+
#
|
|
223
|
+
# @param buffer [String] Raw buffer of binary data
|
|
224
|
+
# @return [Array] Array of read id values in order
|
|
225
|
+
def read_id_values(buffer)
|
|
226
|
+
return [] unless buffer
|
|
227
|
+
return [] unless @id_items
|
|
228
|
+
values = []
|
|
229
|
+
|
|
230
|
+
@id_items.each do |item|
|
|
231
|
+
begin
|
|
232
|
+
values << read_item(item, :RAW, buffer)
|
|
233
|
+
rescue Exception
|
|
234
|
+
values << nil
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
values
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# Returns @received_time unless a packet item called PACKET_TIME exists that returns
|
|
242
|
+
# a Ruby Time object that represents a different timestamp for the packet
|
|
243
|
+
def packet_time
|
|
244
|
+
item = @items['PACKET_TIME'.freeze]
|
|
245
|
+
if item
|
|
246
|
+
return read_item(item, :CONVERTED, @buffer)
|
|
247
|
+
else
|
|
248
|
+
return @received_time
|
|
207
249
|
end
|
|
208
|
-
end
|
|
250
|
+
end
|
|
209
251
|
|
|
210
|
-
# Calculates a unique
|
|
252
|
+
# Calculates a unique hashing sum that changes if the parts of the packet configuration change that could affect
|
|
211
253
|
# the "shape" of the packet. This value is cached and that packet should not be changed if this method is being used
|
|
212
254
|
def config_name
|
|
213
255
|
return @config_name if @config_name
|
|
@@ -215,7 +257,9 @@ module Cosmos
|
|
|
215
257
|
@sorted_items.each do |item|
|
|
216
258
|
string << " ITEM #{item.name} #{item.bit_offset} #{item.bit_size} #{item.data_type} #{item.array_size} #{item.endianness} #{item.overflow} #{item.states} #{item.read_conversion ? item.read_conversion.class : 'NO_CONVERSION'}"
|
|
217
259
|
end
|
|
218
|
-
|
|
260
|
+
|
|
261
|
+
# Use the hashing algorithm established by Cosmos::System
|
|
262
|
+
digest = Digest.const_get(System.hashing_algorithm).send('new')
|
|
219
263
|
digest << string
|
|
220
264
|
@config_name = digest.hexdigest
|
|
221
265
|
@config_name
|
|
@@ -297,7 +341,7 @@ module Cosmos
|
|
|
297
341
|
previous_item = nil
|
|
298
342
|
warnings = []
|
|
299
343
|
@sorted_items.each do |item|
|
|
300
|
-
if expected_next_offset and item.bit_offset < expected_next_offset
|
|
344
|
+
if expected_next_offset and (item.bit_offset < expected_next_offset) and !item.overlap
|
|
301
345
|
msg = "Bit definition overlap at bit offset #{item.bit_offset} for packet #{@target_name} #{@packet_name} items #{item.name} and #{previous_item.name}"
|
|
302
346
|
Logger.instance.warn(msg)
|
|
303
347
|
warnings << msg
|
|
@@ -529,6 +573,8 @@ module Cosmos
|
|
|
529
573
|
value = value.map do |val, index|
|
|
530
574
|
if item.states.key(val)
|
|
531
575
|
item.states.key(val)
|
|
576
|
+
elsif item.states.values.include?(CATCH_ALL_STATE)
|
|
577
|
+
item.states.key(CATCH_ALL_STATE)
|
|
532
578
|
else
|
|
533
579
|
apply_format_string_and_units(item, val, value_type)
|
|
534
580
|
end
|
|
@@ -537,6 +583,8 @@ module Cosmos
|
|
|
537
583
|
state_value = item.states.key(value)
|
|
538
584
|
if state_value
|
|
539
585
|
value = state_value
|
|
586
|
+
elsif item.states.values.include?(CATCH_ALL_STATE)
|
|
587
|
+
value = item.states.key(CATCH_ALL_STATE)
|
|
540
588
|
else
|
|
541
589
|
value = apply_format_string_and_units(item, value, value_type)
|
|
542
590
|
end
|
|
@@ -652,9 +700,10 @@ module Cosmos
|
|
|
652
700
|
# @param value_type (see #read_item)
|
|
653
701
|
# @param indent (see Structure#formatted)
|
|
654
702
|
# @param buffer (see Structure#formatted)
|
|
703
|
+
# @param ignored (see Structure#ignored)
|
|
655
704
|
# @return (see Structure#formatted)
|
|
656
|
-
def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer)
|
|
657
|
-
return super(value_type, indent, buffer)
|
|
705
|
+
def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer, ignored = nil)
|
|
706
|
+
return super(value_type, indent, buffer, ignored)
|
|
658
707
|
end
|
|
659
708
|
|
|
660
709
|
# Restore all items in the packet to their default value
|
|
@@ -670,6 +719,12 @@ module Cosmos
|
|
|
670
719
|
|
|
671
720
|
# Define the reserved items on the current telemetry packet
|
|
672
721
|
def define_reserved_items
|
|
722
|
+
item = define_item('PACKET_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
|
|
723
|
+
:ERROR, '%0.6f', PacketTimeSecondsConversion.new)
|
|
724
|
+
item.description = 'COSMOS Packet Time (UTC, Floating point, Unix epoch)'
|
|
725
|
+
item = define_item('PACKET_TIMEFORMATTED', 0, 0, :DERIVED, nil, @default_endianness,
|
|
726
|
+
:ERROR, nil, PacketTimeFormattedConversion.new)
|
|
727
|
+
item.description = 'COSMOS Packet Time (Local time zone, Formatted string)'
|
|
673
728
|
item = define_item('RECEIVED_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
|
|
674
729
|
:ERROR, '%0.6f', ReceivedTimeSecondsConversion.new)
|
|
675
730
|
item.description = 'COSMOS Received Time (UTC, Floating point, Unix epoch)'
|
|
@@ -750,7 +805,8 @@ module Cosmos
|
|
|
750
805
|
def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
|
|
751
806
|
# If check_limits is being called, then a new packet has arrived and
|
|
752
807
|
# this packet is no longer stale
|
|
753
|
-
|
|
808
|
+
# Stored telemetry doesn't affect the current value table and such doesn't affect stale
|
|
809
|
+
if @stale and !@stored
|
|
754
810
|
@stale = false
|
|
755
811
|
set_all_limits_states(nil)
|
|
756
812
|
end
|
|
@@ -786,6 +842,8 @@ module Cosmos
|
|
|
786
842
|
|
|
787
843
|
@received_time = nil
|
|
788
844
|
@received_count = 0
|
|
845
|
+
@stored = false
|
|
846
|
+
@extra = nil
|
|
789
847
|
if @read_conversion_cache
|
|
790
848
|
synchronize() do
|
|
791
849
|
@read_conversion_cache.clear
|
|
@@ -811,6 +869,7 @@ module Cosmos
|
|
|
811
869
|
end
|
|
812
870
|
end
|
|
813
871
|
packet.instance_variable_set("@read_conversion_cache".freeze, nil)
|
|
872
|
+
packet.extra = JSON.parse(packet.extra.to_json) if packet.extra # Deep copy using JSON
|
|
814
873
|
packet
|
|
815
874
|
end
|
|
816
875
|
alias dup clone
|
|
@@ -818,7 +877,19 @@ module Cosmos
|
|
|
818
877
|
def update_id_items(item)
|
|
819
878
|
if item.id_value
|
|
820
879
|
@id_items ||= []
|
|
821
|
-
|
|
880
|
+
# Add to Id Items
|
|
881
|
+
unless @id_items.empty?
|
|
882
|
+
last_item = @id_items[-1]
|
|
883
|
+
@id_items << item
|
|
884
|
+
# If the current item or last item have a negative offset then we have
|
|
885
|
+
# to re-sort. We also re-sort if the current item is less than the last
|
|
886
|
+
# item because we are inserting.
|
|
887
|
+
if last_item.bit_offset <= 0 or item.bit_offset <= 0 or item.bit_offset < last_item.bit_offset
|
|
888
|
+
@id_items = @id_items.sort
|
|
889
|
+
end
|
|
890
|
+
else
|
|
891
|
+
@id_items << item
|
|
892
|
+
end
|
|
822
893
|
end
|
|
823
894
|
item
|
|
824
895
|
end
|