cosmos 3.5.1 → 3.5.2

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