cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  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 +20 -20
  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/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,118 +1,118 @@
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/opengl/opengl'
13
- require 'cosmos/gui/opengl/stl_shape'
14
- require 'cosmos/gui/opengl/texture_mapped_sphere'
15
-
16
- module Cosmos
17
-
18
- class SceneConfig
19
-
20
- attr_accessor :scene
21
-
22
- def initialize(filename, dragable = true)
23
- @scene = GlScene.new
24
-
25
- shape = nil
26
- parser = ConfigParser.new
27
- parser.parse_file(filename) do |keyword, parameters|
28
- case keyword
29
- when 'STL_FILE'
30
- usage = "#{keyword} <filename> <scaling factor (optional)>"
31
- parser.verify_num_parameters(1, 2, usage)
32
- shape = StlShape.new(0.0, 0.0, 0.0)
33
- if parameters[0] =~ /^\// or parameters[0] =~ /^\w:/
34
- shape.stl_file = parameters[0]
35
- else
36
- shape.stl_file = File.join(Cosmos::USERPATH, 'config', 'data', parameters[0])
37
- end
38
- raise "STL File \"#{shape.stl_file}\" does not exist" unless File.exist? shape.stl_file
39
- shape.show_load_progress = true
40
- shape.tipText = parameters[0]
41
- shape.dragable = dragable
42
- if parameters[1]
43
- shape.stl_scaling_factor = parameters[1].to_f
44
- end
45
- @scene.append(shape)
46
-
47
- when 'TEXTURE_MAPPED_SPHERE'
48
- usage = "#{keyword} <texture_filename>"
49
- parser.verify_num_parameters(1, 1, usage)
50
- shape = TextureMappedSphere.new(0.0, 0.0, 0.0, parameters[0])
51
- shape.dragable = dragable
52
- @scene.append(shape)
53
-
54
- when 'TIP_TEXT'
55
- usage = "#{keyword} <text>"
56
- parser.verify_num_parameters(1, 1, usage)
57
- shape.tipText = parameters[0]
58
-
59
- when 'COLOR'
60
- usage = "#{keyword} <red> <green> <blue> <alpha (optional)>"
61
- parser.verify_num_parameters(3, 4, usage)
62
- if parameters[3]
63
- shape.base_color = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f]
64
- else
65
- shape.base_color = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, 1.0]
66
- end
67
- shape.color = shape.base_color.clone
68
-
69
- when 'POSITION'
70
- usage = "#{keyword} <x> <y> <z>"
71
- parser.verify_num_parameters(3, 3, usage)
72
- shape.position = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f]
73
-
74
- when 'ROTATION_X'
75
- usage = "#{keyword} <rotation_x>"
76
- parser.verify_num_parameters(1, 1, usage)
77
- shape.rotation_x = parameters[0].to_f
78
-
79
- when 'ROTATION_Y'
80
- usage = "#{keyword} <rotation_y>"
81
- parser.verify_num_parameters(1, 1, usage)
82
- shape.rotation_y = parameters[0].to_f
83
-
84
- when 'ROTATION_Z'
85
- usage = "#{keyword} <rotation_z>"
86
- parser.verify_num_parameters(1, 1, usage)
87
- shape.rotation_z = parameters[0].to_f
88
-
89
- when 'ZOOM'
90
- usage = "#{keyword} <zoom>"
91
- parser.verify_num_parameters(1, 1, usage)
92
- @scene.zoom = parameters[0].to_f
93
-
94
- when 'ORIENTATION'
95
- usage = "#{keyword} <q0> <q1> <q2> <q3 - scalar>"
96
- parser.verify_num_parameters(4, 4, usage)
97
- @scene.orientation = Quaternion.new([parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f])
98
-
99
- when 'CENTER'
100
- usage = "#{keyword} <x> <y> <z>"
101
- parser.verify_num_parameters(3, 3, usage)
102
- @scene.center = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f]
103
-
104
- when 'BOUNDS'
105
- usage = "#{keyword} <x0> <x1> <y0> <y1> <z0> <z1>"
106
- parser.verify_num_parameters(6, 6, usage)
107
- @scene.bounds = GlBounds.new(parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f, parameters[4].to_f, parameters[5].to_f)
108
-
109
- else
110
- raise "Unknown keyword #{keyword} with parameters #{parameters.join(' ')}"
111
- end # case keyword
112
- end # parser.parse_file
113
-
114
- end
115
-
116
- end # class SceneDefinition
117
-
118
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ require 'cosmos/gui/opengl/opengl'
13
+ require 'cosmos/gui/opengl/stl_shape'
14
+ require 'cosmos/gui/opengl/texture_mapped_sphere'
15
+
16
+ module Cosmos
17
+
18
+ class SceneConfig
19
+
20
+ attr_accessor :scene
21
+
22
+ def initialize(filename, dragable = true)
23
+ @scene = GlScene.new
24
+
25
+ shape = nil
26
+ parser = ConfigParser.new
27
+ parser.parse_file(filename) do |keyword, parameters|
28
+ case keyword
29
+ when 'STL_FILE'
30
+ usage = "#{keyword} <filename> <scaling factor (optional)>"
31
+ parser.verify_num_parameters(1, 2, usage)
32
+ shape = StlShape.new(0.0, 0.0, 0.0)
33
+ if parameters[0] =~ /^\// or parameters[0] =~ /^\w:/
34
+ shape.stl_file = parameters[0]
35
+ else
36
+ shape.stl_file = File.join(Cosmos::USERPATH, 'config', 'data', parameters[0])
37
+ end
38
+ raise "STL File \"#{shape.stl_file}\" does not exist" unless File.exist? shape.stl_file
39
+ shape.show_load_progress = true
40
+ shape.tipText = parameters[0]
41
+ shape.dragable = dragable
42
+ if parameters[1]
43
+ shape.stl_scaling_factor = parameters[1].to_f
44
+ end
45
+ @scene.append(shape)
46
+
47
+ when 'TEXTURE_MAPPED_SPHERE'
48
+ usage = "#{keyword} <texture_filename>"
49
+ parser.verify_num_parameters(1, 1, usage)
50
+ shape = TextureMappedSphere.new(0.0, 0.0, 0.0, parameters[0])
51
+ shape.dragable = dragable
52
+ @scene.append(shape)
53
+
54
+ when 'TIP_TEXT'
55
+ usage = "#{keyword} <text>"
56
+ parser.verify_num_parameters(1, 1, usage)
57
+ shape.tipText = parameters[0]
58
+
59
+ when 'COLOR'
60
+ usage = "#{keyword} <red> <green> <blue> <alpha (optional)>"
61
+ parser.verify_num_parameters(3, 4, usage)
62
+ if parameters[3]
63
+ shape.base_color = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f]
64
+ else
65
+ shape.base_color = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, 1.0]
66
+ end
67
+ shape.color = shape.base_color.clone
68
+
69
+ when 'POSITION'
70
+ usage = "#{keyword} <x> <y> <z>"
71
+ parser.verify_num_parameters(3, 3, usage)
72
+ shape.position = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f]
73
+
74
+ when 'ROTATION_X'
75
+ usage = "#{keyword} <rotation_x>"
76
+ parser.verify_num_parameters(1, 1, usage)
77
+ shape.rotation_x = parameters[0].to_f
78
+
79
+ when 'ROTATION_Y'
80
+ usage = "#{keyword} <rotation_y>"
81
+ parser.verify_num_parameters(1, 1, usage)
82
+ shape.rotation_y = parameters[0].to_f
83
+
84
+ when 'ROTATION_Z'
85
+ usage = "#{keyword} <rotation_z>"
86
+ parser.verify_num_parameters(1, 1, usage)
87
+ shape.rotation_z = parameters[0].to_f
88
+
89
+ when 'ZOOM'
90
+ usage = "#{keyword} <zoom>"
91
+ parser.verify_num_parameters(1, 1, usage)
92
+ @scene.zoom = parameters[0].to_f
93
+
94
+ when 'ORIENTATION'
95
+ usage = "#{keyword} <q0> <q1> <q2> <q3 - scalar>"
96
+ parser.verify_num_parameters(4, 4, usage)
97
+ @scene.orientation = Quaternion.new([parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f])
98
+
99
+ when 'CENTER'
100
+ usage = "#{keyword} <x> <y> <z>"
101
+ parser.verify_num_parameters(3, 3, usage)
102
+ @scene.center = [parameters[0].to_f, parameters[1].to_f, parameters[2].to_f]
103
+
104
+ when 'BOUNDS'
105
+ usage = "#{keyword} <x0> <x1> <y0> <y1> <z0> <z1>"
106
+ parser.verify_num_parameters(6, 6, usage)
107
+ @scene.bounds = GlBounds.new(parameters[0].to_f, parameters[1].to_f, parameters[2].to_f, parameters[3].to_f, parameters[4].to_f, parameters[5].to_f)
108
+
109
+ else
110
+ raise "Unknown keyword #{keyword} with parameters #{parameters.join(' ')}"
111
+ end # case keyword
112
+ end # parser.parse_file
113
+
114
+ end
115
+
116
+ end # class SceneDefinition
117
+
118
+ end # module Cosmos
@@ -1,525 +1,525 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos'
12
- Cosmos.catch_fatal_exception do
13
- require 'cosmos/script'
14
- require 'cosmos/gui/qt_tool'
15
- require 'cosmos/gui/dialogs/tlm_details_dialog'
16
- require 'cosmos/gui/dialogs/tlm_edit_dialog'
17
- require 'cosmos/gui/dialogs/exception_dialog'
18
- require 'cosmos/gui/dialogs/splash'
19
- require 'cosmos/gui/widgets/full_text_search_line_edit'
20
- end
21
-
22
- module Cosmos
23
-
24
- class PacketViewer < QtTool
25
- slots 'file_options()'
26
- slots 'update_all()'
27
- slots 'mouse_over(int, int)'
28
- slots 'context_menu(const QPoint&)'
29
-
30
- def initialize(options)
31
- super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
32
- Cosmos.load_cosmos_icon("packet_viewer.png")
33
-
34
- @table = nil
35
- @tlm_thread = nil
36
- @shutdown_tlm_thread = false
37
- @mode = :WITH_UNITS
38
- @polling_rate = 1.0
39
- @colorblind = false
40
-
41
- initialize_actions()
42
- initialize_menus()
43
- initialize_central_widget(options)
44
- complete_initialize()
45
-
46
- # Bring up slash screen for long duration tasks after creation
47
- Splash.execute(self) do |splash|
48
- # Configure CosmosConfig to interact with splash screen
49
- ConfigParser.splash = splash
50
-
51
- System.telemetry
52
- Qt.execute_in_main_thread(true) do
53
- update_targets()
54
- @target_select.setCurrentText(options.packet[0].upcase) if options.packet
55
- update_packets()
56
- @packet_select.setCurrentText(options.packet[1].upcase) if options.packet
57
- update_tlm_items()
58
-
59
- @search_box.completion_list = System.telemetry.all_item_strings(true, splash)
60
- @search_box.callback = lambda do |tlm|
61
- split_tlm = tlm.split(" ")
62
- if split_tlm.length == 3
63
- target_name = split_tlm[0].upcase
64
- @target_select.setCurrentText(target_name)
65
- update_packets()
66
- packet_name = split_tlm[1]
67
- @packet_select.setCurrentText(packet_name)
68
- item_name = split_tlm[2]
69
- update_tlm_items(item_name)
70
- end
71
- end
72
- end
73
-
74
- # Unconfigure CosmosConfig to interact with splash screen
75
- ConfigParser.splash = nil
76
- end
77
- end
78
-
79
- def initialize_actions
80
- super()
81
-
82
- @reset_action = Qt::Action.new(tr('&Reset'), self)
83
- @reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
84
- @reset_action.shortcut = @reset_keyseq
85
- @reset_action.statusTip = tr('Reset Connection')
86
- connect(@reset_action, SIGNAL('triggered()'), self, SLOT('update_all()'))
87
-
88
- @option_action = Qt::Action.new(tr('O&ptions'), self)
89
- @option_action.statusTip = tr('Application Options')
90
- connect(@option_action, SIGNAL('triggered()'), self, SLOT('file_options()'))
91
-
92
- @color_blind_action = Qt::Action.new(tr('Color&blind Mode'), self)
93
- @color_blind_keyseq = Qt::KeySequence.new(tr('Ctrl+B'))
94
- @color_blind_action.shortcut = @color_blind_keyseq
95
- @color_blind_action.statusTip = tr('Enable text representation of colors in the values')
96
- @color_blind_action.setCheckable(true)
97
- @color_blind_action.connect(SIGNAL('triggered()')) do
98
- @colorblind = @color_blind_action.isChecked
99
- end
100
-
101
- @formatted_tlm_units_action = Qt::Action.new(tr('Formatted Telemetry With &Units'), self)
102
- @formatted_tlm_units_keyseq = Qt::KeySequence.new(tr('Ctrl+U'))
103
- @formatted_tlm_units_action.shortcut = @formatted_tlm_units_keyseq
104
- @formatted_tlm_units_action.statusTip = tr('Formatted Telemetry with Units')
105
- @formatted_tlm_units_action.setCheckable(true)
106
- @formatted_tlm_units_action.setChecked(true)
107
- @formatted_tlm_units_action.connect(SIGNAL('triggered()')) do
108
- @mode = :WITH_UNITS
109
- self.window_title = "COSMOS Packet Viewer : Formatted Telemetry with Units"
110
- end
111
-
112
- @formatted_tlm_action = Qt::Action.new(tr('&Formatted Telemetry'), self)
113
- @formatted_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
114
- @formatted_tlm_action.shortcut = @formatted_tlm_keyseq
115
- @formatted_tlm_action.statusTip = tr('Formatted Telemetry')
116
- @formatted_tlm_action.setCheckable(true)
117
- @formatted_tlm_action.connect(SIGNAL('triggered()')) do
118
- @mode = :FORMATTED
119
- self.window_title = "COSMOS Packet Viewer : Formatted Telemetry"
120
- end
121
-
122
- @normal_tlm_action = Qt::Action.new(tr('Normal &Converted Telemetry'), self)
123
- @normal_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
124
- @normal_tlm_action.shortcut = @normal_tlm_keyseq
125
- @normal_tlm_action.statusTip = tr('Normal Converted Telemetry')
126
- @normal_tlm_action.setCheckable(true)
127
- @normal_tlm_action.connect(SIGNAL('triggered()')) do
128
- @mode = :CONVERTED
129
- self.window_title = "COSMOS Packet Viewer : Coverted Telemetry"
130
- end
131
-
132
- @raw_tlm_action = Qt::Action.new(tr('&Raw Telemetry'), self)
133
- @raw_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
134
- @raw_tlm_action.shortcut = @raw_tlm_keyseq
135
- @raw_tlm_action.statusTip = tr('Raw Unprocessed Telemetry')
136
- @raw_tlm_action.setCheckable(true)
137
- @raw_tlm_action.connect(SIGNAL('triggered()')) do
138
- @mode = :RAW
139
- self.window_title = "COSMOS Packet Viewer : Raw Telemetry"
140
- end
141
-
142
- # The formatting options are mutually exclusive so create an action group
143
- formatting_group = Qt::ActionGroup.new(self)
144
- formatting_group.addAction(@formatted_tlm_units_action)
145
- formatting_group.addAction(@formatted_tlm_action)
146
- formatting_group.addAction(@normal_tlm_action)
147
- formatting_group.addAction(@raw_tlm_action)
148
- end
149
-
150
- def initialize_menus
151
- # File Menu
152
- file_menu = menuBar.addMenu(tr('&File'))
153
- file_menu.addAction(@reset_action)
154
- file_menu.addAction(@option_action)
155
- file_menu.addSeparator()
156
- file_menu.addAction(@exit_action)
157
-
158
- # View Menu
159
- view_menu = menuBar.addMenu(tr('&View'))
160
- view_menu.addAction(@color_blind_action)
161
- view_menu.addSeparator.setText(tr('Formatting'));
162
- view_menu.addAction(@formatted_tlm_units_action)
163
- view_menu.addAction(@formatted_tlm_action)
164
- view_menu.addAction(@normal_tlm_action)
165
- view_menu.addAction(@raw_tlm_action)
166
-
167
- # Help Menu
168
- @about_string = "Packet Viewer provides a view of every telemetry packet in the system. Packets can be viewed in numerous represenations ranging from the raw data to formatted with units."
169
- initialize_help_menu()
170
- end
171
-
172
- def initialize_central_widget(options)
173
- # Create the central widget
174
- central_widget = Qt::Widget.new
175
- setCentralWidget(central_widget)
176
-
177
- # Create the top level vertical layout
178
- top_layout = Qt::VBoxLayout.new(central_widget)
179
-
180
- # Set the target combobox selection
181
- @target_select = Qt::ComboBox.new
182
- @target_select.setMaxVisibleItems(6)
183
- @target_select.connect(SIGNAL('activated(const QString&)')) do
184
- update_packets()
185
- update_tlm_items()
186
- end
187
- target_label = Qt::Label.new(tr("&Target:"))
188
- target_label.setBuddy(@target_select)
189
-
190
- # Set the comamnd combobox selection
191
- @packet_select = Qt::ComboBox.new
192
- @packet_select.setMaxVisibleItems(20)
193
- @packet_select.connect(SIGNAL('activated(const QString&)')) do
194
- update_tlm_items()
195
- end
196
- cmd_label = Qt::Label.new(tr("&Packet:"))
197
- cmd_label.setBuddy(@packet_select)
198
-
199
- # Mnemonic Search Box
200
- @search_layout = Qt::HBoxLayout.new
201
- @search_box = FullTextSearchLineEdit.new(self)
202
- @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
203
- @search_layout.addWidget(@search_box)
204
- top_layout.addLayout(@search_layout)
205
-
206
- # Layout the top level selection
207
- select_layout = Qt::HBoxLayout.new
208
- select_layout.addWidget(target_label)
209
- select_layout.addWidget(@target_select, 1)
210
- select_layout.addWidget(cmd_label)
211
- select_layout.addWidget(@packet_select, 1)
212
- top_layout.addLayout(select_layout)
213
-
214
- # Separator Between Telemetry Selection and Telemetry Description
215
- sep1 = Qt::Frame.new(central_widget)
216
- sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
217
- top_layout.addWidget(sep1)
218
-
219
- # Telemetry Description Label
220
- dec_label = Qt::Label.new(tr("Description:"))
221
- @description = Qt::Label.new('')
222
- desc_layout = Qt::HBoxLayout.new
223
- desc_layout.addWidget(dec_label)
224
- desc_layout.addWidget(@description, 1)
225
- top_layout.addLayout(desc_layout)
226
-
227
- # Separator Between Telemetry Selection and Description
228
- sep2 = Qt::Frame.new(central_widget)
229
- sep2.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
230
- top_layout.addWidget(sep2)
231
-
232
- @frame = Qt::VBoxLayout.new
233
- top_layout.addLayout(@frame)
234
- end
235
-
236
- def file_options
237
- @polling_rate = Qt::InputDialog.getDouble(self, tr("Options"), tr("Polling Rate:"), @polling_rate, 0, 1000, 1, nil)
238
- end
239
-
240
- def update_all
241
- update_targets()
242
- update_packets()
243
- update_tlm_items()
244
- end
245
-
246
- def update_targets
247
- @target_select.clearItems
248
-
249
- System.telemetry.target_names.each do |target_name|
250
- packets = System.telemetry.packets(target_name)
251
- has_non_hidden = false
252
- packets.each do |packet_name, packet|
253
- next if packet.hidden
254
- has_non_hidden = true
255
- break
256
- end
257
- @target_select.addItem(target_name) if has_non_hidden
258
- end
259
- end
260
-
261
- def update_packets
262
- @packet_select.clearItems
263
- @packets = []
264
- begin
265
- packets = System.telemetry.packets(@target_select.text)
266
- rescue
267
- # Unknown target or no telemetry packets
268
- packets = []
269
- end
270
- packets.each do |packet_name, packet|
271
- @packets << [packet_name, packet.description] unless packet.hidden
272
- end
273
- @packets.sort
274
- @packets = [[""]] if @packets.empty?
275
- @packets.each do |packet_name, description|
276
- @packet_select.addItem(packet_name)
277
- end
278
- if not @packets.empty?
279
- @packet_select.setCurrentText(@packets[0][0])
280
- end
281
- end
282
-
283
- def update_tlm_items(featured_item_name = nil)
284
- target_name = @target_select.text
285
- packet_name = @packet_select.text
286
-
287
- if @tlm_thread
288
- @shutdown_tlm_thread = true
289
- Qt.execute_in_main_thread(false, 0.001, true) {update_tlm_items(featured_item_name)}
290
- return
291
- end
292
-
293
- # Clear Status Bar
294
- statusBar.clearMessage()
295
-
296
- # Update Telemetry Description
297
- @description.text = ""
298
- @packets.each do |name, description|
299
- if name == packet_name
300
- @description.text = description.to_s
301
- break
302
- end
303
- end
304
-
305
- # Destory and recreate a new table widget
306
- @table.dispose if @table
307
-
308
- # Table for Telemetry Items
309
- @table = Qt::TableWidget.new()
310
-
311
- # Update Telemetry Items
312
- tlm_items = []
313
- begin
314
- System.telemetry.items(target_name, packet_name).each do |item|
315
- tlm_items << [item.name, item.states, item.description]
316
- end
317
- rescue
318
- # Unknown packet
319
- end
320
-
321
- @table.setRowCount(tlm_items.length)
322
- @table.setColumnCount(2)
323
- # Force the last section (the values) to fill all available space in the frame
324
- @table.horizontalHeader.setStretchLastSection(true)
325
- @table.setHorizontalHeaderLabels(%w(Item Value))
326
- @descriptions = []
327
-
328
- row = 0
329
- featured_item = nil
330
- tlm_items.each do |tlm_name, states, description|
331
- item = Qt::TableWidgetItem.new(tr("#{tlm_name}:"))
332
- item.setTextAlignment(Qt::AlignRight)
333
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable)
334
- @table.setItem(row, 0, item)
335
- item = Qt::TableWidgetItem.new(tr("0.0"))
336
- item.setTextAlignment(Qt::AlignRight)
337
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
338
- @table.setItem(row, 1, item)
339
- @descriptions[row] = []
340
- @descriptions[row][0] = description
341
- @descriptions[row][1] = description
342
- row += 1
343
- featured_item = item if featured_item_name == tlm_name
344
- end
345
-
346
- @table.resizeColumnsToContents()
347
- @table.resizeRowsToContents()
348
- @table.scrollToItem(featured_item) if featured_item
349
- @frame.addWidget(@table)
350
-
351
- # Handle Table Clicks
352
- @table.setMouseTracking(true)
353
- connect(@table, SIGNAL('cellEntered(int, int)'), self, SLOT('mouse_over(int, int)'))
354
- @table.setContextMenuPolicy(Qt::CustomContextMenu)
355
- connect(@table, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
356
-
357
- # Start Update Thread
358
- update_needed = false
359
- @tlm_thread = Thread.new do
360
- begin
361
- while true
362
- time = Time.now
363
- break if @shutdown_tlm_thread
364
-
365
- begin
366
- tlm_items = get_tlm_packet(target_name || '', packet_name || '', @mode)
367
- rescue DRb::DRbConnError => err
368
- Qt.execute_in_main_thread(true) do
369
- statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
370
- end
371
- tlm_items = nil
372
- update_needed = false
373
- rescue RuntimeError => err
374
- Qt.execute_in_main_thread(true) do
375
- statusBar.showMessage(tr("Packet #{target_name} #{packet_name} does not exist"))
376
- end
377
- tlm_items = nil
378
- update_needed = true
379
- end
380
-
381
- break if @shutdown_tlm_thread
382
-
383
- Qt.execute_in_main_thread(true) do
384
- # If we need an update (which indicates we've reconnected to the server)
385
- # Then we call update_all which will update all the telemetry items and kill and respawn this thread
386
- if update_needed
387
- update_all()
388
- end
389
-
390
- if tlm_items
391
- row = 0
392
- tlm_items.each do |name, value, limits_state|
393
- text = value.to_s
394
-
395
- case limits_state
396
- when :GREEN, :GREEN_HIGH
397
- @table.item(row, 1).textColor = Cosmos::GREEN
398
- text << ' (G)' if @colorblind
399
- when :GREEN_LOW
400
- @table.item(row, 1).textColor = Cosmos::GREEN
401
- text << ' (g)' if @colorblind
402
- when :YELLOW, :YELLOW_HIGH
403
- @table.item(row, 1).textColor = Cosmos::YELLOW
404
- text << ' (Y)' if @colorblind
405
- when :YELLOW_LOW
406
- @table.item(row, 1).textColor = Cosmos::YELLOW
407
- text << ' (y)' if @colorblind
408
- when :RED, :RED_HIGH
409
- @table.item(row, 1).textColor = Cosmos::RED
410
- text << ' (R)' if @colorblind
411
- when :RED_LOW
412
- @table.item(row, 1).textColor = Cosmos::RED
413
- text << ' (r)' if @colorblind
414
- when :BLUE
415
- @table.item(row, 1).textColor = Cosmos::BLUE
416
- text << ' (B)' if @colorblind
417
- when :STALE
418
- @table.item(row, 1).textColor = Cosmos::PURPLE
419
- text << ' ($)' if @colorblind
420
- else
421
- @table.item(row, 1).textColor = Cosmos::BLACK
422
- end
423
-
424
- @table.item(row,1).setText(text)
425
- row += 1
426
- end
427
- end
428
- end
429
- # Delay for 1/10 of polling rate
430
- 10.times do
431
- break if @shutdown_tlm_thread
432
- sleep(@polling_rate.to_f / 10.0) if (Time.now - time < @polling_rate)
433
- end
434
- end
435
- rescue Exception => error
436
- Qt.execute_in_main_thread(true) do
437
- ExceptionDialog.new(self, error, "COSMOS Packet Viewer : Telemetry Thread")
438
- end
439
- end
440
- @shutdown_tlm_thread = false
441
- @tlm_thread = nil
442
- end
443
- end
444
-
445
- def mouse_over(row, col)
446
- statusBar.showMessage(tr(@descriptions[row][col]))
447
- end
448
-
449
- def context_menu(point)
450
- target_name = @target_select.currentText
451
- packet_name = @packet_select.currentText
452
- item = @table.itemAt(point)
453
- if item
454
- item_name = @table.item(item.row, 0).text[0..-2] # Remove :
455
- if target_name.length > 0 and packet_name.length > 0 and item_name.length > 0
456
- menu = Qt::Menu.new()
457
-
458
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
459
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
460
- details_action.connect(SIGNAL('triggered()')) do
461
- TlmDetailsDialog.new(nil, target_name, packet_name, item_name)
462
- end
463
- menu.addAction(details_action)
464
-
465
- edit_action = Qt::Action.new(tr("Edit #{target_name} #{packet_name} #{item_name}"), self)
466
- edit_action.statusTip = tr("Edit Settings for #{target_name} #{packet_name} #{item_name}")
467
- edit_action.connect(SIGNAL('triggered()')) do
468
- TlmEditDialog.new(self, target_name, packet_name, item_name)
469
- end
470
- menu.addAction(edit_action)
471
-
472
- graph_action = Qt::Action.new(tr("Graph #{target_name} #{packet_name} #{item_name}"), self)
473
- graph_action.statusTip = tr("Create a new COSMOS graph of #{target_name} #{packet_name} #{item_name}")
474
- graph_action.connect(SIGNAL('triggered()')) do
475
- if Kernel.is_windows?
476
- Cosmos.run_process("rubyw tools/TlmGrapher -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
477
- elsif Kernel.is_mac? and File.exist?("tools/mac/TlmGrapher.app")
478
- Cosmos.run_process("open tools/mac/TlmGrapher.app --args -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
479
- else
480
- Cosmos.run_process("ruby tools/TlmGrapher -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
481
- end
482
- end
483
- menu.addAction(graph_action)
484
-
485
- menu.exec(@table.mapToGlobal(point))
486
- menu.dispose
487
- end
488
- end
489
- end
490
-
491
- def closeEvent(event)
492
- if @tlm_thread
493
- @shutdown_tlm_thread = true
494
- Qt.execute_in_main_thread(false, 0.001, true) { close() }
495
- event.ignore
496
- return
497
- end
498
- super(event)
499
- end
500
-
501
- def self.run(option_parser = nil, options = nil)
502
- Cosmos.catch_fatal_exception do
503
- unless option_parser and options
504
- option_parser, options = create_default_options()
505
- options.width = 325
506
- options.height = 200
507
- options.title = 'Packet Viewer : Formatted Telemetry with Units'
508
- option_parser.separator "Packet Viewer Specific Options:"
509
- option_parser.on("-p", "--packet 'TARGET_NAME PACKET_NAME'", "Start viewing the specified packet") do |arg|
510
- split = arg.split
511
- if split.length != 2
512
- puts "Packet must be specified as 'TARGET_NAME PACKET_NAME' in quotes"
513
- exit
514
- end
515
- options.packet = split
516
- end
517
- end
518
-
519
- super(option_parser, options)
520
- end
521
- end
522
-
523
- end # class PacketViewer
524
-
525
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/script'
14
+ require 'cosmos/gui/qt_tool'
15
+ require 'cosmos/gui/dialogs/tlm_details_dialog'
16
+ require 'cosmos/gui/dialogs/tlm_edit_dialog'
17
+ require 'cosmos/gui/dialogs/exception_dialog'
18
+ require 'cosmos/gui/dialogs/splash'
19
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
20
+ end
21
+
22
+ module Cosmos
23
+
24
+ class PacketViewer < QtTool
25
+ slots 'file_options()'
26
+ slots 'update_all()'
27
+ slots 'mouse_over(int, int)'
28
+ slots 'context_menu(const QPoint&)'
29
+
30
+ def initialize(options)
31
+ super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
32
+ Cosmos.load_cosmos_icon("packet_viewer.png")
33
+
34
+ @table = nil
35
+ @tlm_thread = nil
36
+ @shutdown_tlm_thread = false
37
+ @mode = :WITH_UNITS
38
+ @polling_rate = 1.0
39
+ @colorblind = false
40
+
41
+ initialize_actions()
42
+ initialize_menus()
43
+ initialize_central_widget(options)
44
+ complete_initialize()
45
+
46
+ # Bring up slash screen for long duration tasks after creation
47
+ Splash.execute(self) do |splash|
48
+ # Configure CosmosConfig to interact with splash screen
49
+ ConfigParser.splash = splash
50
+
51
+ System.telemetry
52
+ Qt.execute_in_main_thread(true) do
53
+ update_targets()
54
+ @target_select.setCurrentText(options.packet[0].upcase) if options.packet
55
+ update_packets()
56
+ @packet_select.setCurrentText(options.packet[1].upcase) if options.packet
57
+ update_tlm_items()
58
+
59
+ @search_box.completion_list = System.telemetry.all_item_strings(true, splash)
60
+ @search_box.callback = lambda do |tlm|
61
+ split_tlm = tlm.split(" ")
62
+ if split_tlm.length == 3
63
+ target_name = split_tlm[0].upcase
64
+ @target_select.setCurrentText(target_name)
65
+ update_packets()
66
+ packet_name = split_tlm[1]
67
+ @packet_select.setCurrentText(packet_name)
68
+ item_name = split_tlm[2]
69
+ update_tlm_items(item_name)
70
+ end
71
+ end
72
+ end
73
+
74
+ # Unconfigure CosmosConfig to interact with splash screen
75
+ ConfigParser.splash = nil
76
+ end
77
+ end
78
+
79
+ def initialize_actions
80
+ super()
81
+
82
+ @reset_action = Qt::Action.new(tr('&Reset'), self)
83
+ @reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
84
+ @reset_action.shortcut = @reset_keyseq
85
+ @reset_action.statusTip = tr('Reset Connection')
86
+ connect(@reset_action, SIGNAL('triggered()'), self, SLOT('update_all()'))
87
+
88
+ @option_action = Qt::Action.new(tr('O&ptions'), self)
89
+ @option_action.statusTip = tr('Application Options')
90
+ connect(@option_action, SIGNAL('triggered()'), self, SLOT('file_options()'))
91
+
92
+ @color_blind_action = Qt::Action.new(tr('Color&blind Mode'), self)
93
+ @color_blind_keyseq = Qt::KeySequence.new(tr('Ctrl+B'))
94
+ @color_blind_action.shortcut = @color_blind_keyseq
95
+ @color_blind_action.statusTip = tr('Enable text representation of colors in the values')
96
+ @color_blind_action.setCheckable(true)
97
+ @color_blind_action.connect(SIGNAL('triggered()')) do
98
+ @colorblind = @color_blind_action.isChecked
99
+ end
100
+
101
+ @formatted_tlm_units_action = Qt::Action.new(tr('Formatted Telemetry With &Units'), self)
102
+ @formatted_tlm_units_keyseq = Qt::KeySequence.new(tr('Ctrl+U'))
103
+ @formatted_tlm_units_action.shortcut = @formatted_tlm_units_keyseq
104
+ @formatted_tlm_units_action.statusTip = tr('Formatted Telemetry with Units')
105
+ @formatted_tlm_units_action.setCheckable(true)
106
+ @formatted_tlm_units_action.setChecked(true)
107
+ @formatted_tlm_units_action.connect(SIGNAL('triggered()')) do
108
+ @mode = :WITH_UNITS
109
+ self.window_title = "COSMOS Packet Viewer : Formatted Telemetry with Units"
110
+ end
111
+
112
+ @formatted_tlm_action = Qt::Action.new(tr('&Formatted Telemetry'), self)
113
+ @formatted_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
114
+ @formatted_tlm_action.shortcut = @formatted_tlm_keyseq
115
+ @formatted_tlm_action.statusTip = tr('Formatted Telemetry')
116
+ @formatted_tlm_action.setCheckable(true)
117
+ @formatted_tlm_action.connect(SIGNAL('triggered()')) do
118
+ @mode = :FORMATTED
119
+ self.window_title = "COSMOS Packet Viewer : Formatted Telemetry"
120
+ end
121
+
122
+ @normal_tlm_action = Qt::Action.new(tr('Normal &Converted Telemetry'), self)
123
+ @normal_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
124
+ @normal_tlm_action.shortcut = @normal_tlm_keyseq
125
+ @normal_tlm_action.statusTip = tr('Normal Converted Telemetry')
126
+ @normal_tlm_action.setCheckable(true)
127
+ @normal_tlm_action.connect(SIGNAL('triggered()')) do
128
+ @mode = :CONVERTED
129
+ self.window_title = "COSMOS Packet Viewer : Coverted Telemetry"
130
+ end
131
+
132
+ @raw_tlm_action = Qt::Action.new(tr('&Raw Telemetry'), self)
133
+ @raw_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
134
+ @raw_tlm_action.shortcut = @raw_tlm_keyseq
135
+ @raw_tlm_action.statusTip = tr('Raw Unprocessed Telemetry')
136
+ @raw_tlm_action.setCheckable(true)
137
+ @raw_tlm_action.connect(SIGNAL('triggered()')) do
138
+ @mode = :RAW
139
+ self.window_title = "COSMOS Packet Viewer : Raw Telemetry"
140
+ end
141
+
142
+ # The formatting options are mutually exclusive so create an action group
143
+ formatting_group = Qt::ActionGroup.new(self)
144
+ formatting_group.addAction(@formatted_tlm_units_action)
145
+ formatting_group.addAction(@formatted_tlm_action)
146
+ formatting_group.addAction(@normal_tlm_action)
147
+ formatting_group.addAction(@raw_tlm_action)
148
+ end
149
+
150
+ def initialize_menus
151
+ # File Menu
152
+ file_menu = menuBar.addMenu(tr('&File'))
153
+ file_menu.addAction(@reset_action)
154
+ file_menu.addAction(@option_action)
155
+ file_menu.addSeparator()
156
+ file_menu.addAction(@exit_action)
157
+
158
+ # View Menu
159
+ view_menu = menuBar.addMenu(tr('&View'))
160
+ view_menu.addAction(@color_blind_action)
161
+ view_menu.addSeparator.setText(tr('Formatting'));
162
+ view_menu.addAction(@formatted_tlm_units_action)
163
+ view_menu.addAction(@formatted_tlm_action)
164
+ view_menu.addAction(@normal_tlm_action)
165
+ view_menu.addAction(@raw_tlm_action)
166
+
167
+ # Help Menu
168
+ @about_string = "Packet Viewer provides a view of every telemetry packet in the system. Packets can be viewed in numerous represenations ranging from the raw data to formatted with units."
169
+ initialize_help_menu()
170
+ end
171
+
172
+ def initialize_central_widget(options)
173
+ # Create the central widget
174
+ central_widget = Qt::Widget.new
175
+ setCentralWidget(central_widget)
176
+
177
+ # Create the top level vertical layout
178
+ top_layout = Qt::VBoxLayout.new(central_widget)
179
+
180
+ # Set the target combobox selection
181
+ @target_select = Qt::ComboBox.new
182
+ @target_select.setMaxVisibleItems(6)
183
+ @target_select.connect(SIGNAL('activated(const QString&)')) do
184
+ update_packets()
185
+ update_tlm_items()
186
+ end
187
+ target_label = Qt::Label.new(tr("&Target:"))
188
+ target_label.setBuddy(@target_select)
189
+
190
+ # Set the comamnd combobox selection
191
+ @packet_select = Qt::ComboBox.new
192
+ @packet_select.setMaxVisibleItems(20)
193
+ @packet_select.connect(SIGNAL('activated(const QString&)')) do
194
+ update_tlm_items()
195
+ end
196
+ cmd_label = Qt::Label.new(tr("&Packet:"))
197
+ cmd_label.setBuddy(@packet_select)
198
+
199
+ # Mnemonic Search Box
200
+ @search_layout = Qt::HBoxLayout.new
201
+ @search_box = FullTextSearchLineEdit.new(self)
202
+ @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
203
+ @search_layout.addWidget(@search_box)
204
+ top_layout.addLayout(@search_layout)
205
+
206
+ # Layout the top level selection
207
+ select_layout = Qt::HBoxLayout.new
208
+ select_layout.addWidget(target_label)
209
+ select_layout.addWidget(@target_select, 1)
210
+ select_layout.addWidget(cmd_label)
211
+ select_layout.addWidget(@packet_select, 1)
212
+ top_layout.addLayout(select_layout)
213
+
214
+ # Separator Between Telemetry Selection and Telemetry Description
215
+ sep1 = Qt::Frame.new(central_widget)
216
+ sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
217
+ top_layout.addWidget(sep1)
218
+
219
+ # Telemetry Description Label
220
+ dec_label = Qt::Label.new(tr("Description:"))
221
+ @description = Qt::Label.new('')
222
+ desc_layout = Qt::HBoxLayout.new
223
+ desc_layout.addWidget(dec_label)
224
+ desc_layout.addWidget(@description, 1)
225
+ top_layout.addLayout(desc_layout)
226
+
227
+ # Separator Between Telemetry Selection and Description
228
+ sep2 = Qt::Frame.new(central_widget)
229
+ sep2.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
230
+ top_layout.addWidget(sep2)
231
+
232
+ @frame = Qt::VBoxLayout.new
233
+ top_layout.addLayout(@frame)
234
+ end
235
+
236
+ def file_options
237
+ @polling_rate = Qt::InputDialog.getDouble(self, tr("Options"), tr("Polling Rate:"), @polling_rate, 0, 1000, 1, nil)
238
+ end
239
+
240
+ def update_all
241
+ update_targets()
242
+ update_packets()
243
+ update_tlm_items()
244
+ end
245
+
246
+ def update_targets
247
+ @target_select.clearItems
248
+
249
+ System.telemetry.target_names.each do |target_name|
250
+ packets = System.telemetry.packets(target_name)
251
+ has_non_hidden = false
252
+ packets.each do |packet_name, packet|
253
+ next if packet.hidden
254
+ has_non_hidden = true
255
+ break
256
+ end
257
+ @target_select.addItem(target_name) if has_non_hidden
258
+ end
259
+ end
260
+
261
+ def update_packets
262
+ @packet_select.clearItems
263
+ @packets = []
264
+ begin
265
+ packets = System.telemetry.packets(@target_select.text)
266
+ rescue
267
+ # Unknown target or no telemetry packets
268
+ packets = []
269
+ end
270
+ packets.each do |packet_name, packet|
271
+ @packets << [packet_name, packet.description] unless packet.hidden
272
+ end
273
+ @packets.sort
274
+ @packets = [[""]] if @packets.empty?
275
+ @packets.each do |packet_name, description|
276
+ @packet_select.addItem(packet_name)
277
+ end
278
+ if not @packets.empty?
279
+ @packet_select.setCurrentText(@packets[0][0])
280
+ end
281
+ end
282
+
283
+ def update_tlm_items(featured_item_name = nil)
284
+ target_name = @target_select.text
285
+ packet_name = @packet_select.text
286
+
287
+ if @tlm_thread
288
+ @shutdown_tlm_thread = true
289
+ Qt.execute_in_main_thread(false, 0.001, true) {update_tlm_items(featured_item_name)}
290
+ return
291
+ end
292
+
293
+ # Clear Status Bar
294
+ statusBar.clearMessage()
295
+
296
+ # Update Telemetry Description
297
+ @description.text = ""
298
+ @packets.each do |name, description|
299
+ if name == packet_name
300
+ @description.text = description.to_s
301
+ break
302
+ end
303
+ end
304
+
305
+ # Destory and recreate a new table widget
306
+ @table.dispose if @table
307
+
308
+ # Table for Telemetry Items
309
+ @table = Qt::TableWidget.new()
310
+
311
+ # Update Telemetry Items
312
+ tlm_items = []
313
+ begin
314
+ System.telemetry.items(target_name, packet_name).each do |item|
315
+ tlm_items << [item.name, item.states, item.description]
316
+ end
317
+ rescue
318
+ # Unknown packet
319
+ end
320
+
321
+ @table.setRowCount(tlm_items.length)
322
+ @table.setColumnCount(2)
323
+ # Force the last section (the values) to fill all available space in the frame
324
+ @table.horizontalHeader.setStretchLastSection(true)
325
+ @table.setHorizontalHeaderLabels(%w(Item Value))
326
+ @descriptions = []
327
+
328
+ row = 0
329
+ featured_item = nil
330
+ tlm_items.each do |tlm_name, states, description|
331
+ item = Qt::TableWidgetItem.new(tr("#{tlm_name}:"))
332
+ item.setTextAlignment(Qt::AlignRight)
333
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable)
334
+ @table.setItem(row, 0, item)
335
+ item = Qt::TableWidgetItem.new(tr("0.0"))
336
+ item.setTextAlignment(Qt::AlignRight)
337
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
338
+ @table.setItem(row, 1, item)
339
+ @descriptions[row] = []
340
+ @descriptions[row][0] = description
341
+ @descriptions[row][1] = description
342
+ row += 1
343
+ featured_item = item if featured_item_name == tlm_name
344
+ end
345
+
346
+ @table.resizeColumnsToContents()
347
+ @table.resizeRowsToContents()
348
+ @table.scrollToItem(featured_item) if featured_item
349
+ @frame.addWidget(@table)
350
+
351
+ # Handle Table Clicks
352
+ @table.setMouseTracking(true)
353
+ connect(@table, SIGNAL('cellEntered(int, int)'), self, SLOT('mouse_over(int, int)'))
354
+ @table.setContextMenuPolicy(Qt::CustomContextMenu)
355
+ connect(@table, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
356
+
357
+ # Start Update Thread
358
+ update_needed = false
359
+ @tlm_thread = Thread.new do
360
+ begin
361
+ while true
362
+ time = Time.now
363
+ break if @shutdown_tlm_thread
364
+
365
+ begin
366
+ tlm_items = get_tlm_packet(target_name || '', packet_name || '', @mode)
367
+ rescue DRb::DRbConnError => err
368
+ Qt.execute_in_main_thread(true) do
369
+ statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
370
+ end
371
+ tlm_items = nil
372
+ update_needed = false
373
+ rescue RuntimeError => err
374
+ Qt.execute_in_main_thread(true) do
375
+ statusBar.showMessage(tr("Packet #{target_name} #{packet_name} does not exist"))
376
+ end
377
+ tlm_items = nil
378
+ update_needed = true
379
+ end
380
+
381
+ break if @shutdown_tlm_thread
382
+
383
+ Qt.execute_in_main_thread(true) do
384
+ # If we need an update (which indicates we've reconnected to the server)
385
+ # Then we call update_all which will update all the telemetry items and kill and respawn this thread
386
+ if update_needed
387
+ update_all()
388
+ end
389
+
390
+ if tlm_items
391
+ row = 0
392
+ tlm_items.each do |name, value, limits_state|
393
+ text = value.to_s
394
+
395
+ case limits_state
396
+ when :GREEN, :GREEN_HIGH
397
+ @table.item(row, 1).textColor = Cosmos::GREEN
398
+ text << ' (G)' if @colorblind
399
+ when :GREEN_LOW
400
+ @table.item(row, 1).textColor = Cosmos::GREEN
401
+ text << ' (g)' if @colorblind
402
+ when :YELLOW, :YELLOW_HIGH
403
+ @table.item(row, 1).textColor = Cosmos::YELLOW
404
+ text << ' (Y)' if @colorblind
405
+ when :YELLOW_LOW
406
+ @table.item(row, 1).textColor = Cosmos::YELLOW
407
+ text << ' (y)' if @colorblind
408
+ when :RED, :RED_HIGH
409
+ @table.item(row, 1).textColor = Cosmos::RED
410
+ text << ' (R)' if @colorblind
411
+ when :RED_LOW
412
+ @table.item(row, 1).textColor = Cosmos::RED
413
+ text << ' (r)' if @colorblind
414
+ when :BLUE
415
+ @table.item(row, 1).textColor = Cosmos::BLUE
416
+ text << ' (B)' if @colorblind
417
+ when :STALE
418
+ @table.item(row, 1).textColor = Cosmos::PURPLE
419
+ text << ' ($)' if @colorblind
420
+ else
421
+ @table.item(row, 1).textColor = Cosmos::BLACK
422
+ end
423
+
424
+ @table.item(row,1).setText(text)
425
+ row += 1
426
+ end
427
+ end
428
+ end
429
+ # Delay for 1/10 of polling rate
430
+ 10.times do
431
+ break if @shutdown_tlm_thread
432
+ sleep(@polling_rate.to_f / 10.0) if (Time.now - time < @polling_rate)
433
+ end
434
+ end
435
+ rescue Exception => error
436
+ Qt.execute_in_main_thread(true) do
437
+ ExceptionDialog.new(self, error, "COSMOS Packet Viewer : Telemetry Thread")
438
+ end
439
+ end
440
+ @shutdown_tlm_thread = false
441
+ @tlm_thread = nil
442
+ end
443
+ end
444
+
445
+ def mouse_over(row, col)
446
+ statusBar.showMessage(tr(@descriptions[row][col]))
447
+ end
448
+
449
+ def context_menu(point)
450
+ target_name = @target_select.currentText
451
+ packet_name = @packet_select.currentText
452
+ item = @table.itemAt(point)
453
+ if item
454
+ item_name = @table.item(item.row, 0).text[0..-2] # Remove :
455
+ if target_name.length > 0 and packet_name.length > 0 and item_name.length > 0
456
+ menu = Qt::Menu.new()
457
+
458
+ details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
459
+ details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
460
+ details_action.connect(SIGNAL('triggered()')) do
461
+ TlmDetailsDialog.new(nil, target_name, packet_name, item_name)
462
+ end
463
+ menu.addAction(details_action)
464
+
465
+ edit_action = Qt::Action.new(tr("Edit #{target_name} #{packet_name} #{item_name}"), self)
466
+ edit_action.statusTip = tr("Edit Settings for #{target_name} #{packet_name} #{item_name}")
467
+ edit_action.connect(SIGNAL('triggered()')) do
468
+ TlmEditDialog.new(self, target_name, packet_name, item_name)
469
+ end
470
+ menu.addAction(edit_action)
471
+
472
+ graph_action = Qt::Action.new(tr("Graph #{target_name} #{packet_name} #{item_name}"), self)
473
+ graph_action.statusTip = tr("Create a new COSMOS graph of #{target_name} #{packet_name} #{item_name}")
474
+ graph_action.connect(SIGNAL('triggered()')) do
475
+ if Kernel.is_windows?
476
+ Cosmos.run_process("rubyw tools/TlmGrapher -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
477
+ elsif Kernel.is_mac? and File.exist?("tools/mac/TlmGrapher.app")
478
+ Cosmos.run_process("open tools/mac/TlmGrapher.app --args -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
479
+ else
480
+ Cosmos.run_process("ruby tools/TlmGrapher -i \"#{target_name} #{packet_name} #{item_name}\" --system #{File.basename(System.initial_filename)}")
481
+ end
482
+ end
483
+ menu.addAction(graph_action)
484
+
485
+ menu.exec(@table.mapToGlobal(point))
486
+ menu.dispose
487
+ end
488
+ end
489
+ end
490
+
491
+ def closeEvent(event)
492
+ if @tlm_thread
493
+ @shutdown_tlm_thread = true
494
+ Qt.execute_in_main_thread(false, 0.001, true) { close() }
495
+ event.ignore
496
+ return
497
+ end
498
+ super(event)
499
+ end
500
+
501
+ def self.run(option_parser = nil, options = nil)
502
+ Cosmos.catch_fatal_exception do
503
+ unless option_parser and options
504
+ option_parser, options = create_default_options()
505
+ options.width = 325
506
+ options.height = 200
507
+ options.title = 'Packet Viewer : Formatted Telemetry with Units'
508
+ option_parser.separator "Packet Viewer Specific Options:"
509
+ option_parser.on("-p", "--packet 'TARGET_NAME PACKET_NAME'", "Start viewing the specified packet") do |arg|
510
+ split = arg.split
511
+ if split.length != 2
512
+ puts "Packet must be specified as 'TARGET_NAME PACKET_NAME' in quotes"
513
+ exit
514
+ end
515
+ options.packet = split
516
+ end
517
+ end
518
+
519
+ super(option_parser, options)
520
+ end
521
+ end
522
+
523
+ end # class PacketViewer
524
+
525
+ end # module Cosmos