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,66 +1,66 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos/tools/cmd_tlm_server/interface_thread'
|
|
12
|
-
|
|
13
|
-
module Cosmos
|
|
14
|
-
|
|
15
|
-
# Overrides the packet handling method in InterfaceThread to sends all
|
|
16
|
-
# packets to {Commanding#send_command_to_interface}
|
|
17
|
-
class RouterThread < InterfaceThread
|
|
18
|
-
|
|
19
|
-
protected
|
|
20
|
-
|
|
21
|
-
def handle_packet(packet)
|
|
22
|
-
# Start out assuming we will route to all associated interfaces
|
|
23
|
-
interfaces = @interface.interfaces
|
|
24
|
-
|
|
25
|
-
# Identified packets we may handle differently...
|
|
26
|
-
if packet.identified?
|
|
27
|
-
target = System.targets[packet.target_name.upcase]
|
|
28
|
-
if target
|
|
29
|
-
if target.interface
|
|
30
|
-
# If target exists and has an interface we will only send the packet to that interface
|
|
31
|
-
interfaces = [target.interface]
|
|
32
|
-
else
|
|
33
|
-
# If target exists and has no interface we will not send the packet anywhere
|
|
34
|
-
interfaces = []
|
|
35
|
-
Logger.warn "Received command for target with no interface: #{packet.target_name} #{packet.packet_name}"
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Make sure identified packet exists
|
|
40
|
-
begin
|
|
41
|
-
System.commands.packet(packet.target_name, packet.packet_name)
|
|
42
|
-
rescue
|
|
43
|
-
Logger.warn "Received unknown identified command: #{packet.target_name} #{packet.packet_name}"
|
|
44
|
-
|
|
45
|
-
# Clear identification
|
|
46
|
-
packet.target_name = nil
|
|
47
|
-
packet.packet_name = nil
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
interfaces.each do |interface|
|
|
52
|
-
if interface.connected?
|
|
53
|
-
begin
|
|
54
|
-
CmdTlmServer.commanding.send_command_to_interface(interface, packet)
|
|
55
|
-
rescue Exception => err
|
|
56
|
-
Logger.error "Error routing command from #{@interface.name} to interface #{interface.name}\n#{err.formatted}"
|
|
57
|
-
end
|
|
58
|
-
else
|
|
59
|
-
Logger.error "Attempted to route command from #{@interface.name} to disconnected interface #{interface.name}"
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
end # class RouterThread
|
|
65
|
-
|
|
66
|
-
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/tools/cmd_tlm_server/interface_thread'
|
|
12
|
+
|
|
13
|
+
module Cosmos
|
|
14
|
+
|
|
15
|
+
# Overrides the packet handling method in InterfaceThread to sends all
|
|
16
|
+
# packets to {Commanding#send_command_to_interface}
|
|
17
|
+
class RouterThread < InterfaceThread
|
|
18
|
+
|
|
19
|
+
protected
|
|
20
|
+
|
|
21
|
+
def handle_packet(packet)
|
|
22
|
+
# Start out assuming we will route to all associated interfaces
|
|
23
|
+
interfaces = @interface.interfaces
|
|
24
|
+
|
|
25
|
+
# Identified packets we may handle differently...
|
|
26
|
+
if packet.identified?
|
|
27
|
+
target = System.targets[packet.target_name.upcase]
|
|
28
|
+
if target
|
|
29
|
+
if target.interface
|
|
30
|
+
# If target exists and has an interface we will only send the packet to that interface
|
|
31
|
+
interfaces = [target.interface]
|
|
32
|
+
else
|
|
33
|
+
# If target exists and has no interface we will not send the packet anywhere
|
|
34
|
+
interfaces = []
|
|
35
|
+
Logger.warn "Received command for target with no interface: #{packet.target_name} #{packet.packet_name}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Make sure identified packet exists
|
|
40
|
+
begin
|
|
41
|
+
System.commands.packet(packet.target_name, packet.packet_name)
|
|
42
|
+
rescue
|
|
43
|
+
Logger.warn "Received unknown identified command: #{packet.target_name} #{packet.packet_name}"
|
|
44
|
+
|
|
45
|
+
# Clear identification
|
|
46
|
+
packet.target_name = nil
|
|
47
|
+
packet.packet_name = nil
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
interfaces.each do |interface|
|
|
52
|
+
if interface.connected?
|
|
53
|
+
begin
|
|
54
|
+
CmdTlmServer.commanding.send_command_to_interface(interface, packet)
|
|
55
|
+
rescue Exception => err
|
|
56
|
+
Logger.error "Error routing command from #{@interface.name} to interface #{interface.name}\n#{err.formatted}"
|
|
57
|
+
end
|
|
58
|
+
else
|
|
59
|
+
Logger.error "Attempted to route command from #{@interface.name} to disconnected interface #{interface.name}"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end # class RouterThread
|
|
65
|
+
|
|
66
|
+
end # module Cosmos
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos/tools/cmd_tlm_server/connections'
|
|
12
|
-
require 'cosmos/tools/cmd_tlm_server/router_thread'
|
|
13
|
-
require 'cosmos/interfaces/tcpip_server_interface'
|
|
14
|
-
|
|
15
|
-
module Cosmos
|
|
16
|
-
|
|
17
|
-
# Controls the routers as defined in the Command/Telemetry configuration
|
|
18
|
-
# file. Routers are just interfaces which receive command packets from their
|
|
19
|
-
# remote connection and send them out to their interfaces. They receive
|
|
20
|
-
# telemetry packets from their interfaces and send them to their remote
|
|
21
|
-
# connections. This allows them to be intermediaries between an external
|
|
22
|
-
# client and the actual device.
|
|
23
|
-
class Routers < Connections
|
|
24
|
-
# @param cmd_tlm_server_config [CmdTlmServerConfig] The configuration which
|
|
25
|
-
# defines all the routers
|
|
26
|
-
def initialize(cmd_tlm_server_config)
|
|
27
|
-
super(:ROUTERS, cmd_tlm_server_config)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Adds a Preidentified router to the system with given name and port.
|
|
31
|
-
# All interfaces defined by the Command/Telemetry configuration are
|
|
32
|
-
# directed to this router for both commands and telemetry.
|
|
33
|
-
#
|
|
34
|
-
# @param router_name [String] Name of the router
|
|
35
|
-
# @param port [Integer] Port to pass to the {TcpipServerInterface}
|
|
36
|
-
def add_preidentified(router_name, port)
|
|
37
|
-
router_name = router_name.upcase
|
|
38
|
-
router = TcpipServerInterface.new(port, port, 10.0, nil, 'PREIDENTIFIED')
|
|
39
|
-
router.name = router_name
|
|
40
|
-
router.disable_disconnect = true
|
|
41
|
-
@config.routers[router_name] = router
|
|
42
|
-
@config.interfaces.each do |interface_name, interface|
|
|
43
|
-
router.interfaces << interface
|
|
44
|
-
interface.routers << router
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Recreate a router with new initialization parameters
|
|
49
|
-
#
|
|
50
|
-
# @param router_name [String] Name of the router
|
|
51
|
-
# @param params [Array] Array of parameters to pass to the router
|
|
52
|
-
# constructor
|
|
53
|
-
def recreate(router_name, *params)
|
|
54
|
-
router = @config.routers[router_name.upcase]
|
|
55
|
-
raise "Unknown router: #{router_name}" unless router
|
|
56
|
-
|
|
57
|
-
# Build New Router
|
|
58
|
-
new_router = router.class.new(*params)
|
|
59
|
-
router.copy_to(new_router)
|
|
60
|
-
|
|
61
|
-
# Remove old router and add new to each interface
|
|
62
|
-
router.interfaces.each do |interface|
|
|
63
|
-
interface.routers.delete(router)
|
|
64
|
-
interface.routers << new_router
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Replace interface in @interfaces array
|
|
68
|
-
@config.routers[router_name.upcase] = new_router
|
|
69
|
-
|
|
70
|
-
# Make sure there is no thread
|
|
71
|
-
stop_thread(router)
|
|
72
|
-
|
|
73
|
-
return new_router
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
protected
|
|
77
|
-
|
|
78
|
-
# Start an router's packet reading thread
|
|
79
|
-
def start_thread(router)
|
|
80
|
-
Logger.info "Creating thread for router #{router.name}"
|
|
81
|
-
router_thread = RouterThread.new(router)
|
|
82
|
-
router_thread.start
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Stop an router's packet reading thread
|
|
86
|
-
def stop_thread(router)
|
|
87
|
-
if router.thread
|
|
88
|
-
Logger.info "Killing thread for router #{router.name}"
|
|
89
|
-
to_stop = router.thread
|
|
90
|
-
router.thread = nil
|
|
91
|
-
to_stop.stop
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
end # class Routers
|
|
96
|
-
|
|
97
|
-
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/tools/cmd_tlm_server/connections'
|
|
12
|
+
require 'cosmos/tools/cmd_tlm_server/router_thread'
|
|
13
|
+
require 'cosmos/interfaces/tcpip_server_interface'
|
|
14
|
+
|
|
15
|
+
module Cosmos
|
|
16
|
+
|
|
17
|
+
# Controls the routers as defined in the Command/Telemetry configuration
|
|
18
|
+
# file. Routers are just interfaces which receive command packets from their
|
|
19
|
+
# remote connection and send them out to their interfaces. They receive
|
|
20
|
+
# telemetry packets from their interfaces and send them to their remote
|
|
21
|
+
# connections. This allows them to be intermediaries between an external
|
|
22
|
+
# client and the actual device.
|
|
23
|
+
class Routers < Connections
|
|
24
|
+
# @param cmd_tlm_server_config [CmdTlmServerConfig] The configuration which
|
|
25
|
+
# defines all the routers
|
|
26
|
+
def initialize(cmd_tlm_server_config)
|
|
27
|
+
super(:ROUTERS, cmd_tlm_server_config)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Adds a Preidentified router to the system with given name and port.
|
|
31
|
+
# All interfaces defined by the Command/Telemetry configuration are
|
|
32
|
+
# directed to this router for both commands and telemetry.
|
|
33
|
+
#
|
|
34
|
+
# @param router_name [String] Name of the router
|
|
35
|
+
# @param port [Integer] Port to pass to the {TcpipServerInterface}
|
|
36
|
+
def add_preidentified(router_name, port)
|
|
37
|
+
router_name = router_name.upcase
|
|
38
|
+
router = TcpipServerInterface.new(port, port, 10.0, nil, 'PREIDENTIFIED')
|
|
39
|
+
router.name = router_name
|
|
40
|
+
router.disable_disconnect = true
|
|
41
|
+
@config.routers[router_name] = router
|
|
42
|
+
@config.interfaces.each do |interface_name, interface|
|
|
43
|
+
router.interfaces << interface
|
|
44
|
+
interface.routers << router
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Recreate a router with new initialization parameters
|
|
49
|
+
#
|
|
50
|
+
# @param router_name [String] Name of the router
|
|
51
|
+
# @param params [Array] Array of parameters to pass to the router
|
|
52
|
+
# constructor
|
|
53
|
+
def recreate(router_name, *params)
|
|
54
|
+
router = @config.routers[router_name.upcase]
|
|
55
|
+
raise "Unknown router: #{router_name}" unless router
|
|
56
|
+
|
|
57
|
+
# Build New Router
|
|
58
|
+
new_router = router.class.new(*params)
|
|
59
|
+
router.copy_to(new_router)
|
|
60
|
+
|
|
61
|
+
# Remove old router and add new to each interface
|
|
62
|
+
router.interfaces.each do |interface|
|
|
63
|
+
interface.routers.delete(router)
|
|
64
|
+
interface.routers << new_router
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Replace interface in @interfaces array
|
|
68
|
+
@config.routers[router_name.upcase] = new_router
|
|
69
|
+
|
|
70
|
+
# Make sure there is no thread
|
|
71
|
+
stop_thread(router)
|
|
72
|
+
|
|
73
|
+
return new_router
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
protected
|
|
77
|
+
|
|
78
|
+
# Start an router's packet reading thread
|
|
79
|
+
def start_thread(router)
|
|
80
|
+
Logger.info "Creating thread for router #{router.name}"
|
|
81
|
+
router_thread = RouterThread.new(router)
|
|
82
|
+
router_thread.start
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Stop an router's packet reading thread
|
|
86
|
+
def stop_thread(router)
|
|
87
|
+
if router.thread
|
|
88
|
+
Logger.info "Killing thread for router #{router.name}"
|
|
89
|
+
to_stop = router.thread
|
|
90
|
+
router.thread = nil
|
|
91
|
+
to_stop.stop
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end # class Routers
|
|
96
|
+
|
|
97
|
+
end # module Cosmos
|
|
@@ -1,621 +1,621 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos'
|
|
12
|
-
Cosmos.catch_fatal_exception do
|
|
13
|
-
require 'cosmos/script'
|
|
14
|
-
require 'cosmos/config/config_parser'
|
|
15
|
-
require 'cosmos/gui/qt_tool'
|
|
16
|
-
require 'cosmos/gui/dialogs/splash'
|
|
17
|
-
require 'cosmos/gui/dialogs/progress_dialog'
|
|
18
|
-
require 'cosmos/gui/dialogs/exception_dialog'
|
|
19
|
-
require 'cosmos/gui/dialogs/packet_log_dialog'
|
|
20
|
-
require 'cosmos/gui/dialogs/find_replace_dialog'
|
|
21
|
-
require 'cosmos/gui/widgets/realtime_button_bar'
|
|
22
|
-
require 'cosmos/tools/data_viewer/data_viewer_component'
|
|
23
|
-
require 'cosmos/tools/data_viewer/dump_component'
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
module Cosmos
|
|
27
|
-
|
|
28
|
-
class DataViewer < QtTool
|
|
29
|
-
slots 'context_menu(const QPoint&)'
|
|
30
|
-
slots 'handle_tab_change(int)'
|
|
31
|
-
|
|
32
|
-
def initialize(options)
|
|
33
|
-
super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
|
|
34
|
-
Cosmos.load_cosmos_icon("data_viewer.png")
|
|
35
|
-
|
|
36
|
-
initialize_actions()
|
|
37
|
-
initialize_menus()
|
|
38
|
-
initialize_central_widget()
|
|
39
|
-
complete_initialize()
|
|
40
|
-
|
|
41
|
-
# Initialize instance variables
|
|
42
|
-
@auto_start = false
|
|
43
|
-
@pause = false
|
|
44
|
-
@log_file_directory = System.paths['LOGS']
|
|
45
|
-
@tlm_log_system = nil
|
|
46
|
-
@subscription_thread = nil
|
|
47
|
-
@subscription_id = nil
|
|
48
|
-
@packet_log_reader = System.default_packet_log_reader.new
|
|
49
|
-
@time_start = nil
|
|
50
|
-
@time_end = nil
|
|
51
|
-
@log_filenames = []
|
|
52
|
-
@cancel_thread = false
|
|
53
|
-
@sleeper = Sleeper.new
|
|
54
|
-
|
|
55
|
-
# Process config file and create a tab for each data viewer component
|
|
56
|
-
@component_mutex = Mutex.new
|
|
57
|
-
@components = []
|
|
58
|
-
@packets = []
|
|
59
|
-
@packet_to_components_mapping = {}
|
|
60
|
-
@config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', 'data_viewer', options.config_file)
|
|
61
|
-
process_config()
|
|
62
|
-
|
|
63
|
-
# Load System Definition and Event Data
|
|
64
|
-
Splash.execute(self) do |splash|
|
|
65
|
-
Qt.execute_in_main_thread(true) do
|
|
66
|
-
ConfigParser.splash = splash
|
|
67
|
-
System.telemetry
|
|
68
|
-
@components.each do |component|
|
|
69
|
-
# Create tab for each component
|
|
70
|
-
component.initialize_gui
|
|
71
|
-
@tab_book.addTab(component, component.tab_name)
|
|
72
|
-
end
|
|
73
|
-
if @auto_start
|
|
74
|
-
handle_start()
|
|
75
|
-
end
|
|
76
|
-
ConfigParser.splash = nil
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Add GUI Update Timeout
|
|
81
|
-
@timer = Qt::Timer.new(self)
|
|
82
|
-
@timer.connect(SIGNAL('timeout()')) { update_gui() }
|
|
83
|
-
@timer.method_missing(:start, 100)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def initialize_actions
|
|
87
|
-
super()
|
|
88
|
-
|
|
89
|
-
# File Menu Actions
|
|
90
|
-
@open_log = Qt::Action.new(tr('&Open Log File'), self)
|
|
91
|
-
@open_log_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
92
|
-
@open_log.shortcut = @open_log_keyseq
|
|
93
|
-
@open_log.statusTip = tr('Open telemetry log file for processing')
|
|
94
|
-
@open_log.connect(SIGNAL('triggered()')) { handle_open_log_file() }
|
|
95
|
-
|
|
96
|
-
@handle_reset = Qt::Action.new(tr('&Reset'), self)
|
|
97
|
-
@handle_reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
|
|
98
|
-
@handle_reset.shortcut = @handle_reset_keyseq
|
|
99
|
-
@handle_reset.statusTip = tr('Reset Components')
|
|
100
|
-
@handle_reset.connect(SIGNAL('triggered()')) { handle_reset() }
|
|
101
|
-
|
|
102
|
-
# Search Actions
|
|
103
|
-
@search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
|
|
104
|
-
@search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
|
|
105
|
-
@search_find.shortcut = @search_find_keyseq
|
|
106
|
-
@search_find.statusTip = tr('Find text')
|
|
107
|
-
@search_find.connect(SIGNAL('triggered()')) { find() }
|
|
108
|
-
|
|
109
|
-
@search_find_next = Qt::Action.new(tr('Find &Next'), self)
|
|
110
|
-
@search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
|
|
111
|
-
@search_find_next.shortcut = @search_find_next_keyseq
|
|
112
|
-
@search_find_next.statusTip = tr('Find next instance')
|
|
113
|
-
@search_find_next.connect(SIGNAL('triggered()')) { find_next() }
|
|
114
|
-
|
|
115
|
-
@search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
|
|
116
|
-
@search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
|
|
117
|
-
@search_find_previous.shortcut = @search_find_previous_keyseq
|
|
118
|
-
@search_find_previous.statusTip = tr('Find previous instance')
|
|
119
|
-
@search_find_previous.connect(SIGNAL('triggered()')) { find_previous() }
|
|
120
|
-
|
|
121
|
-
# Tab Menu Actions
|
|
122
|
-
@delete_tab = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
|
|
123
|
-
@delete_tab.statusTip = tr('Delete active tab')
|
|
124
|
-
@delete_tab.connect(SIGNAL('triggered()')) { on_tab_delete() }
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def initialize_menus
|
|
128
|
-
# File Menu
|
|
129
|
-
file_menu = menuBar.addMenu(tr('&File'))
|
|
130
|
-
file_menu.addAction(@open_log)
|
|
131
|
-
file_menu.addAction(@handle_reset)
|
|
132
|
-
file_menu.addSeparator()
|
|
133
|
-
file_menu.addAction(@exit_action)
|
|
134
|
-
|
|
135
|
-
# Tab Menu
|
|
136
|
-
@tab_menu = menuBar.addMenu(tr('&Tab'))
|
|
137
|
-
@tab_menu.addAction(@delete_tab)
|
|
138
|
-
@tab_menu.addSeparator()
|
|
139
|
-
@tab_menu_actions = []
|
|
140
|
-
|
|
141
|
-
# Search Menu
|
|
142
|
-
view_menu = menuBar.addMenu(tr('&Search'))
|
|
143
|
-
view_menu.addAction(@search_find)
|
|
144
|
-
view_menu.addAction(@search_find_next)
|
|
145
|
-
view_menu.addAction(@search_find_previous)
|
|
146
|
-
|
|
147
|
-
# Help Menu
|
|
148
|
-
@about_string = "Data Viewer is designed to allow users view data that is not easily displayed on telemetry screens."
|
|
149
|
-
initialize_help_menu()
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def initialize_central_widget
|
|
153
|
-
# Create the central widget
|
|
154
|
-
@central_widget = Qt::Widget.new
|
|
155
|
-
setCentralWidget(@central_widget)
|
|
156
|
-
|
|
157
|
-
# Create the top level vertical layout
|
|
158
|
-
@top_layout = Qt::VBoxLayout.new(@central_widget)
|
|
159
|
-
|
|
160
|
-
# Realtime Button Bar
|
|
161
|
-
@realtime_button_bar = RealtimeButtonBar.new(self)
|
|
162
|
-
@realtime_button_bar.start_callback = method(:handle_start)
|
|
163
|
-
@realtime_button_bar.pause_callback = method(:handle_pause)
|
|
164
|
-
@realtime_button_bar.stop_callback = method(:handle_stop)
|
|
165
|
-
@realtime_button_bar.state = 'Stopped'
|
|
166
|
-
@top_layout.addWidget(@realtime_button_bar)
|
|
167
|
-
|
|
168
|
-
# Create tab book
|
|
169
|
-
@tab_book = Qt::TabWidget.new
|
|
170
|
-
@tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
|
|
171
|
-
connect(@tab_book, SIGNAL('currentChanged(int)'), self, SLOT('handle_tab_change(int)'))
|
|
172
|
-
connect(@tab_book, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
|
|
173
|
-
@top_layout.addWidget(@tab_book)
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def current_component
|
|
177
|
-
@component_mutex.synchronize do
|
|
178
|
-
yield @components[@tab_book.currentIndex()]
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def find
|
|
183
|
-
current_component do |component|
|
|
184
|
-
FindReplaceDialog.show_find(component.text)
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def find_next
|
|
189
|
-
current_component do |component|
|
|
190
|
-
FindReplaceDialog.find_next(component.text)
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def find_previous
|
|
195
|
-
current_component do |component|
|
|
196
|
-
FindReplaceDialog.find_previous(component.text)
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def handle_tab_change(index)
|
|
201
|
-
# Remove existing actions
|
|
202
|
-
@tab_menu_actions.each do |action|
|
|
203
|
-
@tab_menu.removeAction(action)
|
|
204
|
-
action.dispose
|
|
205
|
-
end
|
|
206
|
-
@tab_menu_actions = []
|
|
207
|
-
|
|
208
|
-
# Add new actions
|
|
209
|
-
unless @components.empty?
|
|
210
|
-
@component_mutex.synchronize do
|
|
211
|
-
component = @components[index]
|
|
212
|
-
component.packets.each do |target_name, packet_name|
|
|
213
|
-
action = Qt::Action.new("#{target_name} #{packet_name}", @tab_menu)
|
|
214
|
-
action.setCheckable(true)
|
|
215
|
-
key = target_name + ' ' + packet_name
|
|
216
|
-
components = @packet_to_components_mapping[key]
|
|
217
|
-
if components.include?(component)
|
|
218
|
-
action.setChecked(true)
|
|
219
|
-
else
|
|
220
|
-
action.setChecked(false)
|
|
221
|
-
end
|
|
222
|
-
action.connect(SIGNAL('triggered()')) { enable_disable_component_packet(index, target_name, packet_name, action.checked?) }
|
|
223
|
-
@tab_menu.addAction(action)
|
|
224
|
-
@tab_menu_actions << action
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
def context_menu(point)
|
|
231
|
-
index = 0
|
|
232
|
-
(0..@tab_book.tabBar.count).each do |i|
|
|
233
|
-
index = i if @tab_book.tabBar.tabRect(i).contains(point)
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
return if (index == @tab_book.tabBar.count)
|
|
237
|
-
|
|
238
|
-
# Bring the right clicked tab to the front
|
|
239
|
-
@tab_book.setCurrentIndex(index)
|
|
240
|
-
@tab_menu.exec(@tab_book.mapToGlobal(point))
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
def start_subscription_thread
|
|
244
|
-
unless @subscription_thread
|
|
245
|
-
# Start Thread to Gather Events
|
|
246
|
-
@subscription_thread = Thread.new do
|
|
247
|
-
@cancel_thread = false
|
|
248
|
-
@sleeper = Sleeper.new
|
|
249
|
-
if !@packets.empty?
|
|
250
|
-
begin
|
|
251
|
-
while true
|
|
252
|
-
break if @cancel_thread
|
|
253
|
-
begin
|
|
254
|
-
@subscription_id = subscribe_packet_data(@packets, 10000)
|
|
255
|
-
break if @cancel_thread
|
|
256
|
-
if @pause
|
|
257
|
-
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Paused' }
|
|
258
|
-
else
|
|
259
|
-
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
|
|
260
|
-
end
|
|
261
|
-
Qt.execute_in_main_thread(true) { statusBar.showMessage("Connected to Command and Telemetry Server: #{Time.now.formatted}") }
|
|
262
|
-
rescue DRb::DRbConnError
|
|
263
|
-
break if @cancel_thread
|
|
264
|
-
Qt.execute_in_main_thread(true) do
|
|
265
|
-
@realtime_button_bar.state = 'Connecting'
|
|
266
|
-
statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
|
|
267
|
-
end
|
|
268
|
-
break if @sleeper.sleep(1)
|
|
269
|
-
break if @cancel_thread
|
|
270
|
-
retry
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
while true
|
|
274
|
-
break if @cancel_thread
|
|
275
|
-
begin
|
|
276
|
-
# Get a subscribed to packet
|
|
277
|
-
packet_data, target_name, packet_name, received_time, received_count = get_packet_data(@subscription_id)
|
|
278
|
-
|
|
279
|
-
# Put packet data into its packet
|
|
280
|
-
packet = System.telemetry.packet(target_name, packet_name)
|
|
281
|
-
packet.buffer = packet_data
|
|
282
|
-
packet.received_time = received_time
|
|
283
|
-
packet.received_count = received_count
|
|
284
|
-
|
|
285
|
-
# Route packet to its component(s)
|
|
286
|
-
index = packet.target_name + ' ' + packet.packet_name
|
|
287
|
-
@component_mutex.synchronize do
|
|
288
|
-
components = @packet_to_components_mapping[index]
|
|
289
|
-
if components
|
|
290
|
-
components.each do |component|
|
|
291
|
-
component.process_packet(packet)
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
end
|
|
295
|
-
rescue DRb::DRbConnError
|
|
296
|
-
break if @cancel_thread
|
|
297
|
-
Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server")) }
|
|
298
|
-
break # Let outer loop resubscribe
|
|
299
|
-
rescue RuntimeError => error
|
|
300
|
-
raise error unless error.message =~ /queue/
|
|
301
|
-
break if @cancel_thread
|
|
302
|
-
Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Connection Dropped by Command and Telemetry Server: #{Time.now.formatted}")) }
|
|
303
|
-
break # Let outer loop resubscribe
|
|
304
|
-
end
|
|
305
|
-
end
|
|
306
|
-
end
|
|
307
|
-
rescue Exception => error
|
|
308
|
-
break if @cancel_thread
|
|
309
|
-
Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Data Viewer : Subscription Thread")}
|
|
310
|
-
end
|
|
311
|
-
end # if !@packets.empty
|
|
312
|
-
end
|
|
313
|
-
else
|
|
314
|
-
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
|
|
315
|
-
end
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
def kill_subscription_thread
|
|
319
|
-
Cosmos.kill_thread(self, @subscription_thread)
|
|
320
|
-
@subscription_thread = nil
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
def graceful_kill
|
|
324
|
-
@cancel_thread = true
|
|
325
|
-
@sleeper.cancel
|
|
326
|
-
script_disconnect() # This will break out of get_packet_data
|
|
327
|
-
Qt::CoreApplication.processEvents
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
def handle_reset
|
|
331
|
-
@component_mutex.synchronize do
|
|
332
|
-
@components.each do |component|
|
|
333
|
-
component.reset
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
System.telemetry.reset
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
def handle_start
|
|
340
|
-
if windowTitle() != 'Data Viewer'
|
|
341
|
-
# Clear Title
|
|
342
|
-
setWindowTitle('Data Viewer')
|
|
343
|
-
|
|
344
|
-
# Return to default configuration
|
|
345
|
-
# Show splash during possible reconfiguration
|
|
346
|
-
Splash.execute(self) do |splash|
|
|
347
|
-
ConfigParser.splash = splash
|
|
348
|
-
System.load_configuration
|
|
349
|
-
ConfigParser.splash = nil
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
# Reset Components
|
|
353
|
-
handle_reset()
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
# Restart GUI Updates if necessary
|
|
357
|
-
if @pause
|
|
358
|
-
@pause = false
|
|
359
|
-
@timer.method_missing(:start, 100)
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
# Restart Subscription Thread if necessary
|
|
363
|
-
start_subscription_thread()
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
def handle_pause
|
|
367
|
-
@pause = true
|
|
368
|
-
if @subscription_thread
|
|
369
|
-
@realtime_button_bar.state = 'Paused'
|
|
370
|
-
end
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
def handle_stop
|
|
374
|
-
# Shutdown packet subscription thread
|
|
375
|
-
kill_subscription_thread()
|
|
376
|
-
|
|
377
|
-
# Unsubscribe from subscription
|
|
378
|
-
if @subscription_id
|
|
379
|
-
begin
|
|
380
|
-
unsubscribe_packet_data(@subscription_id)
|
|
381
|
-
rescue DRb::DRbConnError
|
|
382
|
-
# Do Nothing
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
# Restart GUI Updates if necessary
|
|
387
|
-
if @pause
|
|
388
|
-
@pause = false
|
|
389
|
-
@timer.method_missing(:start, 100)
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
@realtime_button_bar.state = 'Stopped'
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
def handle_open_log_file
|
|
396
|
-
# Prompt user for filename
|
|
397
|
-
packet_log_dialog = PacketLogDialog.new(self, 'Open Log File(s):', @log_file_directory, @packet_log_reader, [], nil, false, true, true, Cosmos::TLM_FILE_PATTERN)
|
|
398
|
-
begin
|
|
399
|
-
packet_log_dialog.time_start = @time_start
|
|
400
|
-
packet_log_dialog.time_end = @time_end
|
|
401
|
-
case packet_log_dialog.exec
|
|
402
|
-
when Qt::Dialog::Accepted
|
|
403
|
-
@packet_log_reader = packet_log_dialog.packet_log_reader
|
|
404
|
-
@log_filenames = packet_log_dialog.filenames.sort
|
|
405
|
-
@time_start = packet_log_dialog.time_start
|
|
406
|
-
@time_end = packet_log_dialog.time_end
|
|
407
|
-
@log_file_directory = File.dirname(@log_filenames[0])
|
|
408
|
-
@log_file_directory << '/' unless @log_file_directory[-1..-1] == '\\'
|
|
409
|
-
|
|
410
|
-
# Stop realtime collection
|
|
411
|
-
handle_stop()
|
|
412
|
-
|
|
413
|
-
# Reset components
|
|
414
|
-
handle_reset()
|
|
415
|
-
|
|
416
|
-
@cancel_progress = false
|
|
417
|
-
ProgressDialog.execute(self, 'Processing Log File', 500, 200, @log_filenames.length > 1, true, true, true, true) do |dialog|
|
|
418
|
-
dialog.cancel_callback = method(:cancel_callback)
|
|
419
|
-
dialog.enable_cancel_button
|
|
420
|
-
|
|
421
|
-
@log_filenames.each_with_index do |filename, file_index|
|
|
422
|
-
break if @cancel_progress
|
|
423
|
-
Qt.execute_in_main_thread(true) do
|
|
424
|
-
self.setWindowTitle("Data Viewer : #{filename}")
|
|
425
|
-
end
|
|
426
|
-
|
|
427
|
-
file_size = File.size(filename).to_f
|
|
428
|
-
dialog.append_text("Processing: #{filename}")
|
|
429
|
-
|
|
430
|
-
Cosmos.check_log_configuration(@packet_log_reader, filename)
|
|
431
|
-
@packet_log_reader.each(filename, true, @time_start, @time_end) do |packet|
|
|
432
|
-
break if @cancel_progress
|
|
433
|
-
progress = @packet_log_reader.bytes_read.to_f / file_size
|
|
434
|
-
dialog.set_step_progress(progress)
|
|
435
|
-
|
|
436
|
-
# Route packet to its component(s)
|
|
437
|
-
index = packet.target_name + ' ' + packet.packet_name
|
|
438
|
-
components = @packet_to_components_mapping[index]
|
|
439
|
-
if components
|
|
440
|
-
@component_mutex.synchronize do
|
|
441
|
-
components.each do |component|
|
|
442
|
-
component.process_packet(packet)
|
|
443
|
-
end
|
|
444
|
-
end
|
|
445
|
-
end
|
|
446
|
-
end
|
|
447
|
-
|
|
448
|
-
dialog.set_overall_progress((file_index + 1).to_f / @log_filenames.length) if @log_filenames.length > 1
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
dialog.append_text("Done!")
|
|
452
|
-
dialog.set_step_progress(1.0)
|
|
453
|
-
dialog.set_overall_progress(1.0) if @log_filenames.length > 1
|
|
454
|
-
dialog.complete
|
|
455
|
-
end
|
|
456
|
-
end
|
|
457
|
-
ensure
|
|
458
|
-
packet_log_dialog.dispose if packet_log_dialog
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
def cancel_callback(progress_dialog = nil)
|
|
463
|
-
@cancel_progress = true
|
|
464
|
-
return true, false
|
|
465
|
-
end
|
|
466
|
-
|
|
467
|
-
def update_gui
|
|
468
|
-
if @pause
|
|
469
|
-
@timer.method_missing(:stop)
|
|
470
|
-
else
|
|
471
|
-
Qt.execute_in_main_thread(true) do
|
|
472
|
-
@component_mutex.synchronize do
|
|
473
|
-
@components.each do |component|
|
|
474
|
-
break if @pause
|
|
475
|
-
component.update_gui
|
|
476
|
-
end
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
end
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
def closeEvent(event)
|
|
483
|
-
# Stop GUI update timeout
|
|
484
|
-
@pause = true
|
|
485
|
-
|
|
486
|
-
# Stop Processing Packets
|
|
487
|
-
handle_stop()
|
|
488
|
-
|
|
489
|
-
# Shutdown each component
|
|
490
|
-
@component_mutex.synchronize do
|
|
491
|
-
@components.each {|component| component.shutdown}
|
|
492
|
-
end
|
|
493
|
-
|
|
494
|
-
# Give things time to complete
|
|
495
|
-
sleep(0.1)
|
|
496
|
-
|
|
497
|
-
# Standard COSMOS Shutdown
|
|
498
|
-
shutdown_cmd_tlm()
|
|
499
|
-
|
|
500
|
-
# Accept closure
|
|
501
|
-
super(event)
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
def process_config
|
|
505
|
-
# ensure the file exists
|
|
506
|
-
unless test ?f, @config_filename
|
|
507
|
-
raise "Configuration File Does not Exist: #{@config_filename}"
|
|
508
|
-
end
|
|
509
|
-
|
|
510
|
-
parser = ConfigParser.new
|
|
511
|
-
parser.parse_file(@config_filename) do |keyword, params|
|
|
512
|
-
case keyword
|
|
513
|
-
|
|
514
|
-
when 'AUTO_START'
|
|
515
|
-
usage = "#{keyword}"
|
|
516
|
-
parser.verify_num_parameters(0, 0, usage)
|
|
517
|
-
@auto_start = true
|
|
518
|
-
|
|
519
|
-
when 'COMPONENT'
|
|
520
|
-
usage = "#{keyword} <tab name> <component class filename> <component specific options...>"
|
|
521
|
-
parser.verify_num_parameters(2, nil, usage)
|
|
522
|
-
component_class = Cosmos.require_class(params[1])
|
|
523
|
-
if params.length >= 3
|
|
524
|
-
@components << component_class.new(self, params[0], *params[2..-1])
|
|
525
|
-
else
|
|
526
|
-
@components << component_class.new(self, params[0])
|
|
527
|
-
end
|
|
528
|
-
|
|
529
|
-
when 'PACKET'
|
|
530
|
-
usage = "#{keyword} <target_name> <packet_name>"
|
|
531
|
-
parser.verify_num_parameters(2, 2, usage)
|
|
532
|
-
target_name = params[0].upcase
|
|
533
|
-
packet_name = params[1].upcase
|
|
534
|
-
@packets << [target_name, packet_name]
|
|
535
|
-
@components[-1].add_packet(target_name, packet_name)
|
|
536
|
-
index = target_name + ' ' + packet_name
|
|
537
|
-
@packet_to_components_mapping[index] ||= []
|
|
538
|
-
@packet_to_components_mapping[index] << @components[-1]
|
|
539
|
-
|
|
540
|
-
# Unknown keyword
|
|
541
|
-
else
|
|
542
|
-
raise "Unhandled keyword: #{keyword}" if keyword
|
|
543
|
-
end
|
|
544
|
-
end
|
|
545
|
-
end
|
|
546
|
-
|
|
547
|
-
def delete_component(index)
|
|
548
|
-
@component_mutex.synchronize do
|
|
549
|
-
# Get the component to be deleted
|
|
550
|
-
component = @components[index]
|
|
551
|
-
|
|
552
|
-
# Delete from the components array
|
|
553
|
-
@components.delete_at(index)
|
|
554
|
-
|
|
555
|
-
# Delete from mapping
|
|
556
|
-
@packet_to_components_mapping.each do |key, components|
|
|
557
|
-
components.delete(component)
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
end
|
|
561
|
-
|
|
562
|
-
def enable_disable_component_packet(index, target_name, packet_name, enabled)
|
|
563
|
-
@component_mutex.synchronize do
|
|
564
|
-
# Get the component to be deleted
|
|
565
|
-
component = @components[index]
|
|
566
|
-
|
|
567
|
-
key = target_name + ' ' + packet_name
|
|
568
|
-
if enabled
|
|
569
|
-
# Add to mapping
|
|
570
|
-
components = @packet_to_components_mapping[key]
|
|
571
|
-
components << component unless components.include?(component)
|
|
572
|
-
else
|
|
573
|
-
# Delete from mapping
|
|
574
|
-
components = @packet_to_components_mapping[key]
|
|
575
|
-
components.delete(component)
|
|
576
|
-
end
|
|
577
|
-
end
|
|
578
|
-
end
|
|
579
|
-
|
|
580
|
-
# Handles deleting the current tab
|
|
581
|
-
def on_tab_delete
|
|
582
|
-
if @tab_book.currentIndex() and @tab_book.currentIndex() >= 0
|
|
583
|
-
case Qt::MessageBox.warning(self, 'Warning!', "Are you sure you want to delete the active tab?", Qt::MessageBox::Yes | Qt::MessageBox::No, Qt::MessageBox::No)
|
|
584
|
-
when Qt::MessageBox::Yes
|
|
585
|
-
# Remove component
|
|
586
|
-
tab_index = @tab_book.currentIndex()
|
|
587
|
-
delete_component(tab_index)
|
|
588
|
-
@tab_book.removeTab(tab_index)
|
|
589
|
-
|
|
590
|
-
statusBar.showMessage(tr("Tab Deleted"))
|
|
591
|
-
end
|
|
592
|
-
else
|
|
593
|
-
Qt::MessageBox.information(self, 'Info', "No tabs exist")
|
|
594
|
-
end
|
|
595
|
-
end # def on_tab_delete
|
|
596
|
-
|
|
597
|
-
#############################
|
|
598
|
-
# Class methods
|
|
599
|
-
#############################
|
|
600
|
-
|
|
601
|
-
def self.run(option_parser = nil, options = nil)
|
|
602
|
-
Cosmos.catch_fatal_exception do
|
|
603
|
-
unless option_parser and options
|
|
604
|
-
option_parser, options = create_default_options()
|
|
605
|
-
options.width = 550
|
|
606
|
-
options.height = 500
|
|
607
|
-
options.title = "Data Viewer"
|
|
608
|
-
options.config_file = 'data_viewer.txt'
|
|
609
|
-
option_parser.separator "Data Viewer Specific Options:"
|
|
610
|
-
option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
|
|
611
|
-
options.config_file = arg
|
|
612
|
-
end
|
|
613
|
-
end
|
|
614
|
-
|
|
615
|
-
super(option_parser, options)
|
|
616
|
-
end
|
|
617
|
-
end
|
|
618
|
-
|
|
619
|
-
end # class DataViewer
|
|
620
|
-
|
|
621
|
-
end # module Cosmos
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'cosmos'
|
|
12
|
+
Cosmos.catch_fatal_exception do
|
|
13
|
+
require 'cosmos/script'
|
|
14
|
+
require 'cosmos/config/config_parser'
|
|
15
|
+
require 'cosmos/gui/qt_tool'
|
|
16
|
+
require 'cosmos/gui/dialogs/splash'
|
|
17
|
+
require 'cosmos/gui/dialogs/progress_dialog'
|
|
18
|
+
require 'cosmos/gui/dialogs/exception_dialog'
|
|
19
|
+
require 'cosmos/gui/dialogs/packet_log_dialog'
|
|
20
|
+
require 'cosmos/gui/dialogs/find_replace_dialog'
|
|
21
|
+
require 'cosmos/gui/widgets/realtime_button_bar'
|
|
22
|
+
require 'cosmos/tools/data_viewer/data_viewer_component'
|
|
23
|
+
require 'cosmos/tools/data_viewer/dump_component'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module Cosmos
|
|
27
|
+
|
|
28
|
+
class DataViewer < QtTool
|
|
29
|
+
slots 'context_menu(const QPoint&)'
|
|
30
|
+
slots 'handle_tab_change(int)'
|
|
31
|
+
|
|
32
|
+
def initialize(options)
|
|
33
|
+
super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
|
|
34
|
+
Cosmos.load_cosmos_icon("data_viewer.png")
|
|
35
|
+
|
|
36
|
+
initialize_actions()
|
|
37
|
+
initialize_menus()
|
|
38
|
+
initialize_central_widget()
|
|
39
|
+
complete_initialize()
|
|
40
|
+
|
|
41
|
+
# Initialize instance variables
|
|
42
|
+
@auto_start = false
|
|
43
|
+
@pause = false
|
|
44
|
+
@log_file_directory = System.paths['LOGS']
|
|
45
|
+
@tlm_log_system = nil
|
|
46
|
+
@subscription_thread = nil
|
|
47
|
+
@subscription_id = nil
|
|
48
|
+
@packet_log_reader = System.default_packet_log_reader.new
|
|
49
|
+
@time_start = nil
|
|
50
|
+
@time_end = nil
|
|
51
|
+
@log_filenames = []
|
|
52
|
+
@cancel_thread = false
|
|
53
|
+
@sleeper = Sleeper.new
|
|
54
|
+
|
|
55
|
+
# Process config file and create a tab for each data viewer component
|
|
56
|
+
@component_mutex = Mutex.new
|
|
57
|
+
@components = []
|
|
58
|
+
@packets = []
|
|
59
|
+
@packet_to_components_mapping = {}
|
|
60
|
+
@config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', 'data_viewer', options.config_file)
|
|
61
|
+
process_config()
|
|
62
|
+
|
|
63
|
+
# Load System Definition and Event Data
|
|
64
|
+
Splash.execute(self) do |splash|
|
|
65
|
+
Qt.execute_in_main_thread(true) do
|
|
66
|
+
ConfigParser.splash = splash
|
|
67
|
+
System.telemetry
|
|
68
|
+
@components.each do |component|
|
|
69
|
+
# Create tab for each component
|
|
70
|
+
component.initialize_gui
|
|
71
|
+
@tab_book.addTab(component, component.tab_name)
|
|
72
|
+
end
|
|
73
|
+
if @auto_start
|
|
74
|
+
handle_start()
|
|
75
|
+
end
|
|
76
|
+
ConfigParser.splash = nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Add GUI Update Timeout
|
|
81
|
+
@timer = Qt::Timer.new(self)
|
|
82
|
+
@timer.connect(SIGNAL('timeout()')) { update_gui() }
|
|
83
|
+
@timer.method_missing(:start, 100)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def initialize_actions
|
|
87
|
+
super()
|
|
88
|
+
|
|
89
|
+
# File Menu Actions
|
|
90
|
+
@open_log = Qt::Action.new(tr('&Open Log File'), self)
|
|
91
|
+
@open_log_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
|
|
92
|
+
@open_log.shortcut = @open_log_keyseq
|
|
93
|
+
@open_log.statusTip = tr('Open telemetry log file for processing')
|
|
94
|
+
@open_log.connect(SIGNAL('triggered()')) { handle_open_log_file() }
|
|
95
|
+
|
|
96
|
+
@handle_reset = Qt::Action.new(tr('&Reset'), self)
|
|
97
|
+
@handle_reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
|
|
98
|
+
@handle_reset.shortcut = @handle_reset_keyseq
|
|
99
|
+
@handle_reset.statusTip = tr('Reset Components')
|
|
100
|
+
@handle_reset.connect(SIGNAL('triggered()')) { handle_reset() }
|
|
101
|
+
|
|
102
|
+
# Search Actions
|
|
103
|
+
@search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
|
|
104
|
+
@search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
|
|
105
|
+
@search_find.shortcut = @search_find_keyseq
|
|
106
|
+
@search_find.statusTip = tr('Find text')
|
|
107
|
+
@search_find.connect(SIGNAL('triggered()')) { find() }
|
|
108
|
+
|
|
109
|
+
@search_find_next = Qt::Action.new(tr('Find &Next'), self)
|
|
110
|
+
@search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
|
|
111
|
+
@search_find_next.shortcut = @search_find_next_keyseq
|
|
112
|
+
@search_find_next.statusTip = tr('Find next instance')
|
|
113
|
+
@search_find_next.connect(SIGNAL('triggered()')) { find_next() }
|
|
114
|
+
|
|
115
|
+
@search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
|
|
116
|
+
@search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
|
|
117
|
+
@search_find_previous.shortcut = @search_find_previous_keyseq
|
|
118
|
+
@search_find_previous.statusTip = tr('Find previous instance')
|
|
119
|
+
@search_find_previous.connect(SIGNAL('triggered()')) { find_previous() }
|
|
120
|
+
|
|
121
|
+
# Tab Menu Actions
|
|
122
|
+
@delete_tab = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
|
|
123
|
+
@delete_tab.statusTip = tr('Delete active tab')
|
|
124
|
+
@delete_tab.connect(SIGNAL('triggered()')) { on_tab_delete() }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def initialize_menus
|
|
128
|
+
# File Menu
|
|
129
|
+
file_menu = menuBar.addMenu(tr('&File'))
|
|
130
|
+
file_menu.addAction(@open_log)
|
|
131
|
+
file_menu.addAction(@handle_reset)
|
|
132
|
+
file_menu.addSeparator()
|
|
133
|
+
file_menu.addAction(@exit_action)
|
|
134
|
+
|
|
135
|
+
# Tab Menu
|
|
136
|
+
@tab_menu = menuBar.addMenu(tr('&Tab'))
|
|
137
|
+
@tab_menu.addAction(@delete_tab)
|
|
138
|
+
@tab_menu.addSeparator()
|
|
139
|
+
@tab_menu_actions = []
|
|
140
|
+
|
|
141
|
+
# Search Menu
|
|
142
|
+
view_menu = menuBar.addMenu(tr('&Search'))
|
|
143
|
+
view_menu.addAction(@search_find)
|
|
144
|
+
view_menu.addAction(@search_find_next)
|
|
145
|
+
view_menu.addAction(@search_find_previous)
|
|
146
|
+
|
|
147
|
+
# Help Menu
|
|
148
|
+
@about_string = "Data Viewer is designed to allow users view data that is not easily displayed on telemetry screens."
|
|
149
|
+
initialize_help_menu()
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def initialize_central_widget
|
|
153
|
+
# Create the central widget
|
|
154
|
+
@central_widget = Qt::Widget.new
|
|
155
|
+
setCentralWidget(@central_widget)
|
|
156
|
+
|
|
157
|
+
# Create the top level vertical layout
|
|
158
|
+
@top_layout = Qt::VBoxLayout.new(@central_widget)
|
|
159
|
+
|
|
160
|
+
# Realtime Button Bar
|
|
161
|
+
@realtime_button_bar = RealtimeButtonBar.new(self)
|
|
162
|
+
@realtime_button_bar.start_callback = method(:handle_start)
|
|
163
|
+
@realtime_button_bar.pause_callback = method(:handle_pause)
|
|
164
|
+
@realtime_button_bar.stop_callback = method(:handle_stop)
|
|
165
|
+
@realtime_button_bar.state = 'Stopped'
|
|
166
|
+
@top_layout.addWidget(@realtime_button_bar)
|
|
167
|
+
|
|
168
|
+
# Create tab book
|
|
169
|
+
@tab_book = Qt::TabWidget.new
|
|
170
|
+
@tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
|
|
171
|
+
connect(@tab_book, SIGNAL('currentChanged(int)'), self, SLOT('handle_tab_change(int)'))
|
|
172
|
+
connect(@tab_book, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
|
|
173
|
+
@top_layout.addWidget(@tab_book)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def current_component
|
|
177
|
+
@component_mutex.synchronize do
|
|
178
|
+
yield @components[@tab_book.currentIndex()]
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def find
|
|
183
|
+
current_component do |component|
|
|
184
|
+
FindReplaceDialog.show_find(component.text)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def find_next
|
|
189
|
+
current_component do |component|
|
|
190
|
+
FindReplaceDialog.find_next(component.text)
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def find_previous
|
|
195
|
+
current_component do |component|
|
|
196
|
+
FindReplaceDialog.find_previous(component.text)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def handle_tab_change(index)
|
|
201
|
+
# Remove existing actions
|
|
202
|
+
@tab_menu_actions.each do |action|
|
|
203
|
+
@tab_menu.removeAction(action)
|
|
204
|
+
action.dispose
|
|
205
|
+
end
|
|
206
|
+
@tab_menu_actions = []
|
|
207
|
+
|
|
208
|
+
# Add new actions
|
|
209
|
+
unless @components.empty?
|
|
210
|
+
@component_mutex.synchronize do
|
|
211
|
+
component = @components[index]
|
|
212
|
+
component.packets.each do |target_name, packet_name|
|
|
213
|
+
action = Qt::Action.new("#{target_name} #{packet_name}", @tab_menu)
|
|
214
|
+
action.setCheckable(true)
|
|
215
|
+
key = target_name + ' ' + packet_name
|
|
216
|
+
components = @packet_to_components_mapping[key]
|
|
217
|
+
if components.include?(component)
|
|
218
|
+
action.setChecked(true)
|
|
219
|
+
else
|
|
220
|
+
action.setChecked(false)
|
|
221
|
+
end
|
|
222
|
+
action.connect(SIGNAL('triggered()')) { enable_disable_component_packet(index, target_name, packet_name, action.checked?) }
|
|
223
|
+
@tab_menu.addAction(action)
|
|
224
|
+
@tab_menu_actions << action
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def context_menu(point)
|
|
231
|
+
index = 0
|
|
232
|
+
(0..@tab_book.tabBar.count).each do |i|
|
|
233
|
+
index = i if @tab_book.tabBar.tabRect(i).contains(point)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
return if (index == @tab_book.tabBar.count)
|
|
237
|
+
|
|
238
|
+
# Bring the right clicked tab to the front
|
|
239
|
+
@tab_book.setCurrentIndex(index)
|
|
240
|
+
@tab_menu.exec(@tab_book.mapToGlobal(point))
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def start_subscription_thread
|
|
244
|
+
unless @subscription_thread
|
|
245
|
+
# Start Thread to Gather Events
|
|
246
|
+
@subscription_thread = Thread.new do
|
|
247
|
+
@cancel_thread = false
|
|
248
|
+
@sleeper = Sleeper.new
|
|
249
|
+
if !@packets.empty?
|
|
250
|
+
begin
|
|
251
|
+
while true
|
|
252
|
+
break if @cancel_thread
|
|
253
|
+
begin
|
|
254
|
+
@subscription_id = subscribe_packet_data(@packets, 10000)
|
|
255
|
+
break if @cancel_thread
|
|
256
|
+
if @pause
|
|
257
|
+
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Paused' }
|
|
258
|
+
else
|
|
259
|
+
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
|
|
260
|
+
end
|
|
261
|
+
Qt.execute_in_main_thread(true) { statusBar.showMessage("Connected to Command and Telemetry Server: #{Time.now.formatted}") }
|
|
262
|
+
rescue DRb::DRbConnError
|
|
263
|
+
break if @cancel_thread
|
|
264
|
+
Qt.execute_in_main_thread(true) do
|
|
265
|
+
@realtime_button_bar.state = 'Connecting'
|
|
266
|
+
statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
|
|
267
|
+
end
|
|
268
|
+
break if @sleeper.sleep(1)
|
|
269
|
+
break if @cancel_thread
|
|
270
|
+
retry
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
while true
|
|
274
|
+
break if @cancel_thread
|
|
275
|
+
begin
|
|
276
|
+
# Get a subscribed to packet
|
|
277
|
+
packet_data, target_name, packet_name, received_time, received_count = get_packet_data(@subscription_id)
|
|
278
|
+
|
|
279
|
+
# Put packet data into its packet
|
|
280
|
+
packet = System.telemetry.packet(target_name, packet_name)
|
|
281
|
+
packet.buffer = packet_data
|
|
282
|
+
packet.received_time = received_time
|
|
283
|
+
packet.received_count = received_count
|
|
284
|
+
|
|
285
|
+
# Route packet to its component(s)
|
|
286
|
+
index = packet.target_name + ' ' + packet.packet_name
|
|
287
|
+
@component_mutex.synchronize do
|
|
288
|
+
components = @packet_to_components_mapping[index]
|
|
289
|
+
if components
|
|
290
|
+
components.each do |component|
|
|
291
|
+
component.process_packet(packet)
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
rescue DRb::DRbConnError
|
|
296
|
+
break if @cancel_thread
|
|
297
|
+
Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server")) }
|
|
298
|
+
break # Let outer loop resubscribe
|
|
299
|
+
rescue RuntimeError => error
|
|
300
|
+
raise error unless error.message =~ /queue/
|
|
301
|
+
break if @cancel_thread
|
|
302
|
+
Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Connection Dropped by Command and Telemetry Server: #{Time.now.formatted}")) }
|
|
303
|
+
break # Let outer loop resubscribe
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
rescue Exception => error
|
|
308
|
+
break if @cancel_thread
|
|
309
|
+
Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Data Viewer : Subscription Thread")}
|
|
310
|
+
end
|
|
311
|
+
end # if !@packets.empty
|
|
312
|
+
end
|
|
313
|
+
else
|
|
314
|
+
Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def kill_subscription_thread
|
|
319
|
+
Cosmos.kill_thread(self, @subscription_thread)
|
|
320
|
+
@subscription_thread = nil
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def graceful_kill
|
|
324
|
+
@cancel_thread = true
|
|
325
|
+
@sleeper.cancel
|
|
326
|
+
script_disconnect() # This will break out of get_packet_data
|
|
327
|
+
Qt::CoreApplication.processEvents
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def handle_reset
|
|
331
|
+
@component_mutex.synchronize do
|
|
332
|
+
@components.each do |component|
|
|
333
|
+
component.reset
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
System.telemetry.reset
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def handle_start
|
|
340
|
+
if windowTitle() != 'Data Viewer'
|
|
341
|
+
# Clear Title
|
|
342
|
+
setWindowTitle('Data Viewer')
|
|
343
|
+
|
|
344
|
+
# Return to default configuration
|
|
345
|
+
# Show splash during possible reconfiguration
|
|
346
|
+
Splash.execute(self) do |splash|
|
|
347
|
+
ConfigParser.splash = splash
|
|
348
|
+
System.load_configuration
|
|
349
|
+
ConfigParser.splash = nil
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
# Reset Components
|
|
353
|
+
handle_reset()
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# Restart GUI Updates if necessary
|
|
357
|
+
if @pause
|
|
358
|
+
@pause = false
|
|
359
|
+
@timer.method_missing(:start, 100)
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# Restart Subscription Thread if necessary
|
|
363
|
+
start_subscription_thread()
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def handle_pause
|
|
367
|
+
@pause = true
|
|
368
|
+
if @subscription_thread
|
|
369
|
+
@realtime_button_bar.state = 'Paused'
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def handle_stop
|
|
374
|
+
# Shutdown packet subscription thread
|
|
375
|
+
kill_subscription_thread()
|
|
376
|
+
|
|
377
|
+
# Unsubscribe from subscription
|
|
378
|
+
if @subscription_id
|
|
379
|
+
begin
|
|
380
|
+
unsubscribe_packet_data(@subscription_id)
|
|
381
|
+
rescue DRb::DRbConnError
|
|
382
|
+
# Do Nothing
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
# Restart GUI Updates if necessary
|
|
387
|
+
if @pause
|
|
388
|
+
@pause = false
|
|
389
|
+
@timer.method_missing(:start, 100)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
@realtime_button_bar.state = 'Stopped'
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def handle_open_log_file
|
|
396
|
+
# Prompt user for filename
|
|
397
|
+
packet_log_dialog = PacketLogDialog.new(self, 'Open Log File(s):', @log_file_directory, @packet_log_reader, [], nil, false, true, true, Cosmos::TLM_FILE_PATTERN)
|
|
398
|
+
begin
|
|
399
|
+
packet_log_dialog.time_start = @time_start
|
|
400
|
+
packet_log_dialog.time_end = @time_end
|
|
401
|
+
case packet_log_dialog.exec
|
|
402
|
+
when Qt::Dialog::Accepted
|
|
403
|
+
@packet_log_reader = packet_log_dialog.packet_log_reader
|
|
404
|
+
@log_filenames = packet_log_dialog.filenames.sort
|
|
405
|
+
@time_start = packet_log_dialog.time_start
|
|
406
|
+
@time_end = packet_log_dialog.time_end
|
|
407
|
+
@log_file_directory = File.dirname(@log_filenames[0])
|
|
408
|
+
@log_file_directory << '/' unless @log_file_directory[-1..-1] == '\\'
|
|
409
|
+
|
|
410
|
+
# Stop realtime collection
|
|
411
|
+
handle_stop()
|
|
412
|
+
|
|
413
|
+
# Reset components
|
|
414
|
+
handle_reset()
|
|
415
|
+
|
|
416
|
+
@cancel_progress = false
|
|
417
|
+
ProgressDialog.execute(self, 'Processing Log File', 500, 200, @log_filenames.length > 1, true, true, true, true) do |dialog|
|
|
418
|
+
dialog.cancel_callback = method(:cancel_callback)
|
|
419
|
+
dialog.enable_cancel_button
|
|
420
|
+
|
|
421
|
+
@log_filenames.each_with_index do |filename, file_index|
|
|
422
|
+
break if @cancel_progress
|
|
423
|
+
Qt.execute_in_main_thread(true) do
|
|
424
|
+
self.setWindowTitle("Data Viewer : #{filename}")
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
file_size = File.size(filename).to_f
|
|
428
|
+
dialog.append_text("Processing: #{filename}")
|
|
429
|
+
|
|
430
|
+
Cosmos.check_log_configuration(@packet_log_reader, filename)
|
|
431
|
+
@packet_log_reader.each(filename, true, @time_start, @time_end) do |packet|
|
|
432
|
+
break if @cancel_progress
|
|
433
|
+
progress = @packet_log_reader.bytes_read.to_f / file_size
|
|
434
|
+
dialog.set_step_progress(progress)
|
|
435
|
+
|
|
436
|
+
# Route packet to its component(s)
|
|
437
|
+
index = packet.target_name + ' ' + packet.packet_name
|
|
438
|
+
components = @packet_to_components_mapping[index]
|
|
439
|
+
if components
|
|
440
|
+
@component_mutex.synchronize do
|
|
441
|
+
components.each do |component|
|
|
442
|
+
component.process_packet(packet)
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
dialog.set_overall_progress((file_index + 1).to_f / @log_filenames.length) if @log_filenames.length > 1
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
dialog.append_text("Done!")
|
|
452
|
+
dialog.set_step_progress(1.0)
|
|
453
|
+
dialog.set_overall_progress(1.0) if @log_filenames.length > 1
|
|
454
|
+
dialog.complete
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
ensure
|
|
458
|
+
packet_log_dialog.dispose if packet_log_dialog
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def cancel_callback(progress_dialog = nil)
|
|
463
|
+
@cancel_progress = true
|
|
464
|
+
return true, false
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
def update_gui
|
|
468
|
+
if @pause
|
|
469
|
+
@timer.method_missing(:stop)
|
|
470
|
+
else
|
|
471
|
+
Qt.execute_in_main_thread(true) do
|
|
472
|
+
@component_mutex.synchronize do
|
|
473
|
+
@components.each do |component|
|
|
474
|
+
break if @pause
|
|
475
|
+
component.update_gui
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def closeEvent(event)
|
|
483
|
+
# Stop GUI update timeout
|
|
484
|
+
@pause = true
|
|
485
|
+
|
|
486
|
+
# Stop Processing Packets
|
|
487
|
+
handle_stop()
|
|
488
|
+
|
|
489
|
+
# Shutdown each component
|
|
490
|
+
@component_mutex.synchronize do
|
|
491
|
+
@components.each {|component| component.shutdown}
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
# Give things time to complete
|
|
495
|
+
sleep(0.1)
|
|
496
|
+
|
|
497
|
+
# Standard COSMOS Shutdown
|
|
498
|
+
shutdown_cmd_tlm()
|
|
499
|
+
|
|
500
|
+
# Accept closure
|
|
501
|
+
super(event)
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
def process_config
|
|
505
|
+
# ensure the file exists
|
|
506
|
+
unless test ?f, @config_filename
|
|
507
|
+
raise "Configuration File Does not Exist: #{@config_filename}"
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
parser = ConfigParser.new
|
|
511
|
+
parser.parse_file(@config_filename) do |keyword, params|
|
|
512
|
+
case keyword
|
|
513
|
+
|
|
514
|
+
when 'AUTO_START'
|
|
515
|
+
usage = "#{keyword}"
|
|
516
|
+
parser.verify_num_parameters(0, 0, usage)
|
|
517
|
+
@auto_start = true
|
|
518
|
+
|
|
519
|
+
when 'COMPONENT'
|
|
520
|
+
usage = "#{keyword} <tab name> <component class filename> <component specific options...>"
|
|
521
|
+
parser.verify_num_parameters(2, nil, usage)
|
|
522
|
+
component_class = Cosmos.require_class(params[1])
|
|
523
|
+
if params.length >= 3
|
|
524
|
+
@components << component_class.new(self, params[0], *params[2..-1])
|
|
525
|
+
else
|
|
526
|
+
@components << component_class.new(self, params[0])
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
when 'PACKET'
|
|
530
|
+
usage = "#{keyword} <target_name> <packet_name>"
|
|
531
|
+
parser.verify_num_parameters(2, 2, usage)
|
|
532
|
+
target_name = params[0].upcase
|
|
533
|
+
packet_name = params[1].upcase
|
|
534
|
+
@packets << [target_name, packet_name]
|
|
535
|
+
@components[-1].add_packet(target_name, packet_name)
|
|
536
|
+
index = target_name + ' ' + packet_name
|
|
537
|
+
@packet_to_components_mapping[index] ||= []
|
|
538
|
+
@packet_to_components_mapping[index] << @components[-1]
|
|
539
|
+
|
|
540
|
+
# Unknown keyword
|
|
541
|
+
else
|
|
542
|
+
raise "Unhandled keyword: #{keyword}" if keyword
|
|
543
|
+
end
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
def delete_component(index)
|
|
548
|
+
@component_mutex.synchronize do
|
|
549
|
+
# Get the component to be deleted
|
|
550
|
+
component = @components[index]
|
|
551
|
+
|
|
552
|
+
# Delete from the components array
|
|
553
|
+
@components.delete_at(index)
|
|
554
|
+
|
|
555
|
+
# Delete from mapping
|
|
556
|
+
@packet_to_components_mapping.each do |key, components|
|
|
557
|
+
components.delete(component)
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
def enable_disable_component_packet(index, target_name, packet_name, enabled)
|
|
563
|
+
@component_mutex.synchronize do
|
|
564
|
+
# Get the component to be deleted
|
|
565
|
+
component = @components[index]
|
|
566
|
+
|
|
567
|
+
key = target_name + ' ' + packet_name
|
|
568
|
+
if enabled
|
|
569
|
+
# Add to mapping
|
|
570
|
+
components = @packet_to_components_mapping[key]
|
|
571
|
+
components << component unless components.include?(component)
|
|
572
|
+
else
|
|
573
|
+
# Delete from mapping
|
|
574
|
+
components = @packet_to_components_mapping[key]
|
|
575
|
+
components.delete(component)
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
# Handles deleting the current tab
|
|
581
|
+
def on_tab_delete
|
|
582
|
+
if @tab_book.currentIndex() and @tab_book.currentIndex() >= 0
|
|
583
|
+
case Qt::MessageBox.warning(self, 'Warning!', "Are you sure you want to delete the active tab?", Qt::MessageBox::Yes | Qt::MessageBox::No, Qt::MessageBox::No)
|
|
584
|
+
when Qt::MessageBox::Yes
|
|
585
|
+
# Remove component
|
|
586
|
+
tab_index = @tab_book.currentIndex()
|
|
587
|
+
delete_component(tab_index)
|
|
588
|
+
@tab_book.removeTab(tab_index)
|
|
589
|
+
|
|
590
|
+
statusBar.showMessage(tr("Tab Deleted"))
|
|
591
|
+
end
|
|
592
|
+
else
|
|
593
|
+
Qt::MessageBox.information(self, 'Info', "No tabs exist")
|
|
594
|
+
end
|
|
595
|
+
end # def on_tab_delete
|
|
596
|
+
|
|
597
|
+
#############################
|
|
598
|
+
# Class methods
|
|
599
|
+
#############################
|
|
600
|
+
|
|
601
|
+
def self.run(option_parser = nil, options = nil)
|
|
602
|
+
Cosmos.catch_fatal_exception do
|
|
603
|
+
unless option_parser and options
|
|
604
|
+
option_parser, options = create_default_options()
|
|
605
|
+
options.width = 550
|
|
606
|
+
options.height = 500
|
|
607
|
+
options.title = "Data Viewer"
|
|
608
|
+
options.config_file = 'data_viewer.txt'
|
|
609
|
+
option_parser.separator "Data Viewer Specific Options:"
|
|
610
|
+
option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
|
|
611
|
+
options.config_file = arg
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
super(option_parser, options)
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
end # class DataViewer
|
|
620
|
+
|
|
621
|
+
end # module Cosmos
|