cosmos 3.9.2 → 4.0.0
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/.rubocop.yml +23 -0
- data/.travis.yml +1 -0
- data/.yardopts +3 -0
- data/Gemfile +1 -1
- data/Manifest.txt +137 -52
- data/Rakefile +50 -44
- data/autohotkey/config/system/system.txt +0 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
- data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
- data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
- data/autohotkey/config/targets/META/screens/data.txt +12 -0
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
- data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
- data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
- data/autohotkey/tools/CmdSequence +14 -0
- data/autohotkey/tools/CmdSequenceAHK +23 -0
- data/autohotkey/tools/CmdSequenceAHK2 +16 -0
- data/autohotkey/tools/cmd_extractor.ahk +2 -2
- data/autohotkey/tools/cmd_sender.ahk +4 -6
- data/autohotkey/tools/cmd_sequence.ahk +215 -0
- data/autohotkey/tools/cmd_sequence2.ahk +23 -0
- data/autohotkey/tools/data_viewer.ahk +2 -3
- data/autohotkey/tools/limits_monitor.ahk +9 -11
- data/autohotkey/tools/open_gl_builder.ahk +1 -2
- data/autohotkey/tools/packet_viewer.ahk +51 -35
- data/autohotkey/tools/replay.ahk +1 -2
- data/autohotkey/tools/script_runner.ahk +1 -2
- data/autohotkey/tools/script_runner2.ahk +1 -2
- data/autohotkey/tools/test_runner2.ahk +1 -5
- data/autohotkey/tools/test_runner3.ahk +1 -3
- data/autohotkey/tools/tlm_grapher.ahk +1 -3
- data/autohotkey/tools/tlm_grapher3.ahk +1 -2
- data/autohotkey/tools/tlm_viewer.ahk +8 -3
- data/autohotkey/tools/tlm_viewer2.ahk +2 -3
- data/autohotkey/tools/tlm_viewer5.ahk +1 -2
- data/cosmos.gemspec +26 -20
- data/data/cmd_sequence.png +0 -0
- data/data/config/_array_params.yaml +23 -0
- data/data/config/_id_items.yaml +24 -0
- data/data/config/_id_params.yaml +58 -0
- data/data/config/_interfaces.yaml +206 -0
- data/data/config/_items.yaml +20 -0
- data/data/config/_params.yaml +58 -0
- data/data/config/cmd_tlm_server.yaml +110 -0
- data/data/config/command.yaml +38 -0
- data/data/config/command_modifiers.yaml +127 -0
- data/data/config/command_telemetry.yaml +3 -0
- data/data/config/data_viewer.yaml +43 -0
- data/data/config/handbook_creator.yaml +23 -0
- data/data/config/housekeeping_params.yaml +71 -0
- data/data/config/interface_modifiers.yaml +44 -0
- data/data/config/item_modifiers.yaml +172 -0
- data/data/config/launcher.yaml +117 -0
- data/data/config/limits_monitor.yaml +53 -0
- data/data/config/linegraph_params.yaml +30 -0
- data/data/config/linegraph_plot.yaml +106 -0
- data/data/config/page_modifiers.yaml +128 -0
- data/data/config/param_item_modifiers.yaml +41 -0
- data/data/config/parameter_modifiers.yaml +144 -0
- data/data/config/protocols.yaml +257 -0
- data/data/config/screen.yaml +151 -0
- data/data/config/script_runner.yaml +15 -0
- data/data/config/system.yaml +153 -0
- data/data/config/table_manager.yaml +76 -0
- data/data/config/table_parameter_modifiers.yaml +9 -0
- data/data/config/target.yaml +71 -0
- data/data/config/telemetry.yaml +73 -0
- data/data/config/telemetry_modifiers.yaml +129 -0
- data/data/config/test_runner.yaml +118 -0
- data/data/config/tlm_extractor.yaml +109 -0
- data/data/config/tlm_grapher.yaml +78 -0
- data/data/config/tlm_viewer.yaml +107 -0
- data/data/config/unknown.yaml +3 -0
- data/data/config/widgets.yaml +1339 -0
- data/data/config/xy_params.yaml +50 -0
- data/data/config/xy_plot.yaml +12 -0
- data/data/config_editor.png +0 -0
- data/data/crc.txt +172 -161
- data/data/delete.png +0 -0
- data/demo/config/data/crc.txt +56 -36
- data/demo/config/data/meta_init.txt +1 -4
- data/demo/config/system/system.txt +15 -3
- data/demo/config/system/system2.txt +13 -3
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
- data/demo/config/targets/EXAMPLE/target.txt +3 -1
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
- data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
- data/demo/config/targets/INST/screens/adcs.txt +39 -15
- data/demo/config/targets/INST/screens/commanding.txt +26 -19
- data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
- data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
- data/demo/config/targets/INST/screens/tabs.txt +0 -2
- data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
- data/demo/config/targets/INST/tables/EventAction.csv +9 -0
- data/demo/config/targets/INST/tables/EventAction.dat +0 -0
- data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
- data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
- data/demo/config/targets/INST/target.txt +4 -0
- data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
- data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
- data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
- data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
- data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
- data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
- data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
- data/demo/config/targets/SYSTEM/target.txt +12 -0
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
- data/demo/config/targets/TEMPLATED/target.txt +2 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
- data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
- data/demo/config/tools/launcher/launcher.txt +9 -6
- data/demo/config/tools/launcher/launcher2.txt +16 -13
- data/demo/config/tools/launcher/launcher_mini.txt +45 -0
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
- data/demo/config/tools/test_runner/test_runner.txt +1 -1
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/demo/lib/example_background_task.rb +9 -5
- data/demo/lib/example_target.rb +5 -15
- data/demo/lib/scpi_target.rb +4 -10
- data/demo/procedures/cosmos_api_test.rb +17 -0
- data/demo/tools/CmdSequence +16 -0
- data/demo/tools/CmdSequence.bat +9 -0
- data/demo/tools/ConfigEditor +16 -0
- data/demo/tools/ConfigEditor.bat +9 -0
- data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
- data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
- data/ext/cosmos/ext/packet/packet.c +5 -5
- data/install/config/data/crc.txt +12 -8
- data/install/config/system/system.txt +13 -3
- data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
- data/install/config/targets/SYSTEM/target.txt +12 -0
- data/install/tools/CmdSequence +16 -0
- data/install/tools/CmdSequence.bat +9 -0
- data/install/tools/ConfigEditor +16 -0
- data/install/tools/ConfigEditor.bat +9 -0
- data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
- data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
- data/lib/cosmos.rb +1 -1
- data/lib/cosmos/config/config_parser.rb +147 -59
- data/lib/cosmos/config/meta_config_parser.rb +57 -0
- data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
- data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
- data/lib/cosmos/core_ext/array.rb +45 -5
- data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
- data/lib/cosmos/core_ext/file.rb +2 -2
- data/lib/cosmos/core_ext/kernel.rb +1 -6
- data/lib/cosmos/core_ext/objectspace.rb +0 -2
- data/lib/cosmos/core_ext/string.rb +27 -4
- data/lib/cosmos/core_ext/time.rb +39 -10
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
- data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
- data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
- data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
- data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
- data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
- data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
- data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
- data/lib/cosmos/gui/dialogs/splash.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
- data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
- data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
- data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
- data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
- data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
- data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
- data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
- data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
- data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
- data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
- data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
- data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
- data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
- data/lib/cosmos/gui/qt.rb +1 -1
- data/lib/cosmos/gui/qt_tool.rb +21 -10
- data/lib/cosmos/gui/text/completion.rb +23 -2
- data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
- data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
- data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
- data/lib/cosmos/interfaces.rb +10 -0
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
- data/lib/cosmos/interfaces/interface.rb +240 -22
- data/lib/cosmos/interfaces/linc_interface.rb +3 -5
- data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
- data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
- data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
- data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
- data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
- data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
- data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
- data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
- data/lib/cosmos/interfaces/serial_interface.rb +28 -23
- data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
- data/lib/cosmos/interfaces/stream_interface.rb +36 -108
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
- data/lib/cosmos/interfaces/udp_interface.rb +51 -83
- data/lib/cosmos/io/buffered_file.rb +92 -2
- data/lib/cosmos/io/json_drb.rb +2 -2
- data/lib/cosmos/io/posix_serial_driver.rb +3 -1
- data/lib/cosmos/io/raw_logger.rb +3 -3
- data/lib/cosmos/io/serial_driver.rb +14 -5
- data/lib/cosmos/io/win32_serial_driver.rb +16 -4
- data/lib/cosmos/packet_logs.rb +0 -1
- data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
- data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
- data/lib/cosmos/packets/binary_accessor.rb +599 -32
- data/lib/cosmos/packets/commands.rb +48 -24
- data/lib/cosmos/packets/packet.rb +140 -54
- data/lib/cosmos/packets/packet_config.rb +0 -2
- data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
- data/lib/cosmos/packets/structure.rb +81 -33
- data/lib/cosmos/packets/structure_item.rb +45 -5
- data/lib/cosmos/packets/telemetry.rb +149 -55
- data/lib/cosmos/script/api_shared.rb +1000 -0
- data/lib/cosmos/script/commands.rb +2 -2
- data/lib/cosmos/script/extract.rb +19 -4
- data/lib/cosmos/script/limits.rb +2 -0
- data/lib/cosmos/script/script.rb +1 -1
- data/lib/cosmos/script/scripting.rb +4 -784
- data/lib/cosmos/script/telemetry.rb +44 -23
- data/lib/cosmos/script/tools.rb +15 -69
- data/lib/cosmos/streams/serial_stream.rb +12 -19
- data/lib/cosmos/streams/stream.rb +2 -11
- data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
- data/lib/cosmos/system/system.rb +187 -31
- data/lib/cosmos/system/target.rb +11 -2
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
- data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
- data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
- data/lib/cosmos/tools/launcher/launcher.rb +29 -12
- data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
- data/lib/cosmos/tools/replay/replay.rb +36 -20
- data/lib/cosmos/tools/replay/replay_server.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
- data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
- data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
- data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
- data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
- data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
- data/lib/cosmos/top_level.rb +34 -24
- data/lib/cosmos/utilities/crc.rb +108 -6
- data/lib/cosmos/utilities/csv.rb +68 -14
- data/lib/cosmos/utilities/logger.rb +2 -2
- data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
- data/lib/cosmos/version.rb +6 -6
- data/lib/cosmos/win32/win32_main.rb +50 -46
- data/run_gui_tests.bat +3 -1
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
- data/spec/core_ext/file_spec.rb +1 -1
- data/spec/core_ext/objectspace_spec.rb +12 -9
- data/spec/core_ext/string_spec.rb +6 -0
- data/spec/core_ext/time_spec.rb +10 -0
- data/spec/gui/line_graph/line_clip_spec.rb +226 -224
- data/spec/gui/qt_spec.rb +81 -79
- data/spec/install/config/system/system.txt +0 -6
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
- data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
- data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
- data/spec/install/config/targets/SYSTEM/target.txt +12 -0
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
- data/spec/interfaces/interface_spec.rb +402 -18
- data/spec/interfaces/linc_interface_spec.rb +37 -39
- data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
- data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
- data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
- data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
- data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
- data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
- data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
- data/spec/interfaces/serial_interface_spec.rb +35 -34
- data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
- data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
- data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
- data/spec/interfaces/udp_interface_spec.rb +120 -55
- data/spec/io/serial_driver_spec.rb +41 -39
- data/spec/io/udp_sockets_spec.rb +13 -8
- data/spec/io/win32_serial_driver_spec.rb +62 -59
- data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
- data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
- data/spec/packets/commands_spec.rb +5 -5
- data/spec/packets/packet_spec.rb +2 -14
- data/spec/script/extract_spec.rb +21 -7
- data/spec/script/scripting_spec.rb +261 -6
- data/spec/script/telemetry_spec.rb +17 -9
- data/spec/spec_helper.rb +26 -10
- data/spec/streams/serial_stream_spec.rb +87 -82
- data/spec/streams/tcpip_client_stream_spec.rb +12 -4
- data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
- data/spec/system/system_spec.rb +66 -50
- data/spec/system/target_spec.rb +33 -11
- data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
- data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
- data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
- data/spec/top_level/top_level_spec.rb +39 -11
- data/spec/utilities/csv_spec.rb +62 -20
- data/tasks/gemfile_stats.rake +6 -3
- data/test/performance/config/system/system_packets.txt +0 -1
- data/test/performance/config/system/system_threads.txt +0 -1
- metadata +177 -92
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
- data/autohotkey/config/targets/COSMOS/target.txt +0 -5
- data/autohotkey/userpath.txt +0 -1
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/demo/config/targets/COSMOS/screens/version.txt +0 -19
- data/demo/config/targets/COSMOS/target.txt +0 -11
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
- data/demo/userpath.txt +0 -1
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/install/config/targets/COSMOS/screens/version.txt +0 -19
- data/install/config/targets/COSMOS/target.txt +0 -9
- data/install/config/targets/SYSTEM/README.txt +0 -1
- data/install/userpath.txt +0 -1
- data/lib/cosmos/io/tcpip_server.rb +0 -571
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
- data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
- data/lib/cosmos/streams/stream_protocol.rb +0 -373
- data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
- data/spec/install/config/targets/COSMOS/target.txt +0 -5
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
- data/spec/install/userpath.txt +0 -1
- data/spec/interfaces/stream_interface_spec.rb +0 -157
- data/spec/io/tcpip_server_spec.rb +0 -338
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
- data/spec/streams/burst_stream_protocol_spec.rb +0 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
- data/spec/streams/length_stream_protocol_spec.rb +0 -300
- data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
- data/spec/streams/stream_protocol_spec.rb +0 -346
- data/spec/streams/template_stream_protocol_spec.rb +0 -156
- data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
- data/test/performance/userpath.txt +0 -1
|
@@ -29,10 +29,8 @@ module Cosmos
|
|
|
29
29
|
attr_accessor :background_tasks
|
|
30
30
|
# @return [String] Command and Telemetry Server title
|
|
31
31
|
attr_accessor :title
|
|
32
|
-
# @return [
|
|
33
|
-
attr_accessor :
|
|
34
|
-
# @return [String or nil] Meta Packet Name
|
|
35
|
-
attr_accessor :meta_packet_name
|
|
32
|
+
# @return [Boolean] Flag indicating if meta data should be collected
|
|
33
|
+
attr_accessor :metadata
|
|
36
34
|
|
|
37
35
|
# Create a default pair of packet log writers and parses the
|
|
38
36
|
# configuration file.
|
|
@@ -42,13 +40,12 @@ module Cosmos
|
|
|
42
40
|
@interfaces = {}
|
|
43
41
|
@routers = {}
|
|
44
42
|
@packet_log_writer_pairs = {}
|
|
45
|
-
cmd_log_writer = System.default_packet_log_writer.new(:CMD)
|
|
46
|
-
tlm_log_writer = System.default_packet_log_writer.new(:TLM)
|
|
43
|
+
cmd_log_writer = System.default_packet_log_writer.new(:CMD, *System.default_packet_log_writer_params)
|
|
44
|
+
tlm_log_writer = System.default_packet_log_writer.new(:TLM, *System.default_packet_log_writer_params)
|
|
47
45
|
@packet_log_writer_pairs['DEFAULT'] = PacketLogWriterPair.new(cmd_log_writer, tlm_log_writer)
|
|
48
46
|
@background_tasks = []
|
|
49
47
|
@title = nil
|
|
50
|
-
@
|
|
51
|
-
@meta_packet_name = nil
|
|
48
|
+
@metadata = false
|
|
52
49
|
process_file(filename)
|
|
53
50
|
end
|
|
54
51
|
|
|
@@ -67,7 +64,7 @@ module Cosmos
|
|
|
67
64
|
Logger.info "Processing CmdTlmServer configuration in file: #{File.expand_path(filename)}"
|
|
68
65
|
|
|
69
66
|
Cosmos.set_working_dir do
|
|
70
|
-
|
|
67
|
+
parser = ConfigParser.new("http://cosmosrb.com/docs/system/#command-and-telemetry-server-configuration")
|
|
71
68
|
parser.parse_file(filename) do |keyword, params|
|
|
72
69
|
case keyword
|
|
73
70
|
when 'TITLE'
|
|
@@ -145,7 +142,7 @@ module Cosmos
|
|
|
145
142
|
current_interface_or_router.name = interface_name
|
|
146
143
|
@interfaces[interface_name] = current_interface_or_router
|
|
147
144
|
|
|
148
|
-
when 'LOG', 'DONT_LOG', 'TARGET'
|
|
145
|
+
when 'LOG', 'DONT_LOG', 'TARGET', 'PROTOCOL'
|
|
149
146
|
raise parser.error("No current interface for #{keyword}") unless current_interface_or_router and current_type == :INTERFACE
|
|
150
147
|
|
|
151
148
|
case keyword
|
|
@@ -173,6 +170,19 @@ module Cosmos
|
|
|
173
170
|
raise parser.error("Unknown target #{target_name} mapped to interface #{current_interface_or_router.name}")
|
|
174
171
|
end
|
|
175
172
|
|
|
173
|
+
when 'PROTOCOL'
|
|
174
|
+
usage = "#{keyword} <READ WRITE READ_WRITE> <protocol filename or classname> <Protocol specific parameters>"
|
|
175
|
+
parser.verify_num_parameters(2, nil, usage)
|
|
176
|
+
unless %w(READ WRITE READ_WRITE).include? params[0].upcase
|
|
177
|
+
raise parser.error("Invalid protocol type: #{params[0]}", usage)
|
|
178
|
+
end
|
|
179
|
+
begin
|
|
180
|
+
klass = Cosmos.require_class(params[1])
|
|
181
|
+
current_interface_or_router.add_protocol(klass, params[2..-1], params[0].upcase.intern)
|
|
182
|
+
rescue LoadError, StandardError => error
|
|
183
|
+
raise parser.error(error.message, usage)
|
|
184
|
+
end
|
|
185
|
+
|
|
176
186
|
end # end case keyword for all keywords that require a current interface
|
|
177
187
|
|
|
178
188
|
when 'DONT_CONNECT', 'DONT_RECONNECT', 'RECONNECT_DELAY', 'DISABLE_DISCONNECT', 'LOG_RAW', 'ROUTER_LOG_RAW', 'OPTION'
|
|
@@ -249,12 +259,9 @@ module Cosmos
|
|
|
249
259
|
raise parser.error("No BACKGROUND_TASK defined") if @background_tasks.empty?
|
|
250
260
|
@background_tasks[-1].stopped = true
|
|
251
261
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
System.telemetry.packet(params[0], params[1])
|
|
256
|
-
@meta_target_name = params[0]
|
|
257
|
-
@meta_packet_name = params[1]
|
|
262
|
+
when 'COLLECT_METADATA'
|
|
263
|
+
parser.verify_num_parameters(0, 0, "#{keyword}")
|
|
264
|
+
@metadata = true
|
|
258
265
|
|
|
259
266
|
else
|
|
260
267
|
# blank lines will have a nil keyword and should not raise an exception
|
|
@@ -10,15 +10,68 @@
|
|
|
10
10
|
|
|
11
11
|
require 'cosmos'
|
|
12
12
|
require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server'
|
|
13
|
-
|
|
14
|
-
require 'cosmos/tools/cmd_tlm_server/gui/
|
|
15
|
-
require 'cosmos/tools/cmd_tlm_server/gui/
|
|
16
|
-
require 'cosmos/tools/cmd_tlm_server/gui/
|
|
17
|
-
require 'cosmos/tools/cmd_tlm_server/gui/
|
|
18
|
-
require 'cosmos/gui/
|
|
19
|
-
require 'cosmos/gui/
|
|
20
|
-
require 'cosmos/gui/dialogs/
|
|
21
|
-
require 'cosmos/gui/dialogs/
|
|
13
|
+
if RUBY_ENGINE == 'ruby'
|
|
14
|
+
require 'cosmos/tools/cmd_tlm_server/gui/interfaces_tab'
|
|
15
|
+
require 'cosmos/tools/cmd_tlm_server/gui/targets_tab'
|
|
16
|
+
require 'cosmos/tools/cmd_tlm_server/gui/packets_tab'
|
|
17
|
+
require 'cosmos/tools/cmd_tlm_server/gui/logging_tab'
|
|
18
|
+
require 'cosmos/tools/cmd_tlm_server/gui/status_tab'
|
|
19
|
+
require 'cosmos/gui/qt_tool'
|
|
20
|
+
require 'cosmos/gui/dialogs/splash'
|
|
21
|
+
require 'cosmos/gui/dialogs/exception_dialog'
|
|
22
|
+
require 'cosmos/gui/dialogs/set_tlm_dialog'
|
|
23
|
+
else
|
|
24
|
+
# The following stubs allow the CmdTlmServer to run under JRuby with no gui
|
|
25
|
+
require 'ostruct'
|
|
26
|
+
require 'optparse'
|
|
27
|
+
|
|
28
|
+
class QtTool
|
|
29
|
+
def self.slots(*args)
|
|
30
|
+
# Do nothing
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.create_default_options
|
|
34
|
+
options = OpenStruct.new
|
|
35
|
+
options.redirect_io = true
|
|
36
|
+
options.title = "COSMOS Tool"
|
|
37
|
+
parser = OptionParser.new do |option_parser|
|
|
38
|
+
option_parser.banner = "Usage: ruby #{option_parser.program_name} [options]"
|
|
39
|
+
option_parser.separator("")
|
|
40
|
+
|
|
41
|
+
# Create the help option
|
|
42
|
+
option_parser.on("-h", "--help", "Show this message") do
|
|
43
|
+
puts option_parser
|
|
44
|
+
exit
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Create the version option
|
|
48
|
+
option_parser.on("-v", "--version", "Show version") do
|
|
49
|
+
puts "COSMOS Version: #{COSMOS_VERSION}"
|
|
50
|
+
puts "User Version: #{USER_VERSION}" if defined? USER_VERSION
|
|
51
|
+
exit
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Create the system option
|
|
55
|
+
option_parser.on("--system FILE", "Use an alternative system.txt file") do |arg|
|
|
56
|
+
System.instance(File.join(USERPATH, 'config', 'system', arg))
|
|
57
|
+
end
|
|
58
|
+
option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
|
|
59
|
+
options.config_file = arg
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
return parser, options
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def self.run(option_parser = nil, options = nil)
|
|
67
|
+
Cosmos.set_working_dir do
|
|
68
|
+
option_parser, options = create_default_options() unless option_parser and options
|
|
69
|
+
option_parser.parse!(ARGV)
|
|
70
|
+
post_options_parsed_hook(options)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
22
75
|
|
|
23
76
|
module Cosmos
|
|
24
77
|
|
|
@@ -34,18 +87,22 @@ module Cosmos
|
|
|
34
87
|
|
|
35
88
|
TOOL_NAME = "Command and Telemetry Server"
|
|
36
89
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
90
|
+
attr_writer :no_prompt
|
|
91
|
+
|
|
92
|
+
if RUBY_ENGINE == 'ruby'
|
|
93
|
+
# For the CTS we display all the tables as full size
|
|
94
|
+
# Thus we don't want the table to absorb the scroll wheel events but
|
|
95
|
+
# instead pass them up to the container so the entire window will scroll.
|
|
96
|
+
class Qt::TableWidget
|
|
97
|
+
def wheelEvent(event)
|
|
98
|
+
event.ignore()
|
|
99
|
+
end
|
|
43
100
|
end
|
|
44
101
|
end
|
|
45
102
|
|
|
46
|
-
def meta_callback
|
|
103
|
+
def meta_callback
|
|
47
104
|
Qt.execute_in_main_thread(true) do
|
|
48
|
-
result = SetTlmDialog.execute(self, 'Enter Metadata', 'Set Metadata', 'Cancel',
|
|
105
|
+
result = SetTlmDialog.execute(self, 'Enter Metadata', 'Set Metadata', 'Cancel', 'SYSTEM', 'META')
|
|
49
106
|
exit(1) unless result
|
|
50
107
|
end
|
|
51
108
|
end
|
|
@@ -59,7 +116,7 @@ module Cosmos
|
|
|
59
116
|
@message_log = nil
|
|
60
117
|
@output_sleeper = Sleeper.new
|
|
61
118
|
@first_output = 0
|
|
62
|
-
@interfaces_tab = InterfacesTab.new
|
|
119
|
+
@interfaces_tab = InterfacesTab.new(self)
|
|
63
120
|
@targets_tab = TargetsTab.new
|
|
64
121
|
@packets_tab = PacketsTab.new(self)
|
|
65
122
|
@logging_tab = LoggingTab.new(@production)
|
|
@@ -223,9 +280,9 @@ module Cosmos
|
|
|
223
280
|
@tab_thread = Thread.new do
|
|
224
281
|
begin
|
|
225
282
|
while true
|
|
226
|
-
start_time = Time.now
|
|
283
|
+
start_time = Time.now.sys
|
|
227
284
|
Qt.execute_in_main_thread(true) { @status_tab.update }
|
|
228
|
-
total_time = Time.now - start_time
|
|
285
|
+
total_time = Time.now.sys - start_time
|
|
229
286
|
if total_time > 0.0 and total_time < 1.0
|
|
230
287
|
break if @tab_sleeper.sleep(1.0 - total_time)
|
|
231
288
|
end
|
|
@@ -344,6 +401,8 @@ module Cosmos
|
|
|
344
401
|
|
|
345
402
|
def self.post_options_parsed_hook(options)
|
|
346
403
|
if options.no_gui
|
|
404
|
+
["TERM", "INT"].each {|sig| Signal.trap(sig) {exit}}
|
|
405
|
+
|
|
347
406
|
begin
|
|
348
407
|
@output_sleeper = Sleeper.new
|
|
349
408
|
@string_output = StringIO.new("", "r+")
|
|
@@ -367,6 +426,19 @@ module Cosmos
|
|
|
367
426
|
end
|
|
368
427
|
return false
|
|
369
428
|
else
|
|
429
|
+
["TERM", "INT"].each do |sig|
|
|
430
|
+
Signal.trap(sig) do
|
|
431
|
+
# No synchronization is allowed in trap context, so we have
|
|
432
|
+
# to spawn a thread here to send the close event.
|
|
433
|
+
Thread.new do
|
|
434
|
+
Qt.execute_in_main_thread(true) do
|
|
435
|
+
@@window.no_prompt = true
|
|
436
|
+
@@window.closeEvent(Qt::CloseEvent.new())
|
|
437
|
+
exit
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
end
|
|
370
442
|
return true
|
|
371
443
|
end
|
|
372
444
|
end
|
|
@@ -45,7 +45,7 @@ module Cosmos
|
|
|
45
45
|
# @param packet [Packet] Packet to send
|
|
46
46
|
def send_command_to_interface(interface, packet)
|
|
47
47
|
# Make sure packet received time is set
|
|
48
|
-
packet.received_time ||= Time.now
|
|
48
|
+
packet.received_time ||= Time.now.sys
|
|
49
49
|
|
|
50
50
|
unless packet.identified?
|
|
51
51
|
identified_command = System.commands.identify(packet.buffer, interface.target_names)
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
require 'cosmos'
|
|
12
12
|
require 'cosmos/gui/qt'
|
|
13
|
+
require 'cosmos/gui/dialogs/interface_raw_dialog'
|
|
13
14
|
|
|
14
15
|
module Cosmos
|
|
15
16
|
|
|
@@ -19,7 +20,8 @@ module Cosmos
|
|
|
19
20
|
ROUTERS = 'Routers'
|
|
20
21
|
ALIGN_CENTER = Qt::AlignCenter
|
|
21
22
|
|
|
22
|
-
def initialize
|
|
23
|
+
def initialize(server_gui)
|
|
24
|
+
@server_gui = server_gui
|
|
23
25
|
@interfaces_table = {}
|
|
24
26
|
end
|
|
25
27
|
|
|
@@ -102,11 +104,11 @@ module Cosmos
|
|
|
102
104
|
interfaces_table = Qt::TableWidget.new()
|
|
103
105
|
interfaces_table.verticalHeader.hide()
|
|
104
106
|
interfaces_table.setRowCount(interfaces.all.length)
|
|
105
|
-
interfaces_table.setColumnCount(
|
|
107
|
+
interfaces_table.setColumnCount(11)
|
|
106
108
|
if name == ROUTERS
|
|
107
|
-
interfaces_table.setHorizontalHeaderLabels(["Router", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Pkts Rcvd ", " Pkts Sent "])
|
|
109
|
+
interfaces_table.setHorizontalHeaderLabels(["Router", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Pkts Rcvd ", " Pkts Sent ", "View Raw"])
|
|
108
110
|
else
|
|
109
|
-
interfaces_table.setHorizontalHeaderLabels(["Interface", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Cmd Pkts ", " Tlm Pkts "])
|
|
111
|
+
interfaces_table.setHorizontalHeaderLabels(["Interface", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Cmd Pkts ", " Tlm Pkts ", "View Raw"])
|
|
110
112
|
end
|
|
111
113
|
|
|
112
114
|
populate_interface_table(name, interfaces, interfaces_table)
|
|
@@ -137,6 +139,17 @@ module Cosmos
|
|
|
137
139
|
interfaces_table.setItem(row, index, item)
|
|
138
140
|
index += 1
|
|
139
141
|
end
|
|
142
|
+
view_raw = Qt::PushButton.new("View Raw")
|
|
143
|
+
view_raw.connect(SIGNAL('clicked()')) do
|
|
144
|
+
@raw_dialogs ||= []
|
|
145
|
+
if name == ROUTERS
|
|
146
|
+
current_interface = CmdTlmServer.routers.all[interface_name]
|
|
147
|
+
else
|
|
148
|
+
current_interface = CmdTlmServer.interfaces.all[interface_name]
|
|
149
|
+
end
|
|
150
|
+
@raw_dialogs << InterfaceRawDialog.new(@server_gui, current_interface)
|
|
151
|
+
end
|
|
152
|
+
interfaces_table.setCellWidget(row, index, view_raw)
|
|
140
153
|
row += 1
|
|
141
154
|
end
|
|
142
155
|
end
|
|
@@ -22,9 +22,6 @@ module Cosmos
|
|
|
22
22
|
def populate(tab_widget)
|
|
23
23
|
num_targets = System.targets.length
|
|
24
24
|
if num_targets > 0
|
|
25
|
-
return if num_targets == 1 and System.targets['SYSTEM']
|
|
26
|
-
num_targets -= 1 if System.targets['SYSTEM']
|
|
27
|
-
|
|
28
25
|
scroll = Qt::ScrollArea.new
|
|
29
26
|
widget = Qt::Widget.new
|
|
30
27
|
layout = Qt::VBoxLayout.new(widget)
|
|
@@ -51,7 +48,6 @@ module Cosmos
|
|
|
51
48
|
def update
|
|
52
49
|
row = 0
|
|
53
50
|
System.targets.sort.each do |target_name, target|
|
|
54
|
-
next if target_name == 'SYSTEM'
|
|
55
51
|
@targets_table.item(row,2).setText(target.cmd_cnt.to_s)
|
|
56
52
|
@targets_table.item(row,3).setText(target.tlm_cnt.to_s)
|
|
57
53
|
row += 1
|
|
@@ -63,7 +59,6 @@ module Cosmos
|
|
|
63
59
|
def populate_targets_table
|
|
64
60
|
row = 0
|
|
65
61
|
System.targets.sort.each do |target_name, target|
|
|
66
|
-
next if target_name == 'SYSTEM'
|
|
67
62
|
target_name_widget = Qt::TableWidgetItem.new(Qt::Object.tr(target_name))
|
|
68
63
|
target_name_widget.setTextAlignment(Qt::AlignCenter)
|
|
69
64
|
@targets_table.setItem(row, 0, target_name_widget)
|
|
@@ -93,7 +93,7 @@ module Cosmos
|
|
|
93
93
|
next
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
|
-
packet.received_time = Time.now unless packet.received_time
|
|
96
|
+
packet.received_time = Time.now.sys unless packet.received_time
|
|
97
97
|
rescue Exception => err
|
|
98
98
|
handle_connection_lost(err)
|
|
99
99
|
if @cancel_thread
|
|
@@ -179,7 +179,6 @@ module Cosmos
|
|
|
179
179
|
Logger.error string
|
|
180
180
|
end
|
|
181
181
|
|
|
182
|
-
@interface.post_identify_packet(packet)
|
|
183
182
|
target = System.targets[packet.target_name]
|
|
184
183
|
target.tlm_cnt += 1 if target
|
|
185
184
|
packet.received_count += 1
|
|
@@ -114,15 +114,15 @@ module Cosmos
|
|
|
114
114
|
|
|
115
115
|
# Get info about an interface by name
|
|
116
116
|
#
|
|
117
|
-
# @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
|
|
118
|
-
# Numeric, Numeric>] Array containing \[state, num_clients,
|
|
119
|
-
# write_queue_size, read_queue_size, bytes_written, bytes_read,
|
|
117
|
+
# @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
|
|
118
|
+
# Numeric, Numeric>] Array containing \[state, num_clients,
|
|
119
|
+
# write_queue_size, read_queue_size, bytes_written, bytes_read,
|
|
120
120
|
# write_count, read_count] for the interface
|
|
121
121
|
def get_info(interface_name)
|
|
122
122
|
interface = @config.interfaces[interface_name.upcase]
|
|
123
123
|
raise "Unknown interface: #{interface_name}" unless interface
|
|
124
124
|
|
|
125
|
-
return [state(interface_name), interface.num_clients,
|
|
125
|
+
return [state(interface_name), interface.num_clients,
|
|
126
126
|
interface.write_queue_size, interface.read_queue_size,
|
|
127
127
|
interface.bytes_written, interface.bytes_read,
|
|
128
128
|
interface.write_count, interface.read_count]
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 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 'cosmos/tools/cmd_tlm_server/background_task'
|
|
12
|
+
|
|
13
|
+
module Cosmos
|
|
14
|
+
# Monitors telemetry and enables and disables limits groups
|
|
15
|
+
class LimitsGroupsBackgroundTask < BackgroundTask
|
|
16
|
+
attr_reader :groups
|
|
17
|
+
# Time in the future that we will never hit to allow the logic to work
|
|
18
|
+
FUTURE_TIME = Time.new("3000")
|
|
19
|
+
PAST_TIME = Time.new("1900")
|
|
20
|
+
|
|
21
|
+
def initialize(initial_delay = 0)
|
|
22
|
+
super()
|
|
23
|
+
@initial_delay = Float(initial_delay)
|
|
24
|
+
@name = "Limits Groups"
|
|
25
|
+
@groups = get_limits_groups()
|
|
26
|
+
# Initialize all the group names as instance variables
|
|
27
|
+
@groups.each {|group| self.instance_variable_set("@#{group.downcase}", nil) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Enables and disables COSMOS limits groups. The group named after the
|
|
31
|
+
# passed group variable is automatically enabled and disabled when the
|
|
32
|
+
# yielded to block returns true and false respectively. In addition, any
|
|
33
|
+
# groups with the same name and a _PRI or _RED extension are also enabled
|
|
34
|
+
# or disabled with the base group.
|
|
35
|
+
#
|
|
36
|
+
# @param delay [Integer] The amount of time to wait after detecting the group
|
|
37
|
+
# power on condition before actually enabling the group. A delay
|
|
38
|
+
# allows time for telemetry to stability to avoid false positives.
|
|
39
|
+
# @param enable_code [Proc] Code to execute when the group is enabled
|
|
40
|
+
# @param disable_code [Proc] Code to execute when the group is disabled
|
|
41
|
+
def process_group(delay = 0, enable_code = nil, disable_code = nil)
|
|
42
|
+
group = calling_method.to_s[6..-1]
|
|
43
|
+
|
|
44
|
+
# Grab the instance variable based on the group name
|
|
45
|
+
var_name = "@#{group}"
|
|
46
|
+
var = self.instance_variable_get(var_name)
|
|
47
|
+
# Yield to the block to perform the telemetry check
|
|
48
|
+
if yield
|
|
49
|
+
# If the instance variable is not set or set in the past
|
|
50
|
+
# (by the disable logic) it means the group isn't enabled
|
|
51
|
+
# so store the current time to allow for an enable delay
|
|
52
|
+
if !var || var == PAST_TIME
|
|
53
|
+
self.instance_variable_set(var_name, Time.now)
|
|
54
|
+
# After setting the variable we need to get it again
|
|
55
|
+
var = self.instance_variable_get(var_name)
|
|
56
|
+
end
|
|
57
|
+
# After the requested delay after power on we enable the group
|
|
58
|
+
if Time.now > (var + delay)
|
|
59
|
+
# Reset the instance variable to a distance future time
|
|
60
|
+
# so it won't satisfy any of the other checks and enable the group
|
|
61
|
+
self.instance_variable_set(var_name, FUTURE_TIME)
|
|
62
|
+
enable_limits_group(group)
|
|
63
|
+
# Call any additional enable code passed to the method
|
|
64
|
+
enable_code.call if enable_code
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
# If the instance variable is not set or set in the future
|
|
68
|
+
# (by the enable logic) it means the group isn't disabled
|
|
69
|
+
# Reset the instance variable to a distance past time so it
|
|
70
|
+
# won't satisfy any of the other checks and disable the group
|
|
71
|
+
if !var || var == FUTURE_TIME
|
|
72
|
+
self.instance_variable_set(var_name, PAST_TIME)
|
|
73
|
+
disable_limits_group(group)
|
|
74
|
+
# Call any additional disable code passed to the method
|
|
75
|
+
disable_code.call if disable_code
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def call
|
|
81
|
+
@status = "Starting the LimitsGroupsBackgroundTask"
|
|
82
|
+
check_methods = find_check_methods()
|
|
83
|
+
sleep @initial_delay
|
|
84
|
+
@sleeper = Sleeper.new
|
|
85
|
+
loop do
|
|
86
|
+
start = Time.now
|
|
87
|
+
check_methods.each {|method| self.send(method.intern) }
|
|
88
|
+
now = Time.now
|
|
89
|
+
@status = "#{now.formatted}: Checking groups took #{now - start}s"
|
|
90
|
+
sleep_time = 1 - (now - start)
|
|
91
|
+
sleep_time = 0 if sleep_time < 0
|
|
92
|
+
broken = @sleeper.sleep(sleep_time) # Run the checks at 1Hz
|
|
93
|
+
break if broken
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def stop
|
|
98
|
+
@sleeper.cancel
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
protected
|
|
102
|
+
|
|
103
|
+
def find_check_methods
|
|
104
|
+
# Find all the check methods (begins with 'check_')
|
|
105
|
+
check_methods = []
|
|
106
|
+
self.class.instance_methods.each do |method_name|
|
|
107
|
+
if method_name.to_s =~ /^check_/
|
|
108
|
+
# The second part of the method must correspond to a group name
|
|
109
|
+
if @groups.include?(method_name.to_s[6..-1].upcase)
|
|
110
|
+
check_methods << method_name.to_s
|
|
111
|
+
else
|
|
112
|
+
raise "Method #{method_name} doesn't match a group name.\n"\
|
|
113
|
+
"Methods must begin with 'check_' and end with a valid group name.\n"\
|
|
114
|
+
"Groups are #{@groups.join(', ')}."
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
check_methods.sort # Sort by name
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|