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
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
require 'dart_common'
|
|
12
12
|
require 'dart_logging'
|
|
13
13
|
require 'packet_log_entry'
|
|
14
|
+
require 'cosmos/io/json_drb_object'
|
|
14
15
|
|
|
15
16
|
class DartDecommutatorStatus
|
|
16
17
|
attr_accessor :count
|
|
@@ -36,24 +37,40 @@ class DartDecommutator
|
|
|
36
37
|
# Wait 60s before giving up on the PacketConfig becoming ready
|
|
37
38
|
PACKET_CONFIG_READY_TIMEOUT = 60
|
|
38
39
|
|
|
40
|
+
# Delay between updating the DART status packet. Simply throttles this rarely viewed status
|
|
41
|
+
STATUS_UPDATE_PERIOD_SECONDS = 60.seconds
|
|
42
|
+
|
|
39
43
|
def initialize(worker_id = 0, num_workers = 1)
|
|
40
44
|
sync_targets_and_packets()
|
|
41
45
|
@worker_id = worker_id
|
|
42
46
|
@num_workers = num_workers
|
|
43
47
|
@status = DartDecommutatorStatus.new
|
|
48
|
+
@master = Cosmos::JsonDRbObject.new(Cosmos::System.connect_hosts['DART_MASTER'], Cosmos::System.ports['DART_MASTER'], 1.0, Cosmos::System.x_csrf_token)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def timeit(message, &block)
|
|
52
|
+
time_start = Time.now
|
|
53
|
+
yield
|
|
54
|
+
Cosmos::Logger.info("#{Time.now - time_start}s #{message}")
|
|
44
55
|
end
|
|
45
56
|
|
|
46
57
|
# Run forever looking for data to decommutate
|
|
47
58
|
def run
|
|
48
|
-
status_time = Time.now +
|
|
59
|
+
status_time = Time.now + STATUS_UPDATE_PERIOD_SECONDS
|
|
49
60
|
while true
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
ple_id = nil
|
|
62
|
+
start_time = nil
|
|
63
|
+
end_time = nil
|
|
64
|
+
begin
|
|
65
|
+
ple_ids = @master.get_decom_ple_ids()
|
|
66
|
+
rescue DRb::DRbConnError
|
|
67
|
+
sleep(1)
|
|
68
|
+
next
|
|
69
|
+
end
|
|
70
|
+
if ple_ids and ple_ids.length > 0
|
|
71
|
+
ple_ids.each do |ple_id|
|
|
56
72
|
begin
|
|
73
|
+
ple = PacketLogEntry.find(ple_id)
|
|
57
74
|
meta_ple = get_meta_ple(ple)
|
|
58
75
|
next unless meta_ple
|
|
59
76
|
system_meta = get_system_meta(ple, meta_ple)
|
|
@@ -86,15 +103,14 @@ class DartDecommutator
|
|
|
86
103
|
rescue => err
|
|
87
104
|
handle_error("PLE:#{ple.id}:ERROR\n#{err.formatted}")
|
|
88
105
|
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
delta = Time.now - time_start
|
|
94
|
-
sleep(1 - delta) if delta < 1 && delta > 0
|
|
106
|
+
end
|
|
107
|
+
else
|
|
108
|
+
sleep(1)
|
|
109
|
+
end
|
|
95
110
|
end
|
|
96
111
|
rescue Interrupt
|
|
97
112
|
Cosmos::Logger.info("Dart Worker Closing From Signal...")
|
|
113
|
+
@master.shutdown
|
|
98
114
|
end
|
|
99
115
|
|
|
100
116
|
protected
|
|
@@ -238,51 +254,45 @@ class DartDecommutator
|
|
|
238
254
|
end
|
|
239
255
|
|
|
240
256
|
def decom_packet(ple, packet, packet_config)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
packet_config.start_time
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
packet_config.end_time
|
|
248
|
-
|
|
249
|
-
|
|
257
|
+
ActiveRecord::Base.transaction do
|
|
258
|
+
# Update packet config times
|
|
259
|
+
if !packet_config.start_time or (packet.packet_time < packet_config.start_time)
|
|
260
|
+
packet_config.start_time = packet.packet_time
|
|
261
|
+
packet_config.save!
|
|
262
|
+
end
|
|
263
|
+
if !packet_config.end_time or (packet.packet_time > packet_config.end_time)
|
|
264
|
+
packet_config.end_time = packet.packet_time
|
|
265
|
+
packet_config.save!
|
|
266
|
+
end
|
|
250
267
|
|
|
251
|
-
|
|
252
|
-
ple.decom_state = PacketLogEntry::IN_PROGRESS
|
|
253
|
-
ple.save!
|
|
254
|
-
values = get_values(packet)
|
|
268
|
+
values = get_values(packet)
|
|
255
269
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
+
table_index = 0
|
|
271
|
+
rows = []
|
|
272
|
+
# Create rows in the decommutation table model
|
|
273
|
+
values.each_slice(MAX_COLUMNS_PER_TABLE) do |table_values|
|
|
274
|
+
model = get_decom_table_model(packet_config.id, table_index)
|
|
275
|
+
row = model.new
|
|
276
|
+
row.time = ple.time
|
|
277
|
+
row.ple_id = ple.id
|
|
278
|
+
row.packet_log_id = ple.packet_log_id
|
|
279
|
+
row.meta_id = ple.meta_id
|
|
280
|
+
row.reduced_state = READY_TO_REDUCE
|
|
281
|
+
table_values.each_with_index do |value, index|
|
|
282
|
+
item_index = (table_index * MAX_COLUMNS_PER_TABLE) + index
|
|
283
|
+
row.write_attribute("i#{item_index}", value)
|
|
284
|
+
end
|
|
285
|
+
row.save!
|
|
286
|
+
rows << row
|
|
287
|
+
table_index += 1
|
|
270
288
|
end
|
|
271
|
-
row.save!
|
|
272
|
-
rows << row
|
|
273
|
-
table_index += 1
|
|
274
|
-
end
|
|
275
|
-
# Mark ready to reduce
|
|
276
|
-
rows.each do |row|
|
|
277
|
-
row.reduced_state = READY_TO_REDUCE
|
|
278
|
-
row.save!
|
|
279
|
-
end
|
|
280
289
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
290
|
+
# The log entry has been decommutated, mark COMPLETE
|
|
291
|
+
ple.decom_state = PacketLogEntry::COMPLETE
|
|
292
|
+
ple.save!
|
|
293
|
+
@status.count += 1
|
|
294
|
+
Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
295
|
+
end
|
|
286
296
|
end
|
|
287
297
|
|
|
288
298
|
def handle_error(message)
|
|
@@ -80,7 +80,7 @@ class DartImporter
|
|
|
80
80
|
Cosmos::Logger.info("First and Last Packet in File not in database")
|
|
81
81
|
|
|
82
82
|
# Check if time range of packets is not present in database
|
|
83
|
-
ple = PacketLogEntry.where("time >= ? and time <= ?", first_packet.
|
|
83
|
+
ple = PacketLogEntry.where("time >= ? and time <= ?", first_packet.packet_time, last_packet.packet_time).first
|
|
84
84
|
if !ple # Can go fast if not present at all
|
|
85
85
|
Cosmos::Logger.info(" Fast Import Enabled...")
|
|
86
86
|
fast = true
|
|
@@ -134,7 +134,7 @@ class DartImporter
|
|
|
134
134
|
ple = PacketLogEntry.new
|
|
135
135
|
ple.target_id = target_id
|
|
136
136
|
ple.packet_id = packet_id
|
|
137
|
-
ple.time = packet.
|
|
137
|
+
ple.time = packet.packet_time
|
|
138
138
|
ple.packet_log_id = packet_log.id
|
|
139
139
|
ple.data_offset = data_offset
|
|
140
140
|
ple.meta_id = meta_id
|
|
@@ -149,7 +149,7 @@ class DartImporter
|
|
|
149
149
|
ple.save!(validate: false)
|
|
150
150
|
else
|
|
151
151
|
ple_data << "," if ple_data.length > 0
|
|
152
|
-
ple_data << "(#{target_id},#{packet_id},'#{packet.
|
|
152
|
+
ple_data << "(#{target_id},#{packet_id},'#{packet.packet_time.dup.utc.iso8601(6)}',#{packet_log.id},#{data_offset},#{meta_id},#{is_tlm},true)"
|
|
153
153
|
ple_data_count += 1
|
|
154
154
|
end
|
|
155
155
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'dart_common'
|
|
12
|
+
require 'dart_logging'
|
|
13
|
+
require 'thread'
|
|
14
|
+
|
|
15
|
+
# Rails Json screws up COSMOS handling of Nan, etc.
|
|
16
|
+
require "active_support/core_ext/object/json"
|
|
17
|
+
module ActiveSupport
|
|
18
|
+
module ToJsonWithActiveSupportEncoder # :nodoc:
|
|
19
|
+
def to_json(options = nil)
|
|
20
|
+
super(options)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# JsonDRb server which responds to queries for decommutated and reduced data
|
|
26
|
+
# from the database.
|
|
27
|
+
class DartMasterQuery
|
|
28
|
+
include DartCommon
|
|
29
|
+
|
|
30
|
+
def initialize(ples_per_request = 5)
|
|
31
|
+
# Keep a thread to make sure we have the current list of items to decom
|
|
32
|
+
@ples_per_request = ples_per_request
|
|
33
|
+
@mutex = Mutex.new
|
|
34
|
+
@decom_list = []
|
|
35
|
+
@thread = Thread.new do
|
|
36
|
+
loop do
|
|
37
|
+
# Get all entries that are ready and decommutation hasn't started
|
|
38
|
+
if @decom_list.length <= 0
|
|
39
|
+
@mutex.synchronize do
|
|
40
|
+
begin
|
|
41
|
+
@decom_list.replace(PacketLogEntry.where("decom_state = #{PacketLogEntry::NOT_STARTED} and ready = true").order("id ASC").limit(1000).pluck(:id))
|
|
42
|
+
rescue Exception => error
|
|
43
|
+
Cosmos::Logger.error("Error getting packets to decom\n#{error.formatted}")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
sleep(1)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Returns the id of a ple that needs to be decommed next
|
|
54
|
+
#
|
|
55
|
+
def get_decom_ple_ids()
|
|
56
|
+
begin
|
|
57
|
+
@mutex.synchronize do
|
|
58
|
+
result = []
|
|
59
|
+
@ples_per_request.times do
|
|
60
|
+
ple_id = @decom_list.shift
|
|
61
|
+
result << ple_id if ple_id
|
|
62
|
+
end
|
|
63
|
+
return result
|
|
64
|
+
end
|
|
65
|
+
rescue Exception => error
|
|
66
|
+
msg = "Master Error: #{error.message}"
|
|
67
|
+
raise $!, msg, $!.backtrace
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -114,7 +114,7 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
|
|
|
114
114
|
ple = PacketLogEntry.new
|
|
115
115
|
ple.target_id = target_id
|
|
116
116
|
ple.packet_id = packet_id
|
|
117
|
-
ple.time = packet.
|
|
117
|
+
ple.time = packet.packet_time
|
|
118
118
|
ple.packet_log_id = @packet_log_id
|
|
119
119
|
ple.data_offset = @file_size
|
|
120
120
|
ple.meta_id = @meta_id
|
|
@@ -134,7 +134,7 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
|
|
|
134
134
|
@sync_count = 0
|
|
135
135
|
end
|
|
136
136
|
@ple_data << "," if @ple_data.length > 0
|
|
137
|
-
@ple_data << "(#{target_id},#{packet_id},'#{packet.
|
|
137
|
+
@ple_data << "(#{target_id},#{packet_id},'#{packet.packet_time.dup.utc.iso8601(6)}',#{@packet_log_id},#{@file_size},#{@meta_id},#{@is_tlm},true)"
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
@@ -14,6 +14,11 @@ ItemToDecomTableMapping
|
|
|
14
14
|
|
|
15
15
|
# Thread which performs data reduction in the DART database.
|
|
16
16
|
class DartReducerWorkerThread
|
|
17
|
+
# This constant controls how much spread there must be in the data before doing a reduction. Since our minimum
|
|
18
|
+
# reduction is 1 minute, we will wait until we have at least two minutes of spread. Not as important for higher order
|
|
19
|
+
# reductions but also ensures that there is a spread in the data points.
|
|
20
|
+
HOLD_OFF_TIME = 2.minutes
|
|
21
|
+
|
|
17
22
|
# Create a new thread and start it
|
|
18
23
|
#
|
|
19
24
|
# @param master_queue [Queue] Queue which the new thread will be added to
|
|
@@ -61,145 +66,44 @@ class DartReducerWorkerThread
|
|
|
61
66
|
|
|
62
67
|
time_delta, base_model_time_column, time_method = job_attributes(job_type)
|
|
63
68
|
rows = []
|
|
69
|
+
done = false
|
|
64
70
|
# Find all the rows in the decommutation table which are ready to reduce
|
|
65
|
-
base_model.where("reduced_state = #{DartCommon::READY_TO_REDUCE}").order("meta_id ASC, #{base_model_time_column} ASC").
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
item_name = "i#{mapping.item_index}"
|
|
86
|
-
min_item_name = "i#{mapping.item_index}min"
|
|
87
|
-
max_item_name = "i#{mapping.item_index}max"
|
|
88
|
-
avg_item_name = "i#{mapping.item_index}avg"
|
|
89
|
-
stddev_item_name = "i#{mapping.item_index}stddev"
|
|
90
|
-
min_value = nil
|
|
91
|
-
max_value = nil
|
|
92
|
-
total_samples = 0 # s0
|
|
93
|
-
avg_value = 0.0 # s1
|
|
94
|
-
s2 = 0.0
|
|
95
|
-
stddev_value = 0.0
|
|
96
|
-
min_nan_found = false
|
|
97
|
-
max_nan_found = false
|
|
98
|
-
avg_nan_found = false
|
|
99
|
-
stddev_nan_found = false
|
|
100
|
-
# Process each of the rows in the base model which is the decommutation table
|
|
101
|
-
# or a lesser reduction table (the minute or hour table).
|
|
102
|
-
sample_rows.each do |row_to_reduce|
|
|
103
|
-
# If we processing minute data we're reading from the base decommutation table
|
|
104
|
-
# thus there is only raw values to read
|
|
105
|
-
if job_type == :MINUTE
|
|
106
|
-
value = row_to_reduce.read_attribute(item_name)
|
|
107
|
-
min_sample = value
|
|
108
|
-
max_sample = value
|
|
109
|
-
avg_sample = value
|
|
110
|
-
if value.nil?
|
|
111
|
-
handle_error("#{item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
112
|
-
next
|
|
113
|
-
end
|
|
114
|
-
else # :HOUR or :DAY
|
|
115
|
-
# We're processing hour or day data so we're reducing previously reduced data
|
|
116
|
-
# thus there are min, max, and average values to read
|
|
117
|
-
min_sample = row_to_reduce.read_attribute(min_item_name)
|
|
118
|
-
max_sample = row_to_reduce.read_attribute(max_item_name)
|
|
119
|
-
avg_sample = row_to_reduce.read_attribute(avg_item_name)
|
|
120
|
-
stddev_sample = row_to_reduce.read_attribute(stddev_item_name)
|
|
121
|
-
if min_sample.nil?
|
|
122
|
-
handle_error("#{min_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
123
|
-
next
|
|
124
|
-
end
|
|
125
|
-
if max_sample.nil?
|
|
126
|
-
handle_error("#{max_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
127
|
-
next
|
|
128
|
-
end
|
|
129
|
-
if avg_sample.nil?
|
|
130
|
-
handle_error("#{avg_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
131
|
-
next
|
|
132
|
-
end
|
|
133
|
-
if stddev_sample.nil?
|
|
134
|
-
handle_error("#{stddev_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
135
|
-
next
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
if nan_value?(min_sample)
|
|
140
|
-
min_nan_found = true
|
|
141
|
-
else
|
|
142
|
-
if !min_value or min_sample < min_value
|
|
143
|
-
min_value = min_sample
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
if nan_value?(max_sample)
|
|
148
|
-
max_nan_found = true
|
|
149
|
-
else
|
|
150
|
-
if !max_value or max_sample > max_value
|
|
151
|
-
max_value = max_sample
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
if nan_value?(avg_sample)
|
|
156
|
-
avg_nan_found = true
|
|
157
|
-
else
|
|
158
|
-
# MINUTE data is reducing the decommutated values
|
|
159
|
-
if job_type == :MINUTE
|
|
160
|
-
total_samples += 1 # s0
|
|
161
|
-
avg_value += avg_sample # s1
|
|
162
|
-
s2 += (avg_sample * avg_sample)
|
|
163
|
-
else # :HOUR or :DAY
|
|
164
|
-
# Aggregated Stddev
|
|
165
|
-
# See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
|
|
166
|
-
total_samples += row_to_reduce.num_samples # s0
|
|
167
|
-
avg_value += (avg_sample * row_to_reduce.num_samples) # s1
|
|
168
|
-
s2 += row_to_reduce.num_samples * (avg_sample * avg_sample + stddev_sample * stddev_sample)
|
|
71
|
+
row_ids = base_model.where("reduced_state = #{DartCommon::READY_TO_REDUCE}").order("meta_id ASC, #{base_model_time_column} ASC").pluck(:id)
|
|
72
|
+
if row_ids.length > 0
|
|
73
|
+
first_row = base_model.find(row_ids[0])
|
|
74
|
+
last_row = base_model.find(row_ids[-1])
|
|
75
|
+
first_query_row_time = first_row.send(base_model_time_column)
|
|
76
|
+
last_query_row_time = last_row.send(base_model_time_column)
|
|
77
|
+
# Require at least a 2 minute spread to ensure a full minute of context is available
|
|
78
|
+
if (last_query_row_time - first_query_row_time) > HOLD_OFF_TIME
|
|
79
|
+
row_ids.in_groups_of(1000, false).each do |group_row_ids|
|
|
80
|
+
break if done
|
|
81
|
+
query_rows = base_model.order("meta_id ASC, #{base_model_time_column} ASC").where(id: group_row_ids)
|
|
82
|
+
query_rows.each do |row|
|
|
83
|
+
rows << row
|
|
84
|
+
first_row_time = rows[0].send(base_model_time_column)
|
|
85
|
+
last_row_time = rows[-1].send(base_model_time_column)
|
|
86
|
+
|
|
87
|
+
# Break if we are near the end of a minute
|
|
88
|
+
if (last_query_row_time - last_row_time) < 1.minute
|
|
89
|
+
done = true
|
|
90
|
+
break
|
|
169
91
|
end
|
|
92
|
+
|
|
93
|
+
# Ensure we have conditions to process the reduction data
|
|
94
|
+
next unless (last_row_time - first_row_time) > time_delta || # Enough samples or
|
|
95
|
+
# The time attribute (min, hour, day) has changed or
|
|
96
|
+
first_row_time.send(time_method) != last_row_time.send(time_method) ||
|
|
97
|
+
rows[0].meta_id != rows[-1].meta_id # New meta data
|
|
98
|
+
|
|
99
|
+
# Sample from the start to the second to last row because the last row
|
|
100
|
+
# is where we detected a change. The last row will be part of a new sample set.
|
|
101
|
+
sample_rows = rows[0..-2]
|
|
102
|
+
create_reduced_row(sample_rows, base_model, reduction_model, base_model_time_column, mappings, job_type)
|
|
103
|
+
rows = rows[-1..-1] # Start a new sample with the last item in the previous sample
|
|
170
104
|
end
|
|
171
105
|
end
|
|
172
|
-
if total_samples != 0
|
|
173
|
-
# Aggregated Stddev
|
|
174
|
-
# See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
|
|
175
|
-
avg_value = avg_value.to_f / total_samples
|
|
176
|
-
# Note: For very large numbers with very small deviations this sqrt can fail. If so then just set the stddev to 0.
|
|
177
|
-
begin
|
|
178
|
-
stddev_value = sqrt((s2 / total_samples) - (avg_value * avg_value))
|
|
179
|
-
rescue Exception
|
|
180
|
-
stddev_value = 0.0
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
min_value = Float::NAN if min_nan_found and !min_value
|
|
184
|
-
max_value = Float::NAN if max_nan_found and !max_value
|
|
185
|
-
if avg_nan_found and total_samples == 0
|
|
186
|
-
avg_value = Float::NAN
|
|
187
|
-
stddev_value = Float::NAN
|
|
188
|
-
end
|
|
189
|
-
new_row.write_attribute(min_item_name, min_value)
|
|
190
|
-
new_row.write_attribute(max_item_name, max_value)
|
|
191
|
-
new_row.write_attribute(avg_item_name, avg_value)
|
|
192
|
-
new_row.write_attribute(stddev_item_name, stddev_value)
|
|
193
106
|
end
|
|
194
|
-
base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_state => DartCommon::REDUCED)
|
|
195
|
-
new_row.save! # Create the reduced data row in the database
|
|
196
|
-
base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_id => new_row.id)
|
|
197
|
-
new_row.reduced_state = DartCommon::READY_TO_REDUCE
|
|
198
|
-
new_row.save!
|
|
199
|
-
@status.count += 1
|
|
200
|
-
|
|
201
|
-
rows = rows[-1..-1] # Start a new sample with the last item in the previous sample
|
|
202
|
-
Cosmos::Logger.debug("Created #{new_row.class}:#{new_row.id} with #{mappings.length} items from #{new_row.num_samples} samples")
|
|
203
107
|
end
|
|
204
108
|
complete_job(job_type, packet_config_id, table_index)
|
|
205
109
|
end # while @running
|
|
@@ -208,6 +112,133 @@ class DartReducerWorkerThread
|
|
|
208
112
|
handle_error("Reducer Thread Unexpectedly Died: #{error.formatted}")
|
|
209
113
|
end
|
|
210
114
|
|
|
115
|
+
def create_reduced_row(sample_rows, base_model, reduction_model, base_model_time_column, mappings, job_type)
|
|
116
|
+
new_row = reduction_model.new
|
|
117
|
+
new_row.start_time = sample_rows[0].send(base_model_time_column)
|
|
118
|
+
new_row.num_samples = sample_rows.length
|
|
119
|
+
new_row.meta_id = sample_rows[0].meta_id
|
|
120
|
+
new_row.packet_log_id = sample_rows[0].packet_log_id
|
|
121
|
+
# Process each of the ItemToDecomTableMapping to get the item to be reduced
|
|
122
|
+
mappings.each do |mapping|
|
|
123
|
+
item_name = "i#{mapping.item_index}"
|
|
124
|
+
min_item_name = "i#{mapping.item_index}min"
|
|
125
|
+
max_item_name = "i#{mapping.item_index}max"
|
|
126
|
+
avg_item_name = "i#{mapping.item_index}avg"
|
|
127
|
+
stddev_item_name = "i#{mapping.item_index}stddev"
|
|
128
|
+
min_value = nil
|
|
129
|
+
max_value = nil
|
|
130
|
+
total_samples = 0 # s0
|
|
131
|
+
avg_value = 0.0 # s1
|
|
132
|
+
s2 = 0.0
|
|
133
|
+
stddev_value = 0.0
|
|
134
|
+
min_nan_found = false
|
|
135
|
+
max_nan_found = false
|
|
136
|
+
avg_nan_found = false
|
|
137
|
+
stddev_nan_found = false
|
|
138
|
+
# Process each of the rows in the base model which is the decommutation table
|
|
139
|
+
# or a lesser reduction table (the minute or hour table).
|
|
140
|
+
sample_rows.each do |row_to_reduce|
|
|
141
|
+
# If we processing minute data we're reading from the base decommutation table
|
|
142
|
+
# thus there is only raw values to read
|
|
143
|
+
if job_type == :MINUTE
|
|
144
|
+
value = row_to_reduce.read_attribute(item_name)
|
|
145
|
+
min_sample = value
|
|
146
|
+
max_sample = value
|
|
147
|
+
avg_sample = value
|
|
148
|
+
if value.nil?
|
|
149
|
+
handle_error("#{item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
150
|
+
next
|
|
151
|
+
end
|
|
152
|
+
else # :HOUR or :DAY
|
|
153
|
+
# We're processing hour or day data so we're reducing previously reduced data
|
|
154
|
+
# thus there are min, max, and average values to read
|
|
155
|
+
min_sample = row_to_reduce.read_attribute(min_item_name)
|
|
156
|
+
max_sample = row_to_reduce.read_attribute(max_item_name)
|
|
157
|
+
avg_sample = row_to_reduce.read_attribute(avg_item_name)
|
|
158
|
+
stddev_sample = row_to_reduce.read_attribute(stddev_item_name)
|
|
159
|
+
if min_sample.nil?
|
|
160
|
+
handle_error("#{min_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
161
|
+
next
|
|
162
|
+
end
|
|
163
|
+
if max_sample.nil?
|
|
164
|
+
handle_error("#{max_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
165
|
+
next
|
|
166
|
+
end
|
|
167
|
+
if avg_sample.nil?
|
|
168
|
+
handle_error("#{avg_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
169
|
+
next
|
|
170
|
+
end
|
|
171
|
+
if stddev_sample.nil?
|
|
172
|
+
handle_error("#{stddev_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
|
173
|
+
next
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
if nan_value?(min_sample)
|
|
178
|
+
min_nan_found = true
|
|
179
|
+
else
|
|
180
|
+
if !min_value or min_sample < min_value
|
|
181
|
+
min_value = min_sample
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if nan_value?(max_sample)
|
|
186
|
+
max_nan_found = true
|
|
187
|
+
else
|
|
188
|
+
if !max_value or max_sample > max_value
|
|
189
|
+
max_value = max_sample
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
if nan_value?(avg_sample)
|
|
194
|
+
avg_nan_found = true
|
|
195
|
+
else
|
|
196
|
+
# MINUTE data is reducing the decommutated values
|
|
197
|
+
if job_type == :MINUTE
|
|
198
|
+
total_samples += 1 # s0
|
|
199
|
+
avg_value += avg_sample # s1
|
|
200
|
+
s2 += (avg_sample * avg_sample)
|
|
201
|
+
else # :HOUR or :DAY
|
|
202
|
+
# Aggregated Stddev
|
|
203
|
+
# See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
|
|
204
|
+
total_samples += row_to_reduce.num_samples # s0
|
|
205
|
+
avg_value += (avg_sample * row_to_reduce.num_samples) # s1
|
|
206
|
+
s2 += row_to_reduce.num_samples * (avg_sample * avg_sample + stddev_sample * stddev_sample)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
if total_samples != 0
|
|
211
|
+
# Aggregated Stddev
|
|
212
|
+
# See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
|
|
213
|
+
avg_value = avg_value.to_f / total_samples
|
|
214
|
+
# Note: For very large numbers with very small deviations this sqrt can fail. If so then just set the stddev to 0.
|
|
215
|
+
begin
|
|
216
|
+
stddev_value = sqrt((s2 / total_samples) - (avg_value * avg_value))
|
|
217
|
+
rescue Exception
|
|
218
|
+
stddev_value = 0.0
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
min_value = Float::NAN if min_nan_found and !min_value
|
|
222
|
+
max_value = Float::NAN if max_nan_found and !max_value
|
|
223
|
+
if avg_nan_found and total_samples == 0
|
|
224
|
+
avg_value = Float::NAN
|
|
225
|
+
stddev_value = Float::NAN
|
|
226
|
+
end
|
|
227
|
+
new_row.write_attribute(min_item_name, min_value)
|
|
228
|
+
new_row.write_attribute(max_item_name, max_value)
|
|
229
|
+
new_row.write_attribute(avg_item_name, avg_value)
|
|
230
|
+
new_row.write_attribute(stddev_item_name, stddev_value)
|
|
231
|
+
end
|
|
232
|
+
base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_state => DartCommon::REDUCED)
|
|
233
|
+
new_row.save! # Create the reduced data row in the database
|
|
234
|
+
base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_id => new_row.id)
|
|
235
|
+
new_row.reduced_state = DartCommon::READY_TO_REDUCE
|
|
236
|
+
new_row.save!
|
|
237
|
+
@status.count += 1
|
|
238
|
+
|
|
239
|
+
Cosmos::Logger.debug("Created #{new_row.class}:#{new_row.id} with #{mappings.length} items from #{new_row.num_samples} samples")
|
|
240
|
+
end
|
|
241
|
+
|
|
211
242
|
# Shutdown the worker thread
|
|
212
243
|
def shutdown
|
|
213
244
|
@running = false
|