cosmos 3.5.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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