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,78 +1,78 @@
|
|
|
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/tools/cmd_tlm_server/interface_thread'
|
|
13
|
-
require 'cosmos/interfaces/tcpip_client_interface'
|
|
14
|
-
|
|
15
|
-
module Cosmos
|
|
16
|
-
|
|
17
|
-
# Thread used to gather telemetry in realtime and process it using a TabbedPlotsDefinition
|
|
18
|
-
class TabbedPlotsRealtimeThread < InterfaceThread
|
|
19
|
-
|
|
20
|
-
# Create a new TabbedPlotsRealtimeThread
|
|
21
|
-
def initialize(tabbed_plots_config, connection_success_callback = nil, connection_failed_callback = nil, connection_lost_callback = nil, fatal_exception_callback = nil)
|
|
22
|
-
interface = TcpipClientInterface.new('localhost', nil, System.ports['CTS_PREIDENTIFIED'], nil, 10.0, 'PREIDENTIFIED')
|
|
23
|
-
super(interface)
|
|
24
|
-
|
|
25
|
-
@queue = Queue.new
|
|
26
|
-
@tabbed_plots_config = tabbed_plots_config
|
|
27
|
-
|
|
28
|
-
# Connect callbacks
|
|
29
|
-
self.identified_packet_callback = method(:received_packet_callback)
|
|
30
|
-
self.connection_success_callback = connection_success_callback
|
|
31
|
-
self.connection_failed_callback = connection_failed_callback
|
|
32
|
-
self.connection_lost_callback = connection_lost_callback
|
|
33
|
-
self.fatal_exception_callback = fatal_exception_callback
|
|
34
|
-
|
|
35
|
-
@process_thread = Thread.new do
|
|
36
|
-
begin
|
|
37
|
-
loop do
|
|
38
|
-
packet = @queue.pop
|
|
39
|
-
break unless packet
|
|
40
|
-
@tabbed_plots_config.process_packet(packet)
|
|
41
|
-
end
|
|
42
|
-
rescue Exception => error
|
|
43
|
-
if self.fatal_exception_callback
|
|
44
|
-
self.fatal_exception_callback.call(error)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Start interface thread
|
|
50
|
-
start()
|
|
51
|
-
end # def initialize
|
|
52
|
-
|
|
53
|
-
# Callback to the system definition when a packet is received
|
|
54
|
-
def received_packet_callback(packet)
|
|
55
|
-
@queue << packet.clone
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Kills the realtime thread
|
|
59
|
-
def kill
|
|
60
|
-
@queue << nil
|
|
61
|
-
stop()
|
|
62
|
-
Cosmos.kill_thread(self, @process_thread)
|
|
63
|
-
@process_thread = nil
|
|
64
|
-
end # def kill
|
|
65
|
-
|
|
66
|
-
def graceful_kill
|
|
67
|
-
# Allow the callbacks a chance to update the GUI so that they can die gracefully
|
|
68
|
-
if defined? Qt and Thread.current == Thread.main
|
|
69
|
-
5.times do
|
|
70
|
-
Qt::CoreApplication.instance.processEvents
|
|
71
|
-
sleep(0.05)
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
end # class TabbedPlotsRealtimeThread
|
|
77
|
-
|
|
78
|
-
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
|
+
require 'cosmos/tools/cmd_tlm_server/interface_thread'
|
|
13
|
+
require 'cosmos/interfaces/tcpip_client_interface'
|
|
14
|
+
|
|
15
|
+
module Cosmos
|
|
16
|
+
|
|
17
|
+
# Thread used to gather telemetry in realtime and process it using a TabbedPlotsDefinition
|
|
18
|
+
class TabbedPlotsRealtimeThread < InterfaceThread
|
|
19
|
+
|
|
20
|
+
# Create a new TabbedPlotsRealtimeThread
|
|
21
|
+
def initialize(tabbed_plots_config, connection_success_callback = nil, connection_failed_callback = nil, connection_lost_callback = nil, fatal_exception_callback = nil)
|
|
22
|
+
interface = TcpipClientInterface.new('localhost', nil, System.ports['CTS_PREIDENTIFIED'], nil, 10.0, 'PREIDENTIFIED')
|
|
23
|
+
super(interface)
|
|
24
|
+
|
|
25
|
+
@queue = Queue.new
|
|
26
|
+
@tabbed_plots_config = tabbed_plots_config
|
|
27
|
+
|
|
28
|
+
# Connect callbacks
|
|
29
|
+
self.identified_packet_callback = method(:received_packet_callback)
|
|
30
|
+
self.connection_success_callback = connection_success_callback
|
|
31
|
+
self.connection_failed_callback = connection_failed_callback
|
|
32
|
+
self.connection_lost_callback = connection_lost_callback
|
|
33
|
+
self.fatal_exception_callback = fatal_exception_callback
|
|
34
|
+
|
|
35
|
+
@process_thread = Thread.new do
|
|
36
|
+
begin
|
|
37
|
+
loop do
|
|
38
|
+
packet = @queue.pop
|
|
39
|
+
break unless packet
|
|
40
|
+
@tabbed_plots_config.process_packet(packet)
|
|
41
|
+
end
|
|
42
|
+
rescue Exception => error
|
|
43
|
+
if self.fatal_exception_callback
|
|
44
|
+
self.fatal_exception_callback.call(error)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Start interface thread
|
|
50
|
+
start()
|
|
51
|
+
end # def initialize
|
|
52
|
+
|
|
53
|
+
# Callback to the system definition when a packet is received
|
|
54
|
+
def received_packet_callback(packet)
|
|
55
|
+
@queue << packet.clone
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Kills the realtime thread
|
|
59
|
+
def kill
|
|
60
|
+
@queue << nil
|
|
61
|
+
stop()
|
|
62
|
+
Cosmos.kill_thread(self, @process_thread)
|
|
63
|
+
@process_thread = nil
|
|
64
|
+
end # def kill
|
|
65
|
+
|
|
66
|
+
def graceful_kill
|
|
67
|
+
# Allow the callbacks a chance to update the GUI so that they can die gracefully
|
|
68
|
+
if defined? Qt and Thread.current == Thread.main
|
|
69
|
+
5.times do
|
|
70
|
+
Qt::CoreApplication.instance.processEvents
|
|
71
|
+
sleep(0.05)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end # class TabbedPlotsRealtimeThread
|
|
77
|
+
|
|
78
|
+
end # module Cosmos
|
|
@@ -1,57 +1,57 @@
|
|
|
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
|
-
|
|
13
|
-
module Cosmos
|
|
14
|
-
|
|
15
|
-
# Represents a tab in a tabbed plots definition
|
|
16
|
-
class TabbedPlotsTab
|
|
17
|
-
|
|
18
|
-
# Text to display in a tab
|
|
19
|
-
attr_accessor :tab_text
|
|
20
|
-
|
|
21
|
-
# Array of plots in the tab
|
|
22
|
-
attr_accessor :plots
|
|
23
|
-
|
|
24
|
-
# Gui object for tab item
|
|
25
|
-
attr_accessor :gui_item
|
|
26
|
-
|
|
27
|
-
# Gui object for tab frame
|
|
28
|
-
attr_accessor :gui_frame
|
|
29
|
-
|
|
30
|
-
# Gui object for tab layout
|
|
31
|
-
attr_accessor :gui_layout
|
|
32
|
-
|
|
33
|
-
# Create a new TabbedPlotsTab
|
|
34
|
-
def initialize(tab_text = nil)
|
|
35
|
-
@tab_text = tab_text
|
|
36
|
-
@plots = []
|
|
37
|
-
@gui_item = nil
|
|
38
|
-
@gui_frame = nil
|
|
39
|
-
@gui_layout = nil
|
|
40
|
-
end # def initialize
|
|
41
|
-
|
|
42
|
-
# Returns the configuration lines used to create this tab
|
|
43
|
-
def configuration_string
|
|
44
|
-
if @tab_text
|
|
45
|
-
string = "TAB \"#{@tab_text}\"\n"
|
|
46
|
-
else
|
|
47
|
-
string = "TAB\n"
|
|
48
|
-
end
|
|
49
|
-
@plots.each do |plot|
|
|
50
|
-
string << plot.configuration_string
|
|
51
|
-
end
|
|
52
|
-
string
|
|
53
|
-
end # def configuration_string
|
|
54
|
-
|
|
55
|
-
end # class TabbedPlotsTab
|
|
56
|
-
|
|
57
|
-
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
|
+
|
|
13
|
+
module Cosmos
|
|
14
|
+
|
|
15
|
+
# Represents a tab in a tabbed plots definition
|
|
16
|
+
class TabbedPlotsTab
|
|
17
|
+
|
|
18
|
+
# Text to display in a tab
|
|
19
|
+
attr_accessor :tab_text
|
|
20
|
+
|
|
21
|
+
# Array of plots in the tab
|
|
22
|
+
attr_accessor :plots
|
|
23
|
+
|
|
24
|
+
# Gui object for tab item
|
|
25
|
+
attr_accessor :gui_item
|
|
26
|
+
|
|
27
|
+
# Gui object for tab frame
|
|
28
|
+
attr_accessor :gui_frame
|
|
29
|
+
|
|
30
|
+
# Gui object for tab layout
|
|
31
|
+
attr_accessor :gui_layout
|
|
32
|
+
|
|
33
|
+
# Create a new TabbedPlotsTab
|
|
34
|
+
def initialize(tab_text = nil)
|
|
35
|
+
@tab_text = tab_text
|
|
36
|
+
@plots = []
|
|
37
|
+
@gui_item = nil
|
|
38
|
+
@gui_frame = nil
|
|
39
|
+
@gui_layout = nil
|
|
40
|
+
end # def initialize
|
|
41
|
+
|
|
42
|
+
# Returns the configuration lines used to create this tab
|
|
43
|
+
def configuration_string
|
|
44
|
+
if @tab_text
|
|
45
|
+
string = "TAB \"#{@tab_text}\"\n"
|
|
46
|
+
else
|
|
47
|
+
string = "TAB\n"
|
|
48
|
+
end
|
|
49
|
+
@plots.each do |plot|
|
|
50
|
+
string << plot.configuration_string
|
|
51
|
+
end
|
|
52
|
+
string
|
|
53
|
+
end # def configuration_string
|
|
54
|
+
|
|
55
|
+
end # class TabbedPlotsTab
|
|
56
|
+
|
|
57
|
+
end # module Cosmos
|
|
@@ -1,1004 +1,1004 @@
|
|
|
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/gui/qt'
|
|
12
|
-
require 'cosmos/gui/qt_tool'
|
|
13
|
-
require 'cosmos/gui/dialogs/splash'
|
|
14
|
-
require 'cosmos/packet_logs/packet_log_reader'
|
|
15
|
-
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config'
|
|
16
|
-
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread'
|
|
17
|
-
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread'
|
|
18
|
-
require 'cosmos/gui/widgets/realtime_button_bar'
|
|
19
|
-
require 'cosmos/gui/dialogs/exception_list_dialog'
|
|
20
|
-
require 'cosmos/gui/dialogs/packet_log_dialog'
|
|
21
|
-
require 'cosmos/gui/dialogs/progress_dialog'
|
|
22
|
-
require 'cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots'
|
|
23
|
-
|
|
24
|
-
module Cosmos
|
|
25
|
-
|
|
26
|
-
# Displays multiple plots that perform various analysis on data.
|
|
27
|
-
class TabbedPlotsTool < QtTool
|
|
28
|
-
|
|
29
|
-
MINIMUM_LEFT_PANEL_WIDTH = 200
|
|
30
|
-
DEFAULT_LEFT_PANEL_WIDTH = 250
|
|
31
|
-
|
|
32
|
-
def initialize(options)
|
|
33
|
-
super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
|
|
34
|
-
@base_title = self.windowTitle
|
|
35
|
-
Cosmos.load_cosmos_icon("tlm_grapher.png")
|
|
36
|
-
|
|
37
|
-
statusBar.showMessage(tr("")) # Show blank message to initialize status bar
|
|
38
|
-
|
|
39
|
-
initialize_actions()
|
|
40
|
-
initialize_menus(options)
|
|
41
|
-
initialize_central_widget()
|
|
42
|
-
complete_initialize()
|
|
43
|
-
|
|
44
|
-
# Define instance variables
|
|
45
|
-
@log_filenames = []
|
|
46
|
-
@log_dir = System.paths['LOGS']
|
|
47
|
-
@log_dir += '/' unless @log_dir[-1..-1] == '\\' or @log_dir[-1..-1] == '/'
|
|
48
|
-
@time_start = nil
|
|
49
|
-
@time_end = nil
|
|
50
|
-
@screenshot_dir = @log_dir.clone
|
|
51
|
-
@export_dir = @log_dir.clone
|
|
52
|
-
@data_object_types = options.data_object_types
|
|
53
|
-
@adder_orientation = options.adder_orientation
|
|
54
|
-
@adder_types = options.adder_types
|
|
55
|
-
@tool_short_name = options.tool_short_name
|
|
56
|
-
@plot_types = options.plot_types
|
|
57
|
-
@tabbed_plots_type = options.tabbed_plots_type
|
|
58
|
-
@items = options.items
|
|
59
|
-
@plot_type_to_data_object_type_mapping = options.plot_type_to_data_object_type_mapping
|
|
60
|
-
@start = options.start
|
|
61
|
-
@packet_log_reader = PacketLogReader.new
|
|
62
|
-
@tabbed_plots_config = nil
|
|
63
|
-
@tabbed_plots = nil
|
|
64
|
-
@realtime_thread = nil
|
|
65
|
-
@config_modified = false
|
|
66
|
-
|
|
67
|
-
# Bring up slash screen for long duration tasks after creation
|
|
68
|
-
Splash.execute(self) do |splash|
|
|
69
|
-
# Configure CosmosConfig to interact with splash screen
|
|
70
|
-
ConfigParser.splash = splash
|
|
71
|
-
|
|
72
|
-
# Load telemetry
|
|
73
|
-
System.telemetry
|
|
74
|
-
|
|
75
|
-
# Create tabbed plots definition
|
|
76
|
-
@config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', options.config_dir, options.config_file)
|
|
77
|
-
Qt.execute_in_main_thread(true) do
|
|
78
|
-
load_configuration()
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Unconfigure CosmosConfig to interact with splash screen
|
|
82
|
-
ConfigParser.splash = nil
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def initialize_actions
|
|
87
|
-
super()
|
|
88
|
-
|
|
89
|
-
# File Menu Actions
|
|
90
|
-
@file_process = Qt::Action.new(tr('&Open Log'), self)
|
|
91
|
-
@file_process_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
92
|
-
@file_process.shortcut = @file_process_keyseq
|
|
93
|
-
@file_process.statusTip = tr('Open Log File')
|
|
94
|
-
@file_process.connect(SIGNAL('triggered()')) { on_file_process_log() }
|
|
95
|
-
|
|
96
|
-
@file_load = Qt::Action.new(Cosmos.get_icon('open.png'), tr('&Load Config'), self)
|
|
97
|
-
@file_load.statusTip = tr('Load Saved Configuration')
|
|
98
|
-
@file_load.connect(SIGNAL('triggered()')) { on_file_load_config() }
|
|
99
|
-
|
|
100
|
-
@file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save Config'), self)
|
|
101
|
-
@file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
|
|
102
|
-
@file_save.shortcut = @file_save_keyseq
|
|
103
|
-
@file_save.statusTip = tr('Save Current Configuration')
|
|
104
|
-
@file_save.connect(SIGNAL('triggered()')) { on_file_save_config() }
|
|
105
|
-
|
|
106
|
-
@file_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('Screensho&t'), self)
|
|
107
|
-
@file_screenshot.statusTip = tr('Screenshot of Application')
|
|
108
|
-
@file_screenshot.connect(SIGNAL('triggered()')) { on_file_screenshot() }
|
|
109
|
-
|
|
110
|
-
# Tab Menu Actions
|
|
111
|
-
@tab_add = Qt::Action.new(Cosmos.get_icon('add_tab.png'), tr('&Add Tab'), self)
|
|
112
|
-
@tab_add.statusTip = tr('Add New Tab')
|
|
113
|
-
@tab_add.connect(SIGNAL('triggered()')) { on_tab_add() }
|
|
114
|
-
|
|
115
|
-
@tab_delete = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
|
|
116
|
-
@tab_delete.statusTip = tr('Delete Active Tab')
|
|
117
|
-
@tab_delete.connect(SIGNAL('triggered()')) { on_tab_delete() }
|
|
118
|
-
|
|
119
|
-
@tab_edit = Qt::Action.new(Cosmos.get_icon('edit_tab.png'), tr('&Edit Tab'), self)
|
|
120
|
-
@tab_edit.statusTip = tr('Edit Active Tab')
|
|
121
|
-
@tab_edit.connect(SIGNAL('triggered()')) { on_tab_edit() }
|
|
122
|
-
|
|
123
|
-
@tab_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('&Screenshot Tab'), self)
|
|
124
|
-
@tab_screenshot.statusTip = tr('Screenshot of Active Tab')
|
|
125
|
-
@tab_screenshot.connect(SIGNAL('triggered()')) { on_tab_screenshot() }
|
|
126
|
-
|
|
127
|
-
@tab_export = Qt::Action.new(tr('E&xport Tab Data Objects'), self)
|
|
128
|
-
@tab_export.statusTip = tr('Export Tab Data Object(s)')
|
|
129
|
-
@tab_export.connect(SIGNAL('triggered()')) { on_tab_export() }
|
|
130
|
-
|
|
131
|
-
@tab_reset = Qt::Action.new(tr('&Reset Tab Data Objects'), self)
|
|
132
|
-
@tab_reset.statusTip = tr('Reset Tab Data Object(s)')
|
|
133
|
-
@tab_reset.connect(SIGNAL('triggered()')) { on_tab_reset() }
|
|
134
|
-
|
|
135
|
-
# Plot Menu Actions
|
|
136
|
-
@plot_add = Qt::Action.new(Cosmos.get_icon('add_plot.png'), tr('&Add Plot'), self)
|
|
137
|
-
@plot_add.statusTip = tr('Add New Plot')
|
|
138
|
-
@plot_add.connect(SIGNAL('triggered()')) { on_plot_add() }
|
|
139
|
-
|
|
140
|
-
@plot_delete = Qt::Action.new(Cosmos.get_icon('delete_plot.png'), tr('&Delete Plot'), self)
|
|
141
|
-
@plot_delete.statusTip = tr('Delete Selected Plot')
|
|
142
|
-
@plot_delete.connect(SIGNAL('triggered()')) { on_plot_delete() }
|
|
143
|
-
|
|
144
|
-
@plot_edit = Qt::Action.new(Cosmos.get_icon('edit_plot.png'), tr('&Edit Plot'), self)
|
|
145
|
-
@plot_edit.statusTip = tr('Edit Selected Plot')
|
|
146
|
-
@plot_edit.connect(SIGNAL('triggered()')) { on_plot_edit() }
|
|
147
|
-
|
|
148
|
-
@plot_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('&Screenshot Plot'), self)
|
|
149
|
-
@plot_screenshot.statusTip = tr('Screenshot Selected Plot')
|
|
150
|
-
@plot_screenshot.connect(SIGNAL('triggered()')) { on_plot_screenshot() }
|
|
151
|
-
|
|
152
|
-
@plot_add_data = Qt::Action.new(Cosmos.get_icon('add_database.png'), tr('Add Data &Object'), self)
|
|
153
|
-
@plot_add_data.statusTip = tr('Add Data Object')
|
|
154
|
-
@plot_add_data.connect(SIGNAL('triggered()')) { on_data_object_add() }
|
|
155
|
-
|
|
156
|
-
@plot_edit_data = Qt::Action.new(Cosmos.get_icon('edit_database.png'), tr('Edit &Plot Data Objects'), self)
|
|
157
|
-
@plot_edit_data.statusTip = tr('Edit Plot Data Object(s)')
|
|
158
|
-
@plot_edit_data.connect(SIGNAL('triggered()')) { on_plot_data_object_edit() }
|
|
159
|
-
|
|
160
|
-
@plot_export = Qt::Action.new(tr('E&xport Plot Data Objects'), self)
|
|
161
|
-
@plot_export.statusTip = tr('Export Plot Data Object(s)')
|
|
162
|
-
@plot_export.connect(SIGNAL('triggered()')) { on_plot_export() }
|
|
163
|
-
|
|
164
|
-
@plot_reset = Qt::Action.new(tr('&Reset Plot Data Objects'), self)
|
|
165
|
-
@plot_reset.statusTip = tr('Reset Plot Data Object(s)')
|
|
166
|
-
@plot_reset.connect(SIGNAL('triggered()')) { on_plot_reset() }
|
|
167
|
-
|
|
168
|
-
# Data Object Menu
|
|
169
|
-
@data_add = Qt::Action.new(Cosmos.get_icon('add_database.png'), tr('&Add Data Object'), self)
|
|
170
|
-
@data_add.statusTip = tr('Add Data Object')
|
|
171
|
-
@data_add.connect(SIGNAL('triggered()')) { on_data_object_add() }
|
|
172
|
-
|
|
173
|
-
@data_delete = Qt::Action.new(Cosmos.get_icon('delete_database.png'), tr('&Delete Data Object'), self)
|
|
174
|
-
@data_delete.statusTip = tr('Delete Selected Data Object(s)')
|
|
175
|
-
@data_delete.connect(SIGNAL('triggered()')) { on_data_object_delete() }
|
|
176
|
-
|
|
177
|
-
@data_edit = Qt::Action.new(Cosmos.get_icon('edit_database.png'), tr('&Edit Data Object'), self)
|
|
178
|
-
@data_edit.statusTip = tr('Edit Selected Data Object(s)')
|
|
179
|
-
@data_edit.connect(SIGNAL('triggered()')) { on_data_object_edit() }
|
|
180
|
-
|
|
181
|
-
@data_duplicate = Qt::Action.new(tr('Du&plicate Data Object'), self)
|
|
182
|
-
@data_duplicate.statusTip = tr('Duplicate Selected Data Object(s)')
|
|
183
|
-
@data_duplicate.connect(SIGNAL('triggered()')) { on_data_object_duplicate() }
|
|
184
|
-
|
|
185
|
-
@data_export = Qt::Action.new(tr('E&xport Data Object'), self)
|
|
186
|
-
@data_export.statusTip = tr('Export Selected Data Object(s)')
|
|
187
|
-
@data_export.connect(SIGNAL('triggered()')) { on_data_object_export() }
|
|
188
|
-
|
|
189
|
-
@data_export_all = Qt::Action.new(tr('Expor&t All Data Objects'), self)
|
|
190
|
-
@data_export_all.statusTip = tr('Export All Data Objects')
|
|
191
|
-
@data_export_all.connect(SIGNAL('triggered()')) { on_data_object_export_all() }
|
|
192
|
-
|
|
193
|
-
@data_reset = Qt::Action.new(tr('&Reset Data Object'), self)
|
|
194
|
-
@data_reset.statusTip = tr('Reset Selected Data Object(s)')
|
|
195
|
-
@data_reset.connect(SIGNAL('triggered()')) { on_data_object_reset() }
|
|
196
|
-
|
|
197
|
-
@data_reset_all = Qt::Action.new(tr('Re&set All Data Objects'), self)
|
|
198
|
-
@data_reset_all.statusTip = tr('Reset All Data Objects')
|
|
199
|
-
@data_reset_all.connect(SIGNAL('triggered()')) { on_data_object_reset_all() }
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def initialize_menus(options)
|
|
203
|
-
# File Menu
|
|
204
|
-
@file_menu = menuBar.addMenu(tr('&File'))
|
|
205
|
-
@file_menu.addAction(@file_process)
|
|
206
|
-
@file_menu.addSeparator()
|
|
207
|
-
@file_menu.addAction(@file_load)
|
|
208
|
-
@file_menu.addAction(@file_save)
|
|
209
|
-
@file_menu.addSeparator()
|
|
210
|
-
@file_menu.addAction(@file_screenshot)
|
|
211
|
-
@file_menu.addSeparator()
|
|
212
|
-
@file_menu.addAction(@exit_action)
|
|
213
|
-
|
|
214
|
-
@tab_menu = menuBar.addMenu(tr('&Tab'))
|
|
215
|
-
@tab_menu.addAction(@tab_add)
|
|
216
|
-
@tab_menu.addAction(@tab_delete)
|
|
217
|
-
@tab_menu.addAction(@tab_edit)
|
|
218
|
-
@tab_menu.addSeparator()
|
|
219
|
-
@tab_menu.addAction(@tab_screenshot)
|
|
220
|
-
@tab_menu.addAction(@tab_export)
|
|
221
|
-
@tab_menu.addSeparator()
|
|
222
|
-
@tab_menu.addAction(@tab_reset)
|
|
223
|
-
|
|
224
|
-
@plot_menu = menuBar.addMenu(tr('&Plot'))
|
|
225
|
-
@plot_menu.addAction(@plot_add)
|
|
226
|
-
@plot_menu.addAction(@plot_delete)
|
|
227
|
-
@plot_menu.addAction(@plot_edit)
|
|
228
|
-
@plot_menu.addSeparator()
|
|
229
|
-
@plot_menu.addAction(@plot_add_data)
|
|
230
|
-
@plot_menu.addAction(@plot_edit_data)
|
|
231
|
-
@plot_menu.addSeparator()
|
|
232
|
-
@plot_menu.addAction(@plot_screenshot)
|
|
233
|
-
@plot_menu.addAction(@plot_export)
|
|
234
|
-
@plot_menu.addSeparator()
|
|
235
|
-
@plot_menu.addAction(@plot_reset)
|
|
236
|
-
|
|
237
|
-
@data_menu = menuBar.addMenu(tr('&Data Object'))
|
|
238
|
-
@data_menu.addAction(@data_add)
|
|
239
|
-
@data_menu.addAction(@data_delete)
|
|
240
|
-
@data_menu.addAction(@data_edit)
|
|
241
|
-
@data_menu.addSeparator()
|
|
242
|
-
@data_menu.addAction(@data_duplicate)
|
|
243
|
-
@data_menu.addAction(@data_export)
|
|
244
|
-
@data_menu.addAction(@data_export_all)
|
|
245
|
-
@data_menu.addSeparator()
|
|
246
|
-
@data_menu.addAction(@data_reset)
|
|
247
|
-
@data_menu.addAction(@data_reset_all)
|
|
248
|
-
|
|
249
|
-
# Help Menu
|
|
250
|
-
@about_string = options.about_string
|
|
251
|
-
initialize_help_menu()
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
def initialize_central_widget
|
|
255
|
-
# Create a splitter to break application into to halves
|
|
256
|
-
@splitter = Qt::Splitter.new(Qt::Horizontal, central_widget)
|
|
257
|
-
setCentralWidget(@splitter)
|
|
258
|
-
|
|
259
|
-
# Create a Vertical Frame for the left contents
|
|
260
|
-
@left_widget = Qt::Widget.new(self)
|
|
261
|
-
@left_frame = Qt::VBoxLayout.new
|
|
262
|
-
@left_widget.setLayout(@left_frame)
|
|
263
|
-
@splitter.addWidget(@left_widget)
|
|
264
|
-
|
|
265
|
-
# Create a Vertical Frame for the right contents
|
|
266
|
-
@right_widget = Qt::Widget.new(self)
|
|
267
|
-
@right_frame = Qt::VBoxLayout.new
|
|
268
|
-
@right_widget.setLayout(@right_frame)
|
|
269
|
-
@splitter.addWidget(@right_widget)
|
|
270
|
-
@splitter.setStretchFactor(0,0) # Set the left side stretch factor to 0
|
|
271
|
-
@splitter.setStretchFactor(1,1) # Set the right side stretch factor to 1 to give it priority for space
|
|
272
|
-
|
|
273
|
-
# Realtime Button Bar
|
|
274
|
-
@realtime_button_bar = RealtimeButtonBar.new(self, Qt::Vertical)
|
|
275
|
-
@realtime_button_bar.start_callback = method(:handle_start)
|
|
276
|
-
@realtime_button_bar.pause_callback = method(:handle_pause)
|
|
277
|
-
@realtime_button_bar.stop_callback = method(:handle_stop)
|
|
278
|
-
@realtime_button_bar.state = 'Stopped'
|
|
279
|
-
@left_frame.addWidget(@realtime_button_bar)
|
|
280
|
-
|
|
281
|
-
# Separator after RBB
|
|
282
|
-
@sep = Qt::Frame.new
|
|
283
|
-
@sep.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
|
|
284
|
-
@left_frame.addWidget(@sep)
|
|
285
|
-
end # def initialize
|
|
286
|
-
|
|
287
|
-
protected
|
|
288
|
-
|
|
289
|
-
###############################################################################
|
|
290
|
-
# Protected Methods Used During Initialization
|
|
291
|
-
###############################################################################
|
|
292
|
-
|
|
293
|
-
# Loads in a new configuration file
|
|
294
|
-
def load_configuration
|
|
295
|
-
# Shutdown TabbedPlots if one already exists
|
|
296
|
-
@tabbed_plots.shutdown if @tabbed_plots
|
|
297
|
-
|
|
298
|
-
if @items && !@items.empty?
|
|
299
|
-
# Don't use config file and handle items passed in from the command line
|
|
300
|
-
@tabbed_plots_config = TabbedPlotsConfig.new(nil,
|
|
301
|
-
@plot_types,
|
|
302
|
-
@data_object_types,
|
|
303
|
-
@plot_type_to_data_object_type_mapping)
|
|
304
|
-
handle_items()
|
|
305
|
-
else
|
|
306
|
-
# Create new tabbed plots definition from config file
|
|
307
|
-
@tabbed_plots_config = TabbedPlotsConfig.new(@config_filename,
|
|
308
|
-
@plot_types,
|
|
309
|
-
@data_object_types,
|
|
310
|
-
@plot_type_to_data_object_type_mapping)
|
|
311
|
-
end
|
|
312
|
-
@config_modified = false
|
|
313
|
-
|
|
314
|
-
# Handle configuration errors
|
|
315
|
-
unless @tabbed_plots_config.configuration_errors.empty?
|
|
316
|
-
ExceptionListDialog.new('Errors Encountered in Configuration File:',
|
|
317
|
-
@tabbed_plots_config.configuration_errors)
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
# Add a TabbedPlots widget to show all the plots
|
|
321
|
-
if @tabbed_plots
|
|
322
|
-
@tabbed_plots.config_modified_callback = nil
|
|
323
|
-
else
|
|
324
|
-
# Require tabbed plots file
|
|
325
|
-
tabbed_plots_filename = @tabbed_plots_type + '_tabbed_plots.rb'
|
|
326
|
-
tabbed_plots_class = Cosmos.require_class(tabbed_plots_filename)
|
|
327
|
-
@tabbed_plots = tabbed_plots_class.new(self, @left_frame, @right_frame, statusBar)
|
|
328
|
-
@tabbed_plots.tab_item_right_button_release_callback = method(:handle_tab_right_click)
|
|
329
|
-
@tabbed_plots.plot_right_button_release_callback = method(:handle_plot_right_click)
|
|
330
|
-
@tabbed_plots.data_object_right_button_release_callback = method(:handle_data_object_right_click)
|
|
331
|
-
end
|
|
332
|
-
@tabbed_plots.startup(@tabbed_plots_config, @adder_orientation, @adder_types)
|
|
333
|
-
@tabbed_plots.config_modified_callback = method(:handle_config_modified)
|
|
334
|
-
@tabbed_plots.pause
|
|
335
|
-
|
|
336
|
-
# Start realtime collection if given an item or told to start
|
|
337
|
-
if (@items and not @items.empty?) or @start
|
|
338
|
-
handle_start()
|
|
339
|
-
@items = nil
|
|
340
|
-
@start = false
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
if !File.exist?(@config_filename)
|
|
344
|
-
# Warn if the configuration file did not exist
|
|
345
|
-
statusBar.showMessage(tr("Configuration File does not exist: #{@config_filename}. Using default configuration."))
|
|
346
|
-
end
|
|
347
|
-
update_window_title()
|
|
348
|
-
end # def load_configuration
|
|
349
|
-
|
|
350
|
-
def update_window_title
|
|
351
|
-
if File.exist?(@config_filename)
|
|
352
|
-
if @config_modified
|
|
353
|
-
self.windowTitle = @base_title + ' - ' + @config_filename + '*'
|
|
354
|
-
else
|
|
355
|
-
self.windowTitle = @base_title + ' - ' + @config_filename
|
|
356
|
-
end
|
|
357
|
-
else
|
|
358
|
-
self.windowTitle = @base_title
|
|
359
|
-
end
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
# Override this method to handle items passed in from command line
|
|
363
|
-
def handle_items
|
|
364
|
-
# Do nothing by default
|
|
365
|
-
end # def handle_items
|
|
366
|
-
|
|
367
|
-
def screenshot
|
|
368
|
-
screenshot_filename = File.join(@screenshot_dir,
|
|
369
|
-
File.build_timestamped_filename([@tool_short_name, 'screenshot'], '.png'))
|
|
370
|
-
filename = Qt::FileDialog::getSaveFileName(self,
|
|
371
|
-
"Save Screen Shot",
|
|
372
|
-
screenshot_filename,
|
|
373
|
-
"Screenshots (*.png);;All Files (*)")
|
|
374
|
-
unless filename.nil? or filename.empty?
|
|
375
|
-
Qt.execute_in_main_thread(true) do
|
|
376
|
-
begin
|
|
377
|
-
yield filename
|
|
378
|
-
@screenshot_dir = File.dirname(filename)
|
|
379
|
-
statusBar.showMessage(tr("Screenshot saved to: #{filename}"))
|
|
380
|
-
rescue Exception => error
|
|
381
|
-
statusBar.showMessage(tr("Screenshot creation failed"))
|
|
382
|
-
Qt::MessageBox.warning(
|
|
383
|
-
self,
|
|
384
|
-
"Screenshot Creation Error",
|
|
385
|
-
"Could not create file: #{filename}\n#{error.class} : #{error.message}")
|
|
386
|
-
end
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
end
|
|
390
|
-
|
|
391
|
-
def export
|
|
392
|
-
export_filename = File.join(@export_dir,
|
|
393
|
-
File.build_timestamped_filename([@tool_short_name, 'export'], '.txt'))
|
|
394
|
-
filename = Qt::FileDialog::getSaveFileName(self,
|
|
395
|
-
"Export Filename",
|
|
396
|
-
export_filename,
|
|
397
|
-
"Export Files (*.txt);;All Files (*)")
|
|
398
|
-
unless filename.nil? or filename.empty?
|
|
399
|
-
filename << '.txt' if File.extname(filename).empty?
|
|
400
|
-
begin
|
|
401
|
-
ProgressDialog.execute(self, "Export Progress", 500, 100, true, false, true, true, true) do |dialog|
|
|
402
|
-
yield filename, dialog
|
|
403
|
-
dialog.append_text("\n\nExported to #{filename}")
|
|
404
|
-
dialog.set_overall_progress(1.0)
|
|
405
|
-
dialog.complete
|
|
406
|
-
end
|
|
407
|
-
@export_dir = File.dirname(filename)
|
|
408
|
-
statusBar.showMessage(tr("Exported to #{filename}"))
|
|
409
|
-
rescue Exception => error
|
|
410
|
-
statusBar.showMessage(tr("Export Failed"))
|
|
411
|
-
Qt::MessageBox.warning(
|
|
412
|
-
self,
|
|
413
|
-
"Export Error",
|
|
414
|
-
"Could not create file: #{filename}\n#{error.class} : #{error.message}")
|
|
415
|
-
end
|
|
416
|
-
end
|
|
417
|
-
end
|
|
418
|
-
|
|
419
|
-
def reset_or_delete(item, delete)
|
|
420
|
-
action = "reset"
|
|
421
|
-
action = "delete" if delete
|
|
422
|
-
result = Qt::MessageBox.warning(self,
|
|
423
|
-
'Warning!',
|
|
424
|
-
"Are you sure you want to #{action} the #{item}?",
|
|
425
|
-
Qt::MessageBox::Yes | Qt::MessageBox::No,
|
|
426
|
-
Qt::MessageBox::No)
|
|
427
|
-
if result == Qt::MessageBox::Yes
|
|
428
|
-
yield
|
|
429
|
-
@config_modified = true if delete
|
|
430
|
-
update_window_title() if delete
|
|
431
|
-
statusBar.showMessage(tr("#{action.capitalize} #{item} successful"))
|
|
432
|
-
else
|
|
433
|
-
statusBar.showMessage(tr("#{action.capitalize} #{item} cancelled"))
|
|
434
|
-
end
|
|
435
|
-
end
|
|
436
|
-
def reset(item)
|
|
437
|
-
reset_or_delete(item, false) do
|
|
438
|
-
yield
|
|
439
|
-
end
|
|
440
|
-
end
|
|
441
|
-
def delete(item)
|
|
442
|
-
reset_or_delete(item, true) do
|
|
443
|
-
yield
|
|
444
|
-
end
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
###############################################################################
|
|
448
|
-
# Application Close Handler
|
|
449
|
-
###############################################################################
|
|
450
|
-
|
|
451
|
-
# Prompts for save if the current configuration has been modified
|
|
452
|
-
def prompt_for_save_if_needed
|
|
453
|
-
safe_to_continue = true
|
|
454
|
-
if @config_modified and File.exist?(@config_filename)
|
|
455
|
-
case Qt::MessageBox.question(
|
|
456
|
-
self, # parent
|
|
457
|
-
'Save?', # title
|
|
458
|
-
"Save changes to '#{@config_filename}'?", # text
|
|
459
|
-
Qt::MessageBox::Yes | Qt::MessageBox::No | Qt::MessageBox::Cancel, # buttons
|
|
460
|
-
Qt::MessageBox::Cancel) # default button
|
|
461
|
-
when Qt::MessageBox::Cancel
|
|
462
|
-
safe_to_continue = false
|
|
463
|
-
when Qt::MessageBox::Yes
|
|
464
|
-
saved = on_file_save_config()
|
|
465
|
-
if not saved
|
|
466
|
-
safe_to_continue = false
|
|
467
|
-
end
|
|
468
|
-
end
|
|
469
|
-
end
|
|
470
|
-
return safe_to_continue
|
|
471
|
-
end
|
|
472
|
-
|
|
473
|
-
# Handles application window closing
|
|
474
|
-
def closeEvent(event)
|
|
475
|
-
if prompt_for_save_if_needed()
|
|
476
|
-
super(event)
|
|
477
|
-
@realtime_thread.kill if @realtime_thread
|
|
478
|
-
@realtime_thread = nil
|
|
479
|
-
else
|
|
480
|
-
event.ignore()
|
|
481
|
-
end
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
###############################################################################
|
|
485
|
-
# File Menu Handlers
|
|
486
|
-
###############################################################################
|
|
487
|
-
|
|
488
|
-
# Handles processing log files
|
|
489
|
-
def on_file_process_log
|
|
490
|
-
paused = @tabbed_plots.paused?
|
|
491
|
-
@tabbed_plots.pause
|
|
492
|
-
dialog = PacketLogDialog.new(self,
|
|
493
|
-
'Process Log File(s):',
|
|
494
|
-
@log_dir,
|
|
495
|
-
@packet_log_reader,
|
|
496
|
-
@log_filenames)
|
|
497
|
-
dialog.time_start = @time_start
|
|
498
|
-
dialog.time_end = @time_end
|
|
499
|
-
result = dialog.exec
|
|
500
|
-
if result != 0
|
|
501
|
-
@time_start = dialog.time_start
|
|
502
|
-
@time_end = dialog.time_end
|
|
503
|
-
handle_stop()
|
|
504
|
-
System.telemetry.reset
|
|
505
|
-
@tabbed_plots.reset_all_data_objects
|
|
506
|
-
@realtime_button_bar.state = 'Log File'
|
|
507
|
-
@packet_log_reader = dialog.packet_log_reader
|
|
508
|
-
@log_filenames = dialog.filenames.clone
|
|
509
|
-
filenames = dialog.filenames.sort
|
|
510
|
-
|
|
511
|
-
ProgressDialog.execute(self, 'Log File Progress', 500, 300) do |progress_dialog|
|
|
512
|
-
logfile_thread = TabbedPlotsLogfileThread.new(filenames,
|
|
513
|
-
@packet_log_reader,
|
|
514
|
-
@tabbed_plots_config,
|
|
515
|
-
progress_dialog,
|
|
516
|
-
@time_start,
|
|
517
|
-
@time_end)
|
|
518
|
-
sleep(0.1) until logfile_thread.done?
|
|
519
|
-
progress_dialog.close_done
|
|
520
|
-
end
|
|
521
|
-
|
|
522
|
-
@tabbed_plots.redraw_plots(true, true)
|
|
523
|
-
@tabbed_plots.update
|
|
524
|
-
else
|
|
525
|
-
@tabbed_plots.resume unless paused
|
|
526
|
-
end
|
|
527
|
-
dialog.dispose
|
|
528
|
-
end # def on_file_process_log
|
|
529
|
-
|
|
530
|
-
# Handles loading a configuration file
|
|
531
|
-
def on_file_load_config
|
|
532
|
-
paused = @tabbed_plots.paused?
|
|
533
|
-
@tabbed_plots.pause
|
|
534
|
-
|
|
535
|
-
if prompt_for_save_if_needed()
|
|
536
|
-
filename = Qt::FileDialog.getOpenFileName(self,
|
|
537
|
-
"Load Configuration",
|
|
538
|
-
@config_filename,
|
|
539
|
-
"Config File (*.txt);;All Files (*)")
|
|
540
|
-
if filename and not filename.empty?
|
|
541
|
-
@config_filename = filename
|
|
542
|
-
if @realtime_thread then running = true else running = false end
|
|
543
|
-
handle_stop()
|
|
544
|
-
load_configuration()
|
|
545
|
-
handle_start() if running
|
|
546
|
-
handle_pause() if paused
|
|
547
|
-
else
|
|
548
|
-
@tabbed_plots.resume unless paused
|
|
549
|
-
end
|
|
550
|
-
end
|
|
551
|
-
end # def on_file_load_config
|
|
552
|
-
|
|
553
|
-
# Handles saving the current configuration to a file
|
|
554
|
-
def on_file_save_config
|
|
555
|
-
saved = false
|
|
556
|
-
paused = @tabbed_plots.paused?
|
|
557
|
-
@tabbed_plots.pause
|
|
558
|
-
filename = Qt::FileDialog.getSaveFileName(self,
|
|
559
|
-
"Save Configuration",
|
|
560
|
-
@config_filename,
|
|
561
|
-
"Config File (*.txt);;All Files (*)")
|
|
562
|
-
if filename and not filename.empty?
|
|
563
|
-
filename << '.txt' if File.extname(filename).empty?
|
|
564
|
-
File.open(filename, 'w') {|file| file.write(@tabbed_plots_config.configuration_string)}
|
|
565
|
-
@config_filename = filename
|
|
566
|
-
@config_modified = false
|
|
567
|
-
update_window_title()
|
|
568
|
-
saved = true
|
|
569
|
-
end
|
|
570
|
-
@tabbed_plots.resume unless paused
|
|
571
|
-
return saved
|
|
572
|
-
end # def on_file_save_config
|
|
573
|
-
|
|
574
|
-
# Handles taking a screenshot of the tool
|
|
575
|
-
def on_file_screenshot
|
|
576
|
-
paused = @tabbed_plots.paused?
|
|
577
|
-
@tabbed_plots.pause
|
|
578
|
-
screenshot do |filename|
|
|
579
|
-
Screenshot.screenshot_window(self, filename)
|
|
580
|
-
end
|
|
581
|
-
@tabbed_plots.resume unless paused
|
|
582
|
-
end # def on_file_screenshot
|
|
583
|
-
|
|
584
|
-
###############################################################################
|
|
585
|
-
# Tab Menu Handlers
|
|
586
|
-
###############################################################################
|
|
587
|
-
|
|
588
|
-
# Common method to check for the existance of a tab before yielding
|
|
589
|
-
def tab_selected?
|
|
590
|
-
paused = @tabbed_plots.paused?
|
|
591
|
-
@tabbed_plots.pause
|
|
592
|
-
if @tabbed_plots.current_tab_index
|
|
593
|
-
yield
|
|
594
|
-
else
|
|
595
|
-
Qt::MessageBox.information(self, 'Info', "No tabs exist")
|
|
596
|
-
end
|
|
597
|
-
@tabbed_plots.resume unless paused
|
|
598
|
-
end
|
|
599
|
-
|
|
600
|
-
# Handles adding a new tab
|
|
601
|
-
def on_tab_add
|
|
602
|
-
paused = @tabbed_plots.paused?
|
|
603
|
-
@tabbed_plots.pause
|
|
604
|
-
@tabbed_plots.add_tab
|
|
605
|
-
statusBar.showMessage(tr("Tab Added"))
|
|
606
|
-
@config_modified = true
|
|
607
|
-
update_window_title()
|
|
608
|
-
@tabbed_plots.resume unless paused
|
|
609
|
-
end # def on_tab_add
|
|
610
|
-
|
|
611
|
-
# Handles deleting the current tab
|
|
612
|
-
def on_tab_delete
|
|
613
|
-
tab_selected? do
|
|
614
|
-
delete("tab") do
|
|
615
|
-
@tabbed_plots.delete_tab
|
|
616
|
-
end
|
|
617
|
-
end
|
|
618
|
-
end # def on_tab_delete
|
|
619
|
-
|
|
620
|
-
# Handles editing the current tab
|
|
621
|
-
def on_tab_edit
|
|
622
|
-
tab_selected? do
|
|
623
|
-
edited = @tabbed_plots.edit_tab
|
|
624
|
-
if edited
|
|
625
|
-
statusBar.showMessage(tr("Tab Edited"))
|
|
626
|
-
@config_modified = true
|
|
627
|
-
update_window_title()
|
|
628
|
-
end
|
|
629
|
-
end
|
|
630
|
-
end # def on_tab_edit
|
|
631
|
-
|
|
632
|
-
# Handles taking a screenshot of the current tab
|
|
633
|
-
def on_tab_screenshot
|
|
634
|
-
tab_selected? do
|
|
635
|
-
screenshot do |filename|
|
|
636
|
-
@tabbed_plots.screenshot_tab(filename)
|
|
637
|
-
end
|
|
638
|
-
end
|
|
639
|
-
end
|
|
640
|
-
|
|
641
|
-
# Handles exporting all data objects on the current tab
|
|
642
|
-
def on_tab_export
|
|
643
|
-
tab_selected? do
|
|
644
|
-
if @tabbed_plots.tab_has_data_objects?
|
|
645
|
-
export do |filename, progress_dialog|
|
|
646
|
-
@tabbed_plots.export_tab(filename, progress_dialog)
|
|
647
|
-
end
|
|
648
|
-
else
|
|
649
|
-
Qt::MessageBox.information(self, 'Info', "No data objects exist on this tab")
|
|
650
|
-
end
|
|
651
|
-
end
|
|
652
|
-
end # def on_tab_export
|
|
653
|
-
|
|
654
|
-
# Handles reseting all data objects on the current tab
|
|
655
|
-
def on_tab_reset
|
|
656
|
-
tab_selected? do
|
|
657
|
-
reset("data objects on the current tab") do
|
|
658
|
-
@tabbed_plots.reset_tab
|
|
659
|
-
end
|
|
660
|
-
end
|
|
661
|
-
end # def on_tab_reset
|
|
662
|
-
|
|
663
|
-
###############################################################################
|
|
664
|
-
# Plot Menu Handlers
|
|
665
|
-
###############################################################################
|
|
666
|
-
|
|
667
|
-
# Common method to check for a selected plot before yielding
|
|
668
|
-
def plot_selected?
|
|
669
|
-
paused = @tabbed_plots.paused?
|
|
670
|
-
@tabbed_plots.pause
|
|
671
|
-
if @tabbed_plots.selected_plot_index
|
|
672
|
-
yield
|
|
673
|
-
else
|
|
674
|
-
Qt::MessageBox.information(self, 'Info', "Please select a plot")
|
|
675
|
-
end
|
|
676
|
-
@tabbed_plots.resume unless paused
|
|
677
|
-
end
|
|
678
|
-
|
|
679
|
-
# Common method to check for the existance of data objects before yielding
|
|
680
|
-
def plot_data_objects?
|
|
681
|
-
if @tabbed_plots.plot_has_data_objects?
|
|
682
|
-
yield
|
|
683
|
-
else
|
|
684
|
-
Qt::MessageBox.information(self, 'Info', "No data objects exist on this plot")
|
|
685
|
-
end
|
|
686
|
-
end
|
|
687
|
-
|
|
688
|
-
# Handles adding a new plot to the current tab
|
|
689
|
-
def on_plot_add
|
|
690
|
-
paused = @tabbed_plots.paused?
|
|
691
|
-
@tabbed_plots.pause
|
|
692
|
-
added = @tabbed_plots.add_plot
|
|
693
|
-
if added
|
|
694
|
-
@config_modified = true
|
|
695
|
-
update_window_title()
|
|
696
|
-
end
|
|
697
|
-
@tabbed_plots.resume unless paused
|
|
698
|
-
end # def on_plot_add
|
|
699
|
-
|
|
700
|
-
# Handles deleting the selected plot
|
|
701
|
-
def on_plot_delete
|
|
702
|
-
plot_selected? do
|
|
703
|
-
delete("plot") do
|
|
704
|
-
@tabbed_plots.delete_plot
|
|
705
|
-
end
|
|
706
|
-
end
|
|
707
|
-
end # def on_plot_delete
|
|
708
|
-
|
|
709
|
-
# Handles editing the selected plot
|
|
710
|
-
def on_plot_edit
|
|
711
|
-
plot_selected? do
|
|
712
|
-
edited = @tabbed_plots.edit_plot
|
|
713
|
-
if edited
|
|
714
|
-
@config_modified = true
|
|
715
|
-
update_window_title()
|
|
716
|
-
end
|
|
717
|
-
end
|
|
718
|
-
end # def on_plot_edit
|
|
719
|
-
|
|
720
|
-
# Handles taking a screenshot of the selected plot
|
|
721
|
-
def on_plot_screenshot
|
|
722
|
-
plot_selected? do
|
|
723
|
-
screenshot do |filename|
|
|
724
|
-
@tabbed_plots.screenshot_plot(filename)
|
|
725
|
-
end
|
|
726
|
-
end
|
|
727
|
-
end # def on_plot_screenshot
|
|
728
|
-
|
|
729
|
-
def on_plot_data_object_edit
|
|
730
|
-
edited = false
|
|
731
|
-
plot_selected? do
|
|
732
|
-
plot_data_objects? do
|
|
733
|
-
tab_index = @tabbed_plots.current_tab_index
|
|
734
|
-
plot_index = @tabbed_plots.selected_plot_index
|
|
735
|
-
@tabbed_plots_config.tabs[tab_index].plots[plot_index].data_objects.each_with_index do |object, index|
|
|
736
|
-
edited |= @tabbed_plots.edit_data_object(tab_index, plot_index, index)
|
|
737
|
-
end
|
|
738
|
-
if edited
|
|
739
|
-
@config_modified = true
|
|
740
|
-
update_window_title()
|
|
741
|
-
end
|
|
742
|
-
end
|
|
743
|
-
end
|
|
744
|
-
end
|
|
745
|
-
|
|
746
|
-
# Handles exporting the data objects on the selected plot
|
|
747
|
-
def on_plot_export
|
|
748
|
-
plot_selected? do
|
|
749
|
-
plot_data_objects? do
|
|
750
|
-
export do |filename, progress_dialog|
|
|
751
|
-
@tabbed_plots.export_plot(filename, progress_dialog)
|
|
752
|
-
end
|
|
753
|
-
end
|
|
754
|
-
end
|
|
755
|
-
end # def on_plot_export
|
|
756
|
-
|
|
757
|
-
# Handles reseting the data objects on the selected plot
|
|
758
|
-
def on_plot_reset
|
|
759
|
-
plot_selected? do
|
|
760
|
-
plot_data_objects? do
|
|
761
|
-
reset("data objects on the selected plot") do
|
|
762
|
-
@tabbed_plots.reset_plot
|
|
763
|
-
end
|
|
764
|
-
end
|
|
765
|
-
end
|
|
766
|
-
end # def on_plot_reset
|
|
767
|
-
|
|
768
|
-
###############################################################################
|
|
769
|
-
# Data Object Menu Handlers
|
|
770
|
-
###############################################################################
|
|
771
|
-
|
|
772
|
-
def data_objects_selected?
|
|
773
|
-
paused = @tabbed_plots.paused?
|
|
774
|
-
@tabbed_plots.pause
|
|
775
|
-
unless @tabbed_plots.selected_data_object_indexes.empty?
|
|
776
|
-
yield
|
|
777
|
-
else
|
|
778
|
-
Qt::MessageBox.information(self, 'Information', "Please select one or more data objects")
|
|
779
|
-
end
|
|
780
|
-
@tabbed_plots.resume unless paused
|
|
781
|
-
end
|
|
782
|
-
|
|
783
|
-
def data_objects_exist?
|
|
784
|
-
paused = @tabbed_plots.paused?
|
|
785
|
-
@tabbed_plots.pause
|
|
786
|
-
if @tabbed_plots.plot_has_data_objects?
|
|
787
|
-
yield
|
|
788
|
-
else
|
|
789
|
-
Qt::MessageBox.information(self, 'Information', "No data objects exist on this plot")
|
|
790
|
-
end
|
|
791
|
-
@tabbed_plots.resume unless paused
|
|
792
|
-
end
|
|
793
|
-
|
|
794
|
-
# Handles adding a data object to the selected plot
|
|
795
|
-
def on_data_object_add
|
|
796
|
-
paused = @tabbed_plots.paused?
|
|
797
|
-
@tabbed_plots.pause
|
|
798
|
-
added = @tabbed_plots.add_data_object
|
|
799
|
-
if added
|
|
800
|
-
@config_modified = true
|
|
801
|
-
update_window_title()
|
|
802
|
-
end
|
|
803
|
-
@tabbed_plots.resume unless paused
|
|
804
|
-
end # def on_data_object_add
|
|
805
|
-
|
|
806
|
-
# Handles editing the selected data object(s)
|
|
807
|
-
def on_data_object_edit
|
|
808
|
-
data_objects_selected? do
|
|
809
|
-
edited = @tabbed_plots.edit_data_object
|
|
810
|
-
if edited
|
|
811
|
-
@config_modified = true
|
|
812
|
-
update_window_title()
|
|
813
|
-
end
|
|
814
|
-
end
|
|
815
|
-
end # def on_data_object_edit
|
|
816
|
-
|
|
817
|
-
# Handles duplicating the selected data object(s)
|
|
818
|
-
def on_data_object_duplicate
|
|
819
|
-
data_objects_selected? do
|
|
820
|
-
@tabbed_plots.duplicate_data_object
|
|
821
|
-
@config_modified = true
|
|
822
|
-
update_window_title()
|
|
823
|
-
end
|
|
824
|
-
end # def on_data_object_duplicate
|
|
825
|
-
|
|
826
|
-
# Handles deleting the selected data object(s)
|
|
827
|
-
def on_data_object_delete
|
|
828
|
-
data_objects_selected? do
|
|
829
|
-
delete("selected data object(s)") do
|
|
830
|
-
@tabbed_plots.delete_data_object
|
|
831
|
-
end
|
|
832
|
-
end
|
|
833
|
-
end # def on_data_object_delete
|
|
834
|
-
|
|
835
|
-
# Handles exporting the selected data object(s)
|
|
836
|
-
def on_data_object_export
|
|
837
|
-
data_objects_selected? do
|
|
838
|
-
export do |filename, progress_dialog|
|
|
839
|
-
@tabbed_plots.export_data_object(filename, progress_dialog)
|
|
840
|
-
end
|
|
841
|
-
end
|
|
842
|
-
end # def on_data_object_export
|
|
843
|
-
|
|
844
|
-
# Handles exporting all data objects
|
|
845
|
-
def on_data_object_export_all
|
|
846
|
-
data_objects_exist? do
|
|
847
|
-
export do |filename, progress_dialog|
|
|
848
|
-
@tabbed_plots.export_all_data_objects(filename, progress_dialog)
|
|
849
|
-
end
|
|
850
|
-
end
|
|
851
|
-
end # def on_data_object_export_all
|
|
852
|
-
|
|
853
|
-
# Handles reseting the selected data object(s)
|
|
854
|
-
def on_data_object_reset
|
|
855
|
-
data_objects_selected? do
|
|
856
|
-
reset("selected data objects") do
|
|
857
|
-
@tabbed_plots.reset_data_object
|
|
858
|
-
end
|
|
859
|
-
end
|
|
860
|
-
end # def on_data_object_reset
|
|
861
|
-
|
|
862
|
-
# Handles reseting all data objects
|
|
863
|
-
def on_data_object_reset_all
|
|
864
|
-
data_objects_exist? do
|
|
865
|
-
reset("all data objects") do
|
|
866
|
-
@tabbed_plots.reset_all_data_objects
|
|
867
|
-
end
|
|
868
|
-
end
|
|
869
|
-
end # def on_data_object_reset_all
|
|
870
|
-
|
|
871
|
-
###############################################################################
|
|
872
|
-
# Right-Click Handlers
|
|
873
|
-
###############################################################################
|
|
874
|
-
|
|
875
|
-
# Handles right clicking for tabs
|
|
876
|
-
def handle_tab_right_click(point)
|
|
877
|
-
# Popup menu
|
|
878
|
-
@tab_menu.exec(point)
|
|
879
|
-
end # def handle_tab_right_click
|
|
880
|
-
|
|
881
|
-
# Handles right clicking for plots
|
|
882
|
-
def handle_plot_right_click(point)
|
|
883
|
-
# Popup menu
|
|
884
|
-
@plot_menu.exec(point)
|
|
885
|
-
end # def handle_plot_right_click
|
|
886
|
-
|
|
887
|
-
# Handles right clicking for data objects
|
|
888
|
-
def handle_data_object_right_click(point)
|
|
889
|
-
# Popup menu
|
|
890
|
-
@data_menu.exec(point)
|
|
891
|
-
end # def handle_data_object_right_click
|
|
892
|
-
|
|
893
|
-
###############################################################################
|
|
894
|
-
# Other Tabbed Plots Handlers
|
|
895
|
-
###############################################################################
|
|
896
|
-
|
|
897
|
-
def handle_config_modified
|
|
898
|
-
@config_modified = true
|
|
899
|
-
update_window_title()
|
|
900
|
-
end
|
|
901
|
-
|
|
902
|
-
###############################################################################
|
|
903
|
-
# Realtime Button Bar Button Handlers
|
|
904
|
-
###############################################################################
|
|
905
|
-
|
|
906
|
-
# Handle start button
|
|
907
|
-
def handle_start
|
|
908
|
-
if @realtime_thread
|
|
909
|
-
# Resume plotting in case it was paused
|
|
910
|
-
@tabbed_plots.resume
|
|
911
|
-
statusBar.showMessage(tr("Plot Updates Resumed"))
|
|
912
|
-
@realtime_button_bar.state = 'Running'
|
|
913
|
-
else
|
|
914
|
-
System.load_configuration
|
|
915
|
-
if @realtime_button_bar.state == 'Log File'
|
|
916
|
-
System.telemetry.reset
|
|
917
|
-
@tabbed_plots.reset_all_data_objects
|
|
918
|
-
end
|
|
919
|
-
@tabbed_plots.resume
|
|
920
|
-
|
|
921
|
-
# Startup realtime thread
|
|
922
|
-
@realtime_button_bar.state = 'Connecting'
|
|
923
|
-
statusBar.showMessage(tr("Connecting to COSMOS Server"))
|
|
924
|
-
@realtime_thread = TabbedPlotsRealtimeThread.new(@tabbed_plots_config, method(:realtime_thread_connection_success_callback), method(:realtime_thread_connection_failed_callback), method(:realtime_thread_connection_lost_callback), method(:realtime_thread_fatal_exception_callback))
|
|
925
|
-
end
|
|
926
|
-
end # def handle_start
|
|
927
|
-
|
|
928
|
-
# Handle pause button
|
|
929
|
-
def handle_pause
|
|
930
|
-
if @realtime_thread
|
|
931
|
-
# Pause plotting
|
|
932
|
-
@tabbed_plots.pause
|
|
933
|
-
statusBar.showMessage(tr("Plot Updates Paused - Still Collecting Data in the Background"))
|
|
934
|
-
@realtime_button_bar.state = 'Paused'
|
|
935
|
-
else
|
|
936
|
-
# Do Nothing
|
|
937
|
-
end
|
|
938
|
-
end # def handle_pause
|
|
939
|
-
|
|
940
|
-
# Handle stop button
|
|
941
|
-
def handle_stop
|
|
942
|
-
@tabbed_plots.pause
|
|
943
|
-
if @realtime_thread
|
|
944
|
-
# Kill realtime thread
|
|
945
|
-
@realtime_thread.kill
|
|
946
|
-
@realtime_thread = nil
|
|
947
|
-
@realtime_button_bar.state = 'Stopped'
|
|
948
|
-
statusBar.showMessage(tr("Disconnection from COSMOS Server Successful"))
|
|
949
|
-
else
|
|
950
|
-
# Do Nothing
|
|
951
|
-
end
|
|
952
|
-
end # def handle_stop
|
|
953
|
-
|
|
954
|
-
###############################################################################
|
|
955
|
-
# Realtime Thread Callbacks - Not executed in GUI context - No Direct GUI
|
|
956
|
-
# interaction allowed!
|
|
957
|
-
###############################################################################
|
|
958
|
-
|
|
959
|
-
# Handle succesful realtime thread connection
|
|
960
|
-
def realtime_thread_connection_success_callback
|
|
961
|
-
# Notify user of connection success
|
|
962
|
-
Qt.execute_in_main_thread(true) do
|
|
963
|
-
statusBar.showMessage(tr("Connection to COSMOS Server Successful"))
|
|
964
|
-
if @tabbed_plots.paused?
|
|
965
|
-
@realtime_button_bar.state = 'Paused'
|
|
966
|
-
else
|
|
967
|
-
@realtime_button_bar.state = 'Running'
|
|
968
|
-
end
|
|
969
|
-
end
|
|
970
|
-
end # def realtime_thread_connection_success_callback
|
|
971
|
-
|
|
972
|
-
# Handle realtime thread connection failure
|
|
973
|
-
def realtime_thread_connection_failed_callback(error)
|
|
974
|
-
# Notify user connection failed
|
|
975
|
-
Qt.execute_in_main_thread(true) do
|
|
976
|
-
statusBar.showMessage(tr("Connection to COSMOS Server Failed : #{error.class} : #{error.message}"))
|
|
977
|
-
@realtime_button_bar.state = 'Connecting'
|
|
978
|
-
end
|
|
979
|
-
end # def realtime_thread_connection_failed_callback
|
|
980
|
-
|
|
981
|
-
# Handle realtime thread connection lost
|
|
982
|
-
def realtime_thread_connection_lost_callback(error)
|
|
983
|
-
# Notify user of connection lost
|
|
984
|
-
if error
|
|
985
|
-
Qt.execute_in_main_thread(true) do
|
|
986
|
-
statusBar.showMessage(tr("Connection to COSMOS Server Lost : #{error.class} : #{error.message}"))
|
|
987
|
-
@realtime_button_bar.state = 'Connecting'
|
|
988
|
-
end
|
|
989
|
-
else
|
|
990
|
-
Qt.execute_in_main_thread(true) do
|
|
991
|
-
statusBar.showMessage(tr("Connection to COSMOS Server Lost"))
|
|
992
|
-
@realtime_button_bar.state = 'Connecting'
|
|
993
|
-
end
|
|
994
|
-
end
|
|
995
|
-
end # def realtime_thread_connection_lost_callback
|
|
996
|
-
|
|
997
|
-
# Handle realtime thread fatal exception
|
|
998
|
-
def realtime_thread_fatal_exception_callback(error)
|
|
999
|
-
Cosmos.handle_fatal_exception(error)
|
|
1000
|
-
end # def realtime_thread_fatal_exception_callback
|
|
1001
|
-
|
|
1002
|
-
end # class TabbedPlotsTool
|
|
1003
|
-
|
|
1004
|
-
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/gui/qt'
|
|
12
|
+
require 'cosmos/gui/qt_tool'
|
|
13
|
+
require 'cosmos/gui/dialogs/splash'
|
|
14
|
+
require 'cosmos/packet_logs/packet_log_reader'
|
|
15
|
+
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config'
|
|
16
|
+
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread'
|
|
17
|
+
require 'cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread'
|
|
18
|
+
require 'cosmos/gui/widgets/realtime_button_bar'
|
|
19
|
+
require 'cosmos/gui/dialogs/exception_list_dialog'
|
|
20
|
+
require 'cosmos/gui/dialogs/packet_log_dialog'
|
|
21
|
+
require 'cosmos/gui/dialogs/progress_dialog'
|
|
22
|
+
require 'cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots'
|
|
23
|
+
|
|
24
|
+
module Cosmos
|
|
25
|
+
|
|
26
|
+
# Displays multiple plots that perform various analysis on data.
|
|
27
|
+
class TabbedPlotsTool < QtTool
|
|
28
|
+
|
|
29
|
+
MINIMUM_LEFT_PANEL_WIDTH = 200
|
|
30
|
+
DEFAULT_LEFT_PANEL_WIDTH = 250
|
|
31
|
+
|
|
32
|
+
def initialize(options)
|
|
33
|
+
super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
|
|
34
|
+
@base_title = self.windowTitle
|
|
35
|
+
Cosmos.load_cosmos_icon("tlm_grapher.png")
|
|
36
|
+
|
|
37
|
+
statusBar.showMessage(tr("")) # Show blank message to initialize status bar
|
|
38
|
+
|
|
39
|
+
initialize_actions()
|
|
40
|
+
initialize_menus(options)
|
|
41
|
+
initialize_central_widget()
|
|
42
|
+
complete_initialize()
|
|
43
|
+
|
|
44
|
+
# Define instance variables
|
|
45
|
+
@log_filenames = []
|
|
46
|
+
@log_dir = System.paths['LOGS']
|
|
47
|
+
@log_dir += '/' unless @log_dir[-1..-1] == '\\' or @log_dir[-1..-1] == '/'
|
|
48
|
+
@time_start = nil
|
|
49
|
+
@time_end = nil
|
|
50
|
+
@screenshot_dir = @log_dir.clone
|
|
51
|
+
@export_dir = @log_dir.clone
|
|
52
|
+
@data_object_types = options.data_object_types
|
|
53
|
+
@adder_orientation = options.adder_orientation
|
|
54
|
+
@adder_types = options.adder_types
|
|
55
|
+
@tool_short_name = options.tool_short_name
|
|
56
|
+
@plot_types = options.plot_types
|
|
57
|
+
@tabbed_plots_type = options.tabbed_plots_type
|
|
58
|
+
@items = options.items
|
|
59
|
+
@plot_type_to_data_object_type_mapping = options.plot_type_to_data_object_type_mapping
|
|
60
|
+
@start = options.start
|
|
61
|
+
@packet_log_reader = PacketLogReader.new
|
|
62
|
+
@tabbed_plots_config = nil
|
|
63
|
+
@tabbed_plots = nil
|
|
64
|
+
@realtime_thread = nil
|
|
65
|
+
@config_modified = false
|
|
66
|
+
|
|
67
|
+
# Bring up slash screen for long duration tasks after creation
|
|
68
|
+
Splash.execute(self) do |splash|
|
|
69
|
+
# Configure CosmosConfig to interact with splash screen
|
|
70
|
+
ConfigParser.splash = splash
|
|
71
|
+
|
|
72
|
+
# Load telemetry
|
|
73
|
+
System.telemetry
|
|
74
|
+
|
|
75
|
+
# Create tabbed plots definition
|
|
76
|
+
@config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', options.config_dir, options.config_file)
|
|
77
|
+
Qt.execute_in_main_thread(true) do
|
|
78
|
+
load_configuration()
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Unconfigure CosmosConfig to interact with splash screen
|
|
82
|
+
ConfigParser.splash = nil
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def initialize_actions
|
|
87
|
+
super()
|
|
88
|
+
|
|
89
|
+
# File Menu Actions
|
|
90
|
+
@file_process = Qt::Action.new(tr('&Open Log'), self)
|
|
91
|
+
@file_process_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
92
|
+
@file_process.shortcut = @file_process_keyseq
|
|
93
|
+
@file_process.statusTip = tr('Open Log File')
|
|
94
|
+
@file_process.connect(SIGNAL('triggered()')) { on_file_process_log() }
|
|
95
|
+
|
|
96
|
+
@file_load = Qt::Action.new(Cosmos.get_icon('open.png'), tr('&Load Config'), self)
|
|
97
|
+
@file_load.statusTip = tr('Load Saved Configuration')
|
|
98
|
+
@file_load.connect(SIGNAL('triggered()')) { on_file_load_config() }
|
|
99
|
+
|
|
100
|
+
@file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save Config'), self)
|
|
101
|
+
@file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
|
|
102
|
+
@file_save.shortcut = @file_save_keyseq
|
|
103
|
+
@file_save.statusTip = tr('Save Current Configuration')
|
|
104
|
+
@file_save.connect(SIGNAL('triggered()')) { on_file_save_config() }
|
|
105
|
+
|
|
106
|
+
@file_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('Screensho&t'), self)
|
|
107
|
+
@file_screenshot.statusTip = tr('Screenshot of Application')
|
|
108
|
+
@file_screenshot.connect(SIGNAL('triggered()')) { on_file_screenshot() }
|
|
109
|
+
|
|
110
|
+
# Tab Menu Actions
|
|
111
|
+
@tab_add = Qt::Action.new(Cosmos.get_icon('add_tab.png'), tr('&Add Tab'), self)
|
|
112
|
+
@tab_add.statusTip = tr('Add New Tab')
|
|
113
|
+
@tab_add.connect(SIGNAL('triggered()')) { on_tab_add() }
|
|
114
|
+
|
|
115
|
+
@tab_delete = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
|
|
116
|
+
@tab_delete.statusTip = tr('Delete Active Tab')
|
|
117
|
+
@tab_delete.connect(SIGNAL('triggered()')) { on_tab_delete() }
|
|
118
|
+
|
|
119
|
+
@tab_edit = Qt::Action.new(Cosmos.get_icon('edit_tab.png'), tr('&Edit Tab'), self)
|
|
120
|
+
@tab_edit.statusTip = tr('Edit Active Tab')
|
|
121
|
+
@tab_edit.connect(SIGNAL('triggered()')) { on_tab_edit() }
|
|
122
|
+
|
|
123
|
+
@tab_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('&Screenshot Tab'), self)
|
|
124
|
+
@tab_screenshot.statusTip = tr('Screenshot of Active Tab')
|
|
125
|
+
@tab_screenshot.connect(SIGNAL('triggered()')) { on_tab_screenshot() }
|
|
126
|
+
|
|
127
|
+
@tab_export = Qt::Action.new(tr('E&xport Tab Data Objects'), self)
|
|
128
|
+
@tab_export.statusTip = tr('Export Tab Data Object(s)')
|
|
129
|
+
@tab_export.connect(SIGNAL('triggered()')) { on_tab_export() }
|
|
130
|
+
|
|
131
|
+
@tab_reset = Qt::Action.new(tr('&Reset Tab Data Objects'), self)
|
|
132
|
+
@tab_reset.statusTip = tr('Reset Tab Data Object(s)')
|
|
133
|
+
@tab_reset.connect(SIGNAL('triggered()')) { on_tab_reset() }
|
|
134
|
+
|
|
135
|
+
# Plot Menu Actions
|
|
136
|
+
@plot_add = Qt::Action.new(Cosmos.get_icon('add_plot.png'), tr('&Add Plot'), self)
|
|
137
|
+
@plot_add.statusTip = tr('Add New Plot')
|
|
138
|
+
@plot_add.connect(SIGNAL('triggered()')) { on_plot_add() }
|
|
139
|
+
|
|
140
|
+
@plot_delete = Qt::Action.new(Cosmos.get_icon('delete_plot.png'), tr('&Delete Plot'), self)
|
|
141
|
+
@plot_delete.statusTip = tr('Delete Selected Plot')
|
|
142
|
+
@plot_delete.connect(SIGNAL('triggered()')) { on_plot_delete() }
|
|
143
|
+
|
|
144
|
+
@plot_edit = Qt::Action.new(Cosmos.get_icon('edit_plot.png'), tr('&Edit Plot'), self)
|
|
145
|
+
@plot_edit.statusTip = tr('Edit Selected Plot')
|
|
146
|
+
@plot_edit.connect(SIGNAL('triggered()')) { on_plot_edit() }
|
|
147
|
+
|
|
148
|
+
@plot_screenshot = Qt::Action.new(Cosmos.get_icon('screenshot.png'), tr('&Screenshot Plot'), self)
|
|
149
|
+
@plot_screenshot.statusTip = tr('Screenshot Selected Plot')
|
|
150
|
+
@plot_screenshot.connect(SIGNAL('triggered()')) { on_plot_screenshot() }
|
|
151
|
+
|
|
152
|
+
@plot_add_data = Qt::Action.new(Cosmos.get_icon('add_database.png'), tr('Add Data &Object'), self)
|
|
153
|
+
@plot_add_data.statusTip = tr('Add Data Object')
|
|
154
|
+
@plot_add_data.connect(SIGNAL('triggered()')) { on_data_object_add() }
|
|
155
|
+
|
|
156
|
+
@plot_edit_data = Qt::Action.new(Cosmos.get_icon('edit_database.png'), tr('Edit &Plot Data Objects'), self)
|
|
157
|
+
@plot_edit_data.statusTip = tr('Edit Plot Data Object(s)')
|
|
158
|
+
@plot_edit_data.connect(SIGNAL('triggered()')) { on_plot_data_object_edit() }
|
|
159
|
+
|
|
160
|
+
@plot_export = Qt::Action.new(tr('E&xport Plot Data Objects'), self)
|
|
161
|
+
@plot_export.statusTip = tr('Export Plot Data Object(s)')
|
|
162
|
+
@plot_export.connect(SIGNAL('triggered()')) { on_plot_export() }
|
|
163
|
+
|
|
164
|
+
@plot_reset = Qt::Action.new(tr('&Reset Plot Data Objects'), self)
|
|
165
|
+
@plot_reset.statusTip = tr('Reset Plot Data Object(s)')
|
|
166
|
+
@plot_reset.connect(SIGNAL('triggered()')) { on_plot_reset() }
|
|
167
|
+
|
|
168
|
+
# Data Object Menu
|
|
169
|
+
@data_add = Qt::Action.new(Cosmos.get_icon('add_database.png'), tr('&Add Data Object'), self)
|
|
170
|
+
@data_add.statusTip = tr('Add Data Object')
|
|
171
|
+
@data_add.connect(SIGNAL('triggered()')) { on_data_object_add() }
|
|
172
|
+
|
|
173
|
+
@data_delete = Qt::Action.new(Cosmos.get_icon('delete_database.png'), tr('&Delete Data Object'), self)
|
|
174
|
+
@data_delete.statusTip = tr('Delete Selected Data Object(s)')
|
|
175
|
+
@data_delete.connect(SIGNAL('triggered()')) { on_data_object_delete() }
|
|
176
|
+
|
|
177
|
+
@data_edit = Qt::Action.new(Cosmos.get_icon('edit_database.png'), tr('&Edit Data Object'), self)
|
|
178
|
+
@data_edit.statusTip = tr('Edit Selected Data Object(s)')
|
|
179
|
+
@data_edit.connect(SIGNAL('triggered()')) { on_data_object_edit() }
|
|
180
|
+
|
|
181
|
+
@data_duplicate = Qt::Action.new(tr('Du&plicate Data Object'), self)
|
|
182
|
+
@data_duplicate.statusTip = tr('Duplicate Selected Data Object(s)')
|
|
183
|
+
@data_duplicate.connect(SIGNAL('triggered()')) { on_data_object_duplicate() }
|
|
184
|
+
|
|
185
|
+
@data_export = Qt::Action.new(tr('E&xport Data Object'), self)
|
|
186
|
+
@data_export.statusTip = tr('Export Selected Data Object(s)')
|
|
187
|
+
@data_export.connect(SIGNAL('triggered()')) { on_data_object_export() }
|
|
188
|
+
|
|
189
|
+
@data_export_all = Qt::Action.new(tr('Expor&t All Data Objects'), self)
|
|
190
|
+
@data_export_all.statusTip = tr('Export All Data Objects')
|
|
191
|
+
@data_export_all.connect(SIGNAL('triggered()')) { on_data_object_export_all() }
|
|
192
|
+
|
|
193
|
+
@data_reset = Qt::Action.new(tr('&Reset Data Object'), self)
|
|
194
|
+
@data_reset.statusTip = tr('Reset Selected Data Object(s)')
|
|
195
|
+
@data_reset.connect(SIGNAL('triggered()')) { on_data_object_reset() }
|
|
196
|
+
|
|
197
|
+
@data_reset_all = Qt::Action.new(tr('Re&set All Data Objects'), self)
|
|
198
|
+
@data_reset_all.statusTip = tr('Reset All Data Objects')
|
|
199
|
+
@data_reset_all.connect(SIGNAL('triggered()')) { on_data_object_reset_all() }
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def initialize_menus(options)
|
|
203
|
+
# File Menu
|
|
204
|
+
@file_menu = menuBar.addMenu(tr('&File'))
|
|
205
|
+
@file_menu.addAction(@file_process)
|
|
206
|
+
@file_menu.addSeparator()
|
|
207
|
+
@file_menu.addAction(@file_load)
|
|
208
|
+
@file_menu.addAction(@file_save)
|
|
209
|
+
@file_menu.addSeparator()
|
|
210
|
+
@file_menu.addAction(@file_screenshot)
|
|
211
|
+
@file_menu.addSeparator()
|
|
212
|
+
@file_menu.addAction(@exit_action)
|
|
213
|
+
|
|
214
|
+
@tab_menu = menuBar.addMenu(tr('&Tab'))
|
|
215
|
+
@tab_menu.addAction(@tab_add)
|
|
216
|
+
@tab_menu.addAction(@tab_delete)
|
|
217
|
+
@tab_menu.addAction(@tab_edit)
|
|
218
|
+
@tab_menu.addSeparator()
|
|
219
|
+
@tab_menu.addAction(@tab_screenshot)
|
|
220
|
+
@tab_menu.addAction(@tab_export)
|
|
221
|
+
@tab_menu.addSeparator()
|
|
222
|
+
@tab_menu.addAction(@tab_reset)
|
|
223
|
+
|
|
224
|
+
@plot_menu = menuBar.addMenu(tr('&Plot'))
|
|
225
|
+
@plot_menu.addAction(@plot_add)
|
|
226
|
+
@plot_menu.addAction(@plot_delete)
|
|
227
|
+
@plot_menu.addAction(@plot_edit)
|
|
228
|
+
@plot_menu.addSeparator()
|
|
229
|
+
@plot_menu.addAction(@plot_add_data)
|
|
230
|
+
@plot_menu.addAction(@plot_edit_data)
|
|
231
|
+
@plot_menu.addSeparator()
|
|
232
|
+
@plot_menu.addAction(@plot_screenshot)
|
|
233
|
+
@plot_menu.addAction(@plot_export)
|
|
234
|
+
@plot_menu.addSeparator()
|
|
235
|
+
@plot_menu.addAction(@plot_reset)
|
|
236
|
+
|
|
237
|
+
@data_menu = menuBar.addMenu(tr('&Data Object'))
|
|
238
|
+
@data_menu.addAction(@data_add)
|
|
239
|
+
@data_menu.addAction(@data_delete)
|
|
240
|
+
@data_menu.addAction(@data_edit)
|
|
241
|
+
@data_menu.addSeparator()
|
|
242
|
+
@data_menu.addAction(@data_duplicate)
|
|
243
|
+
@data_menu.addAction(@data_export)
|
|
244
|
+
@data_menu.addAction(@data_export_all)
|
|
245
|
+
@data_menu.addSeparator()
|
|
246
|
+
@data_menu.addAction(@data_reset)
|
|
247
|
+
@data_menu.addAction(@data_reset_all)
|
|
248
|
+
|
|
249
|
+
# Help Menu
|
|
250
|
+
@about_string = options.about_string
|
|
251
|
+
initialize_help_menu()
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def initialize_central_widget
|
|
255
|
+
# Create a splitter to break application into to halves
|
|
256
|
+
@splitter = Qt::Splitter.new(Qt::Horizontal, central_widget)
|
|
257
|
+
setCentralWidget(@splitter)
|
|
258
|
+
|
|
259
|
+
# Create a Vertical Frame for the left contents
|
|
260
|
+
@left_widget = Qt::Widget.new(self)
|
|
261
|
+
@left_frame = Qt::VBoxLayout.new
|
|
262
|
+
@left_widget.setLayout(@left_frame)
|
|
263
|
+
@splitter.addWidget(@left_widget)
|
|
264
|
+
|
|
265
|
+
# Create a Vertical Frame for the right contents
|
|
266
|
+
@right_widget = Qt::Widget.new(self)
|
|
267
|
+
@right_frame = Qt::VBoxLayout.new
|
|
268
|
+
@right_widget.setLayout(@right_frame)
|
|
269
|
+
@splitter.addWidget(@right_widget)
|
|
270
|
+
@splitter.setStretchFactor(0,0) # Set the left side stretch factor to 0
|
|
271
|
+
@splitter.setStretchFactor(1,1) # Set the right side stretch factor to 1 to give it priority for space
|
|
272
|
+
|
|
273
|
+
# Realtime Button Bar
|
|
274
|
+
@realtime_button_bar = RealtimeButtonBar.new(self, Qt::Vertical)
|
|
275
|
+
@realtime_button_bar.start_callback = method(:handle_start)
|
|
276
|
+
@realtime_button_bar.pause_callback = method(:handle_pause)
|
|
277
|
+
@realtime_button_bar.stop_callback = method(:handle_stop)
|
|
278
|
+
@realtime_button_bar.state = 'Stopped'
|
|
279
|
+
@left_frame.addWidget(@realtime_button_bar)
|
|
280
|
+
|
|
281
|
+
# Separator after RBB
|
|
282
|
+
@sep = Qt::Frame.new
|
|
283
|
+
@sep.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
|
|
284
|
+
@left_frame.addWidget(@sep)
|
|
285
|
+
end # def initialize
|
|
286
|
+
|
|
287
|
+
protected
|
|
288
|
+
|
|
289
|
+
###############################################################################
|
|
290
|
+
# Protected Methods Used During Initialization
|
|
291
|
+
###############################################################################
|
|
292
|
+
|
|
293
|
+
# Loads in a new configuration file
|
|
294
|
+
def load_configuration
|
|
295
|
+
# Shutdown TabbedPlots if one already exists
|
|
296
|
+
@tabbed_plots.shutdown if @tabbed_plots
|
|
297
|
+
|
|
298
|
+
if @items && !@items.empty?
|
|
299
|
+
# Don't use config file and handle items passed in from the command line
|
|
300
|
+
@tabbed_plots_config = TabbedPlotsConfig.new(nil,
|
|
301
|
+
@plot_types,
|
|
302
|
+
@data_object_types,
|
|
303
|
+
@plot_type_to_data_object_type_mapping)
|
|
304
|
+
handle_items()
|
|
305
|
+
else
|
|
306
|
+
# Create new tabbed plots definition from config file
|
|
307
|
+
@tabbed_plots_config = TabbedPlotsConfig.new(@config_filename,
|
|
308
|
+
@plot_types,
|
|
309
|
+
@data_object_types,
|
|
310
|
+
@plot_type_to_data_object_type_mapping)
|
|
311
|
+
end
|
|
312
|
+
@config_modified = false
|
|
313
|
+
|
|
314
|
+
# Handle configuration errors
|
|
315
|
+
unless @tabbed_plots_config.configuration_errors.empty?
|
|
316
|
+
ExceptionListDialog.new('Errors Encountered in Configuration File:',
|
|
317
|
+
@tabbed_plots_config.configuration_errors)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Add a TabbedPlots widget to show all the plots
|
|
321
|
+
if @tabbed_plots
|
|
322
|
+
@tabbed_plots.config_modified_callback = nil
|
|
323
|
+
else
|
|
324
|
+
# Require tabbed plots file
|
|
325
|
+
tabbed_plots_filename = @tabbed_plots_type + '_tabbed_plots.rb'
|
|
326
|
+
tabbed_plots_class = Cosmos.require_class(tabbed_plots_filename)
|
|
327
|
+
@tabbed_plots = tabbed_plots_class.new(self, @left_frame, @right_frame, statusBar)
|
|
328
|
+
@tabbed_plots.tab_item_right_button_release_callback = method(:handle_tab_right_click)
|
|
329
|
+
@tabbed_plots.plot_right_button_release_callback = method(:handle_plot_right_click)
|
|
330
|
+
@tabbed_plots.data_object_right_button_release_callback = method(:handle_data_object_right_click)
|
|
331
|
+
end
|
|
332
|
+
@tabbed_plots.startup(@tabbed_plots_config, @adder_orientation, @adder_types)
|
|
333
|
+
@tabbed_plots.config_modified_callback = method(:handle_config_modified)
|
|
334
|
+
@tabbed_plots.pause
|
|
335
|
+
|
|
336
|
+
# Start realtime collection if given an item or told to start
|
|
337
|
+
if (@items and not @items.empty?) or @start
|
|
338
|
+
handle_start()
|
|
339
|
+
@items = nil
|
|
340
|
+
@start = false
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
if !File.exist?(@config_filename)
|
|
344
|
+
# Warn if the configuration file did not exist
|
|
345
|
+
statusBar.showMessage(tr("Configuration File does not exist: #{@config_filename}. Using default configuration."))
|
|
346
|
+
end
|
|
347
|
+
update_window_title()
|
|
348
|
+
end # def load_configuration
|
|
349
|
+
|
|
350
|
+
def update_window_title
|
|
351
|
+
if File.exist?(@config_filename)
|
|
352
|
+
if @config_modified
|
|
353
|
+
self.windowTitle = @base_title + ' - ' + @config_filename + '*'
|
|
354
|
+
else
|
|
355
|
+
self.windowTitle = @base_title + ' - ' + @config_filename
|
|
356
|
+
end
|
|
357
|
+
else
|
|
358
|
+
self.windowTitle = @base_title
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# Override this method to handle items passed in from command line
|
|
363
|
+
def handle_items
|
|
364
|
+
# Do nothing by default
|
|
365
|
+
end # def handle_items
|
|
366
|
+
|
|
367
|
+
def screenshot
|
|
368
|
+
screenshot_filename = File.join(@screenshot_dir,
|
|
369
|
+
File.build_timestamped_filename([@tool_short_name, 'screenshot'], '.png'))
|
|
370
|
+
filename = Qt::FileDialog::getSaveFileName(self,
|
|
371
|
+
"Save Screen Shot",
|
|
372
|
+
screenshot_filename,
|
|
373
|
+
"Screenshots (*.png);;All Files (*)")
|
|
374
|
+
unless filename.nil? or filename.empty?
|
|
375
|
+
Qt.execute_in_main_thread(true) do
|
|
376
|
+
begin
|
|
377
|
+
yield filename
|
|
378
|
+
@screenshot_dir = File.dirname(filename)
|
|
379
|
+
statusBar.showMessage(tr("Screenshot saved to: #{filename}"))
|
|
380
|
+
rescue Exception => error
|
|
381
|
+
statusBar.showMessage(tr("Screenshot creation failed"))
|
|
382
|
+
Qt::MessageBox.warning(
|
|
383
|
+
self,
|
|
384
|
+
"Screenshot Creation Error",
|
|
385
|
+
"Could not create file: #{filename}\n#{error.class} : #{error.message}")
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def export
|
|
392
|
+
export_filename = File.join(@export_dir,
|
|
393
|
+
File.build_timestamped_filename([@tool_short_name, 'export'], '.txt'))
|
|
394
|
+
filename = Qt::FileDialog::getSaveFileName(self,
|
|
395
|
+
"Export Filename",
|
|
396
|
+
export_filename,
|
|
397
|
+
"Export Files (*.txt);;All Files (*)")
|
|
398
|
+
unless filename.nil? or filename.empty?
|
|
399
|
+
filename << '.txt' if File.extname(filename).empty?
|
|
400
|
+
begin
|
|
401
|
+
ProgressDialog.execute(self, "Export Progress", 500, 100, true, false, true, true, true) do |dialog|
|
|
402
|
+
yield filename, dialog
|
|
403
|
+
dialog.append_text("\n\nExported to #{filename}")
|
|
404
|
+
dialog.set_overall_progress(1.0)
|
|
405
|
+
dialog.complete
|
|
406
|
+
end
|
|
407
|
+
@export_dir = File.dirname(filename)
|
|
408
|
+
statusBar.showMessage(tr("Exported to #{filename}"))
|
|
409
|
+
rescue Exception => error
|
|
410
|
+
statusBar.showMessage(tr("Export Failed"))
|
|
411
|
+
Qt::MessageBox.warning(
|
|
412
|
+
self,
|
|
413
|
+
"Export Error",
|
|
414
|
+
"Could not create file: #{filename}\n#{error.class} : #{error.message}")
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def reset_or_delete(item, delete)
|
|
420
|
+
action = "reset"
|
|
421
|
+
action = "delete" if delete
|
|
422
|
+
result = Qt::MessageBox.warning(self,
|
|
423
|
+
'Warning!',
|
|
424
|
+
"Are you sure you want to #{action} the #{item}?",
|
|
425
|
+
Qt::MessageBox::Yes | Qt::MessageBox::No,
|
|
426
|
+
Qt::MessageBox::No)
|
|
427
|
+
if result == Qt::MessageBox::Yes
|
|
428
|
+
yield
|
|
429
|
+
@config_modified = true if delete
|
|
430
|
+
update_window_title() if delete
|
|
431
|
+
statusBar.showMessage(tr("#{action.capitalize} #{item} successful"))
|
|
432
|
+
else
|
|
433
|
+
statusBar.showMessage(tr("#{action.capitalize} #{item} cancelled"))
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
def reset(item)
|
|
437
|
+
reset_or_delete(item, false) do
|
|
438
|
+
yield
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
def delete(item)
|
|
442
|
+
reset_or_delete(item, true) do
|
|
443
|
+
yield
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
###############################################################################
|
|
448
|
+
# Application Close Handler
|
|
449
|
+
###############################################################################
|
|
450
|
+
|
|
451
|
+
# Prompts for save if the current configuration has been modified
|
|
452
|
+
def prompt_for_save_if_needed
|
|
453
|
+
safe_to_continue = true
|
|
454
|
+
if @config_modified and File.exist?(@config_filename)
|
|
455
|
+
case Qt::MessageBox.question(
|
|
456
|
+
self, # parent
|
|
457
|
+
'Save?', # title
|
|
458
|
+
"Save changes to '#{@config_filename}'?", # text
|
|
459
|
+
Qt::MessageBox::Yes | Qt::MessageBox::No | Qt::MessageBox::Cancel, # buttons
|
|
460
|
+
Qt::MessageBox::Cancel) # default button
|
|
461
|
+
when Qt::MessageBox::Cancel
|
|
462
|
+
safe_to_continue = false
|
|
463
|
+
when Qt::MessageBox::Yes
|
|
464
|
+
saved = on_file_save_config()
|
|
465
|
+
if not saved
|
|
466
|
+
safe_to_continue = false
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
return safe_to_continue
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
# Handles application window closing
|
|
474
|
+
def closeEvent(event)
|
|
475
|
+
if prompt_for_save_if_needed()
|
|
476
|
+
super(event)
|
|
477
|
+
@realtime_thread.kill if @realtime_thread
|
|
478
|
+
@realtime_thread = nil
|
|
479
|
+
else
|
|
480
|
+
event.ignore()
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
###############################################################################
|
|
485
|
+
# File Menu Handlers
|
|
486
|
+
###############################################################################
|
|
487
|
+
|
|
488
|
+
# Handles processing log files
|
|
489
|
+
def on_file_process_log
|
|
490
|
+
paused = @tabbed_plots.paused?
|
|
491
|
+
@tabbed_plots.pause
|
|
492
|
+
dialog = PacketLogDialog.new(self,
|
|
493
|
+
'Process Log File(s):',
|
|
494
|
+
@log_dir,
|
|
495
|
+
@packet_log_reader,
|
|
496
|
+
@log_filenames)
|
|
497
|
+
dialog.time_start = @time_start
|
|
498
|
+
dialog.time_end = @time_end
|
|
499
|
+
result = dialog.exec
|
|
500
|
+
if result != 0
|
|
501
|
+
@time_start = dialog.time_start
|
|
502
|
+
@time_end = dialog.time_end
|
|
503
|
+
handle_stop()
|
|
504
|
+
System.telemetry.reset
|
|
505
|
+
@tabbed_plots.reset_all_data_objects
|
|
506
|
+
@realtime_button_bar.state = 'Log File'
|
|
507
|
+
@packet_log_reader = dialog.packet_log_reader
|
|
508
|
+
@log_filenames = dialog.filenames.clone
|
|
509
|
+
filenames = dialog.filenames.sort
|
|
510
|
+
|
|
511
|
+
ProgressDialog.execute(self, 'Log File Progress', 500, 300) do |progress_dialog|
|
|
512
|
+
logfile_thread = TabbedPlotsLogfileThread.new(filenames,
|
|
513
|
+
@packet_log_reader,
|
|
514
|
+
@tabbed_plots_config,
|
|
515
|
+
progress_dialog,
|
|
516
|
+
@time_start,
|
|
517
|
+
@time_end)
|
|
518
|
+
sleep(0.1) until logfile_thread.done?
|
|
519
|
+
progress_dialog.close_done
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
@tabbed_plots.redraw_plots(true, true)
|
|
523
|
+
@tabbed_plots.update
|
|
524
|
+
else
|
|
525
|
+
@tabbed_plots.resume unless paused
|
|
526
|
+
end
|
|
527
|
+
dialog.dispose
|
|
528
|
+
end # def on_file_process_log
|
|
529
|
+
|
|
530
|
+
# Handles loading a configuration file
|
|
531
|
+
def on_file_load_config
|
|
532
|
+
paused = @tabbed_plots.paused?
|
|
533
|
+
@tabbed_plots.pause
|
|
534
|
+
|
|
535
|
+
if prompt_for_save_if_needed()
|
|
536
|
+
filename = Qt::FileDialog.getOpenFileName(self,
|
|
537
|
+
"Load Configuration",
|
|
538
|
+
@config_filename,
|
|
539
|
+
"Config File (*.txt);;All Files (*)")
|
|
540
|
+
if filename and not filename.empty?
|
|
541
|
+
@config_filename = filename
|
|
542
|
+
if @realtime_thread then running = true else running = false end
|
|
543
|
+
handle_stop()
|
|
544
|
+
load_configuration()
|
|
545
|
+
handle_start() if running
|
|
546
|
+
handle_pause() if paused
|
|
547
|
+
else
|
|
548
|
+
@tabbed_plots.resume unless paused
|
|
549
|
+
end
|
|
550
|
+
end
|
|
551
|
+
end # def on_file_load_config
|
|
552
|
+
|
|
553
|
+
# Handles saving the current configuration to a file
|
|
554
|
+
def on_file_save_config
|
|
555
|
+
saved = false
|
|
556
|
+
paused = @tabbed_plots.paused?
|
|
557
|
+
@tabbed_plots.pause
|
|
558
|
+
filename = Qt::FileDialog.getSaveFileName(self,
|
|
559
|
+
"Save Configuration",
|
|
560
|
+
@config_filename,
|
|
561
|
+
"Config File (*.txt);;All Files (*)")
|
|
562
|
+
if filename and not filename.empty?
|
|
563
|
+
filename << '.txt' if File.extname(filename).empty?
|
|
564
|
+
File.open(filename, 'w') {|file| file.write(@tabbed_plots_config.configuration_string)}
|
|
565
|
+
@config_filename = filename
|
|
566
|
+
@config_modified = false
|
|
567
|
+
update_window_title()
|
|
568
|
+
saved = true
|
|
569
|
+
end
|
|
570
|
+
@tabbed_plots.resume unless paused
|
|
571
|
+
return saved
|
|
572
|
+
end # def on_file_save_config
|
|
573
|
+
|
|
574
|
+
# Handles taking a screenshot of the tool
|
|
575
|
+
def on_file_screenshot
|
|
576
|
+
paused = @tabbed_plots.paused?
|
|
577
|
+
@tabbed_plots.pause
|
|
578
|
+
screenshot do |filename|
|
|
579
|
+
Screenshot.screenshot_window(self, filename)
|
|
580
|
+
end
|
|
581
|
+
@tabbed_plots.resume unless paused
|
|
582
|
+
end # def on_file_screenshot
|
|
583
|
+
|
|
584
|
+
###############################################################################
|
|
585
|
+
# Tab Menu Handlers
|
|
586
|
+
###############################################################################
|
|
587
|
+
|
|
588
|
+
# Common method to check for the existance of a tab before yielding
|
|
589
|
+
def tab_selected?
|
|
590
|
+
paused = @tabbed_plots.paused?
|
|
591
|
+
@tabbed_plots.pause
|
|
592
|
+
if @tabbed_plots.current_tab_index
|
|
593
|
+
yield
|
|
594
|
+
else
|
|
595
|
+
Qt::MessageBox.information(self, 'Info', "No tabs exist")
|
|
596
|
+
end
|
|
597
|
+
@tabbed_plots.resume unless paused
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
# Handles adding a new tab
|
|
601
|
+
def on_tab_add
|
|
602
|
+
paused = @tabbed_plots.paused?
|
|
603
|
+
@tabbed_plots.pause
|
|
604
|
+
@tabbed_plots.add_tab
|
|
605
|
+
statusBar.showMessage(tr("Tab Added"))
|
|
606
|
+
@config_modified = true
|
|
607
|
+
update_window_title()
|
|
608
|
+
@tabbed_plots.resume unless paused
|
|
609
|
+
end # def on_tab_add
|
|
610
|
+
|
|
611
|
+
# Handles deleting the current tab
|
|
612
|
+
def on_tab_delete
|
|
613
|
+
tab_selected? do
|
|
614
|
+
delete("tab") do
|
|
615
|
+
@tabbed_plots.delete_tab
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
end # def on_tab_delete
|
|
619
|
+
|
|
620
|
+
# Handles editing the current tab
|
|
621
|
+
def on_tab_edit
|
|
622
|
+
tab_selected? do
|
|
623
|
+
edited = @tabbed_plots.edit_tab
|
|
624
|
+
if edited
|
|
625
|
+
statusBar.showMessage(tr("Tab Edited"))
|
|
626
|
+
@config_modified = true
|
|
627
|
+
update_window_title()
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
end # def on_tab_edit
|
|
631
|
+
|
|
632
|
+
# Handles taking a screenshot of the current tab
|
|
633
|
+
def on_tab_screenshot
|
|
634
|
+
tab_selected? do
|
|
635
|
+
screenshot do |filename|
|
|
636
|
+
@tabbed_plots.screenshot_tab(filename)
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
# Handles exporting all data objects on the current tab
|
|
642
|
+
def on_tab_export
|
|
643
|
+
tab_selected? do
|
|
644
|
+
if @tabbed_plots.tab_has_data_objects?
|
|
645
|
+
export do |filename, progress_dialog|
|
|
646
|
+
@tabbed_plots.export_tab(filename, progress_dialog)
|
|
647
|
+
end
|
|
648
|
+
else
|
|
649
|
+
Qt::MessageBox.information(self, 'Info', "No data objects exist on this tab")
|
|
650
|
+
end
|
|
651
|
+
end
|
|
652
|
+
end # def on_tab_export
|
|
653
|
+
|
|
654
|
+
# Handles reseting all data objects on the current tab
|
|
655
|
+
def on_tab_reset
|
|
656
|
+
tab_selected? do
|
|
657
|
+
reset("data objects on the current tab") do
|
|
658
|
+
@tabbed_plots.reset_tab
|
|
659
|
+
end
|
|
660
|
+
end
|
|
661
|
+
end # def on_tab_reset
|
|
662
|
+
|
|
663
|
+
###############################################################################
|
|
664
|
+
# Plot Menu Handlers
|
|
665
|
+
###############################################################################
|
|
666
|
+
|
|
667
|
+
# Common method to check for a selected plot before yielding
|
|
668
|
+
def plot_selected?
|
|
669
|
+
paused = @tabbed_plots.paused?
|
|
670
|
+
@tabbed_plots.pause
|
|
671
|
+
if @tabbed_plots.selected_plot_index
|
|
672
|
+
yield
|
|
673
|
+
else
|
|
674
|
+
Qt::MessageBox.information(self, 'Info', "Please select a plot")
|
|
675
|
+
end
|
|
676
|
+
@tabbed_plots.resume unless paused
|
|
677
|
+
end
|
|
678
|
+
|
|
679
|
+
# Common method to check for the existance of data objects before yielding
|
|
680
|
+
def plot_data_objects?
|
|
681
|
+
if @tabbed_plots.plot_has_data_objects?
|
|
682
|
+
yield
|
|
683
|
+
else
|
|
684
|
+
Qt::MessageBox.information(self, 'Info', "No data objects exist on this plot")
|
|
685
|
+
end
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
# Handles adding a new plot to the current tab
|
|
689
|
+
def on_plot_add
|
|
690
|
+
paused = @tabbed_plots.paused?
|
|
691
|
+
@tabbed_plots.pause
|
|
692
|
+
added = @tabbed_plots.add_plot
|
|
693
|
+
if added
|
|
694
|
+
@config_modified = true
|
|
695
|
+
update_window_title()
|
|
696
|
+
end
|
|
697
|
+
@tabbed_plots.resume unless paused
|
|
698
|
+
end # def on_plot_add
|
|
699
|
+
|
|
700
|
+
# Handles deleting the selected plot
|
|
701
|
+
def on_plot_delete
|
|
702
|
+
plot_selected? do
|
|
703
|
+
delete("plot") do
|
|
704
|
+
@tabbed_plots.delete_plot
|
|
705
|
+
end
|
|
706
|
+
end
|
|
707
|
+
end # def on_plot_delete
|
|
708
|
+
|
|
709
|
+
# Handles editing the selected plot
|
|
710
|
+
def on_plot_edit
|
|
711
|
+
plot_selected? do
|
|
712
|
+
edited = @tabbed_plots.edit_plot
|
|
713
|
+
if edited
|
|
714
|
+
@config_modified = true
|
|
715
|
+
update_window_title()
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
end # def on_plot_edit
|
|
719
|
+
|
|
720
|
+
# Handles taking a screenshot of the selected plot
|
|
721
|
+
def on_plot_screenshot
|
|
722
|
+
plot_selected? do
|
|
723
|
+
screenshot do |filename|
|
|
724
|
+
@tabbed_plots.screenshot_plot(filename)
|
|
725
|
+
end
|
|
726
|
+
end
|
|
727
|
+
end # def on_plot_screenshot
|
|
728
|
+
|
|
729
|
+
def on_plot_data_object_edit
|
|
730
|
+
edited = false
|
|
731
|
+
plot_selected? do
|
|
732
|
+
plot_data_objects? do
|
|
733
|
+
tab_index = @tabbed_plots.current_tab_index
|
|
734
|
+
plot_index = @tabbed_plots.selected_plot_index
|
|
735
|
+
@tabbed_plots_config.tabs[tab_index].plots[plot_index].data_objects.each_with_index do |object, index|
|
|
736
|
+
edited |= @tabbed_plots.edit_data_object(tab_index, plot_index, index)
|
|
737
|
+
end
|
|
738
|
+
if edited
|
|
739
|
+
@config_modified = true
|
|
740
|
+
update_window_title()
|
|
741
|
+
end
|
|
742
|
+
end
|
|
743
|
+
end
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
# Handles exporting the data objects on the selected plot
|
|
747
|
+
def on_plot_export
|
|
748
|
+
plot_selected? do
|
|
749
|
+
plot_data_objects? do
|
|
750
|
+
export do |filename, progress_dialog|
|
|
751
|
+
@tabbed_plots.export_plot(filename, progress_dialog)
|
|
752
|
+
end
|
|
753
|
+
end
|
|
754
|
+
end
|
|
755
|
+
end # def on_plot_export
|
|
756
|
+
|
|
757
|
+
# Handles reseting the data objects on the selected plot
|
|
758
|
+
def on_plot_reset
|
|
759
|
+
plot_selected? do
|
|
760
|
+
plot_data_objects? do
|
|
761
|
+
reset("data objects on the selected plot") do
|
|
762
|
+
@tabbed_plots.reset_plot
|
|
763
|
+
end
|
|
764
|
+
end
|
|
765
|
+
end
|
|
766
|
+
end # def on_plot_reset
|
|
767
|
+
|
|
768
|
+
###############################################################################
|
|
769
|
+
# Data Object Menu Handlers
|
|
770
|
+
###############################################################################
|
|
771
|
+
|
|
772
|
+
def data_objects_selected?
|
|
773
|
+
paused = @tabbed_plots.paused?
|
|
774
|
+
@tabbed_plots.pause
|
|
775
|
+
unless @tabbed_plots.selected_data_object_indexes.empty?
|
|
776
|
+
yield
|
|
777
|
+
else
|
|
778
|
+
Qt::MessageBox.information(self, 'Information', "Please select one or more data objects")
|
|
779
|
+
end
|
|
780
|
+
@tabbed_plots.resume unless paused
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
def data_objects_exist?
|
|
784
|
+
paused = @tabbed_plots.paused?
|
|
785
|
+
@tabbed_plots.pause
|
|
786
|
+
if @tabbed_plots.plot_has_data_objects?
|
|
787
|
+
yield
|
|
788
|
+
else
|
|
789
|
+
Qt::MessageBox.information(self, 'Information', "No data objects exist on this plot")
|
|
790
|
+
end
|
|
791
|
+
@tabbed_plots.resume unless paused
|
|
792
|
+
end
|
|
793
|
+
|
|
794
|
+
# Handles adding a data object to the selected plot
|
|
795
|
+
def on_data_object_add
|
|
796
|
+
paused = @tabbed_plots.paused?
|
|
797
|
+
@tabbed_plots.pause
|
|
798
|
+
added = @tabbed_plots.add_data_object
|
|
799
|
+
if added
|
|
800
|
+
@config_modified = true
|
|
801
|
+
update_window_title()
|
|
802
|
+
end
|
|
803
|
+
@tabbed_plots.resume unless paused
|
|
804
|
+
end # def on_data_object_add
|
|
805
|
+
|
|
806
|
+
# Handles editing the selected data object(s)
|
|
807
|
+
def on_data_object_edit
|
|
808
|
+
data_objects_selected? do
|
|
809
|
+
edited = @tabbed_plots.edit_data_object
|
|
810
|
+
if edited
|
|
811
|
+
@config_modified = true
|
|
812
|
+
update_window_title()
|
|
813
|
+
end
|
|
814
|
+
end
|
|
815
|
+
end # def on_data_object_edit
|
|
816
|
+
|
|
817
|
+
# Handles duplicating the selected data object(s)
|
|
818
|
+
def on_data_object_duplicate
|
|
819
|
+
data_objects_selected? do
|
|
820
|
+
@tabbed_plots.duplicate_data_object
|
|
821
|
+
@config_modified = true
|
|
822
|
+
update_window_title()
|
|
823
|
+
end
|
|
824
|
+
end # def on_data_object_duplicate
|
|
825
|
+
|
|
826
|
+
# Handles deleting the selected data object(s)
|
|
827
|
+
def on_data_object_delete
|
|
828
|
+
data_objects_selected? do
|
|
829
|
+
delete("selected data object(s)") do
|
|
830
|
+
@tabbed_plots.delete_data_object
|
|
831
|
+
end
|
|
832
|
+
end
|
|
833
|
+
end # def on_data_object_delete
|
|
834
|
+
|
|
835
|
+
# Handles exporting the selected data object(s)
|
|
836
|
+
def on_data_object_export
|
|
837
|
+
data_objects_selected? do
|
|
838
|
+
export do |filename, progress_dialog|
|
|
839
|
+
@tabbed_plots.export_data_object(filename, progress_dialog)
|
|
840
|
+
end
|
|
841
|
+
end
|
|
842
|
+
end # def on_data_object_export
|
|
843
|
+
|
|
844
|
+
# Handles exporting all data objects
|
|
845
|
+
def on_data_object_export_all
|
|
846
|
+
data_objects_exist? do
|
|
847
|
+
export do |filename, progress_dialog|
|
|
848
|
+
@tabbed_plots.export_all_data_objects(filename, progress_dialog)
|
|
849
|
+
end
|
|
850
|
+
end
|
|
851
|
+
end # def on_data_object_export_all
|
|
852
|
+
|
|
853
|
+
# Handles reseting the selected data object(s)
|
|
854
|
+
def on_data_object_reset
|
|
855
|
+
data_objects_selected? do
|
|
856
|
+
reset("selected data objects") do
|
|
857
|
+
@tabbed_plots.reset_data_object
|
|
858
|
+
end
|
|
859
|
+
end
|
|
860
|
+
end # def on_data_object_reset
|
|
861
|
+
|
|
862
|
+
# Handles reseting all data objects
|
|
863
|
+
def on_data_object_reset_all
|
|
864
|
+
data_objects_exist? do
|
|
865
|
+
reset("all data objects") do
|
|
866
|
+
@tabbed_plots.reset_all_data_objects
|
|
867
|
+
end
|
|
868
|
+
end
|
|
869
|
+
end # def on_data_object_reset_all
|
|
870
|
+
|
|
871
|
+
###############################################################################
|
|
872
|
+
# Right-Click Handlers
|
|
873
|
+
###############################################################################
|
|
874
|
+
|
|
875
|
+
# Handles right clicking for tabs
|
|
876
|
+
def handle_tab_right_click(point)
|
|
877
|
+
# Popup menu
|
|
878
|
+
@tab_menu.exec(point)
|
|
879
|
+
end # def handle_tab_right_click
|
|
880
|
+
|
|
881
|
+
# Handles right clicking for plots
|
|
882
|
+
def handle_plot_right_click(point)
|
|
883
|
+
# Popup menu
|
|
884
|
+
@plot_menu.exec(point)
|
|
885
|
+
end # def handle_plot_right_click
|
|
886
|
+
|
|
887
|
+
# Handles right clicking for data objects
|
|
888
|
+
def handle_data_object_right_click(point)
|
|
889
|
+
# Popup menu
|
|
890
|
+
@data_menu.exec(point)
|
|
891
|
+
end # def handle_data_object_right_click
|
|
892
|
+
|
|
893
|
+
###############################################################################
|
|
894
|
+
# Other Tabbed Plots Handlers
|
|
895
|
+
###############################################################################
|
|
896
|
+
|
|
897
|
+
def handle_config_modified
|
|
898
|
+
@config_modified = true
|
|
899
|
+
update_window_title()
|
|
900
|
+
end
|
|
901
|
+
|
|
902
|
+
###############################################################################
|
|
903
|
+
# Realtime Button Bar Button Handlers
|
|
904
|
+
###############################################################################
|
|
905
|
+
|
|
906
|
+
# Handle start button
|
|
907
|
+
def handle_start
|
|
908
|
+
if @realtime_thread
|
|
909
|
+
# Resume plotting in case it was paused
|
|
910
|
+
@tabbed_plots.resume
|
|
911
|
+
statusBar.showMessage(tr("Plot Updates Resumed"))
|
|
912
|
+
@realtime_button_bar.state = 'Running'
|
|
913
|
+
else
|
|
914
|
+
System.load_configuration
|
|
915
|
+
if @realtime_button_bar.state == 'Log File'
|
|
916
|
+
System.telemetry.reset
|
|
917
|
+
@tabbed_plots.reset_all_data_objects
|
|
918
|
+
end
|
|
919
|
+
@tabbed_plots.resume
|
|
920
|
+
|
|
921
|
+
# Startup realtime thread
|
|
922
|
+
@realtime_button_bar.state = 'Connecting'
|
|
923
|
+
statusBar.showMessage(tr("Connecting to COSMOS Server"))
|
|
924
|
+
@realtime_thread = TabbedPlotsRealtimeThread.new(@tabbed_plots_config, method(:realtime_thread_connection_success_callback), method(:realtime_thread_connection_failed_callback), method(:realtime_thread_connection_lost_callback), method(:realtime_thread_fatal_exception_callback))
|
|
925
|
+
end
|
|
926
|
+
end # def handle_start
|
|
927
|
+
|
|
928
|
+
# Handle pause button
|
|
929
|
+
def handle_pause
|
|
930
|
+
if @realtime_thread
|
|
931
|
+
# Pause plotting
|
|
932
|
+
@tabbed_plots.pause
|
|
933
|
+
statusBar.showMessage(tr("Plot Updates Paused - Still Collecting Data in the Background"))
|
|
934
|
+
@realtime_button_bar.state = 'Paused'
|
|
935
|
+
else
|
|
936
|
+
# Do Nothing
|
|
937
|
+
end
|
|
938
|
+
end # def handle_pause
|
|
939
|
+
|
|
940
|
+
# Handle stop button
|
|
941
|
+
def handle_stop
|
|
942
|
+
@tabbed_plots.pause
|
|
943
|
+
if @realtime_thread
|
|
944
|
+
# Kill realtime thread
|
|
945
|
+
@realtime_thread.kill
|
|
946
|
+
@realtime_thread = nil
|
|
947
|
+
@realtime_button_bar.state = 'Stopped'
|
|
948
|
+
statusBar.showMessage(tr("Disconnection from COSMOS Server Successful"))
|
|
949
|
+
else
|
|
950
|
+
# Do Nothing
|
|
951
|
+
end
|
|
952
|
+
end # def handle_stop
|
|
953
|
+
|
|
954
|
+
###############################################################################
|
|
955
|
+
# Realtime Thread Callbacks - Not executed in GUI context - No Direct GUI
|
|
956
|
+
# interaction allowed!
|
|
957
|
+
###############################################################################
|
|
958
|
+
|
|
959
|
+
# Handle succesful realtime thread connection
|
|
960
|
+
def realtime_thread_connection_success_callback
|
|
961
|
+
# Notify user of connection success
|
|
962
|
+
Qt.execute_in_main_thread(true) do
|
|
963
|
+
statusBar.showMessage(tr("Connection to COSMOS Server Successful"))
|
|
964
|
+
if @tabbed_plots.paused?
|
|
965
|
+
@realtime_button_bar.state = 'Paused'
|
|
966
|
+
else
|
|
967
|
+
@realtime_button_bar.state = 'Running'
|
|
968
|
+
end
|
|
969
|
+
end
|
|
970
|
+
end # def realtime_thread_connection_success_callback
|
|
971
|
+
|
|
972
|
+
# Handle realtime thread connection failure
|
|
973
|
+
def realtime_thread_connection_failed_callback(error)
|
|
974
|
+
# Notify user connection failed
|
|
975
|
+
Qt.execute_in_main_thread(true) do
|
|
976
|
+
statusBar.showMessage(tr("Connection to COSMOS Server Failed : #{error.class} : #{error.message}"))
|
|
977
|
+
@realtime_button_bar.state = 'Connecting'
|
|
978
|
+
end
|
|
979
|
+
end # def realtime_thread_connection_failed_callback
|
|
980
|
+
|
|
981
|
+
# Handle realtime thread connection lost
|
|
982
|
+
def realtime_thread_connection_lost_callback(error)
|
|
983
|
+
# Notify user of connection lost
|
|
984
|
+
if error
|
|
985
|
+
Qt.execute_in_main_thread(true) do
|
|
986
|
+
statusBar.showMessage(tr("Connection to COSMOS Server Lost : #{error.class} : #{error.message}"))
|
|
987
|
+
@realtime_button_bar.state = 'Connecting'
|
|
988
|
+
end
|
|
989
|
+
else
|
|
990
|
+
Qt.execute_in_main_thread(true) do
|
|
991
|
+
statusBar.showMessage(tr("Connection to COSMOS Server Lost"))
|
|
992
|
+
@realtime_button_bar.state = 'Connecting'
|
|
993
|
+
end
|
|
994
|
+
end
|
|
995
|
+
end # def realtime_thread_connection_lost_callback
|
|
996
|
+
|
|
997
|
+
# Handle realtime thread fatal exception
|
|
998
|
+
def realtime_thread_fatal_exception_callback(error)
|
|
999
|
+
Cosmos.handle_fatal_exception(error)
|
|
1000
|
+
end # def realtime_thread_fatal_exception_callback
|
|
1001
|
+
|
|
1002
|
+
end # class TabbedPlotsTool
|
|
1003
|
+
|
|
1004
|
+
end # module Cosmos
|