cosmos 3.5.1 → 3.5.2
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/.coveralls.yml +1 -1
- data/.gitattributes +3 -3
- data/.gitignore +48 -48
- data/.travis.yml +8 -8
- data/CONTRIBUTING.txt +50 -50
- data/Gemfile +10 -10
- data/Guardfile +27 -27
- data/LICENSE.txt +879 -879
- data/Manifest.txt +1414 -1414
- data/README.md +111 -111
- data/Rakefile +218 -214
- data/autohotkey/config/data/diamond.STL +57 -57
- data/autohotkey/config/system/system.txt +34 -34
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/autohotkey/config/targets/COSMOS/target.txt +5 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
- data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
- data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
- data/autohotkey/config/targets/INST/screens/array.txt +7 -7
- data/autohotkey/config/targets/INST/screens/block.txt +8 -8
- data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
- data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
- data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
- data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
- data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
- data/autohotkey/config/targets/INST/screens/image.txt +21 -21
- data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
- data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
- data/autohotkey/config/targets/INST/screens/other.txt +25 -25
- data/autohotkey/config/targets/INST/screens/params.txt +25 -25
- data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
- data/autohotkey/config/targets/INST/target.txt +26 -26
- data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
- data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
- data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/autohotkey/config/tools/launcher/launcher.txt +38 -38
- data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
- data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
- data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
- data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
- data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
- data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
- data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
- data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
- data/autohotkey/lib/example_background_task.rb +42 -42
- data/autohotkey/lib/user_version.rb +3 -3
- data/autohotkey/procedures/clear_util.rb +7 -7
- data/autohotkey/procedures/collect_util.rb +14 -14
- data/autohotkey/procedures/example_test.rb +67 -67
- data/autohotkey/procedures/example_test2.rb +74 -74
- data/autohotkey/procedures/script_test.rb +17 -17
- data/autohotkey/procedures/syntax_error.rb +18 -18
- data/autohotkey/tools/CmdExtractorAHK +16 -16
- data/autohotkey/tools/CmdSender +14 -14
- data/autohotkey/tools/CmdSenderAHK +18 -18
- data/autohotkey/tools/CmdTlmServer +14 -14
- data/autohotkey/tools/CmdTlmServerAHK +28 -28
- data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
- data/autohotkey/tools/DataViewer +14 -14
- data/autohotkey/tools/DataViewerAHK +17 -17
- data/autohotkey/tools/HandbookCreatorAHK +20 -20
- data/autohotkey/tools/LauncherAHK +17 -17
- data/autohotkey/tools/LimitsMonitorAHK +20 -20
- data/autohotkey/tools/OpenGLBuilderAHK +24 -24
- data/autohotkey/tools/PacketViewer +14 -14
- data/autohotkey/tools/PacketViewerAHK +18 -18
- data/autohotkey/tools/PacketViewerAHK2 +17 -17
- data/autohotkey/tools/Replay +14 -14
- data/autohotkey/tools/ReplayAHK +17 -17
- data/autohotkey/tools/ScriptRunner +14 -14
- data/autohotkey/tools/ScriptRunnerAHK +20 -20
- data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
- data/autohotkey/tools/TableManager +14 -14
- data/autohotkey/tools/TableManagerAHK +30 -30
- data/autohotkey/tools/TestRunner +15 -15
- data/autohotkey/tools/TestRunnerAHK +17 -17
- data/autohotkey/tools/TestRunnerAHK2 +17 -17
- data/autohotkey/tools/TestRunnerAHK3 +17 -17
- data/autohotkey/tools/TestRunnerAHK4 +17 -17
- data/autohotkey/tools/TestRunnerAHK5 +17 -17
- data/autohotkey/tools/TestRunnerAHK6 +17 -17
- data/autohotkey/tools/TlmExtractor +15 -15
- data/autohotkey/tools/TlmExtractorAHK +19 -19
- data/autohotkey/tools/TlmExtractorAHK2 +16 -16
- data/autohotkey/tools/TlmExtractorAHK3 +16 -16
- data/autohotkey/tools/TlmGrapher +14 -14
- data/autohotkey/tools/TlmGrapherAHK +19 -19
- data/autohotkey/tools/TlmGrapherAHK2 +23 -23
- data/autohotkey/tools/TlmGrapherAHK3 +17 -17
- data/autohotkey/tools/TlmGrapherAHK4 +17 -17
- data/autohotkey/tools/TlmViewer +14 -14
- data/autohotkey/tools/TlmViewerAHK +28 -28
- data/autohotkey/tools/TlmViewerAHK2 +22 -22
- data/autohotkey/tools/TlmViewerAHK3 +23 -23
- data/autohotkey/tools/TlmViewerAHK4 +22 -22
- data/autohotkey/tools/TlmViewerAHK5 +18 -18
- data/autohotkey/tools/autohotkey.rb +37 -37
- data/autohotkey/tools/cmd_extractor.ahk +33 -33
- data/autohotkey/tools/cmd_sender.ahk +182 -182
- data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
- data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
- data/autohotkey/tools/data_viewer.ahk +141 -141
- data/autohotkey/tools/handbook_creator.ahk +32 -32
- data/autohotkey/tools/launcher.ahk +41 -41
- data/autohotkey/tools/limits_monitor.ahk +123 -123
- data/autohotkey/tools/open_gl_builder.ahk +134 -134
- data/autohotkey/tools/packet_viewer.ahk +196 -196
- data/autohotkey/tools/packet_viewer2.ahk +9 -9
- data/autohotkey/tools/replay.ahk +104 -104
- data/autohotkey/tools/script_runner.ahk +589 -589
- data/autohotkey/tools/script_runner2.ahk +38 -38
- data/autohotkey/tools/table_manager.ahk +220 -220
- data/autohotkey/tools/test_runner.ahk +262 -262
- data/autohotkey/tools/test_runner2.ahk +53 -53
- data/autohotkey/tools/test_runner3.ahk +13 -13
- data/autohotkey/tools/test_runner5.ahk +8 -8
- data/autohotkey/tools/test_runner6.ahk +5 -5
- data/autohotkey/tools/tlm_extractor.ahk +296 -296
- data/autohotkey/tools/tlm_grapher.ahk +660 -660
- data/autohotkey/tools/tlm_grapher2.ahk +115 -115
- data/autohotkey/tools/tlm_grapher3.ahk +24 -24
- data/autohotkey/tools/tlm_viewer.ahk +133 -133
- data/autohotkey/tools/tlm_viewer2.ahk +50 -50
- data/autohotkey/tools/tlm_viewer4.ahk +4 -4
- data/autohotkey/tools/tlm_viewer5.ahk +20 -20
- data/bin/cosmos +96 -96
- data/bin/cstol_converter +1166 -1166
- data/bin/rubysloc +85 -85
- data/cosmos.gemspec +99 -99
- data/data/about.txt +4 -4
- data/data/crc.txt +326 -326
- data/data/diamond.STL +57 -57
- data/data/legal.txt +9 -9
- data/demo/Gemfile +10 -10
- data/demo/Launcher +16 -16
- data/demo/Launcher.bat +0 -0
- data/demo/Rakefile +77 -77
- data/demo/config/data/crc.txt +224 -226
- data/demo/config/data/diamond.STL +57 -57
- data/demo/config/data/meta_init.txt +4 -4
- data/demo/config/system/system.txt +35 -35
- data/demo/config/system/system2.txt +33 -33
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/demo/config/targets/COSMOS/screens/version.txt +19 -19
- data/demo/config/targets/COSMOS/target.txt +11 -11
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
- data/demo/config/targets/EXAMPLE/target.txt +6 -6
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
- data/demo/config/targets/INST/screens/adcs.txt +46 -46
- data/demo/config/targets/INST/screens/array.txt +15 -15
- data/demo/config/targets/INST/screens/block.txt +8 -8
- data/demo/config/targets/INST/screens/commanding.txt +30 -30
- data/demo/config/targets/INST/screens/graphs.txt +14 -14
- data/demo/config/targets/INST/screens/ground.txt +25 -25
- data/demo/config/targets/INST/screens/hs.txt +44 -44
- data/demo/config/targets/INST/screens/latest.txt +23 -23
- data/demo/config/targets/INST/screens/other.txt +29 -29
- data/demo/config/targets/INST/screens/tabs.txt +70 -70
- data/demo/config/targets/INST/target.txt +33 -33
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
- data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
- data/demo/config/targets/TEMPLATED/target.txt +6 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
- data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
- data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
- data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
- data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/demo/config/tools/launcher/launcher.txt +45 -45
- data/demo/config/tools/launcher/launcher2.txt +45 -45
- data/demo/config/tools/script_runner/script_runner.txt +3 -3
- data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/demo/config/tools/test_runner/test_runner.txt +17 -17
- data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
- data/demo/lib/example_background_task.rb +57 -57
- data/demo/lib/example_target.rb +113 -113
- data/demo/lib/scpi_target.rb +74 -74
- data/demo/lib/user_version.rb +3 -3
- data/demo/procedures/checks.rb +11 -11
- data/demo/procedures/clear_util.rb +7 -7
- data/demo/procedures/collect.rb +18 -18
- data/demo/procedures/collect_util.rb +14 -14
- data/demo/procedures/cosmos_api_test.rb +293 -293
- data/demo/procedures/disconnect.rb +29 -29
- data/demo/procedures/example_test.rb +183 -183
- data/demo/procedures/plot_test.rb +8 -8
- data/demo/procedures/run_example_test.rb +3 -3
- data/demo/procedures/test.rb +51 -51
- data/demo/tools/CmdExtractor +16 -16
- data/demo/tools/CmdExtractor.bat +0 -0
- data/demo/tools/CmdSender +16 -16
- data/demo/tools/CmdSender.bat +0 -0
- data/demo/tools/CmdTlmServer +16 -16
- data/demo/tools/CmdTlmServer.bat +0 -0
- data/demo/tools/DataViewer +16 -16
- data/demo/tools/DataViewer.bat +0 -0
- data/demo/tools/ExampleTarget +16 -16
- data/demo/tools/ExampleTarget.bat +0 -0
- data/demo/tools/HandbookCreator +16 -16
- data/demo/tools/HandbookCreator.bat +0 -0
- data/demo/tools/Launcher +16 -16
- data/demo/tools/Launcher.bat +0 -0
- data/demo/tools/LimitsMonitor +16 -16
- data/demo/tools/LimitsMonitor.bat +0 -0
- data/demo/tools/OpenGLBuilder +16 -16
- data/demo/tools/OpenGLBuilder.bat +0 -0
- data/demo/tools/PacketViewer +16 -16
- data/demo/tools/PacketViewer.bat +0 -0
- data/demo/tools/Replay +16 -16
- data/demo/tools/Replay.bat +0 -0
- data/demo/tools/ScpiTarget +16 -16
- data/demo/tools/ScpiTarget.bat +0 -0
- data/demo/tools/ScriptRunner +16 -16
- data/demo/tools/ScriptRunner.bat +0 -0
- data/demo/tools/TableManager +16 -16
- data/demo/tools/TableManager.bat +0 -0
- data/demo/tools/TestRunner +16 -16
- data/demo/tools/TestRunner.bat +0 -0
- data/demo/tools/TlmExtractor +16 -16
- data/demo/tools/TlmExtractor.bat +0 -0
- data/demo/tools/TlmGrapher +16 -16
- data/demo/tools/TlmGrapher.bat +0 -0
- data/demo/tools/TlmViewer +16 -16
- data/demo/tools/TlmViewer.bat +0 -0
- data/demo/tools/ToolLaunch.bat +14 -5
- data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
- data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
- data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
- data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/tool_launch.rb +38 -38
- data/ext/cosmos/ext/array/array.c +111 -111
- data/ext/cosmos/ext/array/extconf.rb +13 -13
- data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
- data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
- data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
- data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
- data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
- data/ext/cosmos/ext/crc/crc.c +341 -341
- data/ext/cosmos/ext/crc/extconf.rb +12 -12
- data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
- data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
- data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
- data/ext/cosmos/ext/packet/extconf.rb +13 -13
- data/ext/cosmos/ext/packet/packet.c +339 -339
- data/ext/cosmos/ext/platform/extconf.rb +13 -13
- data/ext/cosmos/ext/platform/platform.c +101 -101
- data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
- data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
- data/ext/cosmos/ext/string/extconf.rb +13 -13
- data/ext/cosmos/ext/string/string.c +49 -49
- data/ext/cosmos/ext/structure/structure.c +1428 -1428
- data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
- data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
- data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
- data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
- data/ext/mkrf_conf.rb +40 -40
- data/install/Gemfile +10 -10
- data/install/Launcher +16 -16
- data/install/Launcher.bat +0 -0
- data/install/Rakefile +77 -77
- data/install/config/data/crc.txt +151 -151
- data/install/config/system/system.txt +29 -29
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/install/config/targets/COSMOS/target.txt +8 -8
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/install/config/tools/data_viewer/data_viewer.txt +3 -3
- data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/install/config/tools/launcher/launcher.txt +40 -40
- data/install/config/tools/script_runner/script_runner.txt +3 -3
- data/install/config/tools/test_runner/test_runner.txt +8 -8
- data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/install/lib/user_version.rb +3 -3
- data/install/tools/CmdExtractor +16 -16
- data/install/tools/CmdExtractor.bat +0 -0
- data/install/tools/CmdSender +16 -16
- data/install/tools/CmdSender.bat +0 -0
- data/install/tools/CmdTlmServer +16 -16
- data/install/tools/CmdTlmServer.bat +0 -0
- data/install/tools/DataViewer +16 -16
- data/install/tools/DataViewer.bat +0 -0
- data/install/tools/HandbookCreator +16 -16
- data/install/tools/HandbookCreator.bat +0 -0
- data/install/tools/Launcher +16 -16
- data/install/tools/Launcher.bat +0 -0
- data/install/tools/LimitsMonitor +16 -16
- data/install/tools/LimitsMonitor.bat +0 -0
- data/install/tools/OpenGLBuilder +16 -16
- data/install/tools/OpenGLBuilder.bat +0 -0
- data/install/tools/PacketViewer +16 -16
- data/install/tools/PacketViewer.bat +0 -0
- data/install/tools/Replay +16 -16
- data/install/tools/Replay.bat +0 -0
- data/install/tools/ScriptRunner +16 -16
- data/install/tools/ScriptRunner.bat +0 -0
- data/install/tools/TableManager +16 -16
- data/install/tools/TableManager.bat +0 -0
- data/install/tools/TestRunner +16 -16
- data/install/tools/TestRunner.bat +0 -0
- data/install/tools/TlmExtractor +16 -16
- data/install/tools/TlmExtractor.bat +0 -0
- data/install/tools/TlmGrapher +16 -16
- data/install/tools/TlmGrapher.bat +0 -0
- data/install/tools/TlmViewer +16 -16
- data/install/tools/TlmViewer.bat +0 -0
- data/install/tools/ToolLaunch.bat +14 -5
- data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
- data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
- data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
- data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
- data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
- data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
- data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/tool_launch.rb +38 -38
- data/lib/cosmos.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
- data/lib/cosmos/config/config_parser.rb +324 -324
- data/lib/cosmos/conversions.rb +13 -13
- data/lib/cosmos/conversions/conversion.rb +47 -47
- data/lib/cosmos/conversions/generic_conversion.rb +55 -55
- data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
- data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
- data/lib/cosmos/conversions/processor_conversion.rb +46 -46
- data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
- data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
- data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
- data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
- data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
- data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
- data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
- data/lib/cosmos/core_ext.rb +18 -18
- data/lib/cosmos/core_ext/array.rb +354 -354
- data/lib/cosmos/core_ext/class.rb +51 -51
- data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
- data/lib/cosmos/core_ext/exception.rb +52 -52
- data/lib/cosmos/core_ext/file.rb +75 -75
- data/lib/cosmos/core_ext/hash.rb +28 -28
- data/lib/cosmos/core_ext/io.rb +75 -75
- data/lib/cosmos/core_ext/kernel.rb +38 -38
- data/lib/cosmos/core_ext/math.rb +119 -119
- data/lib/cosmos/core_ext/matrix.rb +146 -146
- data/lib/cosmos/core_ext/objectspace.rb +29 -29
- data/lib/cosmos/core_ext/range.rb +22 -22
- data/lib/cosmos/core_ext/socket.rb +32 -32
- data/lib/cosmos/core_ext/string.rb +311 -311
- data/lib/cosmos/core_ext/stringio.rb +24 -24
- data/lib/cosmos/core_ext/time.rb +448 -448
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
- data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
- data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
- data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
- data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
- data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
- data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
- data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
- data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
- data/lib/cosmos/gui/dialogs/splash.rb +135 -135
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
- data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
- data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
- data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
- data/lib/cosmos/gui/line_graph/lines.rb +290 -290
- data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
- data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
- data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
- data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
- data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
- data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
- data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
- data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
- data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
- data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
- data/lib/cosmos/gui/opengl/opengl.rb +8 -8
- data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
- data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
- data/lib/cosmos/gui/qt.rb +860 -860
- data/lib/cosmos/gui/qt_tool.rb +380 -380
- data/lib/cosmos/gui/text/completion.rb +381 -381
- data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
- data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
- data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
- data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
- data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
- data/lib/cosmos/interfaces.rb +11 -11
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
- data/lib/cosmos/interfaces/interface.rb +225 -225
- data/lib/cosmos/interfaces/linc_interface.rb +360 -360
- data/lib/cosmos/interfaces/serial_interface.rb +76 -76
- data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
- data/lib/cosmos/interfaces/stream_interface.rb +136 -136
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
- data/lib/cosmos/interfaces/udp_interface.rb +161 -161
- data/lib/cosmos/io/buffered_file.rb +11 -11
- data/lib/cosmos/io/cosmos_snmp.rb +50 -50
- data/lib/cosmos/io/io_multiplexer.rb +89 -89
- data/lib/cosmos/io/json_drb.rb +376 -376
- data/lib/cosmos/io/json_drb_object.rb +198 -198
- data/lib/cosmos/io/json_rpc.rb +365 -365
- data/lib/cosmos/io/posix_serial_driver.rb +145 -145
- data/lib/cosmos/io/raw_logger.rb +174 -174
- data/lib/cosmos/io/raw_logger_pair.rb +71 -71
- data/lib/cosmos/io/serial_driver.rb +85 -85
- data/lib/cosmos/io/stderr.rb +36 -36
- data/lib/cosmos/io/stdout.rb +36 -36
- data/lib/cosmos/io/tcpip_server.rb +571 -571
- data/lib/cosmos/io/udp_sockets.rb +152 -152
- data/lib/cosmos/io/win32_serial_driver.rb +145 -145
- data/lib/cosmos/packet_logs.rb +7 -7
- data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
- data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
- data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
- data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
- data/lib/cosmos/packets/binary_accessor.rb +634 -634
- data/lib/cosmos/packets/commands.rb +293 -293
- data/lib/cosmos/packets/limits.rb +267 -267
- data/lib/cosmos/packets/limits_response.rb +38 -38
- data/lib/cosmos/packets/packet.rb +786 -786
- data/lib/cosmos/packets/packet_config.rb +482 -482
- data/lib/cosmos/packets/packet_item.rb +317 -317
- data/lib/cosmos/packets/packet_item_limits.rb +128 -128
- data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
- data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
- data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
- data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
- data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
- data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
- data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
- data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
- data/lib/cosmos/packets/structure.rb +458 -458
- data/lib/cosmos/packets/structure_item.rb +233 -233
- data/lib/cosmos/packets/telemetry.rb +350 -350
- data/lib/cosmos/processors.rb +6 -6
- data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
- data/lib/cosmos/processors/processor.rb +71 -71
- data/lib/cosmos/processors/statistics_processor.rb +65 -65
- data/lib/cosmos/processors/watermark_processor.rb +44 -44
- data/lib/cosmos/script.rb +9 -9
- data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
- data/lib/cosmos/script/commands.rb +184 -184
- data/lib/cosmos/script/extract.rb +123 -123
- data/lib/cosmos/script/limits.rb +114 -114
- data/lib/cosmos/script/script.rb +76 -76
- data/lib/cosmos/script/scripting.rb +897 -897
- data/lib/cosmos/script/telemetry.rb +174 -174
- data/lib/cosmos/script/tools.rb +138 -138
- data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
- data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
- data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
- data/lib/cosmos/streams/serial_stream.rb +157 -157
- data/lib/cosmos/streams/stream.rb +63 -63
- data/lib/cosmos/streams/stream_protocol.rb +373 -373
- data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
- data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
- data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
- data/lib/cosmos/system.rb +4 -4
- data/lib/cosmos/system/system.rb +618 -618
- data/lib/cosmos/system/target.rb +197 -197
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
- data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
- data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
- data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
- data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
- data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
- data/lib/cosmos/tools/launcher/launcher.rb +188 -188
- data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
- data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
- data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
- data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
- data/lib/cosmos/tools/replay/replay.rb +501 -501
- data/lib/cosmos/tools/replay/replay_server.rb +91 -91
- data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
- data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
- data/lib/cosmos/tools/table_manager/table.rb +70 -70
- data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
- data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
- data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
- data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
- data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
- data/lib/cosmos/tools/test_runner/test.rb +539 -539
- data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
- data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
- data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
- data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
- data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
- data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
- data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
- data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
- data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
- data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
- data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
- data/lib/cosmos/top_level.rb +759 -759
- data/lib/cosmos/utilities.rb +11 -11
- data/lib/cosmos/utilities/crc.rb +166 -166
- data/lib/cosmos/utilities/csv.rb +83 -83
- data/lib/cosmos/utilities/logger.rb +137 -137
- data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
- data/lib/cosmos/utilities/message_log.rb +79 -79
- data/lib/cosmos/utilities/quaternion.rb +258 -258
- data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
- data/lib/cosmos/utilities/simulated_target.rb +99 -99
- data/lib/cosmos/utilities/sleeper.rb +44 -44
- data/lib/cosmos/version.rb +12 -12
- data/lib/cosmos/win32/excel.rb +66 -66
- data/lib/cosmos/win32/win32.rb +387 -387
- data/lib/cosmos/win32/win32_main.rb +321 -321
- data/roodi.yml +24 -24
- data/run_gui_tests.bat +0 -0
- data/spec/ccsds/ccsds_packet_spec.rb +67 -67
- data/spec/ccsds/ccsds_parser_spec.rb +148 -148
- data/spec/config/config_parser_spec.rb +322 -322
- data/spec/conversions/conversion_spec.rb +31 -31
- data/spec/conversions/generic_conversion_spec.rb +45 -45
- data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
- data/spec/conversions/polynomial_conversion_spec.rb +40 -40
- data/spec/conversions/processor_conversion_spec.rb +45 -45
- data/spec/conversions/received_count_conversion_spec.rb +43 -43
- data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
- data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
- data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
- data/spec/core_ext/array_spec.rb +186 -186
- data/spec/core_ext/class_spec.rb +36 -36
- data/spec/core_ext/cosmos_io_spec.rb +77 -77
- data/spec/core_ext/exception_spec.rb +91 -91
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +24 -24
- data/spec/core_ext/io_spec.rb +46 -46
- data/spec/core_ext/kernel_spec.rb +54 -54
- data/spec/core_ext/math_spec.rb +116 -116
- data/spec/core_ext/matrix_spec.rb +66 -66
- data/spec/core_ext/objectspace_spec.rb +29 -29
- data/spec/core_ext/range_spec.rb +21 -21
- data/spec/core_ext/socket_spec.rb +32 -32
- data/spec/core_ext/string_spec.rb +223 -223
- data/spec/core_ext/stringio_spec.rb +21 -21
- data/spec/core_ext/time_spec.rb +202 -202
- data/spec/gui/line_graph/line_clip_spec.rb +322 -322
- data/spec/gui/qt_spec.rb +102 -102
- data/spec/install/config/system/system.txt +33 -33
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/spec/install/config/targets/COSMOS/target.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
- data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
- data/spec/install/config/targets/INST/target.txt +10 -10
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
- data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
- data/spec/interfaces/interface_spec.rb +130 -130
- data/spec/interfaces/linc_interface_spec.rb +259 -259
- data/spec/interfaces/serial_interface_spec.rb +56 -56
- data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
- data/spec/interfaces/stream_interface_spec.rb +157 -157
- data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
- data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
- data/spec/interfaces/udp_interface_spec.rb +175 -175
- data/spec/io/buffered_file_spec.rb +113 -113
- data/spec/io/io_multiplexer_spec.rb +94 -94
- data/spec/io/json_drb_object_spec.rb +119 -119
- data/spec/io/json_drb_spec.rb +311 -311
- data/spec/io/json_rpc_spec.rb +264 -264
- data/spec/io/raw_logger_pair_spec.rb +76 -76
- data/spec/io/raw_logger_spec.rb +133 -133
- data/spec/io/serial_driver_spec.rb +60 -60
- data/spec/io/stderr_spec.rb +32 -32
- data/spec/io/stdout_spec.rb +32 -32
- data/spec/io/tcpip_server_spec.rb +338 -338
- data/spec/io/udp_sockets_spec.rb +94 -94
- data/spec/io/win32_serial_driver_spec.rb +88 -88
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
- data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
- data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
- data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
- data/spec/packets/binary_accessor_spec.rb +2326 -2326
- data/spec/packets/commands_spec.rb +369 -369
- data/spec/packets/limits_response_spec.rb +25 -25
- data/spec/packets/limits_spec.rb +344 -344
- data/spec/packets/packet_config_spec.rb +805 -805
- data/spec/packets/packet_item_limits_spec.rb +161 -161
- data/spec/packets/packet_item_spec.rb +386 -386
- data/spec/packets/packet_spec.rb +1317 -1317
- data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
- data/spec/packets/parsers/limits_parser_spec.rb +282 -282
- data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
- data/spec/packets/parsers/macro_parser_spec.rb +212 -212
- data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
- data/spec/packets/parsers/packet_parser_spec.rb +99 -99
- data/spec/packets/parsers/processor_parser_spec.rb +114 -114
- data/spec/packets/parsers/state_parser_spec.rb +156 -156
- data/spec/packets/structure_item_spec.rb +195 -195
- data/spec/packets/structure_spec.rb +565 -565
- data/spec/packets/telemetry_spec.rb +578 -578
- data/spec/processors/new_packet_log_processor_spec.rb +39 -39
- data/spec/processors/processor_spec.rb +55 -55
- data/spec/processors/statistics_processor_spec.rb +60 -60
- data/spec/processors/watermark_processor_spec.rb +51 -51
- data/spec/script/cmd_tlm_server_spec.rb +110 -110
- data/spec/script/commands_disconnect_spec.rb +270 -270
- data/spec/script/commands_spec.rb +302 -302
- data/spec/script/limits_spec.rb +153 -153
- data/spec/script/script_spec.rb +86 -86
- data/spec/script/scripting_spec.rb +440 -440
- data/spec/script/telemetry_spec.rb +165 -165
- data/spec/script/tools_spec.rb +117 -117
- data/spec/spec_helper.rb +190 -190
- data/spec/streams/burst_stream_protocol_spec.rb +32 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
- data/spec/streams/length_stream_protocol_spec.rb +300 -300
- data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
- data/spec/streams/serial_stream_spec.rb +117 -117
- data/spec/streams/stream_protocol_spec.rb +346 -346
- data/spec/streams/stream_spec.rb +30 -30
- data/spec/streams/tcpip_client_stream_spec.rb +57 -57
- data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
- data/spec/streams/template_stream_protocol_spec.rb +156 -156
- data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
- data/spec/system/system_spec.rb +665 -665
- data/spec/system/target_spec.rb +250 -250
- data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
- data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
- data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
- data/spec/tools/launcher/launcher_config_spec.rb +464 -464
- data/spec/top_level/top_level_spec.rb +334 -334
- data/spec/utilities/crc_spec.rb +45 -45
- data/spec/utilities/csv_spec.rb +97 -97
- data/spec/utilities/logger_spec.rb +102 -102
- data/spec/utilities/message_log_spec.rb +89 -89
- data/spec/utilities/quaternion_spec.rb +107 -107
- data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
- data/tasks/manifest.rake +22 -22
- data/tasks/spec.rake +23 -23
- data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
- data/test/benchmarks/gsub_benchmark.rb +152 -152
- data/test/benchmarks/is_a_benchmark.rb +34 -34
- data/test/performance/PACKETS.bat +0 -0
- data/test/performance/Rakefile +77 -77
- data/test/performance/THREADS.bat +0 -0
- data/test/performance/config/data/crc.txt +196 -196
- data/test/performance/config/data/diamond.STL +57 -57
- data/test/performance/config/data/meta_init.txt +4 -4
- data/test/performance/config/system/system_packets.txt +39 -39
- data/test/performance/config/system/system_threads.txt +59 -59
- data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
- data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
- data/test/performance/config/targets/COSMOS/target.txt +11 -11
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
- data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
- data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
- data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
- data/test/performance/config/targets/PACKET/target.txt +28 -28
- data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
- data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
- data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
- data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
- data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
- data/test/performance/config/targets/THREAD/target.txt +6 -6
- data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
- data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
- data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
- data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
- data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
- data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
- data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
- data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
- data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
- data/test/performance/lib/packet_target.rb +126 -126
- data/test/performance/lib/thread_target.rb +120 -120
- data/test/performance/lib/user_version.rb +3 -3
- data/test/performance/procedures/checks.rb +11 -11
- data/test/performance/procedures/clear_util.rb +7 -7
- data/test/performance/procedures/collect.rb +18 -18
- data/test/performance/procedures/collect_util.rb +14 -14
- data/test/performance/procedures/cosmos_api_test.rb +293 -293
- data/test/performance/procedures/disconnect.rb +29 -29
- data/test/performance/procedures/example_test.rb +182 -182
- data/test/performance/procedures/plot_test.rb +8 -8
- data/test/performance/procedures/procedure.rb +2 -2
- data/test/performance/procedures/run_example_test.rb +3 -3
- data/test/performance/procedures/test.rb +51 -51
- data/test/performance/tools/CmdExtractor +14 -14
- data/test/performance/tools/CmdExtractor.bat +0 -0
- data/test/performance/tools/CmdSender +14 -14
- data/test/performance/tools/CmdSender.bat +0 -0
- data/test/performance/tools/CmdTlmServer +16 -16
- data/test/performance/tools/CmdTlmServer.bat +0 -0
- data/test/performance/tools/CmdTlmServerMemProf +20 -20
- data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
- data/test/performance/tools/DataViewer +14 -14
- data/test/performance/tools/DataViewer.bat +0 -0
- data/test/performance/tools/HandbookCreator +14 -14
- data/test/performance/tools/HandbookCreator.bat +0 -0
- data/test/performance/tools/Launcher +14 -14
- data/test/performance/tools/Launcher.bat +0 -0
- data/test/performance/tools/LimitsMonitor +14 -14
- data/test/performance/tools/LimitsMonitor.bat +0 -0
- data/test/performance/tools/OpenGLBuilder +14 -14
- data/test/performance/tools/OpenGLBuilder.bat +0 -0
- data/test/performance/tools/PacketTarget +14 -14
- data/test/performance/tools/PacketTarget.bat +0 -0
- data/test/performance/tools/PacketViewer +14 -14
- data/test/performance/tools/PacketViewer.bat +0 -0
- data/test/performance/tools/Replay +14 -14
- data/test/performance/tools/Replay.bat +0 -0
- data/test/performance/tools/ScpiTarget +14 -14
- data/test/performance/tools/ScpiTarget.bat +0 -0
- data/test/performance/tools/ScriptRunner +14 -14
- data/test/performance/tools/ScriptRunner.bat +0 -0
- data/test/performance/tools/TableManager +14 -14
- data/test/performance/tools/TableManager.bat +0 -0
- data/test/performance/tools/TestRunner +14 -14
- data/test/performance/tools/TestRunner.bat +0 -0
- data/test/performance/tools/ThreadTarget +14 -14
- data/test/performance/tools/ThreadTarget.bat +0 -0
- data/test/performance/tools/TlmExtractor +14 -14
- data/test/performance/tools/TlmExtractor.bat +0 -0
- data/test/performance/tools/TlmGrapher +14 -14
- data/test/performance/tools/TlmGrapher.bat +0 -0
- data/test/performance/tools/TlmGrapherMemProf +19 -19
- data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
- data/test/performance/tools/TlmViewer +14 -14
- data/test/performance/tools/TlmViewer.bat +0 -0
- data/test/performance/tools/TlmViewerMemProf +19 -19
- data/test/performance/tools/TlmViewerMemProf.bat +0 -0
- data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- metadata +3 -3
|
@@ -1,40 +1,40 @@
|
|
|
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'
|
|
12
|
-
require 'cosmos/gui/qt'
|
|
13
|
-
|
|
14
|
-
module Cosmos
|
|
15
|
-
|
|
16
|
-
class LauncherMultitool < Qt::Object
|
|
17
|
-
slots 'button_clicked()'
|
|
18
|
-
|
|
19
|
-
def initialize(parent, multitool_settings)
|
|
20
|
-
super(parent)
|
|
21
|
-
@multitool_settings = multitool_settings
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def button_clicked
|
|
25
|
-
@multitool_settings.each do |item_type, item, capture_io|
|
|
26
|
-
case item_type
|
|
27
|
-
when :TOOL
|
|
28
|
-
if capture_io
|
|
29
|
-
Cosmos.run_process_check_output(item)
|
|
30
|
-
else
|
|
31
|
-
Cosmos.run_process(item)
|
|
32
|
-
end
|
|
33
|
-
when :DELAY
|
|
34
|
-
sleep(item)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
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'
|
|
12
|
+
require 'cosmos/gui/qt'
|
|
13
|
+
|
|
14
|
+
module Cosmos
|
|
15
|
+
|
|
16
|
+
class LauncherMultitool < Qt::Object
|
|
17
|
+
slots 'button_clicked()'
|
|
18
|
+
|
|
19
|
+
def initialize(parent, multitool_settings)
|
|
20
|
+
super(parent)
|
|
21
|
+
@multitool_settings = multitool_settings
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def button_clicked
|
|
25
|
+
@multitool_settings.each do |item_type, item, capture_io|
|
|
26
|
+
case item_type
|
|
27
|
+
when :TOOL
|
|
28
|
+
if capture_io
|
|
29
|
+
Cosmos.run_process_check_output(item)
|
|
30
|
+
else
|
|
31
|
+
Cosmos.run_process(item)
|
|
32
|
+
end
|
|
33
|
+
when :DELAY
|
|
34
|
+
sleep(item)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -1,116 +1,116 @@
|
|
|
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'
|
|
12
|
-
require 'cosmos/gui/qt'
|
|
13
|
-
|
|
14
|
-
module Cosmos
|
|
15
|
-
class LauncherTool < Qt::Object
|
|
16
|
-
slots 'button_clicked()'
|
|
17
|
-
|
|
18
|
-
def initialize(parent, button_text, shell_command, capture_io, variable_parameters)
|
|
19
|
-
super(parent)
|
|
20
|
-
@button_text = button_text
|
|
21
|
-
@shell_command = shell_command
|
|
22
|
-
@capture_io = capture_io
|
|
23
|
-
@variable_parameters = variable_parameters
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def button_clicked
|
|
27
|
-
if @variable_parameters
|
|
28
|
-
parameters = parameters_dialog
|
|
29
|
-
if parameters
|
|
30
|
-
if @capture_io
|
|
31
|
-
Cosmos.run_process_check_output(@shell_command + ' ' + parameters)
|
|
32
|
-
else
|
|
33
|
-
Cosmos.run_process(@shell_command + ' ' + parameters)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
else
|
|
37
|
-
if @capture_io
|
|
38
|
-
Cosmos.run_process_check_output(@shell_command)
|
|
39
|
-
else
|
|
40
|
-
Cosmos.run_process(@shell_command)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def parameters_dialog
|
|
46
|
-
dialog = Qt::Dialog.new(parent)
|
|
47
|
-
dialog.window_title = "#{@button_text} Options"
|
|
48
|
-
layout = Qt::VBoxLayout.new
|
|
49
|
-
dialog.layout = layout
|
|
50
|
-
|
|
51
|
-
widgets = []
|
|
52
|
-
@variable_parameters.each do |parameter_name, parameter_value|
|
|
53
|
-
hlayout = Qt::HBoxLayout.new
|
|
54
|
-
hlayout.addWidget(Qt::Label.new(parameter_name))
|
|
55
|
-
parameter_options = parameter_value.split('|')
|
|
56
|
-
if parameter_options.length > 1
|
|
57
|
-
combo_box = Qt::ComboBox.new
|
|
58
|
-
combo_box.setEditable(true)
|
|
59
|
-
idx = 0
|
|
60
|
-
parameter_options.each do |option|
|
|
61
|
-
combo_box.insertItem(idx, option)
|
|
62
|
-
idx += 1
|
|
63
|
-
end
|
|
64
|
-
combo_box.setCurrentIndex(0) # Default Option is the first one
|
|
65
|
-
hlayout.addWidget(combo_box)
|
|
66
|
-
widgets << combo_box
|
|
67
|
-
else
|
|
68
|
-
line_edit = Qt::LineEdit.new
|
|
69
|
-
line_edit.setText(parameter_value)
|
|
70
|
-
hlayout.addWidget(line_edit)
|
|
71
|
-
widgets << line_edit
|
|
72
|
-
end
|
|
73
|
-
layout.addLayout(hlayout)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
ok_button = Qt::PushButton.new('Ok')
|
|
77
|
-
connect(ok_button, SIGNAL('clicked()'), dialog, SLOT('accept()'))
|
|
78
|
-
cancel_button = Qt::PushButton.new('Cancel')
|
|
79
|
-
connect(cancel_button, SIGNAL('clicked()'), dialog, SLOT('reject()'))
|
|
80
|
-
|
|
81
|
-
hlayout = Qt::HBoxLayout.new
|
|
82
|
-
hlayout.addWidget(ok_button, 0, Qt::AlignLeft)
|
|
83
|
-
hlayout.addWidget(cancel_button, 0, Qt::AlignRight)
|
|
84
|
-
layout.addLayout(hlayout)
|
|
85
|
-
|
|
86
|
-
dialog.resize(400, 0)
|
|
87
|
-
cursor_pos = Qt::Cursor.pos
|
|
88
|
-
x_pos = cursor_pos.x - 200
|
|
89
|
-
y_pos = cursor_pos.y - 50
|
|
90
|
-
if x_pos < 0
|
|
91
|
-
x_pos = 0
|
|
92
|
-
elsif x_pos > (Qt::Application.desktop.width - dialog.frameGeometry.width)
|
|
93
|
-
x_pos = Qt::Application.desktop.width - dialog.frameGeometry.width
|
|
94
|
-
end
|
|
95
|
-
dialog.move(x_pos, y_pos)
|
|
96
|
-
|
|
97
|
-
result = dialog.exec
|
|
98
|
-
if result == Qt::Dialog::Accepted
|
|
99
|
-
parameters = ''
|
|
100
|
-
index = 0
|
|
101
|
-
@variable_parameters.each do |parameter_name, _parameter_value|
|
|
102
|
-
parameters << parameter_name
|
|
103
|
-
parameters << ' '
|
|
104
|
-
parameters << widgets[index].text
|
|
105
|
-
parameters << ' '
|
|
106
|
-
index += 1
|
|
107
|
-
end
|
|
108
|
-
dialog.dispose
|
|
109
|
-
return parameters
|
|
110
|
-
else
|
|
111
|
-
dialog.dispose
|
|
112
|
-
return nil
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
end
|
|
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'
|
|
12
|
+
require 'cosmos/gui/qt'
|
|
13
|
+
|
|
14
|
+
module Cosmos
|
|
15
|
+
class LauncherTool < Qt::Object
|
|
16
|
+
slots 'button_clicked()'
|
|
17
|
+
|
|
18
|
+
def initialize(parent, button_text, shell_command, capture_io, variable_parameters)
|
|
19
|
+
super(parent)
|
|
20
|
+
@button_text = button_text
|
|
21
|
+
@shell_command = shell_command
|
|
22
|
+
@capture_io = capture_io
|
|
23
|
+
@variable_parameters = variable_parameters
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def button_clicked
|
|
27
|
+
if @variable_parameters
|
|
28
|
+
parameters = parameters_dialog
|
|
29
|
+
if parameters
|
|
30
|
+
if @capture_io
|
|
31
|
+
Cosmos.run_process_check_output(@shell_command + ' ' + parameters)
|
|
32
|
+
else
|
|
33
|
+
Cosmos.run_process(@shell_command + ' ' + parameters)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
if @capture_io
|
|
38
|
+
Cosmos.run_process_check_output(@shell_command)
|
|
39
|
+
else
|
|
40
|
+
Cosmos.run_process(@shell_command)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def parameters_dialog
|
|
46
|
+
dialog = Qt::Dialog.new(parent)
|
|
47
|
+
dialog.window_title = "#{@button_text} Options"
|
|
48
|
+
layout = Qt::VBoxLayout.new
|
|
49
|
+
dialog.layout = layout
|
|
50
|
+
|
|
51
|
+
widgets = []
|
|
52
|
+
@variable_parameters.each do |parameter_name, parameter_value|
|
|
53
|
+
hlayout = Qt::HBoxLayout.new
|
|
54
|
+
hlayout.addWidget(Qt::Label.new(parameter_name))
|
|
55
|
+
parameter_options = parameter_value.split('|')
|
|
56
|
+
if parameter_options.length > 1
|
|
57
|
+
combo_box = Qt::ComboBox.new
|
|
58
|
+
combo_box.setEditable(true)
|
|
59
|
+
idx = 0
|
|
60
|
+
parameter_options.each do |option|
|
|
61
|
+
combo_box.insertItem(idx, option)
|
|
62
|
+
idx += 1
|
|
63
|
+
end
|
|
64
|
+
combo_box.setCurrentIndex(0) # Default Option is the first one
|
|
65
|
+
hlayout.addWidget(combo_box)
|
|
66
|
+
widgets << combo_box
|
|
67
|
+
else
|
|
68
|
+
line_edit = Qt::LineEdit.new
|
|
69
|
+
line_edit.setText(parameter_value)
|
|
70
|
+
hlayout.addWidget(line_edit)
|
|
71
|
+
widgets << line_edit
|
|
72
|
+
end
|
|
73
|
+
layout.addLayout(hlayout)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
ok_button = Qt::PushButton.new('Ok')
|
|
77
|
+
connect(ok_button, SIGNAL('clicked()'), dialog, SLOT('accept()'))
|
|
78
|
+
cancel_button = Qt::PushButton.new('Cancel')
|
|
79
|
+
connect(cancel_button, SIGNAL('clicked()'), dialog, SLOT('reject()'))
|
|
80
|
+
|
|
81
|
+
hlayout = Qt::HBoxLayout.new
|
|
82
|
+
hlayout.addWidget(ok_button, 0, Qt::AlignLeft)
|
|
83
|
+
hlayout.addWidget(cancel_button, 0, Qt::AlignRight)
|
|
84
|
+
layout.addLayout(hlayout)
|
|
85
|
+
|
|
86
|
+
dialog.resize(400, 0)
|
|
87
|
+
cursor_pos = Qt::Cursor.pos
|
|
88
|
+
x_pos = cursor_pos.x - 200
|
|
89
|
+
y_pos = cursor_pos.y - 50
|
|
90
|
+
if x_pos < 0
|
|
91
|
+
x_pos = 0
|
|
92
|
+
elsif x_pos > (Qt::Application.desktop.width - dialog.frameGeometry.width)
|
|
93
|
+
x_pos = Qt::Application.desktop.width - dialog.frameGeometry.width
|
|
94
|
+
end
|
|
95
|
+
dialog.move(x_pos, y_pos)
|
|
96
|
+
|
|
97
|
+
result = dialog.exec
|
|
98
|
+
if result == Qt::Dialog::Accepted
|
|
99
|
+
parameters = ''
|
|
100
|
+
index = 0
|
|
101
|
+
@variable_parameters.each do |parameter_name, _parameter_value|
|
|
102
|
+
parameters << parameter_name
|
|
103
|
+
parameters << ' '
|
|
104
|
+
parameters << widgets[index].text
|
|
105
|
+
parameters << ' '
|
|
106
|
+
index += 1
|
|
107
|
+
end
|
|
108
|
+
dialog.dispose
|
|
109
|
+
return parameters
|
|
110
|
+
else
|
|
111
|
+
dialog.dispose
|
|
112
|
+
return nil
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -1,837 +1,837 @@
|
|
|
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'
|
|
12
|
-
Cosmos.catch_fatal_exception do
|
|
13
|
-
require 'cosmos/gui/qt_tool'
|
|
14
|
-
require 'cosmos/gui/dialogs/splash'
|
|
15
|
-
require 'cosmos/gui/dialogs/cmd_tlm_raw_dialog'
|
|
16
|
-
require 'cosmos/script'
|
|
17
|
-
require 'cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget'
|
|
18
|
-
require 'cosmos/tools/tlm_viewer/widgets/label_widget'
|
|
19
|
-
require 'pathname'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Extend Array to search for and delete telemetry items.
|
|
23
|
-
# Telemetry items are Arrays of [target name, packet name, item name].
|
|
24
|
-
class Array
|
|
25
|
-
def includes_item?(item)
|
|
26
|
-
found, index = find_item(item)
|
|
27
|
-
return found
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def delete_item(item)
|
|
31
|
-
found, index = find_item(item)
|
|
32
|
-
self.delete_at(index) if found
|
|
33
|
-
return index
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
private
|
|
37
|
-
def find_item(item)
|
|
38
|
-
found = false
|
|
39
|
-
index = 0
|
|
40
|
-
self.each do |target_name, packet_name, item_name|
|
|
41
|
-
if ((target_name == item[0]) &&
|
|
42
|
-
(packet_name == item[1]) &&
|
|
43
|
-
# If the item name is nil we're dealing with a packet
|
|
44
|
-
(item_name == item[2] || item_name.nil?))
|
|
45
|
-
found = true
|
|
46
|
-
break
|
|
47
|
-
end
|
|
48
|
-
index += 1
|
|
49
|
-
end
|
|
50
|
-
return found, index
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
module Cosmos
|
|
55
|
-
|
|
56
|
-
class LimitsItems
|
|
57
|
-
# @return [Array<String,String,String>] Target name, packet name, item name
|
|
58
|
-
attr_reader :ignored
|
|
59
|
-
# @return [Boolean] Whether the limits items have been fetched from the server
|
|
60
|
-
attr_reader :initialized
|
|
61
|
-
|
|
62
|
-
UNKNOWN_ARRAY = ['UNKNOWN', 'UNKNOWN', nil]
|
|
63
|
-
|
|
64
|
-
# @param new_item_callback [Proc] Method to create a new item in the GUI
|
|
65
|
-
# @param update_item_callback [Proc] Method to update an item in the GUI
|
|
66
|
-
# @param clear_items_callback [Proc] Method to clear all items in the GUI
|
|
67
|
-
def initialize(new_item_callback, update_item_callback, clear_items_callback)
|
|
68
|
-
@new_item_callback = new_item_callback
|
|
69
|
-
@update_item_callback = update_item_callback
|
|
70
|
-
@clear_items_callback = clear_items_callback
|
|
71
|
-
@ignored = []
|
|
72
|
-
@items = {}
|
|
73
|
-
@out_of_limits = []
|
|
74
|
-
@queue_id = nil
|
|
75
|
-
@limits_set = :DEFAULT
|
|
76
|
-
request_reset()
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Request that the limits items be refreshed from the server
|
|
80
|
-
def request_reset
|
|
81
|
-
@initialized = false
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Ignore an item. Don't display it in the GUI if it goes out of limits
|
|
85
|
-
# and don't have it count towards the overall limit state. Still display
|
|
86
|
-
# its limits transitions in the log.
|
|
87
|
-
#
|
|
88
|
-
# @param item [Array<String,String,String>] Target name, packet name,
|
|
89
|
-
# item name to ignore
|
|
90
|
-
def ignore(item)
|
|
91
|
-
index = @out_of_limits.delete_item(item)
|
|
92
|
-
@items.delete("#{item[0]} #{item[1]} #{item[2]}") if index
|
|
93
|
-
unless @ignored.includes_item?(item)
|
|
94
|
-
@ignored << item
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Remove an item from the ignored list to have it be displayed and
|
|
99
|
-
# count towards the overall limits state.
|
|
100
|
-
#
|
|
101
|
-
# @param item [Array<String,String,String> Target name, packet name,
|
|
102
|
-
# item name to remove from ignored list
|
|
103
|
-
def remove_ignored(item)
|
|
104
|
-
index = @ignored.delete_item(item)
|
|
105
|
-
if index
|
|
106
|
-
# If we deleted a packet we need to recalculate the stale packets
|
|
107
|
-
if item[2].empty?
|
|
108
|
-
get_stale(true).each do |target, packet|
|
|
109
|
-
stale_packet(target, packet)
|
|
110
|
-
end
|
|
111
|
-
# We deleted an item so get all the current out of limit items
|
|
112
|
-
else
|
|
113
|
-
get_out_of_limits().each do |target, packet, item, state|
|
|
114
|
-
limits_change(target, packet, item, state)
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
rescue DRb::DRbConnError
|
|
119
|
-
# Do nothing
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# @return [Boolean] Whether there are any items being ignored
|
|
123
|
-
def ignored_items?
|
|
124
|
-
!@ignored.empty?
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# @return [Symbol] The overall limits state. Returns :STALE if there
|
|
128
|
-
# is no connection to the server.
|
|
129
|
-
def overall_state
|
|
130
|
-
get_overall_limits_state(@ignored)
|
|
131
|
-
rescue DRb::DRbConnError
|
|
132
|
-
:STALE
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Calls get_limits_event to process all the server limits events that
|
|
136
|
-
# were subscribed to. This method should be called continuously until
|
|
137
|
-
# it returns nil which indicates no more events.
|
|
138
|
-
#
|
|
139
|
-
# @return [Array<String,Symbol] String describing the event and a symbol
|
|
140
|
-
# indicating how the event string should be colored (:BLACK, :BLUE,
|
|
141
|
-
# :GREEN, :YELLOW, or :RED)
|
|
142
|
-
def process_events
|
|
143
|
-
result = nil
|
|
144
|
-
type = nil
|
|
145
|
-
data = nil
|
|
146
|
-
begin
|
|
147
|
-
reset() unless @initialized
|
|
148
|
-
# Get events non-blocking which is why we rescue ThreadError
|
|
149
|
-
type, data = get_limits_event(@queue_id, true)
|
|
150
|
-
rescue ThreadError
|
|
151
|
-
# Do nothing (nominal exception if there are no events)
|
|
152
|
-
rescue DRb::DRbConnError
|
|
153
|
-
# The server is down so request a reset
|
|
154
|
-
request_reset()
|
|
155
|
-
end
|
|
156
|
-
return result unless type
|
|
157
|
-
|
|
158
|
-
case type
|
|
159
|
-
when :LIMITS_CHANGE
|
|
160
|
-
# The most common event: target, packet, item, state
|
|
161
|
-
result = limits_change(data[0], data[1], data[2], data[4])
|
|
162
|
-
|
|
163
|
-
when :LIMITS_SET
|
|
164
|
-
# Check if the overall limits set changed. If so we need to reset
|
|
165
|
-
# to incorporate all the new limits.
|
|
166
|
-
if @limits_set != data
|
|
167
|
-
request_reset()
|
|
168
|
-
result = ["INFO: Limits Set Changed to: #{data}\n", :BLACK]
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
when :LIMITS_SETTINGS
|
|
172
|
-
# The limits settings for an individual item changed. Set our local tool
|
|
173
|
-
# knowledge of the limits to match the server.
|
|
174
|
-
begin
|
|
175
|
-
System.limits.set(data[0], data[1], data[2], data[6], data[7], data[8], data[9], data[10], data[11], data[3], data[4], data[5])
|
|
176
|
-
result = ["INFO: Limits Settings Changed: #{data}\n", :BLACK]
|
|
177
|
-
rescue
|
|
178
|
-
# This can fail if we missed setting the DEFAULT limits set earlier
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
when :STALE_PACKET
|
|
182
|
-
# A packet has gone stale: target, packet
|
|
183
|
-
result = stale_packet(data[0], data[1])
|
|
184
|
-
end
|
|
185
|
-
result
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
# Update the values for all the out of limits items being tracked.
|
|
189
|
-
def update_values
|
|
190
|
-
# Reject any out of limits packets as they don't have values
|
|
191
|
-
items = @out_of_limits.reject {|item| item[2].nil? }
|
|
192
|
-
|
|
193
|
-
values, limits_states, limits_settings, limits_set = get_tlm_values(items, :WITH_UNITS)
|
|
194
|
-
index = 0
|
|
195
|
-
items.each do |target_name, packet_name, item_name|
|
|
196
|
-
begin
|
|
197
|
-
# Update the limits settings each time we update values
|
|
198
|
-
# to stay in sync with the Server. Responding to :LIMITS_SETTINGS
|
|
199
|
-
# events isn't enough since we don't get those upon startup.
|
|
200
|
-
System.limits.set(target_name, packet_name, item_name,
|
|
201
|
-
limits_settings[index][0], limits_settings[index][1],
|
|
202
|
-
limits_settings[index][2], limits_settings[index][3],
|
|
203
|
-
limits_settings[index][4], limits_settings[index][5],
|
|
204
|
-
limits_set) if limits_settings[index]
|
|
205
|
-
rescue
|
|
206
|
-
# This can fail if we missed setting the DEFAULT limits set earlier
|
|
207
|
-
end
|
|
208
|
-
name = "#{target_name} #{packet_name} #{item_name}"
|
|
209
|
-
@update_item_callback.call(@items[name], values[index], limits_states[index], limits_set)
|
|
210
|
-
index += 1
|
|
211
|
-
end
|
|
212
|
-
rescue DRb::DRbConnError
|
|
213
|
-
# Do nothing
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
# Load a new configuration of ignored items and packets and reset
|
|
217
|
-
#
|
|
218
|
-
# @param config_file [String] Configuration file base name which will be
|
|
219
|
-
# expanded to find a file in the config/tools/limits_monitor dir.
|
|
220
|
-
# @return [String] Message indicating success or fail
|
|
221
|
-
def open_config(filename)
|
|
222
|
-
return "" unless filename
|
|
223
|
-
|
|
224
|
-
unless Pathname.new(filename).absolute?
|
|
225
|
-
filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'limits_monitor', filename)
|
|
226
|
-
end
|
|
227
|
-
return "Configuration file #{filename} not found!" unless File.exist?(filename)
|
|
228
|
-
|
|
229
|
-
@ignored = []
|
|
230
|
-
begin
|
|
231
|
-
parser = ConfigParser.new
|
|
232
|
-
parser.parse_file(filename) do |keyword, params|
|
|
233
|
-
case keyword
|
|
234
|
-
# TODO: Eventually we can deprecate 'IGNORE' in favor
|
|
235
|
-
# of 'IGNORE_ITEM' now that we also have 'IGNORE_PACKET'
|
|
236
|
-
when 'IGNORE', 'IGNORE_ITEM'
|
|
237
|
-
@ignored << ([params[0], params[1], params[2]])
|
|
238
|
-
when 'IGNORE_PACKET'
|
|
239
|
-
@ignored << ([params[0], params[1], nil])
|
|
240
|
-
end
|
|
241
|
-
end
|
|
242
|
-
result = "#{filename} loaded. "
|
|
243
|
-
result << "Warning: Some items ignored" if ignored_items?
|
|
244
|
-
rescue => e
|
|
245
|
-
result = "Error loading configuration : #{e.message}"
|
|
246
|
-
end
|
|
247
|
-
# Since we may have loaded new ignored items we need to reset
|
|
248
|
-
request_reset()
|
|
249
|
-
result
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
# Save the current configuration of ignored items and packets.
|
|
253
|
-
#
|
|
254
|
-
# @param config_file [String] Configuration file to save.
|
|
255
|
-
# @return [String] Message indicating success or fail
|
|
256
|
-
def save_config(filename)
|
|
257
|
-
begin
|
|
258
|
-
File.open(filename, "w") do |file|
|
|
259
|
-
@ignored.each do |target, pkt_name, item_name|
|
|
260
|
-
if item_name
|
|
261
|
-
file.puts("IGNORE_ITEM #{target} #{pkt_name} #{item_name}")
|
|
262
|
-
else
|
|
263
|
-
file.puts("IGNORE_PACKET #{target} #{pkt_name}")
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
result = "#{filename} saved"
|
|
268
|
-
rescue => e
|
|
269
|
-
result = "Error saving configuration : #{e.message}"
|
|
270
|
-
end
|
|
271
|
-
result
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
private
|
|
275
|
-
|
|
276
|
-
# Clear all tracked out of limits items and resubscribe to the server
|
|
277
|
-
# limits events. Clear the GUI and re-create all out of limits items
|
|
278
|
-
# and stale packets.
|
|
279
|
-
#
|
|
280
|
-
# Note this method can raise a DRb::DRbConnError error!
|
|
281
|
-
def reset
|
|
282
|
-
@items = {}
|
|
283
|
-
@out_of_limits = []
|
|
284
|
-
@limits_set = get_limits_set()
|
|
285
|
-
unsubscribe_limits_events(@queue_id) if @queue_id
|
|
286
|
-
@queue_id = subscribe_limits_events(100000)
|
|
287
|
-
@clear_items_callback.call
|
|
288
|
-
get_out_of_limits().each do |target, packet, item, state|
|
|
289
|
-
limits_change(target, packet, item, state)
|
|
290
|
-
end
|
|
291
|
-
get_stale(true).each do |target, packet|
|
|
292
|
-
stale_packet(target, packet)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
@initialized = true
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
# Process a limits_change event by recoloring out of limits events
|
|
299
|
-
# and creating a log message.
|
|
300
|
-
def limits_change(target_name, packet_name, item_name, state)
|
|
301
|
-
message = ''
|
|
302
|
-
color = :BLACK
|
|
303
|
-
item = [target_name, packet_name, item_name]
|
|
304
|
-
|
|
305
|
-
case state
|
|
306
|
-
when :YELLOW, :YELLOW_HIGH, :YELLOW_LOW
|
|
307
|
-
message << "WARN: "
|
|
308
|
-
color = :YELLOW
|
|
309
|
-
out_of_limit(item)
|
|
310
|
-
when :RED, :RED_HIGH, :RED_LOW
|
|
311
|
-
message << "ERROR: "
|
|
312
|
-
color = :RED
|
|
313
|
-
out_of_limit(item)
|
|
314
|
-
when :GREEN, :GREEN_HIGH, :GREEN_LOW
|
|
315
|
-
message << "INFO: "
|
|
316
|
-
color = :GREEN
|
|
317
|
-
when :BLUE
|
|
318
|
-
message << "INFO: "
|
|
319
|
-
color = :BLUE
|
|
320
|
-
end
|
|
321
|
-
value = tlm(target_name, packet_name, item_name)
|
|
322
|
-
message << "#{target_name} #{packet_name} #{item_name} = #{value} is #{state}\n"
|
|
323
|
-
[message, color]
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
# Record the stale packet and generate a log message
|
|
327
|
-
def stale_packet(target_name, packet_name)
|
|
328
|
-
out_of_limit([target_name, packet_name, nil])
|
|
329
|
-
return ["INFO: Packet #{target_name} #{packet_name} is STALE\n", :BLACK]
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
# Record an out of limits item and call the new item callback.
|
|
333
|
-
# Existing out of limits and ignored items are not recorded.
|
|
334
|
-
def out_of_limit(item)
|
|
335
|
-
unless (@out_of_limits.includes_item?(item) || @ignored.includes_item?(item) || UNKNOWN_ARRAY.includes_item?(item))
|
|
336
|
-
@out_of_limits << item
|
|
337
|
-
@items["#{item[0]} #{item[1]} #{item[2]}"] = @new_item_callback.call(*item)
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
# The LimitsMonitor application displays all the out of limits items
|
|
343
|
-
# encountered by the COSMOS server. It provides the ability to ignore and
|
|
344
|
-
# restore limits as well as logs all limits events.
|
|
345
|
-
class LimitsMonitor < QtTool
|
|
346
|
-
# LimitsWidget displays either a stale packet using the Label widget
|
|
347
|
-
# or more commonly an out of limits item using the Labelvaluelimitsbar
|
|
348
|
-
# Widget.
|
|
349
|
-
class LimitsWidget < Qt::Widget
|
|
350
|
-
# @return [Widget] The widget which displays the value
|
|
351
|
-
attr_accessor :value
|
|
352
|
-
|
|
353
|
-
# @parent [Qt::Widget] Parent widget (the LimitsMonitor tool)
|
|
354
|
-
# @target_name [String] Target name
|
|
355
|
-
# @packet_name [String] Packet name
|
|
356
|
-
# @item_name [String] Telemetry item name (nil for stale packets)
|
|
357
|
-
def initialize(parent, target_name, packet_name, item_name)
|
|
358
|
-
super(parent)
|
|
359
|
-
@layout = Qt::HBoxLayout.new
|
|
360
|
-
@layout.setSpacing(0)
|
|
361
|
-
@layout.setContentsMargins(0,0,0,0)
|
|
362
|
-
setLayout(@layout)
|
|
363
|
-
|
|
364
|
-
item = [target_name, packet_name, item_name]
|
|
365
|
-
if item_name
|
|
366
|
-
@value = LabelvaluelimitsbarWidget.new(@layout, target_name, packet_name, item_name)
|
|
367
|
-
@value.set_setting('COLORBLIND', [@colorblind])
|
|
368
|
-
@value.process_settings
|
|
369
|
-
else
|
|
370
|
-
@value = LabelWidget.new(layout, "#{target_name} #{packet_name} is STALE")
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
@ignore_button = Qt::PushButton.new('Ignore')
|
|
374
|
-
@ignore_button.connect(SIGNAL('clicked()')) { parent.ignore(self, item) }
|
|
375
|
-
@layout.addWidget(@ignore_button)
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
# Update the widget's value, limits_state, and limits_set
|
|
379
|
-
def set_values(value, limits_state, limits_set)
|
|
380
|
-
if LabelvaluelimitsbarWidget === @value
|
|
381
|
-
@value.value = value
|
|
382
|
-
@value.limits_state = limits_state
|
|
383
|
-
@value.limits_set = limits_set
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
|
|
387
|
-
# Enable or disable Colorblind mode
|
|
388
|
-
def set_colorblind(enabled)
|
|
389
|
-
if LabelvaluelimitsbarWidget === @value
|
|
390
|
-
@value.set_setting('COLORBLIND', [enabled])
|
|
391
|
-
@value.process_settings
|
|
392
|
-
end
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
# Dispose of the widget
|
|
396
|
-
def dispose
|
|
397
|
-
@ignore_button.dispose
|
|
398
|
-
@value.dispose
|
|
399
|
-
@layout.dispose
|
|
400
|
-
super()
|
|
401
|
-
end
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
# Create the main application GUI. Start the limits thread which responds to
|
|
405
|
-
# asynchronous limits events from the server and the value thread which
|
|
406
|
-
# polls the server at 1Hz for the out of limits items values.
|
|
407
|
-
#
|
|
408
|
-
# @param options [Options] Contains the options for the window.
|
|
409
|
-
def initialize(options)
|
|
410
|
-
super(options)
|
|
411
|
-
Cosmos.load_cosmos_icon("limits_monitor.png")
|
|
412
|
-
|
|
413
|
-
@cancel_thread = false
|
|
414
|
-
@limits_sleeper = Sleeper.new
|
|
415
|
-
@value_sleeper = Sleeper.new
|
|
416
|
-
|
|
417
|
-
initialize_actions()
|
|
418
|
-
initialize_menus()
|
|
419
|
-
initialize_central_widget()
|
|
420
|
-
complete_initialize()
|
|
421
|
-
|
|
422
|
-
@limits_items = LimitsItems.new(
|
|
423
|
-
method(:new_gui_item), method(:update_gui_item), method(:clear_gui_items))
|
|
424
|
-
result = @limits_items.open_config(options.config_file)
|
|
425
|
-
statusBar.showMessage(tr(result))
|
|
426
|
-
|
|
427
|
-
limits_thread()
|
|
428
|
-
value_thread()
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
# Initialize all the actions in the application Menu
|
|
432
|
-
def initialize_actions
|
|
433
|
-
super
|
|
434
|
-
|
|
435
|
-
@options_action = Qt::Action.new(tr('O&ptions'), self)
|
|
436
|
-
@options_action.statusTip = tr('Open the options dialog')
|
|
437
|
-
@options_action.connect(SIGNAL('triggered()')) { show_options_dialog() }
|
|
438
|
-
|
|
439
|
-
@reset_action = Qt::Action.new(tr('&Reset'), self)
|
|
440
|
-
@reset_action_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
|
|
441
|
-
@reset_action.shortcut = @reset_action_keyseq
|
|
442
|
-
@reset_action.statusTip = tr('Reset connection and clear all items. This does not modify the ignored items.')
|
|
443
|
-
@reset_action.connect(SIGNAL('triggered()')) { @limits_items.request_reset() }
|
|
444
|
-
|
|
445
|
-
@open_ignored_action = Qt::Action.new(Cosmos.get_icon('open.png'),
|
|
446
|
-
tr('&Open Config'), self)
|
|
447
|
-
@open_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
448
|
-
@open_ignored_action.shortcut = @open_ignored_action_keyseq
|
|
449
|
-
@open_ignored_action.statusTip = tr('Open ignored telemetry items configuration file')
|
|
450
|
-
@open_ignored_action.connect(SIGNAL('triggered()')) { open_config_file() }
|
|
451
|
-
|
|
452
|
-
@save_ignored_action = Qt::Action.new(Cosmos.get_icon('save.png'),
|
|
453
|
-
tr('&Save Config'), self)
|
|
454
|
-
@save_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
|
|
455
|
-
@save_ignored_action.shortcut = @save_ignored_action_keyseq
|
|
456
|
-
@save_ignored_action.statusTip = tr('Save all ignored telemetry items in a configuration file')
|
|
457
|
-
@save_ignored_action.connect(SIGNAL('triggered()')) { save_config_file() }
|
|
458
|
-
|
|
459
|
-
@edit_ignored_action = Qt::Action.new(tr('&Edit Ignored'), self)
|
|
460
|
-
@edit_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+E'))
|
|
461
|
-
@edit_ignored_action.shortcut = @edit_ignored_action_keyseq
|
|
462
|
-
@edit_ignored_action.statusTip = tr('Edit the ignored telemetry items list')
|
|
463
|
-
@edit_ignored_action.connect(SIGNAL('triggered()')) { edit_ignored_items() }
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
# Initialize the application menu bar options
|
|
467
|
-
def initialize_menus
|
|
468
|
-
@file_menu = menuBar.addMenu(tr('&File'))
|
|
469
|
-
@file_menu.addAction(@open_ignored_action)
|
|
470
|
-
@file_menu.addAction(@save_ignored_action)
|
|
471
|
-
@file_menu.addAction(@edit_ignored_action)
|
|
472
|
-
@file_menu.addSeparator()
|
|
473
|
-
@file_menu.addAction(@reset_action)
|
|
474
|
-
@file_menu.addAction(@options_action)
|
|
475
|
-
@file_menu.addSeparator()
|
|
476
|
-
@file_menu.addAction(@exit_action)
|
|
477
|
-
|
|
478
|
-
# Help Menu
|
|
479
|
-
@about_string = "Limits Monitor displays all telemetry items that are or have been out of limits since it was started or reset."
|
|
480
|
-
|
|
481
|
-
initialize_help_menu()
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
# Layout the main GUI tab widget with a view of all the out of limits items
|
|
485
|
-
# in one tab and a log tab showing all limits events.
|
|
486
|
-
def initialize_central_widget
|
|
487
|
-
@tabbook = Qt::TabWidget.new(self)
|
|
488
|
-
setCentralWidget(@tabbook)
|
|
489
|
-
@widget = Qt::Widget.new
|
|
490
|
-
@layout = Qt::VBoxLayout.new(@widget)
|
|
491
|
-
|
|
492
|
-
@monitored_state_text_field = Qt::LineEdit.new(self)
|
|
493
|
-
@monitored_state_text_field.setText('Stale')
|
|
494
|
-
@monitored_state_text_field.setAlignment(Qt::AlignCenter)
|
|
495
|
-
@monitored_state_text_field.setReadOnly(true)
|
|
496
|
-
@palette = Qt::Palette.new()
|
|
497
|
-
@palette.setColor(Qt::Palette::Base, Qt::Color.new(255,0,255))
|
|
498
|
-
@monitored_state_text_field.setPalette(@palette)
|
|
499
|
-
@state_label = Qt::Label.new('Monitored Limits State: ')
|
|
500
|
-
|
|
501
|
-
@monitored_state_frame = Qt::HBoxLayout.new
|
|
502
|
-
@monitored_state_frame.addWidget(@state_label)
|
|
503
|
-
@monitored_state_frame.addWidget(@monitored_state_text_field)
|
|
504
|
-
label = Qt::Label.new
|
|
505
|
-
filename = File.join(::Cosmos::PATH, 'data', 'spinner.gif')
|
|
506
|
-
movie = Qt::Movie.new(filename)
|
|
507
|
-
label.setMovie(movie)
|
|
508
|
-
movie.start
|
|
509
|
-
@monitored_state_frame.addWidget(label)
|
|
510
|
-
@monitored_state_frame.setAlignment(Qt::AlignTop)
|
|
511
|
-
@layout.addLayout(@monitored_state_frame)
|
|
512
|
-
|
|
513
|
-
@scroll = Qt::ScrollArea.new
|
|
514
|
-
@scroll_widget = Qt::Widget.new
|
|
515
|
-
@scroll.setWidget(@scroll_widget)
|
|
516
|
-
@scroll_layout = Qt::VBoxLayout.new(@scroll_widget)
|
|
517
|
-
@scroll_layout.setSizeConstraint(Qt::Layout::SetMinAndMaxSize)
|
|
518
|
-
@layout.addWidget(@scroll)
|
|
519
|
-
|
|
520
|
-
@log_output = Qt::PlainTextEdit.new
|
|
521
|
-
@log_output.setReadOnly(true)
|
|
522
|
-
@log_output.setMaximumBlockCount(100)
|
|
523
|
-
|
|
524
|
-
@tabbook.addTab(@widget, "Limits")
|
|
525
|
-
@tabbook.addTab(@log_output, "Log")
|
|
526
|
-
end
|
|
527
|
-
|
|
528
|
-
def show_options_dialog
|
|
529
|
-
Qt::Dialog.new(self) do |dialog|
|
|
530
|
-
dialog.setWindowTitle('Options')
|
|
531
|
-
|
|
532
|
-
colorblind_box = Qt::CheckBox.new('Colorblind Mode Enabled', self)
|
|
533
|
-
colorblind_box.setCheckState(Qt::Checked) if @colorblind
|
|
534
|
-
|
|
535
|
-
ok = Qt::PushButton.new('Ok') do
|
|
536
|
-
connect(SIGNAL('clicked()')) { dialog.accept }
|
|
537
|
-
end
|
|
538
|
-
cancel = Qt::PushButton.new('Cancel') do
|
|
539
|
-
connect(SIGNAL('clicked()')) { dialog.reject }
|
|
540
|
-
end
|
|
541
|
-
buttons = Qt::HBoxLayout.new do
|
|
542
|
-
addWidget(ok)
|
|
543
|
-
addWidget(cancel)
|
|
544
|
-
end
|
|
545
|
-
dialog.layout = Qt::VBoxLayout.new do
|
|
546
|
-
addWidget(colorblind_box)
|
|
547
|
-
addLayout(buttons)
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
case dialog.exec
|
|
551
|
-
when Qt::Dialog::Accepted
|
|
552
|
-
if (colorblind_box.checkState() == Qt::Checked)
|
|
553
|
-
@colorblind = true
|
|
554
|
-
else
|
|
555
|
-
@colorblind = false
|
|
556
|
-
end
|
|
557
|
-
(0...@scroll_layout.count).each do |index|
|
|
558
|
-
@scroll_layout.itemAt(index).widget.set_colorblind(@colorblind)
|
|
559
|
-
end
|
|
560
|
-
end
|
|
561
|
-
dialog.dispose
|
|
562
|
-
end
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
# @return [String] Fully qualified path to the configuration file
|
|
566
|
-
def config_path
|
|
567
|
-
# If the config file has been set then just return it
|
|
568
|
-
return @filename if @filename
|
|
569
|
-
# This is the default path to the configuration files
|
|
570
|
-
File.join(::Cosmos::USERPATH, 'config', 'tools', 'limits_monitor', 'limits_monitor.txt')
|
|
571
|
-
end
|
|
572
|
-
|
|
573
|
-
# Opens the configuration file and loads the ignored items
|
|
574
|
-
def open_config_file
|
|
575
|
-
filename = Qt::FileDialog::getOpenFileName(self,
|
|
576
|
-
"Open Configuration File", config_path())
|
|
577
|
-
unless filename.nil? || filename.empty?
|
|
578
|
-
result = @limits_items.open_config(filename)
|
|
579
|
-
statusBar.showMessage(tr(result))
|
|
580
|
-
end
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
# Saves the ignored items to the configuration file
|
|
584
|
-
def save_config_file
|
|
585
|
-
filename = Qt::FileDialog.getSaveFileName(self,
|
|
586
|
-
'Save As...', config_path(), 'Configuration Files (*.txt)')
|
|
587
|
-
unless filename.nil? || filename.empty?
|
|
588
|
-
result = @limits_items.save_config(filename)
|
|
589
|
-
statusBar.showMessage(tr(result))
|
|
590
|
-
@filename = filename
|
|
591
|
-
end
|
|
592
|
-
end
|
|
593
|
-
|
|
594
|
-
# Opens a dialog to allow the user to remove ignored items
|
|
595
|
-
def edit_ignored_items
|
|
596
|
-
items = []
|
|
597
|
-
index = 0
|
|
598
|
-
@limits_items.ignored.each do |target_name, packet_name, item_name|
|
|
599
|
-
item = Qt::ListWidgetItem.new("#{target_name} #{packet_name} #{item_name}")
|
|
600
|
-
item.setData(Qt::UserRole, Qt::Variant.new(@limits_items.ignored[index]))
|
|
601
|
-
items << item
|
|
602
|
-
index += 1
|
|
603
|
-
end
|
|
604
|
-
|
|
605
|
-
Qt::Dialog.new(self) do |dialog|
|
|
606
|
-
dialog.setWindowTitle('Ignored Telemetry Items')
|
|
607
|
-
list = Qt::ListWidget.new
|
|
608
|
-
list.setFocus()
|
|
609
|
-
# Allow multiple sections
|
|
610
|
-
list.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
|
|
611
|
-
items.each {|item| list.addItem(item) }
|
|
612
|
-
|
|
613
|
-
shortcut = Qt::Shortcut.new(Qt::KeySequence.new(Qt::KeySequence::Delete), list)
|
|
614
|
-
list.connect(shortcut, SIGNAL('activated()')) do
|
|
615
|
-
items = list.selectedItems()
|
|
616
|
-
(0...items.length).each do |index|
|
|
617
|
-
@limits_items.remove_ignored(items[index].data(Qt::UserRole).value)
|
|
618
|
-
end
|
|
619
|
-
list.remove_selected_items
|
|
620
|
-
list.setCurrentRow(0)
|
|
621
|
-
end
|
|
622
|
-
# Preselect the first row (works if list is empty) so the keyboard
|
|
623
|
-
# works instantly without having to click the list
|
|
624
|
-
list.setCurrentRow(0)
|
|
625
|
-
|
|
626
|
-
ok = Qt::PushButton.new('Ok') do
|
|
627
|
-
connect(SIGNAL('clicked()')) { dialog.done(0) }
|
|
628
|
-
end
|
|
629
|
-
remove = Qt::PushButton.new('Remove Selected') do
|
|
630
|
-
connect(SIGNAL('clicked()')) { shortcut.activated() }
|
|
631
|
-
end
|
|
632
|
-
button_layout = Qt::HBoxLayout.new do
|
|
633
|
-
addWidget(ok)
|
|
634
|
-
addStretch(1)
|
|
635
|
-
addWidget(remove)
|
|
636
|
-
end
|
|
637
|
-
dialog.layout = Qt::VBoxLayout.new do
|
|
638
|
-
addWidget(list)
|
|
639
|
-
addLayout(button_layout)
|
|
640
|
-
end
|
|
641
|
-
dialog.resize(500, 200)
|
|
642
|
-
dialog.exec
|
|
643
|
-
dialog.dispose
|
|
644
|
-
end
|
|
645
|
-
end
|
|
646
|
-
|
|
647
|
-
# Thread to monitor for broken limits and add them to the log and
|
|
648
|
-
# front panel when found.
|
|
649
|
-
def limits_thread
|
|
650
|
-
result = nil
|
|
651
|
-
color = nil
|
|
652
|
-
@limits_thread = Thread.new do
|
|
653
|
-
while true
|
|
654
|
-
break if @cancel_thread
|
|
655
|
-
Qt.execute_in_main_thread(true) do
|
|
656
|
-
result, color = @limits_items.process_events()
|
|
657
|
-
end
|
|
658
|
-
if result
|
|
659
|
-
update_log(result, color)
|
|
660
|
-
else
|
|
661
|
-
break if @limits_sleeper.sleep(1)
|
|
662
|
-
end
|
|
663
|
-
end
|
|
664
|
-
end
|
|
665
|
-
rescue Exception => error
|
|
666
|
-
Cosmos.handle_fatal_exception(error)
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
# Add new out of limit item or stale packet
|
|
670
|
-
#
|
|
671
|
-
# @param target_name [String] Target name of out of limits item.
|
|
672
|
-
# @param packet_name [String] Packet name of out of limits item.
|
|
673
|
-
# @param item_name [String] Item name of out of limits item or nil
|
|
674
|
-
# if its a stale packet
|
|
675
|
-
# @return [Qt::Widget] The new widget that was created
|
|
676
|
-
def new_gui_item(target_name, packet_name, item_name)
|
|
677
|
-
widget = nil
|
|
678
|
-
Qt.execute_in_main_thread(true) do
|
|
679
|
-
widget = LimitsWidget.new(self, target_name, packet_name, item_name)
|
|
680
|
-
@scroll_layout.addWidget(widget)
|
|
681
|
-
end
|
|
682
|
-
widget
|
|
683
|
-
end
|
|
684
|
-
|
|
685
|
-
# Update out of limit item with a values
|
|
686
|
-
#
|
|
687
|
-
# @param target_name [String] Target name of out of limits item.
|
|
688
|
-
# @param packet_name [String] Packet name of out of limits item.
|
|
689
|
-
# @param item_name [String] Item name of out of limits item or nil
|
|
690
|
-
# if its a stale packet
|
|
691
|
-
def update_gui_item(widget, value, limits_state, limits_set)
|
|
692
|
-
Qt.execute_in_main_thread(true) do
|
|
693
|
-
widget.set_values(value, limits_state, limits_set) if widget
|
|
694
|
-
end
|
|
695
|
-
end
|
|
696
|
-
|
|
697
|
-
# Reset the GUI by clearing all items
|
|
698
|
-
def clear_gui_items
|
|
699
|
-
Qt.execute_in_main_thread(true) { @scroll_layout.removeAll }
|
|
700
|
-
end
|
|
701
|
-
|
|
702
|
-
# Update front panel to ignore an item when the corresponding button is pressed.
|
|
703
|
-
#
|
|
704
|
-
# @param item [Array<String,String,String] Array containing the target name,
|
|
705
|
-
# packet name, and item name of the item to ignore.
|
|
706
|
-
def ignore(widget, item)
|
|
707
|
-
@limits_items.ignore(item)
|
|
708
|
-
Qt.execute_in_main_thread(true) do
|
|
709
|
-
@scroll_layout.removeWidget(widget)
|
|
710
|
-
widget.dispose
|
|
711
|
-
@scroll_widget.adjustSize
|
|
712
|
-
statusBar.showMessage('Warning: Some Telemetry Items are Ignored')
|
|
713
|
-
end
|
|
714
|
-
end
|
|
715
|
-
|
|
716
|
-
# Update the log panel with limits change information.
|
|
717
|
-
#
|
|
718
|
-
# @param message [String] Text string with information about which item is out of
|
|
719
|
-
# limits, what its value is, and what limit was broken (red_low, yellow_low, etc.)
|
|
720
|
-
# @param color [Symbol] Color of text to add.
|
|
721
|
-
def update_log(message, color)
|
|
722
|
-
return if @cancel_thread
|
|
723
|
-
Qt.execute_in_main_thread(true) do
|
|
724
|
-
@tf ||= Qt::TextCharFormat.new
|
|
725
|
-
case color
|
|
726
|
-
when :GREEN
|
|
727
|
-
brush = Cosmos.getBrush(Cosmos::GREEN)
|
|
728
|
-
when :YELLOW
|
|
729
|
-
brush = Cosmos.getBrush(Cosmos::YELLOW)
|
|
730
|
-
when :RED
|
|
731
|
-
brush = Cosmos.getBrush(Cosmos::RED)
|
|
732
|
-
when :BLUE
|
|
733
|
-
brush = Cosmos.getBrush(Cosmos::BLUE)
|
|
734
|
-
else # :BLACK
|
|
735
|
-
brush = Cosmos.getBrush(Cosmos::BLACK)
|
|
736
|
-
end
|
|
737
|
-
@tf.setForeground(brush)
|
|
738
|
-
@log_output.setCurrentCharFormat(@tf)
|
|
739
|
-
@log_output.appendPlainText(message.chomp)
|
|
740
|
-
end
|
|
741
|
-
end
|
|
742
|
-
|
|
743
|
-
# Thread to request the out of limits values and update them at 1Hz.
|
|
744
|
-
# Also updates the status bar at the top of the front panel indicating
|
|
745
|
-
# the overall limits value of the system.
|
|
746
|
-
def value_thread
|
|
747
|
-
@value_thread = Thread.new do
|
|
748
|
-
while true
|
|
749
|
-
break if @cancel_thread
|
|
750
|
-
Qt.execute_in_main_thread(true) do
|
|
751
|
-
if @limits_items.initialized
|
|
752
|
-
@limits_items.update_values()
|
|
753
|
-
update_overall_limits_state(@limits_items.overall_state())
|
|
754
|
-
else
|
|
755
|
-
# Set the status bar message to expire in 2s since this runs at 1Hz
|
|
756
|
-
statusBar.showMessage('Error Connecting to Command and Telemetry Server', 2000)
|
|
757
|
-
end
|
|
758
|
-
end
|
|
759
|
-
break if @value_sleeper.sleep(1)
|
|
760
|
-
end
|
|
761
|
-
end
|
|
762
|
-
rescue Exception => error
|
|
763
|
-
Cosmos.handle_fatal_exception(error)
|
|
764
|
-
end
|
|
765
|
-
|
|
766
|
-
# Changes the limits state on the status bar at the top of the screen.
|
|
767
|
-
def update_overall_limits_state(state)
|
|
768
|
-
Qt.execute_in_main_thread(true) do
|
|
769
|
-
text = ''
|
|
770
|
-
case state
|
|
771
|
-
when :STALE
|
|
772
|
-
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,0,255))
|
|
773
|
-
@monitored_state_text_field.setPalette(palette)
|
|
774
|
-
text = 'Stale'
|
|
775
|
-
when :GREEN, :GREEN_HIGH, :GREEN_LOW
|
|
776
|
-
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(0,255,0))
|
|
777
|
-
@monitored_state_text_field.setPalette(palette)
|
|
778
|
-
text = 'Green'
|
|
779
|
-
when :YELLOW, :YELLOW_HIGH, :YELLOW_LOW
|
|
780
|
-
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,255,0))
|
|
781
|
-
@monitored_state_text_field.setPalette(palette)
|
|
782
|
-
text = 'Yellow'
|
|
783
|
-
when :RED, :RED_HIGH, :RED_LOW
|
|
784
|
-
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,0,0))
|
|
785
|
-
@monitored_state_text_field.setPalette(palette)
|
|
786
|
-
text = 'Red'
|
|
787
|
-
when :BLUE
|
|
788
|
-
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(0,0,255))
|
|
789
|
-
@monitored_state_text_field.setPalette(palette)
|
|
790
|
-
text = 'Blue'
|
|
791
|
-
end
|
|
792
|
-
text << ' - Some Items Ignored' if @limits_items.ignored_items?
|
|
793
|
-
@monitored_state_text_field.text = text
|
|
794
|
-
end
|
|
795
|
-
end
|
|
796
|
-
|
|
797
|
-
# Handle the window closing
|
|
798
|
-
def closeEvent(event)
|
|
799
|
-
@cancel_thread = true
|
|
800
|
-
@value_sleeper.cancel
|
|
801
|
-
@limits_sleeper.cancel
|
|
802
|
-
shutdown_cmd_tlm()
|
|
803
|
-
Cosmos.kill_thread(self, @limits_thread, 2)
|
|
804
|
-
Cosmos.kill_thread(self, @value_thread, 2)
|
|
805
|
-
super(event)
|
|
806
|
-
end
|
|
807
|
-
|
|
808
|
-
# Gracefully kill threads
|
|
809
|
-
def graceful_kill
|
|
810
|
-
Qt::CoreApplication.processEvents()
|
|
811
|
-
end
|
|
812
|
-
|
|
813
|
-
# Initialize tool options.
|
|
814
|
-
def self.run(option_parser = nil, options = nil)
|
|
815
|
-
Cosmos.catch_fatal_exception do
|
|
816
|
-
unless option_parser and options
|
|
817
|
-
option_parser, options = create_default_options()
|
|
818
|
-
options.width = 600
|
|
819
|
-
options.height = 500
|
|
820
|
-
options.remember_geometry = false
|
|
821
|
-
options.title = "Limits Monitor"
|
|
822
|
-
options.auto_size = false
|
|
823
|
-
options.config_file = nil
|
|
824
|
-
options.production = false
|
|
825
|
-
options.no_prompt = false
|
|
826
|
-
option_parser.separator "Limits Monitor Specific Options:"
|
|
827
|
-
option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
|
|
828
|
-
options.config_file = arg
|
|
829
|
-
end
|
|
830
|
-
end
|
|
831
|
-
|
|
832
|
-
super(option_parser, options)
|
|
833
|
-
end
|
|
834
|
-
end
|
|
835
|
-
|
|
836
|
-
end # class LimitsMonitor
|
|
837
|
-
end # module Cosmos
|
|
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'
|
|
12
|
+
Cosmos.catch_fatal_exception do
|
|
13
|
+
require 'cosmos/gui/qt_tool'
|
|
14
|
+
require 'cosmos/gui/dialogs/splash'
|
|
15
|
+
require 'cosmos/gui/dialogs/cmd_tlm_raw_dialog'
|
|
16
|
+
require 'cosmos/script'
|
|
17
|
+
require 'cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget'
|
|
18
|
+
require 'cosmos/tools/tlm_viewer/widgets/label_widget'
|
|
19
|
+
require 'pathname'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Extend Array to search for and delete telemetry items.
|
|
23
|
+
# Telemetry items are Arrays of [target name, packet name, item name].
|
|
24
|
+
class Array
|
|
25
|
+
def includes_item?(item)
|
|
26
|
+
found, index = find_item(item)
|
|
27
|
+
return found
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def delete_item(item)
|
|
31
|
+
found, index = find_item(item)
|
|
32
|
+
self.delete_at(index) if found
|
|
33
|
+
return index
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
def find_item(item)
|
|
38
|
+
found = false
|
|
39
|
+
index = 0
|
|
40
|
+
self.each do |target_name, packet_name, item_name|
|
|
41
|
+
if ((target_name == item[0]) &&
|
|
42
|
+
(packet_name == item[1]) &&
|
|
43
|
+
# If the item name is nil we're dealing with a packet
|
|
44
|
+
(item_name == item[2] || item_name.nil?))
|
|
45
|
+
found = true
|
|
46
|
+
break
|
|
47
|
+
end
|
|
48
|
+
index += 1
|
|
49
|
+
end
|
|
50
|
+
return found, index
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
module Cosmos
|
|
55
|
+
|
|
56
|
+
class LimitsItems
|
|
57
|
+
# @return [Array<String,String,String>] Target name, packet name, item name
|
|
58
|
+
attr_reader :ignored
|
|
59
|
+
# @return [Boolean] Whether the limits items have been fetched from the server
|
|
60
|
+
attr_reader :initialized
|
|
61
|
+
|
|
62
|
+
UNKNOWN_ARRAY = ['UNKNOWN', 'UNKNOWN', nil]
|
|
63
|
+
|
|
64
|
+
# @param new_item_callback [Proc] Method to create a new item in the GUI
|
|
65
|
+
# @param update_item_callback [Proc] Method to update an item in the GUI
|
|
66
|
+
# @param clear_items_callback [Proc] Method to clear all items in the GUI
|
|
67
|
+
def initialize(new_item_callback, update_item_callback, clear_items_callback)
|
|
68
|
+
@new_item_callback = new_item_callback
|
|
69
|
+
@update_item_callback = update_item_callback
|
|
70
|
+
@clear_items_callback = clear_items_callback
|
|
71
|
+
@ignored = []
|
|
72
|
+
@items = {}
|
|
73
|
+
@out_of_limits = []
|
|
74
|
+
@queue_id = nil
|
|
75
|
+
@limits_set = :DEFAULT
|
|
76
|
+
request_reset()
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Request that the limits items be refreshed from the server
|
|
80
|
+
def request_reset
|
|
81
|
+
@initialized = false
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Ignore an item. Don't display it in the GUI if it goes out of limits
|
|
85
|
+
# and don't have it count towards the overall limit state. Still display
|
|
86
|
+
# its limits transitions in the log.
|
|
87
|
+
#
|
|
88
|
+
# @param item [Array<String,String,String>] Target name, packet name,
|
|
89
|
+
# item name to ignore
|
|
90
|
+
def ignore(item)
|
|
91
|
+
index = @out_of_limits.delete_item(item)
|
|
92
|
+
@items.delete("#{item[0]} #{item[1]} #{item[2]}") if index
|
|
93
|
+
unless @ignored.includes_item?(item)
|
|
94
|
+
@ignored << item
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Remove an item from the ignored list to have it be displayed and
|
|
99
|
+
# count towards the overall limits state.
|
|
100
|
+
#
|
|
101
|
+
# @param item [Array<String,String,String> Target name, packet name,
|
|
102
|
+
# item name to remove from ignored list
|
|
103
|
+
def remove_ignored(item)
|
|
104
|
+
index = @ignored.delete_item(item)
|
|
105
|
+
if index
|
|
106
|
+
# If we deleted a packet we need to recalculate the stale packets
|
|
107
|
+
if item[2].empty?
|
|
108
|
+
get_stale(true).each do |target, packet|
|
|
109
|
+
stale_packet(target, packet)
|
|
110
|
+
end
|
|
111
|
+
# We deleted an item so get all the current out of limit items
|
|
112
|
+
else
|
|
113
|
+
get_out_of_limits().each do |target, packet, item, state|
|
|
114
|
+
limits_change(target, packet, item, state)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
rescue DRb::DRbConnError
|
|
119
|
+
# Do nothing
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @return [Boolean] Whether there are any items being ignored
|
|
123
|
+
def ignored_items?
|
|
124
|
+
!@ignored.empty?
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @return [Symbol] The overall limits state. Returns :STALE if there
|
|
128
|
+
# is no connection to the server.
|
|
129
|
+
def overall_state
|
|
130
|
+
get_overall_limits_state(@ignored)
|
|
131
|
+
rescue DRb::DRbConnError
|
|
132
|
+
:STALE
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Calls get_limits_event to process all the server limits events that
|
|
136
|
+
# were subscribed to. This method should be called continuously until
|
|
137
|
+
# it returns nil which indicates no more events.
|
|
138
|
+
#
|
|
139
|
+
# @return [Array<String,Symbol] String describing the event and a symbol
|
|
140
|
+
# indicating how the event string should be colored (:BLACK, :BLUE,
|
|
141
|
+
# :GREEN, :YELLOW, or :RED)
|
|
142
|
+
def process_events
|
|
143
|
+
result = nil
|
|
144
|
+
type = nil
|
|
145
|
+
data = nil
|
|
146
|
+
begin
|
|
147
|
+
reset() unless @initialized
|
|
148
|
+
# Get events non-blocking which is why we rescue ThreadError
|
|
149
|
+
type, data = get_limits_event(@queue_id, true)
|
|
150
|
+
rescue ThreadError
|
|
151
|
+
# Do nothing (nominal exception if there are no events)
|
|
152
|
+
rescue DRb::DRbConnError
|
|
153
|
+
# The server is down so request a reset
|
|
154
|
+
request_reset()
|
|
155
|
+
end
|
|
156
|
+
return result unless type
|
|
157
|
+
|
|
158
|
+
case type
|
|
159
|
+
when :LIMITS_CHANGE
|
|
160
|
+
# The most common event: target, packet, item, state
|
|
161
|
+
result = limits_change(data[0], data[1], data[2], data[4])
|
|
162
|
+
|
|
163
|
+
when :LIMITS_SET
|
|
164
|
+
# Check if the overall limits set changed. If so we need to reset
|
|
165
|
+
# to incorporate all the new limits.
|
|
166
|
+
if @limits_set != data
|
|
167
|
+
request_reset()
|
|
168
|
+
result = ["INFO: Limits Set Changed to: #{data}\n", :BLACK]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
when :LIMITS_SETTINGS
|
|
172
|
+
# The limits settings for an individual item changed. Set our local tool
|
|
173
|
+
# knowledge of the limits to match the server.
|
|
174
|
+
begin
|
|
175
|
+
System.limits.set(data[0], data[1], data[2], data[6], data[7], data[8], data[9], data[10], data[11], data[3], data[4], data[5])
|
|
176
|
+
result = ["INFO: Limits Settings Changed: #{data}\n", :BLACK]
|
|
177
|
+
rescue
|
|
178
|
+
# This can fail if we missed setting the DEFAULT limits set earlier
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
when :STALE_PACKET
|
|
182
|
+
# A packet has gone stale: target, packet
|
|
183
|
+
result = stale_packet(data[0], data[1])
|
|
184
|
+
end
|
|
185
|
+
result
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Update the values for all the out of limits items being tracked.
|
|
189
|
+
def update_values
|
|
190
|
+
# Reject any out of limits packets as they don't have values
|
|
191
|
+
items = @out_of_limits.reject {|item| item[2].nil? }
|
|
192
|
+
|
|
193
|
+
values, limits_states, limits_settings, limits_set = get_tlm_values(items, :WITH_UNITS)
|
|
194
|
+
index = 0
|
|
195
|
+
items.each do |target_name, packet_name, item_name|
|
|
196
|
+
begin
|
|
197
|
+
# Update the limits settings each time we update values
|
|
198
|
+
# to stay in sync with the Server. Responding to :LIMITS_SETTINGS
|
|
199
|
+
# events isn't enough since we don't get those upon startup.
|
|
200
|
+
System.limits.set(target_name, packet_name, item_name,
|
|
201
|
+
limits_settings[index][0], limits_settings[index][1],
|
|
202
|
+
limits_settings[index][2], limits_settings[index][3],
|
|
203
|
+
limits_settings[index][4], limits_settings[index][5],
|
|
204
|
+
limits_set) if limits_settings[index]
|
|
205
|
+
rescue
|
|
206
|
+
# This can fail if we missed setting the DEFAULT limits set earlier
|
|
207
|
+
end
|
|
208
|
+
name = "#{target_name} #{packet_name} #{item_name}"
|
|
209
|
+
@update_item_callback.call(@items[name], values[index], limits_states[index], limits_set)
|
|
210
|
+
index += 1
|
|
211
|
+
end
|
|
212
|
+
rescue DRb::DRbConnError
|
|
213
|
+
# Do nothing
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Load a new configuration of ignored items and packets and reset
|
|
217
|
+
#
|
|
218
|
+
# @param config_file [String] Configuration file base name which will be
|
|
219
|
+
# expanded to find a file in the config/tools/limits_monitor dir.
|
|
220
|
+
# @return [String] Message indicating success or fail
|
|
221
|
+
def open_config(filename)
|
|
222
|
+
return "" unless filename
|
|
223
|
+
|
|
224
|
+
unless Pathname.new(filename).absolute?
|
|
225
|
+
filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'limits_monitor', filename)
|
|
226
|
+
end
|
|
227
|
+
return "Configuration file #{filename} not found!" unless File.exist?(filename)
|
|
228
|
+
|
|
229
|
+
@ignored = []
|
|
230
|
+
begin
|
|
231
|
+
parser = ConfigParser.new
|
|
232
|
+
parser.parse_file(filename) do |keyword, params|
|
|
233
|
+
case keyword
|
|
234
|
+
# TODO: Eventually we can deprecate 'IGNORE' in favor
|
|
235
|
+
# of 'IGNORE_ITEM' now that we also have 'IGNORE_PACKET'
|
|
236
|
+
when 'IGNORE', 'IGNORE_ITEM'
|
|
237
|
+
@ignored << ([params[0], params[1], params[2]])
|
|
238
|
+
when 'IGNORE_PACKET'
|
|
239
|
+
@ignored << ([params[0], params[1], nil])
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
result = "#{filename} loaded. "
|
|
243
|
+
result << "Warning: Some items ignored" if ignored_items?
|
|
244
|
+
rescue => e
|
|
245
|
+
result = "Error loading configuration : #{e.message}"
|
|
246
|
+
end
|
|
247
|
+
# Since we may have loaded new ignored items we need to reset
|
|
248
|
+
request_reset()
|
|
249
|
+
result
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Save the current configuration of ignored items and packets.
|
|
253
|
+
#
|
|
254
|
+
# @param config_file [String] Configuration file to save.
|
|
255
|
+
# @return [String] Message indicating success or fail
|
|
256
|
+
def save_config(filename)
|
|
257
|
+
begin
|
|
258
|
+
File.open(filename, "w") do |file|
|
|
259
|
+
@ignored.each do |target, pkt_name, item_name|
|
|
260
|
+
if item_name
|
|
261
|
+
file.puts("IGNORE_ITEM #{target} #{pkt_name} #{item_name}")
|
|
262
|
+
else
|
|
263
|
+
file.puts("IGNORE_PACKET #{target} #{pkt_name}")
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
result = "#{filename} saved"
|
|
268
|
+
rescue => e
|
|
269
|
+
result = "Error saving configuration : #{e.message}"
|
|
270
|
+
end
|
|
271
|
+
result
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
private
|
|
275
|
+
|
|
276
|
+
# Clear all tracked out of limits items and resubscribe to the server
|
|
277
|
+
# limits events. Clear the GUI and re-create all out of limits items
|
|
278
|
+
# and stale packets.
|
|
279
|
+
#
|
|
280
|
+
# Note this method can raise a DRb::DRbConnError error!
|
|
281
|
+
def reset
|
|
282
|
+
@items = {}
|
|
283
|
+
@out_of_limits = []
|
|
284
|
+
@limits_set = get_limits_set()
|
|
285
|
+
unsubscribe_limits_events(@queue_id) if @queue_id
|
|
286
|
+
@queue_id = subscribe_limits_events(100000)
|
|
287
|
+
@clear_items_callback.call
|
|
288
|
+
get_out_of_limits().each do |target, packet, item, state|
|
|
289
|
+
limits_change(target, packet, item, state)
|
|
290
|
+
end
|
|
291
|
+
get_stale(true).each do |target, packet|
|
|
292
|
+
stale_packet(target, packet)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
@initialized = true
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# Process a limits_change event by recoloring out of limits events
|
|
299
|
+
# and creating a log message.
|
|
300
|
+
def limits_change(target_name, packet_name, item_name, state)
|
|
301
|
+
message = ''
|
|
302
|
+
color = :BLACK
|
|
303
|
+
item = [target_name, packet_name, item_name]
|
|
304
|
+
|
|
305
|
+
case state
|
|
306
|
+
when :YELLOW, :YELLOW_HIGH, :YELLOW_LOW
|
|
307
|
+
message << "WARN: "
|
|
308
|
+
color = :YELLOW
|
|
309
|
+
out_of_limit(item)
|
|
310
|
+
when :RED, :RED_HIGH, :RED_LOW
|
|
311
|
+
message << "ERROR: "
|
|
312
|
+
color = :RED
|
|
313
|
+
out_of_limit(item)
|
|
314
|
+
when :GREEN, :GREEN_HIGH, :GREEN_LOW
|
|
315
|
+
message << "INFO: "
|
|
316
|
+
color = :GREEN
|
|
317
|
+
when :BLUE
|
|
318
|
+
message << "INFO: "
|
|
319
|
+
color = :BLUE
|
|
320
|
+
end
|
|
321
|
+
value = tlm(target_name, packet_name, item_name)
|
|
322
|
+
message << "#{target_name} #{packet_name} #{item_name} = #{value} is #{state}\n"
|
|
323
|
+
[message, color]
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# Record the stale packet and generate a log message
|
|
327
|
+
def stale_packet(target_name, packet_name)
|
|
328
|
+
out_of_limit([target_name, packet_name, nil])
|
|
329
|
+
return ["INFO: Packet #{target_name} #{packet_name} is STALE\n", :BLACK]
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
# Record an out of limits item and call the new item callback.
|
|
333
|
+
# Existing out of limits and ignored items are not recorded.
|
|
334
|
+
def out_of_limit(item)
|
|
335
|
+
unless (@out_of_limits.includes_item?(item) || @ignored.includes_item?(item) || UNKNOWN_ARRAY.includes_item?(item))
|
|
336
|
+
@out_of_limits << item
|
|
337
|
+
@items["#{item[0]} #{item[1]} #{item[2]}"] = @new_item_callback.call(*item)
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
# The LimitsMonitor application displays all the out of limits items
|
|
343
|
+
# encountered by the COSMOS server. It provides the ability to ignore and
|
|
344
|
+
# restore limits as well as logs all limits events.
|
|
345
|
+
class LimitsMonitor < QtTool
|
|
346
|
+
# LimitsWidget displays either a stale packet using the Label widget
|
|
347
|
+
# or more commonly an out of limits item using the Labelvaluelimitsbar
|
|
348
|
+
# Widget.
|
|
349
|
+
class LimitsWidget < Qt::Widget
|
|
350
|
+
# @return [Widget] The widget which displays the value
|
|
351
|
+
attr_accessor :value
|
|
352
|
+
|
|
353
|
+
# @parent [Qt::Widget] Parent widget (the LimitsMonitor tool)
|
|
354
|
+
# @target_name [String] Target name
|
|
355
|
+
# @packet_name [String] Packet name
|
|
356
|
+
# @item_name [String] Telemetry item name (nil for stale packets)
|
|
357
|
+
def initialize(parent, target_name, packet_name, item_name)
|
|
358
|
+
super(parent)
|
|
359
|
+
@layout = Qt::HBoxLayout.new
|
|
360
|
+
@layout.setSpacing(0)
|
|
361
|
+
@layout.setContentsMargins(0,0,0,0)
|
|
362
|
+
setLayout(@layout)
|
|
363
|
+
|
|
364
|
+
item = [target_name, packet_name, item_name]
|
|
365
|
+
if item_name
|
|
366
|
+
@value = LabelvaluelimitsbarWidget.new(@layout, target_name, packet_name, item_name)
|
|
367
|
+
@value.set_setting('COLORBLIND', [@colorblind])
|
|
368
|
+
@value.process_settings
|
|
369
|
+
else
|
|
370
|
+
@value = LabelWidget.new(layout, "#{target_name} #{packet_name} is STALE")
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
@ignore_button = Qt::PushButton.new('Ignore')
|
|
374
|
+
@ignore_button.connect(SIGNAL('clicked()')) { parent.ignore(self, item) }
|
|
375
|
+
@layout.addWidget(@ignore_button)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# Update the widget's value, limits_state, and limits_set
|
|
379
|
+
def set_values(value, limits_state, limits_set)
|
|
380
|
+
if LabelvaluelimitsbarWidget === @value
|
|
381
|
+
@value.value = value
|
|
382
|
+
@value.limits_state = limits_state
|
|
383
|
+
@value.limits_set = limits_set
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
# Enable or disable Colorblind mode
|
|
388
|
+
def set_colorblind(enabled)
|
|
389
|
+
if LabelvaluelimitsbarWidget === @value
|
|
390
|
+
@value.set_setting('COLORBLIND', [enabled])
|
|
391
|
+
@value.process_settings
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# Dispose of the widget
|
|
396
|
+
def dispose
|
|
397
|
+
@ignore_button.dispose
|
|
398
|
+
@value.dispose
|
|
399
|
+
@layout.dispose
|
|
400
|
+
super()
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
# Create the main application GUI. Start the limits thread which responds to
|
|
405
|
+
# asynchronous limits events from the server and the value thread which
|
|
406
|
+
# polls the server at 1Hz for the out of limits items values.
|
|
407
|
+
#
|
|
408
|
+
# @param options [Options] Contains the options for the window.
|
|
409
|
+
def initialize(options)
|
|
410
|
+
super(options)
|
|
411
|
+
Cosmos.load_cosmos_icon("limits_monitor.png")
|
|
412
|
+
|
|
413
|
+
@cancel_thread = false
|
|
414
|
+
@limits_sleeper = Sleeper.new
|
|
415
|
+
@value_sleeper = Sleeper.new
|
|
416
|
+
|
|
417
|
+
initialize_actions()
|
|
418
|
+
initialize_menus()
|
|
419
|
+
initialize_central_widget()
|
|
420
|
+
complete_initialize()
|
|
421
|
+
|
|
422
|
+
@limits_items = LimitsItems.new(
|
|
423
|
+
method(:new_gui_item), method(:update_gui_item), method(:clear_gui_items))
|
|
424
|
+
result = @limits_items.open_config(options.config_file)
|
|
425
|
+
statusBar.showMessage(tr(result))
|
|
426
|
+
|
|
427
|
+
limits_thread()
|
|
428
|
+
value_thread()
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
# Initialize all the actions in the application Menu
|
|
432
|
+
def initialize_actions
|
|
433
|
+
super
|
|
434
|
+
|
|
435
|
+
@options_action = Qt::Action.new(tr('O&ptions'), self)
|
|
436
|
+
@options_action.statusTip = tr('Open the options dialog')
|
|
437
|
+
@options_action.connect(SIGNAL('triggered()')) { show_options_dialog() }
|
|
438
|
+
|
|
439
|
+
@reset_action = Qt::Action.new(tr('&Reset'), self)
|
|
440
|
+
@reset_action_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
|
|
441
|
+
@reset_action.shortcut = @reset_action_keyseq
|
|
442
|
+
@reset_action.statusTip = tr('Reset connection and clear all items. This does not modify the ignored items.')
|
|
443
|
+
@reset_action.connect(SIGNAL('triggered()')) { @limits_items.request_reset() }
|
|
444
|
+
|
|
445
|
+
@open_ignored_action = Qt::Action.new(Cosmos.get_icon('open.png'),
|
|
446
|
+
tr('&Open Config'), self)
|
|
447
|
+
@open_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
448
|
+
@open_ignored_action.shortcut = @open_ignored_action_keyseq
|
|
449
|
+
@open_ignored_action.statusTip = tr('Open ignored telemetry items configuration file')
|
|
450
|
+
@open_ignored_action.connect(SIGNAL('triggered()')) { open_config_file() }
|
|
451
|
+
|
|
452
|
+
@save_ignored_action = Qt::Action.new(Cosmos.get_icon('save.png'),
|
|
453
|
+
tr('&Save Config'), self)
|
|
454
|
+
@save_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
|
|
455
|
+
@save_ignored_action.shortcut = @save_ignored_action_keyseq
|
|
456
|
+
@save_ignored_action.statusTip = tr('Save all ignored telemetry items in a configuration file')
|
|
457
|
+
@save_ignored_action.connect(SIGNAL('triggered()')) { save_config_file() }
|
|
458
|
+
|
|
459
|
+
@edit_ignored_action = Qt::Action.new(tr('&Edit Ignored'), self)
|
|
460
|
+
@edit_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+E'))
|
|
461
|
+
@edit_ignored_action.shortcut = @edit_ignored_action_keyseq
|
|
462
|
+
@edit_ignored_action.statusTip = tr('Edit the ignored telemetry items list')
|
|
463
|
+
@edit_ignored_action.connect(SIGNAL('triggered()')) { edit_ignored_items() }
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
# Initialize the application menu bar options
|
|
467
|
+
def initialize_menus
|
|
468
|
+
@file_menu = menuBar.addMenu(tr('&File'))
|
|
469
|
+
@file_menu.addAction(@open_ignored_action)
|
|
470
|
+
@file_menu.addAction(@save_ignored_action)
|
|
471
|
+
@file_menu.addAction(@edit_ignored_action)
|
|
472
|
+
@file_menu.addSeparator()
|
|
473
|
+
@file_menu.addAction(@reset_action)
|
|
474
|
+
@file_menu.addAction(@options_action)
|
|
475
|
+
@file_menu.addSeparator()
|
|
476
|
+
@file_menu.addAction(@exit_action)
|
|
477
|
+
|
|
478
|
+
# Help Menu
|
|
479
|
+
@about_string = "Limits Monitor displays all telemetry items that are or have been out of limits since it was started or reset."
|
|
480
|
+
|
|
481
|
+
initialize_help_menu()
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
# Layout the main GUI tab widget with a view of all the out of limits items
|
|
485
|
+
# in one tab and a log tab showing all limits events.
|
|
486
|
+
def initialize_central_widget
|
|
487
|
+
@tabbook = Qt::TabWidget.new(self)
|
|
488
|
+
setCentralWidget(@tabbook)
|
|
489
|
+
@widget = Qt::Widget.new
|
|
490
|
+
@layout = Qt::VBoxLayout.new(@widget)
|
|
491
|
+
|
|
492
|
+
@monitored_state_text_field = Qt::LineEdit.new(self)
|
|
493
|
+
@monitored_state_text_field.setText('Stale')
|
|
494
|
+
@monitored_state_text_field.setAlignment(Qt::AlignCenter)
|
|
495
|
+
@monitored_state_text_field.setReadOnly(true)
|
|
496
|
+
@palette = Qt::Palette.new()
|
|
497
|
+
@palette.setColor(Qt::Palette::Base, Qt::Color.new(255,0,255))
|
|
498
|
+
@monitored_state_text_field.setPalette(@palette)
|
|
499
|
+
@state_label = Qt::Label.new('Monitored Limits State: ')
|
|
500
|
+
|
|
501
|
+
@monitored_state_frame = Qt::HBoxLayout.new
|
|
502
|
+
@monitored_state_frame.addWidget(@state_label)
|
|
503
|
+
@monitored_state_frame.addWidget(@monitored_state_text_field)
|
|
504
|
+
label = Qt::Label.new
|
|
505
|
+
filename = File.join(::Cosmos::PATH, 'data', 'spinner.gif')
|
|
506
|
+
movie = Qt::Movie.new(filename)
|
|
507
|
+
label.setMovie(movie)
|
|
508
|
+
movie.start
|
|
509
|
+
@monitored_state_frame.addWidget(label)
|
|
510
|
+
@monitored_state_frame.setAlignment(Qt::AlignTop)
|
|
511
|
+
@layout.addLayout(@monitored_state_frame)
|
|
512
|
+
|
|
513
|
+
@scroll = Qt::ScrollArea.new
|
|
514
|
+
@scroll_widget = Qt::Widget.new
|
|
515
|
+
@scroll.setWidget(@scroll_widget)
|
|
516
|
+
@scroll_layout = Qt::VBoxLayout.new(@scroll_widget)
|
|
517
|
+
@scroll_layout.setSizeConstraint(Qt::Layout::SetMinAndMaxSize)
|
|
518
|
+
@layout.addWidget(@scroll)
|
|
519
|
+
|
|
520
|
+
@log_output = Qt::PlainTextEdit.new
|
|
521
|
+
@log_output.setReadOnly(true)
|
|
522
|
+
@log_output.setMaximumBlockCount(100)
|
|
523
|
+
|
|
524
|
+
@tabbook.addTab(@widget, "Limits")
|
|
525
|
+
@tabbook.addTab(@log_output, "Log")
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
def show_options_dialog
|
|
529
|
+
Qt::Dialog.new(self) do |dialog|
|
|
530
|
+
dialog.setWindowTitle('Options')
|
|
531
|
+
|
|
532
|
+
colorblind_box = Qt::CheckBox.new('Colorblind Mode Enabled', self)
|
|
533
|
+
colorblind_box.setCheckState(Qt::Checked) if @colorblind
|
|
534
|
+
|
|
535
|
+
ok = Qt::PushButton.new('Ok') do
|
|
536
|
+
connect(SIGNAL('clicked()')) { dialog.accept }
|
|
537
|
+
end
|
|
538
|
+
cancel = Qt::PushButton.new('Cancel') do
|
|
539
|
+
connect(SIGNAL('clicked()')) { dialog.reject }
|
|
540
|
+
end
|
|
541
|
+
buttons = Qt::HBoxLayout.new do
|
|
542
|
+
addWidget(ok)
|
|
543
|
+
addWidget(cancel)
|
|
544
|
+
end
|
|
545
|
+
dialog.layout = Qt::VBoxLayout.new do
|
|
546
|
+
addWidget(colorblind_box)
|
|
547
|
+
addLayout(buttons)
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
case dialog.exec
|
|
551
|
+
when Qt::Dialog::Accepted
|
|
552
|
+
if (colorblind_box.checkState() == Qt::Checked)
|
|
553
|
+
@colorblind = true
|
|
554
|
+
else
|
|
555
|
+
@colorblind = false
|
|
556
|
+
end
|
|
557
|
+
(0...@scroll_layout.count).each do |index|
|
|
558
|
+
@scroll_layout.itemAt(index).widget.set_colorblind(@colorblind)
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
dialog.dispose
|
|
562
|
+
end
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
# @return [String] Fully qualified path to the configuration file
|
|
566
|
+
def config_path
|
|
567
|
+
# If the config file has been set then just return it
|
|
568
|
+
return @filename if @filename
|
|
569
|
+
# This is the default path to the configuration files
|
|
570
|
+
File.join(::Cosmos::USERPATH, 'config', 'tools', 'limits_monitor', 'limits_monitor.txt')
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
# Opens the configuration file and loads the ignored items
|
|
574
|
+
def open_config_file
|
|
575
|
+
filename = Qt::FileDialog::getOpenFileName(self,
|
|
576
|
+
"Open Configuration File", config_path())
|
|
577
|
+
unless filename.nil? || filename.empty?
|
|
578
|
+
result = @limits_items.open_config(filename)
|
|
579
|
+
statusBar.showMessage(tr(result))
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
# Saves the ignored items to the configuration file
|
|
584
|
+
def save_config_file
|
|
585
|
+
filename = Qt::FileDialog.getSaveFileName(self,
|
|
586
|
+
'Save As...', config_path(), 'Configuration Files (*.txt)')
|
|
587
|
+
unless filename.nil? || filename.empty?
|
|
588
|
+
result = @limits_items.save_config(filename)
|
|
589
|
+
statusBar.showMessage(tr(result))
|
|
590
|
+
@filename = filename
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
# Opens a dialog to allow the user to remove ignored items
|
|
595
|
+
def edit_ignored_items
|
|
596
|
+
items = []
|
|
597
|
+
index = 0
|
|
598
|
+
@limits_items.ignored.each do |target_name, packet_name, item_name|
|
|
599
|
+
item = Qt::ListWidgetItem.new("#{target_name} #{packet_name} #{item_name}")
|
|
600
|
+
item.setData(Qt::UserRole, Qt::Variant.new(@limits_items.ignored[index]))
|
|
601
|
+
items << item
|
|
602
|
+
index += 1
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
Qt::Dialog.new(self) do |dialog|
|
|
606
|
+
dialog.setWindowTitle('Ignored Telemetry Items')
|
|
607
|
+
list = Qt::ListWidget.new
|
|
608
|
+
list.setFocus()
|
|
609
|
+
# Allow multiple sections
|
|
610
|
+
list.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
|
|
611
|
+
items.each {|item| list.addItem(item) }
|
|
612
|
+
|
|
613
|
+
shortcut = Qt::Shortcut.new(Qt::KeySequence.new(Qt::KeySequence::Delete), list)
|
|
614
|
+
list.connect(shortcut, SIGNAL('activated()')) do
|
|
615
|
+
items = list.selectedItems()
|
|
616
|
+
(0...items.length).each do |index|
|
|
617
|
+
@limits_items.remove_ignored(items[index].data(Qt::UserRole).value)
|
|
618
|
+
end
|
|
619
|
+
list.remove_selected_items
|
|
620
|
+
list.setCurrentRow(0)
|
|
621
|
+
end
|
|
622
|
+
# Preselect the first row (works if list is empty) so the keyboard
|
|
623
|
+
# works instantly without having to click the list
|
|
624
|
+
list.setCurrentRow(0)
|
|
625
|
+
|
|
626
|
+
ok = Qt::PushButton.new('Ok') do
|
|
627
|
+
connect(SIGNAL('clicked()')) { dialog.done(0) }
|
|
628
|
+
end
|
|
629
|
+
remove = Qt::PushButton.new('Remove Selected') do
|
|
630
|
+
connect(SIGNAL('clicked()')) { shortcut.activated() }
|
|
631
|
+
end
|
|
632
|
+
button_layout = Qt::HBoxLayout.new do
|
|
633
|
+
addWidget(ok)
|
|
634
|
+
addStretch(1)
|
|
635
|
+
addWidget(remove)
|
|
636
|
+
end
|
|
637
|
+
dialog.layout = Qt::VBoxLayout.new do
|
|
638
|
+
addWidget(list)
|
|
639
|
+
addLayout(button_layout)
|
|
640
|
+
end
|
|
641
|
+
dialog.resize(500, 200)
|
|
642
|
+
dialog.exec
|
|
643
|
+
dialog.dispose
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
# Thread to monitor for broken limits and add them to the log and
|
|
648
|
+
# front panel when found.
|
|
649
|
+
def limits_thread
|
|
650
|
+
result = nil
|
|
651
|
+
color = nil
|
|
652
|
+
@limits_thread = Thread.new do
|
|
653
|
+
while true
|
|
654
|
+
break if @cancel_thread
|
|
655
|
+
Qt.execute_in_main_thread(true) do
|
|
656
|
+
result, color = @limits_items.process_events()
|
|
657
|
+
end
|
|
658
|
+
if result
|
|
659
|
+
update_log(result, color)
|
|
660
|
+
else
|
|
661
|
+
break if @limits_sleeper.sleep(1)
|
|
662
|
+
end
|
|
663
|
+
end
|
|
664
|
+
end
|
|
665
|
+
rescue Exception => error
|
|
666
|
+
Cosmos.handle_fatal_exception(error)
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
# Add new out of limit item or stale packet
|
|
670
|
+
#
|
|
671
|
+
# @param target_name [String] Target name of out of limits item.
|
|
672
|
+
# @param packet_name [String] Packet name of out of limits item.
|
|
673
|
+
# @param item_name [String] Item name of out of limits item or nil
|
|
674
|
+
# if its a stale packet
|
|
675
|
+
# @return [Qt::Widget] The new widget that was created
|
|
676
|
+
def new_gui_item(target_name, packet_name, item_name)
|
|
677
|
+
widget = nil
|
|
678
|
+
Qt.execute_in_main_thread(true) do
|
|
679
|
+
widget = LimitsWidget.new(self, target_name, packet_name, item_name)
|
|
680
|
+
@scroll_layout.addWidget(widget)
|
|
681
|
+
end
|
|
682
|
+
widget
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
# Update out of limit item with a values
|
|
686
|
+
#
|
|
687
|
+
# @param target_name [String] Target name of out of limits item.
|
|
688
|
+
# @param packet_name [String] Packet name of out of limits item.
|
|
689
|
+
# @param item_name [String] Item name of out of limits item or nil
|
|
690
|
+
# if its a stale packet
|
|
691
|
+
def update_gui_item(widget, value, limits_state, limits_set)
|
|
692
|
+
Qt.execute_in_main_thread(true) do
|
|
693
|
+
widget.set_values(value, limits_state, limits_set) if widget
|
|
694
|
+
end
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
# Reset the GUI by clearing all items
|
|
698
|
+
def clear_gui_items
|
|
699
|
+
Qt.execute_in_main_thread(true) { @scroll_layout.removeAll }
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
# Update front panel to ignore an item when the corresponding button is pressed.
|
|
703
|
+
#
|
|
704
|
+
# @param item [Array<String,String,String] Array containing the target name,
|
|
705
|
+
# packet name, and item name of the item to ignore.
|
|
706
|
+
def ignore(widget, item)
|
|
707
|
+
@limits_items.ignore(item)
|
|
708
|
+
Qt.execute_in_main_thread(true) do
|
|
709
|
+
@scroll_layout.removeWidget(widget)
|
|
710
|
+
widget.dispose
|
|
711
|
+
@scroll_widget.adjustSize
|
|
712
|
+
statusBar.showMessage('Warning: Some Telemetry Items are Ignored')
|
|
713
|
+
end
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
# Update the log panel with limits change information.
|
|
717
|
+
#
|
|
718
|
+
# @param message [String] Text string with information about which item is out of
|
|
719
|
+
# limits, what its value is, and what limit was broken (red_low, yellow_low, etc.)
|
|
720
|
+
# @param color [Symbol] Color of text to add.
|
|
721
|
+
def update_log(message, color)
|
|
722
|
+
return if @cancel_thread
|
|
723
|
+
Qt.execute_in_main_thread(true) do
|
|
724
|
+
@tf ||= Qt::TextCharFormat.new
|
|
725
|
+
case color
|
|
726
|
+
when :GREEN
|
|
727
|
+
brush = Cosmos.getBrush(Cosmos::GREEN)
|
|
728
|
+
when :YELLOW
|
|
729
|
+
brush = Cosmos.getBrush(Cosmos::YELLOW)
|
|
730
|
+
when :RED
|
|
731
|
+
brush = Cosmos.getBrush(Cosmos::RED)
|
|
732
|
+
when :BLUE
|
|
733
|
+
brush = Cosmos.getBrush(Cosmos::BLUE)
|
|
734
|
+
else # :BLACK
|
|
735
|
+
brush = Cosmos.getBrush(Cosmos::BLACK)
|
|
736
|
+
end
|
|
737
|
+
@tf.setForeground(brush)
|
|
738
|
+
@log_output.setCurrentCharFormat(@tf)
|
|
739
|
+
@log_output.appendPlainText(message.chomp)
|
|
740
|
+
end
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
# Thread to request the out of limits values and update them at 1Hz.
|
|
744
|
+
# Also updates the status bar at the top of the front panel indicating
|
|
745
|
+
# the overall limits value of the system.
|
|
746
|
+
def value_thread
|
|
747
|
+
@value_thread = Thread.new do
|
|
748
|
+
while true
|
|
749
|
+
break if @cancel_thread
|
|
750
|
+
Qt.execute_in_main_thread(true) do
|
|
751
|
+
if @limits_items.initialized
|
|
752
|
+
@limits_items.update_values()
|
|
753
|
+
update_overall_limits_state(@limits_items.overall_state())
|
|
754
|
+
else
|
|
755
|
+
# Set the status bar message to expire in 2s since this runs at 1Hz
|
|
756
|
+
statusBar.showMessage('Error Connecting to Command and Telemetry Server', 2000)
|
|
757
|
+
end
|
|
758
|
+
end
|
|
759
|
+
break if @value_sleeper.sleep(1)
|
|
760
|
+
end
|
|
761
|
+
end
|
|
762
|
+
rescue Exception => error
|
|
763
|
+
Cosmos.handle_fatal_exception(error)
|
|
764
|
+
end
|
|
765
|
+
|
|
766
|
+
# Changes the limits state on the status bar at the top of the screen.
|
|
767
|
+
def update_overall_limits_state(state)
|
|
768
|
+
Qt.execute_in_main_thread(true) do
|
|
769
|
+
text = ''
|
|
770
|
+
case state
|
|
771
|
+
when :STALE
|
|
772
|
+
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,0,255))
|
|
773
|
+
@monitored_state_text_field.setPalette(palette)
|
|
774
|
+
text = 'Stale'
|
|
775
|
+
when :GREEN, :GREEN_HIGH, :GREEN_LOW
|
|
776
|
+
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(0,255,0))
|
|
777
|
+
@monitored_state_text_field.setPalette(palette)
|
|
778
|
+
text = 'Green'
|
|
779
|
+
when :YELLOW, :YELLOW_HIGH, :YELLOW_LOW
|
|
780
|
+
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,255,0))
|
|
781
|
+
@monitored_state_text_field.setPalette(palette)
|
|
782
|
+
text = 'Yellow'
|
|
783
|
+
when :RED, :RED_HIGH, :RED_LOW
|
|
784
|
+
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(255,0,0))
|
|
785
|
+
@monitored_state_text_field.setPalette(palette)
|
|
786
|
+
text = 'Red'
|
|
787
|
+
when :BLUE
|
|
788
|
+
palette = Cosmos.getPalette(Cosmos.getColor(0, 0, 0), Cosmos.getColor(0,0,255))
|
|
789
|
+
@monitored_state_text_field.setPalette(palette)
|
|
790
|
+
text = 'Blue'
|
|
791
|
+
end
|
|
792
|
+
text << ' - Some Items Ignored' if @limits_items.ignored_items?
|
|
793
|
+
@monitored_state_text_field.text = text
|
|
794
|
+
end
|
|
795
|
+
end
|
|
796
|
+
|
|
797
|
+
# Handle the window closing
|
|
798
|
+
def closeEvent(event)
|
|
799
|
+
@cancel_thread = true
|
|
800
|
+
@value_sleeper.cancel
|
|
801
|
+
@limits_sleeper.cancel
|
|
802
|
+
shutdown_cmd_tlm()
|
|
803
|
+
Cosmos.kill_thread(self, @limits_thread, 2)
|
|
804
|
+
Cosmos.kill_thread(self, @value_thread, 2)
|
|
805
|
+
super(event)
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
# Gracefully kill threads
|
|
809
|
+
def graceful_kill
|
|
810
|
+
Qt::CoreApplication.processEvents()
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
# Initialize tool options.
|
|
814
|
+
def self.run(option_parser = nil, options = nil)
|
|
815
|
+
Cosmos.catch_fatal_exception do
|
|
816
|
+
unless option_parser and options
|
|
817
|
+
option_parser, options = create_default_options()
|
|
818
|
+
options.width = 600
|
|
819
|
+
options.height = 500
|
|
820
|
+
options.remember_geometry = false
|
|
821
|
+
options.title = "Limits Monitor"
|
|
822
|
+
options.auto_size = false
|
|
823
|
+
options.config_file = nil
|
|
824
|
+
options.production = false
|
|
825
|
+
options.no_prompt = false
|
|
826
|
+
option_parser.separator "Limits Monitor Specific Options:"
|
|
827
|
+
option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
|
|
828
|
+
options.config_file = arg
|
|
829
|
+
end
|
|
830
|
+
end
|
|
831
|
+
|
|
832
|
+
super(option_parser, options)
|
|
833
|
+
end
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
end # class LimitsMonitor
|
|
837
|
+
end # module Cosmos
|