cosmos 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.gitignore +48 -48
- data/.travis.yml +7 -7
- data/CONTRIBUTING.txt +50 -50
- data/Gemfile +6 -6
- data/Guardfile +27 -27
- data/LICENSE.txt +879 -879
- data/Manifest.txt +1116 -1114
- data/README.md +109 -107
- data/Rakefile +214 -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 +247 -247
- 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 -294
- 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.rb +18 -18
- 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 +20 -20
- 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/Replay.bat +59 -59
- 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/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 +18 -18
- data/autohotkey/tools/TlmViewerAHK3 +18 -18
- data/autohotkey/tools/TlmViewerAHK4 +18 -18
- data/autohotkey/tools/TlmViewerAHK5 +18 -18
- data/autohotkey/tools/autohotkey.rb +37 -37
- data/autohotkey/tools/cmd_extractor.ahk +27 -27
- data/autohotkey/tools/cmd_sender.ahk +182 -162
- data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
- data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
- data/autohotkey/tools/data_viewer.ahk +135 -135
- data/autohotkey/tools/handbook_creator.ahk +23 -23
- data/autohotkey/tools/launcher.ahk +41 -41
- data/autohotkey/tools/limits_monitor.ahk +70 -70
- data/autohotkey/tools/open_gl_builder.ahk +134 -134
- data/autohotkey/tools/packet_viewer.ahk +143 -143
- data/autohotkey/tools/packet_viewer2.ahk +9 -9
- data/autohotkey/tools/replay.ahk +98 -98
- data/autohotkey/tools/script_runner.ahk +589 -589
- data/autohotkey/tools/script_runner2.ahk +34 -31
- data/autohotkey/tools/table_manager.ahk +220 -220
- data/autohotkey/tools/test_runner.ahk +262 -259
- data/autohotkey/tools/test_runner2.ahk +52 -52
- data/autohotkey/tools/test_runner3.ahk +13 -13
- data/autohotkey/tools/tlm_extractor.ahk +272 -272
- data/autohotkey/tools/tlm_grapher.ahk +642 -642
- 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 -49
- 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 +98 -97
- data/data/about.txt +4 -4
- data/data/crc.txt +306 -305
- data/data/diamond.STL +57 -57
- data/data/legal.txt +9 -9
- data/demo/Gemfile +6 -6
- data/demo/Launcher +15 -15
- data/demo/Launcher.bat +59 -59
- data/demo/Rakefile +61 -61
- data/demo/config/data/crc.txt +222 -206
- data/demo/config/data/diamond.STL +57 -57
- data/demo/config/data/meta_init.txt +4 -4
- data/demo/config/system/system.txt +34 -34
- 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 +3 -3
- 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 -294
- 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 -12
- 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 +54 -48
- data/demo/config/targets/TEMPLATED/target.txt +6 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
- 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 +86 -86
- 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 +80 -80
- 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 -52
- data/demo/lib/example_target.rb +113 -108
- 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 +182 -182
- 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 +15 -15
- data/demo/tools/CmdExtractor.bat +59 -59
- data/demo/tools/CmdSender +15 -15
- data/demo/tools/CmdSender.bat +59 -59
- data/demo/tools/CmdTlmServer +15 -15
- data/demo/tools/CmdTlmServer.bat +59 -59
- data/demo/tools/DataViewer +15 -15
- data/demo/tools/DataViewer.bat +59 -59
- data/demo/tools/ExampleTarget +15 -15
- data/demo/tools/ExampleTarget.bat +59 -59
- data/demo/tools/HandbookCreator +15 -15
- data/demo/tools/HandbookCreator.bat +61 -61
- data/demo/tools/Launcher +15 -15
- data/demo/tools/Launcher.bat +59 -59
- data/demo/tools/LimitsMonitor +15 -15
- data/demo/tools/LimitsMonitor.bat +59 -59
- data/demo/tools/OpenGLBuilder +15 -15
- data/demo/tools/OpenGLBuilder.bat +59 -59
- data/demo/tools/PacketViewer +15 -15
- data/demo/tools/PacketViewer.bat +59 -59
- data/demo/tools/Replay +15 -15
- data/demo/tools/Replay.bat +59 -59
- data/demo/tools/ScpiTarget +15 -15
- data/demo/tools/ScpiTarget.bat +59 -59
- data/demo/tools/ScriptRunner +15 -15
- data/demo/tools/ScriptRunner.bat +59 -59
- data/demo/tools/TableManager +15 -15
- data/demo/tools/TableManager.bat +59 -59
- data/demo/tools/TestRunner +15 -15
- data/demo/tools/TestRunner.bat +59 -59
- data/demo/tools/TlmExtractor +15 -15
- data/demo/tools/TlmExtractor.bat +59 -59
- data/demo/tools/TlmGrapher +15 -15
- data/demo/tools/TlmGrapher.bat +59 -59
- data/demo/tools/TlmViewer +15 -15
- data/demo/tools/TlmViewer.bat +59 -59
- data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- 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 +261 -261
- 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 +81 -81
- 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 +894 -894
- 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 +306 -306
- data/ext/mkrf_conf.rb +40 -40
- data/install/Gemfile +6 -6
- data/install/Launcher +14 -14
- data/install/Launcher.bat +59 -59
- data/install/Rakefile +61 -61
- data/install/config/data/crc.txt +134 -133
- 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 +39 -39
- 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 +15 -15
- data/install/tools/CmdExtractor.bat +59 -59
- data/install/tools/CmdSender +15 -15
- data/install/tools/CmdSender.bat +59 -59
- data/install/tools/CmdTlmServer +15 -15
- data/install/tools/CmdTlmServer.bat +59 -59
- data/install/tools/DataViewer +15 -15
- data/install/tools/DataViewer.bat +59 -59
- data/install/tools/HandbookCreator +15 -15
- data/install/tools/HandbookCreator.bat +61 -61
- data/install/tools/Launcher +15 -15
- data/install/tools/Launcher.bat +59 -59
- data/install/tools/LimitsMonitor +15 -15
- data/install/tools/LimitsMonitor.bat +59 -59
- data/install/tools/OpenGLBuilder +15 -15
- data/install/tools/OpenGLBuilder.bat +59 -59
- data/install/tools/PacketViewer +15 -15
- data/install/tools/PacketViewer.bat +59 -59
- data/install/tools/Replay +15 -15
- data/install/tools/Replay.bat +59 -59
- data/install/tools/ScriptRunner +15 -15
- data/install/tools/ScriptRunner.bat +59 -59
- data/install/tools/TableManager +15 -15
- data/install/tools/TableManager.bat +59 -59
- data/install/tools/TestRunner +15 -15
- data/install/tools/TestRunner.bat +59 -59
- data/install/tools/TlmExtractor +15 -15
- data/install/tools/TlmExtractor.bat +59 -59
- data/install/tools/TlmGrapher +15 -15
- data/install/tools/TlmGrapher.bat +59 -59
- data/install/tools/TlmViewer +15 -15
- data/install/tools/TlmViewer.bat +59 -59
- data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- 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 +310 -310
- data/lib/cosmos/core_ext/stringio.rb +24 -24
- data/lib/cosmos/core_ext/time.rb +446 -446
- 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 +317 -317
- data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
- 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 +196 -196
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
- 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 +113 -113
- 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 +494 -494
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
- 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 +459 -459
- 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 -712
- 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 +813 -786
- data/lib/cosmos/gui/qt_tool.rb +378 -373
- 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 +395 -395
- data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
- data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
- 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 -149
- data/lib/cosmos/interfaces/interface.rb +213 -213
- 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 -128
- data/lib/cosmos/interfaces/stream_interface.rb +156 -156
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
- data/lib/cosmos/interfaces/udp_interface.rb +173 -173
- 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 +344 -320
- data/lib/cosmos/io/json_drb_object.rb +137 -137
- 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 +583 -532
- data/lib/cosmos/io/udp_sockets.rb +152 -152
- data/lib/cosmos/io/win32_serial_driver.rb +147 -147
- data/lib/cosmos/packet_logs.rb +6 -6
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
- data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
- data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
- data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
- data/lib/cosmos/packets/binary_accessor.rb +921 -921
- data/lib/cosmos/packets/commands.rb +291 -291
- data/lib/cosmos/packets/limits.rb +263 -263
- data/lib/cosmos/packets/limits_response.rb +38 -38
- data/lib/cosmos/packets/packet.rb +714 -699
- data/lib/cosmos/packets/packet_config.rb +1034 -1034
- data/lib/cosmos/packets/packet_item.rb +317 -317
- data/lib/cosmos/packets/packet_item_limits.rb +128 -128
- data/lib/cosmos/packets/structure.rb +421 -386
- data/lib/cosmos/packets/structure_item.rb +233 -233
- data/lib/cosmos/packets/telemetry.rb +317 -317
- 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/extract.rb +115 -115
- data/lib/cosmos/script/script.rb +1513 -1493
- 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 +152 -143
- data/lib/cosmos/streams/stream.rb +57 -57
- data/lib/cosmos/streams/stream_protocol.rb +369 -369
- data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
- data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
- 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 +558 -558
- data/lib/cosmos/system/target.rb +178 -178
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
- 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 +936 -940
- data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
- 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 +628 -600
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
- data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
- data/lib/cosmos/tools/launcher/launcher.rb +184 -184
- data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
- data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
- data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
- 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 +525 -525
- data/lib/cosmos/tools/replay/replay.rb +495 -488
- data/lib/cosmos/tools/replay/replay_server.rb +91 -91
- data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
- data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
- 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 +480 -480
- data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
- data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
- 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 +94 -94
- 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 +180 -180
- 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 +173 -173
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
- 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 -320
- 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 +1278 -1278
- 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 +111 -95
- 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 +72 -66
- 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 -458
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
- 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 +70 -70
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
- 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 +647 -596
- data/lib/cosmos/utilities.rb +11 -10
- 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 +74 -74
- 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 -0
- 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 +311 -311
- data/roodi.yml +24 -24
- data/run_gui_tests.bat +32 -32
- 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 +151 -151
- data/spec/gui/line_graph/line_clip_spec.rb +322 -322
- 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 -294
- 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 -131
- data/spec/interfaces/linc_interface_spec.rb +199 -199
- 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 +54 -54
- data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
- data/spec/interfaces/udp_interface_spec.rb +175 -177
- 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 +99 -99
- 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 +61 -61
- 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 +408 -408
- data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
- data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
- data/spec/packets/binary_accessor_spec.rb +2073 -2073
- data/spec/packets/commands_spec.rb +369 -369
- data/spec/packets/limits_response_spec.rb +25 -25
- data/spec/packets/limits_spec.rb +326 -326
- data/spec/packets/packet_config_spec.rb +1620 -1620
- 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 +1057 -949
- data/spec/packets/structure_item_spec.rb +195 -195
- data/spec/packets/structure_spec.rb +419 -419
- data/spec/packets/telemetry_spec.rb +535 -535
- 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/script_spec.rb +654 -654
- data/spec/spec_helper.rb +154 -148
- data/spec/streams/burst_stream_protocol_spec.rb +32 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
- data/spec/streams/length_stream_protocol_spec.rb +297 -297
- data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
- data/spec/streams/serial_stream_spec.rb +105 -105
- data/spec/streams/stream_protocol_spec.rb +332 -332
- data/spec/streams/stream_spec.rb +29 -29
- data/spec/streams/tcpip_client_stream_spec.rb +54 -54
- data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
- data/spec/streams/template_stream_protocol_spec.rb +151 -151
- data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
- data/spec/system/system_spec.rb +645 -645
- data/spec/system/target_spec.rb +248 -248
- data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
- 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 +411 -411
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
- data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
- data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
- data/spec/top_level/top_level_spec.rb +334 -321
- 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
- metadata +18 -2
|
@@ -1,81 +1,81 @@
|
|
|
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/config/config_parser'
|
|
12
|
-
require 'cosmos/streams/stream_protocol'
|
|
13
|
-
|
|
14
|
-
module Cosmos
|
|
15
|
-
|
|
16
|
-
# This StreamProtocol delineates packets using termination characters at
|
|
17
|
-
# the end of the stream.
|
|
18
|
-
class TerminatedStreamProtocol < StreamProtocol
|
|
19
|
-
|
|
20
|
-
# @param write_termination_characters [String] The characters to write to
|
|
21
|
-
# the stream after writing the Packet buffer. Must be given as a
|
|
22
|
-
# hexadecimal string such as '0xABCD'.
|
|
23
|
-
# @param read_termination_characters [String] The characters at the end of
|
|
24
|
-
# the stream which delineate the end of a Packet. Must be given as a
|
|
25
|
-
# hexadecimal string such as '0xABCD'.
|
|
26
|
-
# @param strip_read_termination [Boolean] Whether to remove the
|
|
27
|
-
# read_termination_characters before turning the stream data into a
|
|
28
|
-
# Packet.
|
|
29
|
-
# @param discard_leading_bytes (see StreamProtocol#initialize)
|
|
30
|
-
# @param sync_pattern (see StreamProtocol#initialize)
|
|
31
|
-
# @param fill_sync_pattern (see StreamProtocol#initialize)
|
|
32
|
-
def initialize(write_termination_characters,
|
|
33
|
-
read_termination_characters,
|
|
34
|
-
strip_read_termination = true,
|
|
35
|
-
discard_leading_bytes = 0,
|
|
36
|
-
sync_pattern = nil,
|
|
37
|
-
fill_sync_pattern = false)
|
|
38
|
-
@write_termination_characters = write_termination_characters.hex_to_byte_string
|
|
39
|
-
@read_termination_characters = read_termination_characters.hex_to_byte_string
|
|
40
|
-
@strip_read_termination = ConfigParser.handle_true_false(strip_read_termination)
|
|
41
|
-
|
|
42
|
-
super(discard_leading_bytes, sync_pattern, fill_sync_pattern)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# See StreamProtocol#pre_write_packet
|
|
46
|
-
def pre_write_packet(packet)
|
|
47
|
-
data = super(packet)
|
|
48
|
-
raise "Packet contains termination characters!" if data.index(@write_termination_characters)
|
|
49
|
-
|
|
50
|
-
data = data.clone # Don't want to modify the actual packet buffer with the termination characters
|
|
51
|
-
@write_termination_characters.each_byte do |byte|
|
|
52
|
-
data << byte
|
|
53
|
-
end
|
|
54
|
-
data
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
protected
|
|
58
|
-
|
|
59
|
-
def reduce_to_single_packet
|
|
60
|
-
while true
|
|
61
|
-
index = @data.index(@read_termination_characters)
|
|
62
|
-
|
|
63
|
-
# Reduce to packet data and setup current_data for next packet
|
|
64
|
-
if index
|
|
65
|
-
if @strip_read_termination
|
|
66
|
-
packet_data = @data[0..(index - 1)]
|
|
67
|
-
else
|
|
68
|
-
packet_data = @data[0..(index + @read_termination_characters.length - 1)]
|
|
69
|
-
end
|
|
70
|
-
@data.replace(@data[(index + @read_termination_characters.length)..-1])
|
|
71
|
-
return packet_data
|
|
72
|
-
else
|
|
73
|
-
read_and_handle_timeout()
|
|
74
|
-
return nil if @data.length <= 0
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
end # class TerminatedStreamProtocol
|
|
80
|
-
|
|
81
|
-
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/config/config_parser'
|
|
12
|
+
require 'cosmos/streams/stream_protocol'
|
|
13
|
+
|
|
14
|
+
module Cosmos
|
|
15
|
+
|
|
16
|
+
# This StreamProtocol delineates packets using termination characters at
|
|
17
|
+
# the end of the stream.
|
|
18
|
+
class TerminatedStreamProtocol < StreamProtocol
|
|
19
|
+
|
|
20
|
+
# @param write_termination_characters [String] The characters to write to
|
|
21
|
+
# the stream after writing the Packet buffer. Must be given as a
|
|
22
|
+
# hexadecimal string such as '0xABCD'.
|
|
23
|
+
# @param read_termination_characters [String] The characters at the end of
|
|
24
|
+
# the stream which delineate the end of a Packet. Must be given as a
|
|
25
|
+
# hexadecimal string such as '0xABCD'.
|
|
26
|
+
# @param strip_read_termination [Boolean] Whether to remove the
|
|
27
|
+
# read_termination_characters before turning the stream data into a
|
|
28
|
+
# Packet.
|
|
29
|
+
# @param discard_leading_bytes (see StreamProtocol#initialize)
|
|
30
|
+
# @param sync_pattern (see StreamProtocol#initialize)
|
|
31
|
+
# @param fill_sync_pattern (see StreamProtocol#initialize)
|
|
32
|
+
def initialize(write_termination_characters,
|
|
33
|
+
read_termination_characters,
|
|
34
|
+
strip_read_termination = true,
|
|
35
|
+
discard_leading_bytes = 0,
|
|
36
|
+
sync_pattern = nil,
|
|
37
|
+
fill_sync_pattern = false)
|
|
38
|
+
@write_termination_characters = write_termination_characters.hex_to_byte_string
|
|
39
|
+
@read_termination_characters = read_termination_characters.hex_to_byte_string
|
|
40
|
+
@strip_read_termination = ConfigParser.handle_true_false(strip_read_termination)
|
|
41
|
+
|
|
42
|
+
super(discard_leading_bytes, sync_pattern, fill_sync_pattern)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# See StreamProtocol#pre_write_packet
|
|
46
|
+
def pre_write_packet(packet)
|
|
47
|
+
data = super(packet)
|
|
48
|
+
raise "Packet contains termination characters!" if data.index(@write_termination_characters)
|
|
49
|
+
|
|
50
|
+
data = data.clone # Don't want to modify the actual packet buffer with the termination characters
|
|
51
|
+
@write_termination_characters.each_byte do |byte|
|
|
52
|
+
data << byte
|
|
53
|
+
end
|
|
54
|
+
data
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
protected
|
|
58
|
+
|
|
59
|
+
def reduce_to_single_packet
|
|
60
|
+
while true
|
|
61
|
+
index = @data.index(@read_termination_characters)
|
|
62
|
+
|
|
63
|
+
# Reduce to packet data and setup current_data for next packet
|
|
64
|
+
if index
|
|
65
|
+
if @strip_read_termination
|
|
66
|
+
packet_data = @data[0..(index - 1)]
|
|
67
|
+
else
|
|
68
|
+
packet_data = @data[0..(index + @read_termination_characters.length - 1)]
|
|
69
|
+
end
|
|
70
|
+
@data.replace(@data[(index + @read_termination_characters.length)..-1])
|
|
71
|
+
return packet_data
|
|
72
|
+
else
|
|
73
|
+
read_and_handle_timeout()
|
|
74
|
+
return nil if @data.length <= 0
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end # class TerminatedStreamProtocol
|
|
80
|
+
|
|
81
|
+
end # module Cosmos
|
data/lib/cosmos/system.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
require 'cosmos/system/target'
|
|
4
|
-
require 'cosmos/system/system'
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
require 'cosmos/system/target'
|
|
4
|
+
require 'cosmos/system/system'
|
data/lib/cosmos/system/system.rb
CHANGED
|
@@ -1,558 +1,558 @@
|
|
|
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/config/config_parser'
|
|
12
|
-
require 'cosmos/packets/packet_config'
|
|
13
|
-
require 'cosmos/packets/commands'
|
|
14
|
-
require 'cosmos/packets/telemetry'
|
|
15
|
-
require 'cosmos/packets/limits'
|
|
16
|
-
require 'cosmos/system/target'
|
|
17
|
-
require 'cosmos/packet_logs'
|
|
18
|
-
require 'fileutils'
|
|
19
|
-
require 'drb/acl'
|
|
20
|
-
|
|
21
|
-
module Cosmos
|
|
22
|
-
|
|
23
|
-
# System is the primary entry point into the COSMOS framework. It captures
|
|
24
|
-
# system wide configuration items such as the available ports and paths to
|
|
25
|
-
# various files used by the system. The #commands, #telemetry, and #limits
|
|
26
|
-
# class variables are the primary access points for applications. The
|
|
27
|
-
# #targets variable provides access to all the targets defined by the system.
|
|
28
|
-
# Its primary responsibily is to load the system configuration file and
|
|
29
|
-
# create all the Target instances. It also saves and restores configurations
|
|
30
|
-
# using a MD5 checksum over the entire configuration to detect changes.
|
|
31
|
-
class System
|
|
32
|
-
# @return [Hash<String,Fixnum>] Hash of all the known ports and their values
|
|
33
|
-
instance_attr_reader :ports
|
|
34
|
-
# @return [Hash<String,String>] Hash of all the known paths and their values
|
|
35
|
-
instance_attr_reader :paths
|
|
36
|
-
# @return [String] Arbitrary string containing the version
|
|
37
|
-
instance_attr_reader :cmd_tlm_version
|
|
38
|
-
# @return [PacketLogWriter] Class used to create log files
|
|
39
|
-
instance_attr_reader :default_packet_log_writer
|
|
40
|
-
# @return [PacketLogReader] Class used to read log files
|
|
41
|
-
instance_attr_reader :default_packet_log_reader
|
|
42
|
-
# @return [Boolean] Whether to use DNS to lookup IP addresses or not
|
|
43
|
-
instance_attr_reader :use_dns
|
|
44
|
-
# @return [String] Stores the initial configuration file used when this
|
|
45
|
-
# System was initialized
|
|
46
|
-
instance_attr_reader :initial_filename
|
|
47
|
-
# @return [PacketDefinition] Stores the initial packet list used when this
|
|
48
|
-
# System was initialized
|
|
49
|
-
instance_attr_reader :initial_config
|
|
50
|
-
# @return [ACL] Access control list showing which machines can have access
|
|
51
|
-
instance_attr_reader :acl
|
|
52
|
-
# @return [Hash<String,Target>] Hash of all the known targets
|
|
53
|
-
instance_attr_reader :targets
|
|
54
|
-
# @return [Integer] The number of seconds before a telemetry packet is considered stale
|
|
55
|
-
instance_attr_reader :staleness_seconds
|
|
56
|
-
# @return [Symbol] The current limits set
|
|
57
|
-
instance_attr_reader :limits_set
|
|
58
|
-
|
|
59
|
-
# Known COSMOS ports
|
|
60
|
-
KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
|
|
61
|
-
# Known COSMOS paths
|
|
62
|
-
KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
|
|
63
|
-
|
|
64
|
-
@@instance = nil
|
|
65
|
-
|
|
66
|
-
# Create a new System object. Note, this should not be called directly but
|
|
67
|
-
# you should instead use System.instance and treat this class as a
|
|
68
|
-
# singleton.
|
|
69
|
-
#
|
|
70
|
-
# @param filename [String] Full path to the system configuration file to
|
|
71
|
-
# read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
|
|
72
|
-
def initialize(filename = nil)
|
|
73
|
-
raise "Cosmos::System created twice" unless @@instance.nil?
|
|
74
|
-
@@instance = self
|
|
75
|
-
@targets = {}
|
|
76
|
-
@targets['UNKNOWN'] = Target.new('UNKNOWN')
|
|
77
|
-
@config = nil
|
|
78
|
-
@commands = nil
|
|
79
|
-
@telemetry = nil
|
|
80
|
-
@limits = nil
|
|
81
|
-
@cmd_tlm_version = nil
|
|
82
|
-
@default_packet_log_writer = PacketLogWriter
|
|
83
|
-
@default_packet_log_reader = PacketLogReader
|
|
84
|
-
@use_dns = true
|
|
85
|
-
@acl = nil
|
|
86
|
-
@staleness_seconds = 30
|
|
87
|
-
@limits_set = :DEFAULT
|
|
88
|
-
|
|
89
|
-
@ports = {}
|
|
90
|
-
@ports['CTS_API'] = 7777
|
|
91
|
-
@ports['TLMVIEWER_API'] = 7778
|
|
92
|
-
@ports['CTS_PREIDENTIFIED'] = 7779
|
|
93
|
-
|
|
94
|
-
@paths = {}
|
|
95
|
-
@paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
|
|
96
|
-
@paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
|
|
97
|
-
@paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
|
|
98
|
-
@paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
|
|
99
|
-
@paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
|
|
100
|
-
@paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
|
|
101
|
-
|
|
102
|
-
unless filename
|
|
103
|
-
system_arg = false
|
|
104
|
-
ARGV.each do |arg|
|
|
105
|
-
if system_arg
|
|
106
|
-
filename = File.join(USERPATH, 'config', 'system', arg)
|
|
107
|
-
break
|
|
108
|
-
end
|
|
109
|
-
system_arg = true if arg == '--system'
|
|
110
|
-
end
|
|
111
|
-
filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
|
|
112
|
-
end
|
|
113
|
-
process_file(filename)
|
|
114
|
-
ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
|
|
115
|
-
|
|
116
|
-
@initial_filename = filename
|
|
117
|
-
@initial_config = nil
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# @return [String] Configuration name
|
|
121
|
-
def self.configuration_name
|
|
122
|
-
# In order not to make the @config instance variable accessable to the
|
|
123
|
-
# outside (using a regular accessor method) we use the ability of the
|
|
124
|
-
# object to grab its own instance variable
|
|
125
|
-
self.instance.instance_variable_get(:@config).name
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# Clear the command and telemetry counters for all the targets as well as
|
|
129
|
-
# the counters associated with the Commands and Telemetry instances
|
|
130
|
-
def self.clear_counters
|
|
131
|
-
self.instance.targets.each do |target_name, target|
|
|
132
|
-
target.cmd_cnt = 0
|
|
133
|
-
target.tlm_cnt = 0
|
|
134
|
-
end
|
|
135
|
-
self.instance.telemetry.clear_counters
|
|
136
|
-
self.instance.commands.clear_counters
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# @return [Commands] Access to the command definiton
|
|
140
|
-
def commands
|
|
141
|
-
load_packets() unless @config
|
|
142
|
-
return @commands
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# (see #commands)
|
|
146
|
-
def self.commands
|
|
147
|
-
return self.instance.commands
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# @return [Telemetry] Access to the telemetry definition
|
|
151
|
-
def telemetry
|
|
152
|
-
load_packets() unless @config
|
|
153
|
-
return @telemetry
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# (see #telemetry)
|
|
157
|
-
def self.telemetry
|
|
158
|
-
return self.instance.telemetry
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# @return [Limits] Access to the limits definition
|
|
162
|
-
def limits
|
|
163
|
-
load_packets() unless @config
|
|
164
|
-
return @limits
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# (see #limits)
|
|
168
|
-
def self.limits
|
|
169
|
-
return self.instance.limits
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# Change the system limits set
|
|
173
|
-
#
|
|
174
|
-
# @param [Symbol] The name of the limits set. :DEFAULT is always an option
|
|
175
|
-
# but limits sets are user defined
|
|
176
|
-
def limits_set=(limits_set)
|
|
177
|
-
load_packets() unless @config
|
|
178
|
-
new_limits_set = limits_set.to_s.upcase.intern
|
|
179
|
-
if @limits_set != new_limits_set
|
|
180
|
-
if @config.limits_sets.include?(new_limits_set)
|
|
181
|
-
@limits_set = new_limits_set
|
|
182
|
-
Logger.info("Limits Set Changed to: #{@limits_set}")
|
|
183
|
-
CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
|
|
184
|
-
else
|
|
185
|
-
raise "Unknown limits set requested: #{new_limits_set}"
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
# (see #limits_set=)
|
|
191
|
-
def self.limits_set=(limits_set)
|
|
192
|
-
self.instance.limits_set = limits_set
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
# @return [System] The System singleton
|
|
196
|
-
def self.instance(filename = nil)
|
|
197
|
-
@@instance ||= self.new(filename)
|
|
198
|
-
return @@instance
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# Process the system.txt configuration file
|
|
202
|
-
#
|
|
203
|
-
# @param filename [String] The configuration file
|
|
204
|
-
# @param configuration_directory [String] The configuration directory to
|
|
205
|
-
# search for the target command and telemetry files. Pass nil to look in
|
|
206
|
-
# the default location of <USERPATH>/config/targets.
|
|
207
|
-
def process_file(filename, configuration_directory = nil)
|
|
208
|
-
@targets = {}
|
|
209
|
-
# Set config to nil so things will lazy load later
|
|
210
|
-
@config = nil
|
|
211
|
-
acl_list = []
|
|
212
|
-
all_allowed = false
|
|
213
|
-
first_procedures_path = true
|
|
214
|
-
|
|
215
|
-
Cosmos.set_working_dir do
|
|
216
|
-
parser = ConfigParser.new
|
|
217
|
-
|
|
218
|
-
# First pass - Everything except targets
|
|
219
|
-
parser.parse_file(filename) do |keyword, parameters|
|
|
220
|
-
case keyword
|
|
221
|
-
when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET'
|
|
222
|
-
# Will be handled by second pass
|
|
223
|
-
|
|
224
|
-
when 'PORT'
|
|
225
|
-
usage = "#{keyword} <PORT NAME> <PORT VALUE>"
|
|
226
|
-
parser.verify_num_parameters(2, 2, usage)
|
|
227
|
-
port_name = parameters[0].to_s.upcase
|
|
228
|
-
@ports[port_name] = Integer(parameters[1])
|
|
229
|
-
Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
|
|
230
|
-
|
|
231
|
-
when 'PATH'
|
|
232
|
-
usage = "#{keyword} <PATH NAME> <PATH>"
|
|
233
|
-
parser.verify_num_parameters(2, 2, usage)
|
|
234
|
-
path_name = parameters[0].to_s.upcase
|
|
235
|
-
path = File.expand_path(parameters[1])
|
|
236
|
-
if path_name == 'PROCEDURES'
|
|
237
|
-
if first_procedures_path
|
|
238
|
-
@paths[path_name] = []
|
|
239
|
-
first_procedures_path = false
|
|
240
|
-
end
|
|
241
|
-
@paths[path_name] << path
|
|
242
|
-
else
|
|
243
|
-
@paths[path_name] = path
|
|
244
|
-
end
|
|
245
|
-
unless Dir.exist?(path)
|
|
246
|
-
begin
|
|
247
|
-
FileUtils.mkdir_p(path)
|
|
248
|
-
raise "Path creation failed: #{path}" unless File.exist?(path)
|
|
249
|
-
Logger.info "Created PATH #{path_name} #{path}"
|
|
250
|
-
rescue Exception => err
|
|
251
|
-
Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
|
|
255
|
-
|
|
256
|
-
when 'DEFAULT_PACKET_LOG_WRITER'
|
|
257
|
-
usage = "#{keyword} <FILENAME>"
|
|
258
|
-
parser.verify_num_parameters(1, 1, usage)
|
|
259
|
-
@default_packet_log_writer = Cosmos.require_class(parameters[0])
|
|
260
|
-
|
|
261
|
-
when 'DEFAULT_PACKET_LOG_READER'
|
|
262
|
-
usage = "#{keyword} <FILENAME>"
|
|
263
|
-
parser.verify_num_parameters(1, 1, usage)
|
|
264
|
-
@default_packet_log_reader = Cosmos.require_class(parameters[0])
|
|
265
|
-
|
|
266
|
-
when 'DISABLE_DNS'
|
|
267
|
-
usage = "#{keyword}"
|
|
268
|
-
parser.verify_num_parameters(0, 0, usage)
|
|
269
|
-
@use_dns = false
|
|
270
|
-
|
|
271
|
-
when 'ALLOW_ACCESS'
|
|
272
|
-
parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
|
|
273
|
-
begin
|
|
274
|
-
addr = parameters[0].upcase
|
|
275
|
-
if addr == 'ALL'
|
|
276
|
-
all_allowed = true
|
|
277
|
-
acl_list = []
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
unless all_allowed
|
|
281
|
-
first_char = addr[0..0]
|
|
282
|
-
if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
|
|
283
|
-
# Try to lookup IP Address
|
|
284
|
-
info = Socket.gethostbyname(addr)
|
|
285
|
-
addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
|
|
286
|
-
if (acl_list.empty?)
|
|
287
|
-
acl_list << 'allow'
|
|
288
|
-
acl_list << '127.0.0.1'
|
|
289
|
-
end
|
|
290
|
-
acl_list << 'allow'
|
|
291
|
-
acl_list << addr
|
|
292
|
-
else
|
|
293
|
-
raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
|
|
294
|
-
if (acl_list.empty?)
|
|
295
|
-
acl_list << 'allow'
|
|
296
|
-
acl_list << '127.0.0.1'
|
|
297
|
-
end
|
|
298
|
-
acl_list << 'allow'
|
|
299
|
-
acl_list << addr
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
rescue => err
|
|
303
|
-
raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
when 'STALENESS_SECONDS'
|
|
307
|
-
parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
|
|
308
|
-
@staleness_seconds = Integer(parameters[0])
|
|
309
|
-
|
|
310
|
-
when 'CMD_TLM_VERSION'
|
|
311
|
-
usage = "#{keyword} <VERSION>"
|
|
312
|
-
parser.verify_num_parameters(1, 1, usage)
|
|
313
|
-
@cmd_tlm_version = parameters[0]
|
|
314
|
-
|
|
315
|
-
else
|
|
316
|
-
# blank lines will have a nil keyword and should not raise an exception
|
|
317
|
-
raise parser.error("Unknown keyword '#{keyword}'") if keyword
|
|
318
|
-
end # case keyword
|
|
319
|
-
end # parser.parse_file
|
|
320
|
-
|
|
321
|
-
@acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
|
|
322
|
-
|
|
323
|
-
# Second pass - Process targets
|
|
324
|
-
process_targets(parser, filename, configuration_directory)
|
|
325
|
-
|
|
326
|
-
end # Cosmos.set_working_dir
|
|
327
|
-
end # def process_file
|
|
328
|
-
|
|
329
|
-
# Parse the system.txt configuration file looking for keywords associated
|
|
330
|
-
# with targets and create all the Target instances in the system.
|
|
331
|
-
#
|
|
332
|
-
# @param parser [ConfigParser] Parser created by process_file
|
|
333
|
-
# @param filename (see #process_file)
|
|
334
|
-
# @param configuration_directory (see #process_file)
|
|
335
|
-
def process_targets(parser, filename, configuration_directory)
|
|
336
|
-
parser.parse_file(filename) do |keyword, parameters|
|
|
337
|
-
case keyword
|
|
338
|
-
when 'AUTO_DECLARE_TARGETS'
|
|
339
|
-
usage = "#{keyword}"
|
|
340
|
-
parser.verify_num_parameters(0, 0, usage)
|
|
341
|
-
path = File.join(USERPATH, 'config', 'targets')
|
|
342
|
-
unless File.exist? path
|
|
343
|
-
raise parser.error("#{path} must exist", usage)
|
|
344
|
-
end
|
|
345
|
-
system_found = false
|
|
346
|
-
dirs = []
|
|
347
|
-
Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
|
|
348
|
-
dirs.sort!
|
|
349
|
-
dirs.each do |dir_filename|
|
|
350
|
-
if dir_filename[0] != '.'
|
|
351
|
-
if dir_filename == dir_filename.upcase
|
|
352
|
-
if dir_filename == 'SYSTEM'
|
|
353
|
-
system_found = true
|
|
354
|
-
next
|
|
355
|
-
end
|
|
356
|
-
target = Target.new(dir_filename)
|
|
357
|
-
@targets[target.name] = target
|
|
358
|
-
else
|
|
359
|
-
raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
|
|
360
|
-
end
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
if system_found
|
|
364
|
-
target = Target.new('SYSTEM')
|
|
365
|
-
@targets[target.name] = target
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
when 'DECLARE_TARGET'
|
|
369
|
-
usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
|
|
370
|
-
parser.verify_num_parameters(1, 3, usage)
|
|
371
|
-
target_name = parameters[0].to_s.upcase
|
|
372
|
-
substitute_name = nil
|
|
373
|
-
substitute_name = ConfigParser.handle_nil(parameters[1])
|
|
374
|
-
substitute_name.to_s.upcase if substitute_name
|
|
375
|
-
if configuration_directory
|
|
376
|
-
folder_name = File.join(configuration_directory, target_name)
|
|
377
|
-
else
|
|
378
|
-
folder_name = File.join(USERPATH, 'config', 'targets', target_name)
|
|
379
|
-
end
|
|
380
|
-
unless Dir.exist?(folder_name)
|
|
381
|
-
raise parser.error("Target folder must exist '#{folder_name}'.")
|
|
382
|
-
end
|
|
383
|
-
target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
|
|
384
|
-
@targets[target.name] = target
|
|
385
|
-
end # case keyword
|
|
386
|
-
end # parser.parse_file
|
|
387
|
-
end
|
|
388
|
-
|
|
389
|
-
# Load the specified configuration by iterating through the SAVED_CONFIG
|
|
390
|
-
# directory looking for a matching MD5 sum. Updates the internal state so
|
|
391
|
-
# subsequent commands and telemetry methods return the new configuration.
|
|
392
|
-
#
|
|
393
|
-
# @param name [String] MD5 string which identifies the
|
|
394
|
-
# configuration. Pass nil to load the default configuration.
|
|
395
|
-
# @return [String] The actual configuration loaded
|
|
396
|
-
def load_configuration(name = nil)
|
|
397
|
-
if name and @config
|
|
398
|
-
# Make sure they're requesting something other than the current
|
|
399
|
-
# configuration.
|
|
400
|
-
if name != @config.name
|
|
401
|
-
# If they want the initial configuration we can just swap out the
|
|
402
|
-
# current configuration without doing any file processing
|
|
403
|
-
if name == @initial_config.name
|
|
404
|
-
update_config(@initial_config)
|
|
405
|
-
else
|
|
406
|
-
# Look for the requested configuration in the saved configurations
|
|
407
|
-
configuration_directory = find_configuration(name)
|
|
408
|
-
if configuration_directory
|
|
409
|
-
# We found the configuration requested. Reprocess the system.txt
|
|
410
|
-
# and reload the packets
|
|
411
|
-
process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
|
|
412
|
-
load_packets()
|
|
413
|
-
else
|
|
414
|
-
# We couldn't find the configuration request. Reload the
|
|
415
|
-
# initial configuration
|
|
416
|
-
update_config(@initial_config)
|
|
417
|
-
end
|
|
418
|
-
end
|
|
419
|
-
@telemetry.reset
|
|
420
|
-
end
|
|
421
|
-
else
|
|
422
|
-
# Ensure packets have been lazy loaded
|
|
423
|
-
System.commands()
|
|
424
|
-
current_config = @config
|
|
425
|
-
@config = @initial_config
|
|
426
|
-
@telemetry.reset if current_config != @initial_config
|
|
427
|
-
end
|
|
428
|
-
return @config.name
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
# (see #load_configuration)
|
|
432
|
-
def self.load_configuration(name = nil)
|
|
433
|
-
return self.instance.load_configuration(name)
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
protected
|
|
437
|
-
|
|
438
|
-
def update_config(config)
|
|
439
|
-
unless @config
|
|
440
|
-
@config = config
|
|
441
|
-
@commands = Commands.new(config)
|
|
442
|
-
@telemetry = Telemetry.new(config)
|
|
443
|
-
@limits = Limits.new(config)
|
|
444
|
-
else
|
|
445
|
-
@config = config
|
|
446
|
-
@commands.config = config
|
|
447
|
-
@telemetry.config = config
|
|
448
|
-
@limits.config = config
|
|
449
|
-
end
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
def find_configuration(name)
|
|
453
|
-
Cosmos.set_working_dir do
|
|
454
|
-
Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
|
|
455
|
-
full_path = File.join(@paths['SAVED_CONFIG'], filename)
|
|
456
|
-
if Dir.exist?(full_path) and filename[-32..-1] == name
|
|
457
|
-
return full_path
|
|
458
|
-
end
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
nil
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
def save_configuration
|
|
465
|
-
Cosmos.set_working_dir do
|
|
466
|
-
configuration_directory = find_configuration(@config.name)
|
|
467
|
-
configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
|
|
468
|
-
unless Dir.exist?(configuration_directory)
|
|
469
|
-
begin
|
|
470
|
-
# Create the directory
|
|
471
|
-
FileUtils.mkdir_p(configuration_directory)
|
|
472
|
-
|
|
473
|
-
# Copy target files into directory
|
|
474
|
-
@targets.each do |target_name, target|
|
|
475
|
-
source_dir = File.join(USERPATH, 'config', 'targets', target.original_name)
|
|
476
|
-
destination_dir = File.join(configuration_directory, target.original_name)
|
|
477
|
-
unless Dir.exist?(destination_dir)
|
|
478
|
-
FileUtils.cp_r(source_dir, destination_dir)
|
|
479
|
-
end
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
# Create custom system.txt file
|
|
483
|
-
File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
|
|
484
|
-
@targets.each do |target_name, target|
|
|
485
|
-
target_filename = File.basename(target.filename)
|
|
486
|
-
target_filename = nil unless File.exist?(target.filename)
|
|
487
|
-
if target.substitute
|
|
488
|
-
file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
|
|
489
|
-
else
|
|
490
|
-
file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
|
|
491
|
-
end
|
|
492
|
-
end
|
|
493
|
-
end
|
|
494
|
-
rescue Exception => error
|
|
495
|
-
Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
|
|
496
|
-
end
|
|
497
|
-
end
|
|
498
|
-
end
|
|
499
|
-
end
|
|
500
|
-
|
|
501
|
-
def load_packets
|
|
502
|
-
# Determine MD5 over all targets cmd_tlm files
|
|
503
|
-
cmd_tlm_files = [System.initial_filename]
|
|
504
|
-
additional_data = ''
|
|
505
|
-
@targets.each do |target_name, target|
|
|
506
|
-
cmd_tlm_files << target.filename if File.exist?(target.filename)
|
|
507
|
-
cmd_tlm_files.concat(target.cmd_tlm_files)
|
|
508
|
-
if target.substitute
|
|
509
|
-
additional_data << target.original_name
|
|
510
|
-
additional_data << target.name
|
|
511
|
-
else
|
|
512
|
-
additional_data << target.original_name
|
|
513
|
-
end
|
|
514
|
-
end
|
|
515
|
-
md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
|
|
516
|
-
md5_string = md5.hexdigest
|
|
517
|
-
|
|
518
|
-
# Build filename for marshal file
|
|
519
|
-
marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
|
|
520
|
-
|
|
521
|
-
# Attempt to load marshal file
|
|
522
|
-
config = Cosmos.marshal_load(marshal_filename)
|
|
523
|
-
if config
|
|
524
|
-
update_config(config)
|
|
525
|
-
# Marshal file load successful
|
|
526
|
-
Logger.info "Marshal load success: #{marshal_filename}"
|
|
527
|
-
@config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
|
|
528
|
-
else
|
|
529
|
-
# Marshal file load failed - Manually load configuration
|
|
530
|
-
@config = PacketConfig.new
|
|
531
|
-
@commands = Commands.new(@config)
|
|
532
|
-
@telemetry = Telemetry.new(@config)
|
|
533
|
-
@limits = Limits.new(@config)
|
|
534
|
-
|
|
535
|
-
@targets.each do |target_name, target|
|
|
536
|
-
target.cmd_tlm_files.each do |cmd_tlm_file|
|
|
537
|
-
begin
|
|
538
|
-
@config.process_file(cmd_tlm_file, target.name)
|
|
539
|
-
rescue Exception => err
|
|
540
|
-
Logger.error "Problem processing #{cmd_tlm_file}."
|
|
541
|
-
raise err
|
|
542
|
-
end
|
|
543
|
-
end
|
|
544
|
-
end
|
|
545
|
-
|
|
546
|
-
# Create marshal file for next time
|
|
547
|
-
@config.name = md5_string
|
|
548
|
-
Cosmos.marshal_dump(marshal_filename, @config)
|
|
549
|
-
end
|
|
550
|
-
|
|
551
|
-
# Save configuration
|
|
552
|
-
@initial_config = @config unless @initial_config
|
|
553
|
-
save_configuration()
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
end # class System
|
|
557
|
-
|
|
558
|
-
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/config/config_parser'
|
|
12
|
+
require 'cosmos/packets/packet_config'
|
|
13
|
+
require 'cosmos/packets/commands'
|
|
14
|
+
require 'cosmos/packets/telemetry'
|
|
15
|
+
require 'cosmos/packets/limits'
|
|
16
|
+
require 'cosmos/system/target'
|
|
17
|
+
require 'cosmos/packet_logs'
|
|
18
|
+
require 'fileutils'
|
|
19
|
+
require 'drb/acl'
|
|
20
|
+
|
|
21
|
+
module Cosmos
|
|
22
|
+
|
|
23
|
+
# System is the primary entry point into the COSMOS framework. It captures
|
|
24
|
+
# system wide configuration items such as the available ports and paths to
|
|
25
|
+
# various files used by the system. The #commands, #telemetry, and #limits
|
|
26
|
+
# class variables are the primary access points for applications. The
|
|
27
|
+
# #targets variable provides access to all the targets defined by the system.
|
|
28
|
+
# Its primary responsibily is to load the system configuration file and
|
|
29
|
+
# create all the Target instances. It also saves and restores configurations
|
|
30
|
+
# using a MD5 checksum over the entire configuration to detect changes.
|
|
31
|
+
class System
|
|
32
|
+
# @return [Hash<String,Fixnum>] Hash of all the known ports and their values
|
|
33
|
+
instance_attr_reader :ports
|
|
34
|
+
# @return [Hash<String,String>] Hash of all the known paths and their values
|
|
35
|
+
instance_attr_reader :paths
|
|
36
|
+
# @return [String] Arbitrary string containing the version
|
|
37
|
+
instance_attr_reader :cmd_tlm_version
|
|
38
|
+
# @return [PacketLogWriter] Class used to create log files
|
|
39
|
+
instance_attr_reader :default_packet_log_writer
|
|
40
|
+
# @return [PacketLogReader] Class used to read log files
|
|
41
|
+
instance_attr_reader :default_packet_log_reader
|
|
42
|
+
# @return [Boolean] Whether to use DNS to lookup IP addresses or not
|
|
43
|
+
instance_attr_reader :use_dns
|
|
44
|
+
# @return [String] Stores the initial configuration file used when this
|
|
45
|
+
# System was initialized
|
|
46
|
+
instance_attr_reader :initial_filename
|
|
47
|
+
# @return [PacketDefinition] Stores the initial packet list used when this
|
|
48
|
+
# System was initialized
|
|
49
|
+
instance_attr_reader :initial_config
|
|
50
|
+
# @return [ACL] Access control list showing which machines can have access
|
|
51
|
+
instance_attr_reader :acl
|
|
52
|
+
# @return [Hash<String,Target>] Hash of all the known targets
|
|
53
|
+
instance_attr_reader :targets
|
|
54
|
+
# @return [Integer] The number of seconds before a telemetry packet is considered stale
|
|
55
|
+
instance_attr_reader :staleness_seconds
|
|
56
|
+
# @return [Symbol] The current limits set
|
|
57
|
+
instance_attr_reader :limits_set
|
|
58
|
+
|
|
59
|
+
# Known COSMOS ports
|
|
60
|
+
KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
|
|
61
|
+
# Known COSMOS paths
|
|
62
|
+
KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
|
|
63
|
+
|
|
64
|
+
@@instance = nil
|
|
65
|
+
|
|
66
|
+
# Create a new System object. Note, this should not be called directly but
|
|
67
|
+
# you should instead use System.instance and treat this class as a
|
|
68
|
+
# singleton.
|
|
69
|
+
#
|
|
70
|
+
# @param filename [String] Full path to the system configuration file to
|
|
71
|
+
# read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
|
|
72
|
+
def initialize(filename = nil)
|
|
73
|
+
raise "Cosmos::System created twice" unless @@instance.nil?
|
|
74
|
+
@@instance = self
|
|
75
|
+
@targets = {}
|
|
76
|
+
@targets['UNKNOWN'] = Target.new('UNKNOWN')
|
|
77
|
+
@config = nil
|
|
78
|
+
@commands = nil
|
|
79
|
+
@telemetry = nil
|
|
80
|
+
@limits = nil
|
|
81
|
+
@cmd_tlm_version = nil
|
|
82
|
+
@default_packet_log_writer = PacketLogWriter
|
|
83
|
+
@default_packet_log_reader = PacketLogReader
|
|
84
|
+
@use_dns = true
|
|
85
|
+
@acl = nil
|
|
86
|
+
@staleness_seconds = 30
|
|
87
|
+
@limits_set = :DEFAULT
|
|
88
|
+
|
|
89
|
+
@ports = {}
|
|
90
|
+
@ports['CTS_API'] = 7777
|
|
91
|
+
@ports['TLMVIEWER_API'] = 7778
|
|
92
|
+
@ports['CTS_PREIDENTIFIED'] = 7779
|
|
93
|
+
|
|
94
|
+
@paths = {}
|
|
95
|
+
@paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
|
|
96
|
+
@paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
|
|
97
|
+
@paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
|
|
98
|
+
@paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
|
|
99
|
+
@paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
|
|
100
|
+
@paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
|
|
101
|
+
|
|
102
|
+
unless filename
|
|
103
|
+
system_arg = false
|
|
104
|
+
ARGV.each do |arg|
|
|
105
|
+
if system_arg
|
|
106
|
+
filename = File.join(USERPATH, 'config', 'system', arg)
|
|
107
|
+
break
|
|
108
|
+
end
|
|
109
|
+
system_arg = true if arg == '--system'
|
|
110
|
+
end
|
|
111
|
+
filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
|
|
112
|
+
end
|
|
113
|
+
process_file(filename)
|
|
114
|
+
ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
|
|
115
|
+
|
|
116
|
+
@initial_filename = filename
|
|
117
|
+
@initial_config = nil
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @return [String] Configuration name
|
|
121
|
+
def self.configuration_name
|
|
122
|
+
# In order not to make the @config instance variable accessable to the
|
|
123
|
+
# outside (using a regular accessor method) we use the ability of the
|
|
124
|
+
# object to grab its own instance variable
|
|
125
|
+
self.instance.instance_variable_get(:@config).name
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Clear the command and telemetry counters for all the targets as well as
|
|
129
|
+
# the counters associated with the Commands and Telemetry instances
|
|
130
|
+
def self.clear_counters
|
|
131
|
+
self.instance.targets.each do |target_name, target|
|
|
132
|
+
target.cmd_cnt = 0
|
|
133
|
+
target.tlm_cnt = 0
|
|
134
|
+
end
|
|
135
|
+
self.instance.telemetry.clear_counters
|
|
136
|
+
self.instance.commands.clear_counters
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# @return [Commands] Access to the command definiton
|
|
140
|
+
def commands
|
|
141
|
+
load_packets() unless @config
|
|
142
|
+
return @commands
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# (see #commands)
|
|
146
|
+
def self.commands
|
|
147
|
+
return self.instance.commands
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# @return [Telemetry] Access to the telemetry definition
|
|
151
|
+
def telemetry
|
|
152
|
+
load_packets() unless @config
|
|
153
|
+
return @telemetry
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# (see #telemetry)
|
|
157
|
+
def self.telemetry
|
|
158
|
+
return self.instance.telemetry
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# @return [Limits] Access to the limits definition
|
|
162
|
+
def limits
|
|
163
|
+
load_packets() unless @config
|
|
164
|
+
return @limits
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# (see #limits)
|
|
168
|
+
def self.limits
|
|
169
|
+
return self.instance.limits
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Change the system limits set
|
|
173
|
+
#
|
|
174
|
+
# @param [Symbol] The name of the limits set. :DEFAULT is always an option
|
|
175
|
+
# but limits sets are user defined
|
|
176
|
+
def limits_set=(limits_set)
|
|
177
|
+
load_packets() unless @config
|
|
178
|
+
new_limits_set = limits_set.to_s.upcase.intern
|
|
179
|
+
if @limits_set != new_limits_set
|
|
180
|
+
if @config.limits_sets.include?(new_limits_set)
|
|
181
|
+
@limits_set = new_limits_set
|
|
182
|
+
Logger.info("Limits Set Changed to: #{@limits_set}")
|
|
183
|
+
CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
|
|
184
|
+
else
|
|
185
|
+
raise "Unknown limits set requested: #{new_limits_set}"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# (see #limits_set=)
|
|
191
|
+
def self.limits_set=(limits_set)
|
|
192
|
+
self.instance.limits_set = limits_set
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# @return [System] The System singleton
|
|
196
|
+
def self.instance(filename = nil)
|
|
197
|
+
@@instance ||= self.new(filename)
|
|
198
|
+
return @@instance
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Process the system.txt configuration file
|
|
202
|
+
#
|
|
203
|
+
# @param filename [String] The configuration file
|
|
204
|
+
# @param configuration_directory [String] The configuration directory to
|
|
205
|
+
# search for the target command and telemetry files. Pass nil to look in
|
|
206
|
+
# the default location of <USERPATH>/config/targets.
|
|
207
|
+
def process_file(filename, configuration_directory = nil)
|
|
208
|
+
@targets = {}
|
|
209
|
+
# Set config to nil so things will lazy load later
|
|
210
|
+
@config = nil
|
|
211
|
+
acl_list = []
|
|
212
|
+
all_allowed = false
|
|
213
|
+
first_procedures_path = true
|
|
214
|
+
|
|
215
|
+
Cosmos.set_working_dir do
|
|
216
|
+
parser = ConfigParser.new
|
|
217
|
+
|
|
218
|
+
# First pass - Everything except targets
|
|
219
|
+
parser.parse_file(filename) do |keyword, parameters|
|
|
220
|
+
case keyword
|
|
221
|
+
when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET'
|
|
222
|
+
# Will be handled by second pass
|
|
223
|
+
|
|
224
|
+
when 'PORT'
|
|
225
|
+
usage = "#{keyword} <PORT NAME> <PORT VALUE>"
|
|
226
|
+
parser.verify_num_parameters(2, 2, usage)
|
|
227
|
+
port_name = parameters[0].to_s.upcase
|
|
228
|
+
@ports[port_name] = Integer(parameters[1])
|
|
229
|
+
Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
|
|
230
|
+
|
|
231
|
+
when 'PATH'
|
|
232
|
+
usage = "#{keyword} <PATH NAME> <PATH>"
|
|
233
|
+
parser.verify_num_parameters(2, 2, usage)
|
|
234
|
+
path_name = parameters[0].to_s.upcase
|
|
235
|
+
path = File.expand_path(parameters[1])
|
|
236
|
+
if path_name == 'PROCEDURES'
|
|
237
|
+
if first_procedures_path
|
|
238
|
+
@paths[path_name] = []
|
|
239
|
+
first_procedures_path = false
|
|
240
|
+
end
|
|
241
|
+
@paths[path_name] << path
|
|
242
|
+
else
|
|
243
|
+
@paths[path_name] = path
|
|
244
|
+
end
|
|
245
|
+
unless Dir.exist?(path)
|
|
246
|
+
begin
|
|
247
|
+
FileUtils.mkdir_p(path)
|
|
248
|
+
raise "Path creation failed: #{path}" unless File.exist?(path)
|
|
249
|
+
Logger.info "Created PATH #{path_name} #{path}"
|
|
250
|
+
rescue Exception => err
|
|
251
|
+
Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
|
|
255
|
+
|
|
256
|
+
when 'DEFAULT_PACKET_LOG_WRITER'
|
|
257
|
+
usage = "#{keyword} <FILENAME>"
|
|
258
|
+
parser.verify_num_parameters(1, 1, usage)
|
|
259
|
+
@default_packet_log_writer = Cosmos.require_class(parameters[0])
|
|
260
|
+
|
|
261
|
+
when 'DEFAULT_PACKET_LOG_READER'
|
|
262
|
+
usage = "#{keyword} <FILENAME>"
|
|
263
|
+
parser.verify_num_parameters(1, 1, usage)
|
|
264
|
+
@default_packet_log_reader = Cosmos.require_class(parameters[0])
|
|
265
|
+
|
|
266
|
+
when 'DISABLE_DNS'
|
|
267
|
+
usage = "#{keyword}"
|
|
268
|
+
parser.verify_num_parameters(0, 0, usage)
|
|
269
|
+
@use_dns = false
|
|
270
|
+
|
|
271
|
+
when 'ALLOW_ACCESS'
|
|
272
|
+
parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
|
|
273
|
+
begin
|
|
274
|
+
addr = parameters[0].upcase
|
|
275
|
+
if addr == 'ALL'
|
|
276
|
+
all_allowed = true
|
|
277
|
+
acl_list = []
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
unless all_allowed
|
|
281
|
+
first_char = addr[0..0]
|
|
282
|
+
if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
|
|
283
|
+
# Try to lookup IP Address
|
|
284
|
+
info = Socket.gethostbyname(addr)
|
|
285
|
+
addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
|
|
286
|
+
if (acl_list.empty?)
|
|
287
|
+
acl_list << 'allow'
|
|
288
|
+
acl_list << '127.0.0.1'
|
|
289
|
+
end
|
|
290
|
+
acl_list << 'allow'
|
|
291
|
+
acl_list << addr
|
|
292
|
+
else
|
|
293
|
+
raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
|
|
294
|
+
if (acl_list.empty?)
|
|
295
|
+
acl_list << 'allow'
|
|
296
|
+
acl_list << '127.0.0.1'
|
|
297
|
+
end
|
|
298
|
+
acl_list << 'allow'
|
|
299
|
+
acl_list << addr
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
rescue => err
|
|
303
|
+
raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
when 'STALENESS_SECONDS'
|
|
307
|
+
parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
|
|
308
|
+
@staleness_seconds = Integer(parameters[0])
|
|
309
|
+
|
|
310
|
+
when 'CMD_TLM_VERSION'
|
|
311
|
+
usage = "#{keyword} <VERSION>"
|
|
312
|
+
parser.verify_num_parameters(1, 1, usage)
|
|
313
|
+
@cmd_tlm_version = parameters[0]
|
|
314
|
+
|
|
315
|
+
else
|
|
316
|
+
# blank lines will have a nil keyword and should not raise an exception
|
|
317
|
+
raise parser.error("Unknown keyword '#{keyword}'") if keyword
|
|
318
|
+
end # case keyword
|
|
319
|
+
end # parser.parse_file
|
|
320
|
+
|
|
321
|
+
@acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
|
|
322
|
+
|
|
323
|
+
# Second pass - Process targets
|
|
324
|
+
process_targets(parser, filename, configuration_directory)
|
|
325
|
+
|
|
326
|
+
end # Cosmos.set_working_dir
|
|
327
|
+
end # def process_file
|
|
328
|
+
|
|
329
|
+
# Parse the system.txt configuration file looking for keywords associated
|
|
330
|
+
# with targets and create all the Target instances in the system.
|
|
331
|
+
#
|
|
332
|
+
# @param parser [ConfigParser] Parser created by process_file
|
|
333
|
+
# @param filename (see #process_file)
|
|
334
|
+
# @param configuration_directory (see #process_file)
|
|
335
|
+
def process_targets(parser, filename, configuration_directory)
|
|
336
|
+
parser.parse_file(filename) do |keyword, parameters|
|
|
337
|
+
case keyword
|
|
338
|
+
when 'AUTO_DECLARE_TARGETS'
|
|
339
|
+
usage = "#{keyword}"
|
|
340
|
+
parser.verify_num_parameters(0, 0, usage)
|
|
341
|
+
path = File.join(USERPATH, 'config', 'targets')
|
|
342
|
+
unless File.exist? path
|
|
343
|
+
raise parser.error("#{path} must exist", usage)
|
|
344
|
+
end
|
|
345
|
+
system_found = false
|
|
346
|
+
dirs = []
|
|
347
|
+
Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
|
|
348
|
+
dirs.sort!
|
|
349
|
+
dirs.each do |dir_filename|
|
|
350
|
+
if dir_filename[0] != '.'
|
|
351
|
+
if dir_filename == dir_filename.upcase
|
|
352
|
+
if dir_filename == 'SYSTEM'
|
|
353
|
+
system_found = true
|
|
354
|
+
next
|
|
355
|
+
end
|
|
356
|
+
target = Target.new(dir_filename)
|
|
357
|
+
@targets[target.name] = target
|
|
358
|
+
else
|
|
359
|
+
raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
if system_found
|
|
364
|
+
target = Target.new('SYSTEM')
|
|
365
|
+
@targets[target.name] = target
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
when 'DECLARE_TARGET'
|
|
369
|
+
usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
|
|
370
|
+
parser.verify_num_parameters(1, 3, usage)
|
|
371
|
+
target_name = parameters[0].to_s.upcase
|
|
372
|
+
substitute_name = nil
|
|
373
|
+
substitute_name = ConfigParser.handle_nil(parameters[1])
|
|
374
|
+
substitute_name.to_s.upcase if substitute_name
|
|
375
|
+
if configuration_directory
|
|
376
|
+
folder_name = File.join(configuration_directory, target_name)
|
|
377
|
+
else
|
|
378
|
+
folder_name = File.join(USERPATH, 'config', 'targets', target_name)
|
|
379
|
+
end
|
|
380
|
+
unless Dir.exist?(folder_name)
|
|
381
|
+
raise parser.error("Target folder must exist '#{folder_name}'.")
|
|
382
|
+
end
|
|
383
|
+
target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
|
|
384
|
+
@targets[target.name] = target
|
|
385
|
+
end # case keyword
|
|
386
|
+
end # parser.parse_file
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# Load the specified configuration by iterating through the SAVED_CONFIG
|
|
390
|
+
# directory looking for a matching MD5 sum. Updates the internal state so
|
|
391
|
+
# subsequent commands and telemetry methods return the new configuration.
|
|
392
|
+
#
|
|
393
|
+
# @param name [String] MD5 string which identifies the
|
|
394
|
+
# configuration. Pass nil to load the default configuration.
|
|
395
|
+
# @return [String] The actual configuration loaded
|
|
396
|
+
def load_configuration(name = nil)
|
|
397
|
+
if name and @config
|
|
398
|
+
# Make sure they're requesting something other than the current
|
|
399
|
+
# configuration.
|
|
400
|
+
if name != @config.name
|
|
401
|
+
# If they want the initial configuration we can just swap out the
|
|
402
|
+
# current configuration without doing any file processing
|
|
403
|
+
if name == @initial_config.name
|
|
404
|
+
update_config(@initial_config)
|
|
405
|
+
else
|
|
406
|
+
# Look for the requested configuration in the saved configurations
|
|
407
|
+
configuration_directory = find_configuration(name)
|
|
408
|
+
if configuration_directory
|
|
409
|
+
# We found the configuration requested. Reprocess the system.txt
|
|
410
|
+
# and reload the packets
|
|
411
|
+
process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
|
|
412
|
+
load_packets()
|
|
413
|
+
else
|
|
414
|
+
# We couldn't find the configuration request. Reload the
|
|
415
|
+
# initial configuration
|
|
416
|
+
update_config(@initial_config)
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
@telemetry.reset
|
|
420
|
+
end
|
|
421
|
+
else
|
|
422
|
+
# Ensure packets have been lazy loaded
|
|
423
|
+
System.commands()
|
|
424
|
+
current_config = @config
|
|
425
|
+
@config = @initial_config
|
|
426
|
+
@telemetry.reset if current_config != @initial_config
|
|
427
|
+
end
|
|
428
|
+
return @config.name
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
# (see #load_configuration)
|
|
432
|
+
def self.load_configuration(name = nil)
|
|
433
|
+
return self.instance.load_configuration(name)
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
protected
|
|
437
|
+
|
|
438
|
+
def update_config(config)
|
|
439
|
+
unless @config
|
|
440
|
+
@config = config
|
|
441
|
+
@commands = Commands.new(config)
|
|
442
|
+
@telemetry = Telemetry.new(config)
|
|
443
|
+
@limits = Limits.new(config)
|
|
444
|
+
else
|
|
445
|
+
@config = config
|
|
446
|
+
@commands.config = config
|
|
447
|
+
@telemetry.config = config
|
|
448
|
+
@limits.config = config
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def find_configuration(name)
|
|
453
|
+
Cosmos.set_working_dir do
|
|
454
|
+
Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
|
|
455
|
+
full_path = File.join(@paths['SAVED_CONFIG'], filename)
|
|
456
|
+
if Dir.exist?(full_path) and filename[-32..-1] == name
|
|
457
|
+
return full_path
|
|
458
|
+
end
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
nil
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
def save_configuration
|
|
465
|
+
Cosmos.set_working_dir do
|
|
466
|
+
configuration_directory = find_configuration(@config.name)
|
|
467
|
+
configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
|
|
468
|
+
unless Dir.exist?(configuration_directory)
|
|
469
|
+
begin
|
|
470
|
+
# Create the directory
|
|
471
|
+
FileUtils.mkdir_p(configuration_directory)
|
|
472
|
+
|
|
473
|
+
# Copy target files into directory
|
|
474
|
+
@targets.each do |target_name, target|
|
|
475
|
+
source_dir = File.join(USERPATH, 'config', 'targets', target.original_name)
|
|
476
|
+
destination_dir = File.join(configuration_directory, target.original_name)
|
|
477
|
+
unless Dir.exist?(destination_dir)
|
|
478
|
+
FileUtils.cp_r(source_dir, destination_dir)
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
# Create custom system.txt file
|
|
483
|
+
File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
|
|
484
|
+
@targets.each do |target_name, target|
|
|
485
|
+
target_filename = File.basename(target.filename)
|
|
486
|
+
target_filename = nil unless File.exist?(target.filename)
|
|
487
|
+
if target.substitute
|
|
488
|
+
file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
|
|
489
|
+
else
|
|
490
|
+
file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
rescue Exception => error
|
|
495
|
+
Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
def load_packets
|
|
502
|
+
# Determine MD5 over all targets cmd_tlm files
|
|
503
|
+
cmd_tlm_files = [System.initial_filename]
|
|
504
|
+
additional_data = ''
|
|
505
|
+
@targets.each do |target_name, target|
|
|
506
|
+
cmd_tlm_files << target.filename if File.exist?(target.filename)
|
|
507
|
+
cmd_tlm_files.concat(target.cmd_tlm_files)
|
|
508
|
+
if target.substitute
|
|
509
|
+
additional_data << target.original_name
|
|
510
|
+
additional_data << target.name
|
|
511
|
+
else
|
|
512
|
+
additional_data << target.original_name
|
|
513
|
+
end
|
|
514
|
+
end
|
|
515
|
+
md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
|
|
516
|
+
md5_string = md5.hexdigest
|
|
517
|
+
|
|
518
|
+
# Build filename for marshal file
|
|
519
|
+
marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
|
|
520
|
+
|
|
521
|
+
# Attempt to load marshal file
|
|
522
|
+
config = Cosmos.marshal_load(marshal_filename)
|
|
523
|
+
if config
|
|
524
|
+
update_config(config)
|
|
525
|
+
# Marshal file load successful
|
|
526
|
+
Logger.info "Marshal load success: #{marshal_filename}"
|
|
527
|
+
@config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
|
|
528
|
+
else
|
|
529
|
+
# Marshal file load failed - Manually load configuration
|
|
530
|
+
@config = PacketConfig.new
|
|
531
|
+
@commands = Commands.new(@config)
|
|
532
|
+
@telemetry = Telemetry.new(@config)
|
|
533
|
+
@limits = Limits.new(@config)
|
|
534
|
+
|
|
535
|
+
@targets.each do |target_name, target|
|
|
536
|
+
target.cmd_tlm_files.each do |cmd_tlm_file|
|
|
537
|
+
begin
|
|
538
|
+
@config.process_file(cmd_tlm_file, target.name)
|
|
539
|
+
rescue Exception => err
|
|
540
|
+
Logger.error "Problem processing #{cmd_tlm_file}."
|
|
541
|
+
raise err
|
|
542
|
+
end
|
|
543
|
+
end
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
# Create marshal file for next time
|
|
547
|
+
@config.name = md5_string
|
|
548
|
+
Cosmos.marshal_dump(marshal_filename, @config)
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
# Save configuration
|
|
552
|
+
@initial_config = @config unless @initial_config
|
|
553
|
+
save_configuration()
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
end # class System
|
|
557
|
+
|
|
558
|
+
end # module Cosmos
|