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,544 +1,563 @@
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/tools/tlm_viewer/screen'
15
- require 'cosmos/gui/qt_tool'
16
- require 'cosmos/gui/dialogs/splash'
17
- require 'cosmos/gui/dialogs/progress_dialog'
18
- require 'cosmos/gui/dialogs/select_dialog'
19
- require 'cosmos/gui/widgets/full_text_search_line_edit'
20
- require 'cosmos/tools/tlm_viewer/tlm_viewer_config'
21
- require 'find'
22
- end
23
-
24
- module Cosmos
25
- Cosmos.disable_warnings do
26
- module Script
27
- private
28
-
29
- def display(display_name, x_pos = nil, y_pos = nil)
30
- TlmViewer.instance.display(display_name, x_pos, y_pos)
31
- end
32
-
33
- def clear(display_name)
34
- TlmViewer.instance.clear(display_name)
35
- end
36
- end
37
- end
38
- end # module Cosmos
39
-
40
- module Cosmos
41
-
42
- # The Telemetry Viewer Application provides a frameword for user defined
43
- # 'screens'. Screens can contain telemetry items but also command senders,
44
- # graphs, and any other user defined widgets. The TlmViewer class itself is
45
- # responsible for reading the tlm_viewer.txt file and building the list of
46
- # screens. The actual rendering of the screen is defered to the various
47
- # widget classes.
48
- class TlmViewer < QtTool
49
- @@instance = nil
50
-
51
- def self.instance
52
- @@instance
53
- end
54
-
55
- def self.load_config(filename)
56
- # Determine MD5 over main config file and all screens
57
- tlmviewer_files = [filename, System.initial_filename]
58
- additional_data = ''
59
- System.targets.each do |target_name, target|
60
- tlmviewer_files << target.filename if File.exist?(target.filename)
61
- screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', target.original_name, 'screens')
62
- if File.exist?(screen_dir)
63
- if target.substitute
64
- additional_data << target.original_name
65
- additional_data << target.name
66
- else
67
- additional_data << target.original_name
68
- end
69
- Dir.new(screen_dir).each do |screen_dir_filename|
70
- if screen_dir_filename[0..0] != '.'
71
- tlmviewer_files << File.join(screen_dir, screen_dir_filename)
72
- end
73
- end
74
- end
75
- end
76
-
77
- md5 = Cosmos.md5_files(tlmviewer_files, additional_data)
78
- md5_string = md5.hexdigest
79
-
80
- # Build filename for marshal file
81
- marshal_filename = File.join(System.paths['TMP'], 'tlmviewer_' << md5_string << '.bin')
82
-
83
- # Attempt to load marshal file
84
- config = Cosmos.marshal_load(marshal_filename)
85
- unless config
86
- # Marshal file load failed - Manually load configuration
87
- config = TlmViewerConfig.new(filename)
88
-
89
- # Create marshal file for next time
90
- Cosmos.marshal_dump(marshal_filename, config)
91
- end
92
-
93
- return config
94
- end
95
-
96
- def initialize(options)
97
- # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
98
- super(options)
99
- Cosmos.load_cosmos_icon("tlm_viewer.png")
100
- setMinimumWidth(300)
101
- @@instance = self
102
-
103
- # Get Params from Config File
104
- if options.config_file
105
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
106
- else
107
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
108
- end
109
-
110
- Splash.execute(self, true) do |splash|
111
- ConfigParser.splash = splash
112
- splash.message = "Starting TlmViewer"
113
- System.telemetry
114
- @tlm_viewer_config = self.class.load_config(filename)
115
- ConfigParser.splash = nil
116
- end
117
-
118
- initialize_actions()
119
- initialize_menus(options)
120
- initialize_central_widget(options)
121
- complete_initialize()
122
-
123
- Splash.execute(self) do |splash|
124
- ConfigParser.splash = splash
125
- splash.message = "Displaying requested screens"
126
-
127
- # Startup desired screens once we're running
128
- @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
129
- if screen_info.show_on_startup
130
- display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
131
- end
132
- end
133
-
134
- if options.listen
135
- # Start DRb with access control
136
- @json_drb = JsonDRb.new
137
- port = System.ports['TLMVIEWER_API']
138
- acl = ACL.new(['allow', '127.0.0.1'], ACL::ALLOW_DENY)
139
- @json_drb.acl = acl
140
- whitelist = [
141
- 'display',
142
- 'clear']
143
- @json_drb.method_whitelist = whitelist
144
- begin
145
- @json_drb.start_service "localhost", port, self
146
- rescue Exception
147
- raise FatalError.new("Error starting JsonDRb on port #{port}.\nPerhaps a Telemetry Viewer is already running?")
148
- end
149
- else
150
- @json_drb = nil
151
- end
152
-
153
- @all_telemetry = System.telemetry.all_item_strings(false, splash)
154
-
155
- Qt.execute_in_main_thread(true) do
156
- @search_box.completion_list = @tlm_viewer_config.completion_list
157
- @search_box.callback = lambda do |tlm|
158
- mapping = @tlm_viewer_config.tlm_to_screen_mapping[tlm]
159
- if mapping
160
- mapping.each do |screen_name|
161
- display(screen_name)
162
- end
163
- end
164
- end
165
- end
166
-
167
- ConfigParser.splash = nil
168
- end
169
- end
170
-
171
- def initialize_actions
172
- super()
173
-
174
- # File actions
175
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save Configuration'), self)
176
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
177
- @file_save.shortcut = @file_save_keyseq
178
- @file_save.statusTip = tr('Save all screen positions')
179
- @file_save.connect(SIGNAL('triggered()')) { file_save() }
180
-
181
- @file_generate = Qt::Action.new(tr('&Generate Screens'), self)
182
- @file_generate_keyseq = Qt::KeySequence.new(tr('Ctrl+G'))
183
- @file_generate.shortcut = @file_generate_keyseq
184
- @file_generate.statusTip = tr('Generate screen definition files')
185
- @file_generate.connect(SIGNAL('triggered()')) { file_generate() }
186
-
187
- @file_audit = Qt::Action.new(tr('Audi&t Screens vs Tlm'), self)
188
- @file_audit_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
189
- @file_audit.shortcut = @file_audit_keyseq
190
- @file_audit.statusTip = tr('Create a report listing which telemetry points are not on screens')
191
- @file_audit.connect(SIGNAL('triggered()')) { file_audit() }
192
- end
193
-
194
- def initialize_menus(options)
195
- # File Menu
196
- @file_menu = menuBar.addMenu(tr('&File'))
197
- @file_menu.addAction(@file_save)
198
- @file_menu.addAction(@file_generate)
199
- @file_menu.addAction(@file_audit)
200
- @file_menu.addSeparator()
201
- @file_menu.addAction(@exit_action)
202
-
203
- # Help Menu
204
- @about_string = "Telemetry Viewer provides a view of every telemetry packet in the system."
205
- @about_string << " Packets can be viewed in numerous representations ranging from the raw data to formatted with units."
206
-
207
- initialize_help_menu()
208
- end
209
-
210
- def initialize_central_widget(options)
211
- # Create the central widget
212
- @central_widget = Qt::Widget.new
213
- setCentralWidget(@central_widget)
214
- @top_layout = Qt::VBoxLayout.new
215
-
216
- # Create Search box
217
- @search_layout = Qt::HBoxLayout.new
218
- @search_box = FullTextSearchLineEdit.new(self)
219
- @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;")
220
- @search_layout.addWidget(@search_box)
221
- @top_layout.addLayout(@search_layout)
222
-
223
- # Create Screen Drop Down Lists
224
- @selection_pane = Qt::HBoxLayout.new
225
- @top_layout.addLayout(@selection_pane)
226
- @column_widgets = []
227
- @tlm_viewer_config.columns.each_with_index do |target_screen_infos, column_index|
228
- @column_widgets[column_index] = {}
229
- if column_index != 0
230
- # Separator before editor
231
- @column_widgets[column_index][:sep1] = Qt::Frame.new(@central_widget)
232
- @column_widgets[column_index][:sep1].setFrameStyle(Qt::Frame::VLine | Qt::Frame::Sunken)
233
- @selection_pane.addWidget(@column_widgets[column_index][:sep1])
234
- end
235
- @column_widgets[column_index][:grid] = Qt::GridLayout.new
236
- @selection_pane.addLayout(@column_widgets[column_index][:grid])
237
- row = 0
238
- @column_widgets[column_index][:rows] = []
239
- target_screen_infos.each do |target_name, screen_infos|
240
- @column_widgets[column_index][:rows][row] = {}
241
-
242
- # Create Label for Category
243
- @column_widgets[column_index][:rows][row][:label] = Qt::Label.new("#{target_name}:")
244
- @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:label], row, 0)
245
-
246
- # Create Drop Down Menu for Category
247
- @column_widgets[column_index][:rows][row][:screen_select] = Qt::ComboBox.new
248
- @variants = []
249
- screen_infos.each do |screen_name, screen_info|
250
- @variants << Qt::Variant.new(screen_info.full_name)
251
- @column_widgets[column_index][:rows][row][:screen_select].addItem(screen_info.name, @variants[-1])
252
- end
253
- if screen_infos.length >= 20
254
- @column_widgets[column_index][:rows][row][:screen_select].setMaxVisibleItems(20)
255
- else
256
- @column_widgets[column_index][:rows][row][:screen_select].setMaxVisibleItems(screen_infos.length)
257
- end
258
- my_row = row
259
- handler = lambda do
260
- screen_full_name = @column_widgets[column_index][:rows][my_row][:screen_select].itemData(@column_widgets[column_index][:rows][my_row][:screen_select].currentIndex)
261
- display(screen_full_name.value)
262
- end
263
- @column_widgets[column_index][:rows][row][:screen_select].connect(SIGNAL('activated(int)')) { handler.call }
264
- @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:screen_select], row, 1)
265
-
266
- @column_widgets[column_index][:rows][row][:show_screen] = Qt::PushButton.new("Show Screen")
267
- @column_widgets[column_index][:rows][row][:show_screen].connect(SIGNAL('clicked(bool)')) { handler.call }
268
- @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:show_screen], row, 2)
269
-
270
- row += 1
271
- end
272
- end
273
-
274
- @central_widget.setLayout(@top_layout)
275
- end
276
-
277
- # Handles saving the current configuration to a file
278
- def file_save
279
- filename = Qt::FileDialog.getSaveFileName(self, "Save Configuration", @tlm_viewer_config.filename, "Config Files (*.txt);;All Files (*)")
280
- if filename and not filename.empty?
281
- # Update config with open screen positions and show on startup
282
- Screen.open_screens.clone.each do |screen|
283
- @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
284
- if screen_full_name == screen.full_name
285
- begin
286
- screen_info.x_pos = screen.window.x
287
- screen_info.y_pos = screen.window.y
288
- screen_info.show_on_startup = true
289
- rescue
290
- # Screen probably already closed - continue
291
- end
292
- break
293
- end
294
- end
295
- end
296
-
297
- filename << '.txt' if File.extname(filename).empty?
298
- @tlm_viewer_config.save(filename)
299
- end
300
- end # def on_file_save_config
301
-
302
- def generate_target(target_name)
303
- target = System.targets[target_name]
304
-
305
- results = ''
306
- screen_dir = File.join(USERPATH, 'config', 'targets', target.original_name, 'screens')
307
- Dir.mkdir(screen_dir, 0777) unless File.exist?(screen_dir)
308
-
309
- System.telemetry.packets(target.name).each do |packet_name, packet|
310
- filename = File.join(screen_dir, packet_name.downcase + '.txt')
311
- unless File.exist?(filename)
312
- results << "Creating #{filename}...\n"
313
- File.open(filename, 'w') do |file|
314
- items = packet.sorted_items
315
- if items.length > 34
316
- file.puts "SCREEN 250 800 1.0"
317
- file.puts ""
318
- file.puts "SCROLLWINDOW"
319
- else
320
- file.puts "SCREEN AUTO AUTO 1.0"
321
- end
322
- file.puts ""
323
- file.puts " VERTICALBOX"
324
- items.each do |item|
325
- file.puts " LABELVALUE #{target.original_name} #{packet_name} #{item.name} # #{item.description}"
326
- end
327
- file.puts " END"
328
- file.puts ""
329
- file.puts "END" if items.length > 34
330
- end
331
- else
332
- results << "Skipping #{filename}... already exists\n"
333
- end
334
- end
335
-
336
- return results
337
- end
338
-
339
- def file_generate
340
- target_names = System.telemetry.target_names
341
- target_names.delete('UNKNOWN')
342
- target_names.unshift('ALL')
343
-
344
- dialog = SelectDialog.new(self, 'Target Name:', target_names, 'Select Target Name to Generate Screens')
345
- target_name = dialog.result
346
- if target_name
347
- ProgressDialog.execute(self, 'Generating Telemetry Screens', 500, 10, false, false, true, true, false) do |progress_dialog|
348
- if target_name == 'ALL'
349
- System.telemetry.target_names.each do |my_target_name|
350
- next if my_target_name == 'UNKNOWN'
351
- progress_dialog.append_text(generate_target(my_target_name))
352
- end
353
- else
354
- progress_dialog.append_text(generate_target(target_name))
355
- end
356
- progress_dialog.complete
357
- end
358
- end
359
- end
360
-
361
- def file_audit
362
- output_filename = ''
363
- all_telemetry = @all_telemetry.clone
364
-
365
- # Open a progress dialog with out a step progress
366
- ProgressDialog.execute(self, 'Audit Progress', 650, 400, true, false) do |progress|
367
- progress.enable_cancel_button
368
- begin
369
- index = 1
370
- @tlm_viewer_config.screen_infos.each do |name, info|
371
- progress.append_text("Processing screen #{name}")
372
- screen_text = File.read(info.filename).upcase
373
- found = []
374
- all_telemetry.each do |tlm|
375
- found << tlm if screen_text.include? tlm
376
- end
377
- all_telemetry -= found
378
-
379
- progress.set_overall_progress(index.to_f / @tlm_viewer_config.screen_infos.length.to_f)
380
- index += 1
381
- end
382
-
383
- output_filename = File.join(System.paths['LOGS'],
384
- File.build_timestamped_filename(['screen','audit'], '.txt'))
385
- File.open(output_filename, 'w') do |file|
386
- file.puts "Telemetry Viewer audit created on #{Time.now.formatted}.\n"
387
- if all_telemetry.empty?
388
- msg = "\nAll telemetry points accounted for in screens."
389
- progress.append_text(msg)
390
- file.puts msg
391
- else
392
- progress.append_text("\nThere were #{all_telemetry.length} telemetry points not accounted for.")
393
- file.puts "\nThe following telemetry points were not on any screens:"
394
- all_telemetry.map {|item| file.puts item }
395
- end
396
- end
397
- rescue => error
398
- progress.append_text("Error processing:\n#{error.formatted}\n")
399
- ensure
400
- progress.append_text("\nWriting audit to #{output_filename}")
401
- progress.set_overall_progress(1.0)
402
- progress.complete
403
- end
404
- end
405
- # Open the file as a convenience
406
- Cosmos.open_in_text_editor(output_filename) if output_filename
407
- end
408
-
409
- # Method called by screens to notify that they have been closed
410
- def notify(closed_screen)
411
- screen_full_name = closed_screen.full_name
412
- begin
413
- screen_info = find_screen_info(screen_full_name)
414
- screen_info.screen = nil
415
- rescue
416
- # Oh well
417
- end
418
- end
419
-
420
- def closeEvent(event)
421
- # Are you sure if any screens are open
422
- if Screen.open_screens.length > 0
423
- result = Qt::MessageBox.warning(self, "Confirm Close",
424
- "Are you sure? All Open Telemetry Screens will be Closed.",
425
- Qt::MessageBox::Yes | Qt::MessageBox::No)
426
- if result != Qt::MessageBox::Yes
427
- event.ignore()
428
- else
429
- # Close any open screens
430
- Screen.close_all_screens(self)
431
- shutdown_cmd_tlm()
432
- @json_drb.stop_service if @json_drb
433
- super(event)
434
- end
435
- end
436
- end
437
-
438
- def find_screen_info(screen_full_name)
439
- screen_info = @tlm_viewer_config.screen_infos[screen_full_name.upcase]
440
- raise "Unknown screen: #{screen_full_name.upcase}" unless screen_info
441
- screen_info
442
- end
443
-
444
- def display(screen_full_name, x_pos = nil, y_pos = nil)
445
- return unless screen_full_name
446
- # Find the specified screen
447
- screen_info = find_screen_info(screen_full_name)
448
-
449
- # Raise Screens that are already open
450
- if screen_info.screen
451
- success = false
452
- Qt.execute_in_main_thread(true) do
453
- begin
454
- screen_info.screen.window.raise
455
- screen_info.screen.window.showNormal
456
- success = true
457
- rescue
458
- # Screen probably was closed - continue
459
- screen_info.screen = nil
460
- end
461
- end
462
- return if success
463
- end
464
-
465
- # Create screens that are not open yet
466
- Qt.execute_in_main_thread(true) do
467
- if x_pos and y_pos
468
- screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, self, :REALTIME, x_pos, y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute)
469
- else
470
- screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, self, :REALTIME, screen_info.x_pos, screen_info.y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute)
471
- end
472
- end
473
- end
474
-
475
- # Close the specified screen
476
- def clear(screen_full_name)
477
- # Find the specified screen
478
- screen_info = find_screen_info(screen_full_name)
479
-
480
- # Close the screen
481
- Qt.execute_in_main_thread(true) do
482
- begin
483
- screen_info.screen.window.close if screen_info.screen
484
- ensure
485
- screen_info.screen = nil
486
- end
487
- end
488
- end
489
-
490
- def self.run(option_parser = nil, options = nil)
491
- Cosmos.catch_fatal_exception do
492
- unless option_parser and options
493
- option_parser, options = create_default_options()
494
- options.title = 'Telemetry Viewer'
495
- options.screen = nil
496
- options.listen = true
497
- options.config_file = nil
498
- options.restore_size = false
499
-
500
- option_parser.separator "Telemetry Viewer Specific Options:"
501
- option_parser.on("-c", "--config FILE", "Use the specified config file") { |arg| options.config_file = arg }
502
- option_parser.on("-s", "--screen FILE", "Start up the specified screen") { |arg| options.screen = arg }
503
- option_parser.on("-n", "--nolisten", "Don't listen for requests") do
504
- options.listen = false
505
- options.title += ' : Not Listening'
506
- end
507
- option_parser.parse!(ARGV)
508
- end
509
-
510
- if options.screen
511
- application = nil
512
- begin
513
- QtTool.redirect_io
514
- System.telemetry
515
- application = Qt::Application.new(ARGV)
516
- application.addLibraryPath(Qt::PLUGIN_PATH) if Kernel.is_windows?
517
- if options.config_file
518
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
519
- else
520
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
521
- end
522
- tlm_viewer_config = load_config(filename)
523
- screen_info = tlm_viewer_config.screen_infos[options.screen.upcase]
524
- raise "Unknown screen: #{options.screen.upcase}" unless screen_info
525
- if not options.auto_position
526
- screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, nil, :REALTIME, options.x, options.y, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute, true)
527
- else
528
- screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, nil, :REALTIME, screen_info.x_pos, screen_info.y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute, true)
529
- end
530
- application.exec
531
- rescue Exception => error
532
- unless error.class == SystemExit or error.class == Interrupt
533
- Cosmos.handle_fatal_exception(error, false)
534
- end
535
- end
536
- else
537
- super(option_parser, options)
538
- end
539
- end
540
- end
541
-
542
- end # class TlmViewer
543
-
544
- 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/tools/tlm_viewer/screen'
15
+ require 'cosmos/gui/qt_tool'
16
+ require 'cosmos/gui/dialogs/splash'
17
+ require 'cosmos/gui/dialogs/progress_dialog'
18
+ require 'cosmos/gui/dialogs/select_dialog'
19
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
20
+ require 'cosmos/tools/tlm_viewer/tlm_viewer_config'
21
+ require 'find'
22
+ end
23
+
24
+ module Cosmos
25
+ Cosmos.disable_warnings do
26
+ module Script
27
+ private
28
+
29
+ def display(display_name, x_pos = nil, y_pos = nil)
30
+ TlmViewer.instance.display(display_name, x_pos, y_pos)
31
+ end
32
+
33
+ def clear(display_name)
34
+ TlmViewer.instance.clear(display_name)
35
+ end
36
+ end
37
+ end
38
+ end # module Cosmos
39
+
40
+ module Cosmos
41
+
42
+ # The Telemetry Viewer Application provides a frameword for user defined
43
+ # 'screens'. Screens can contain telemetry items but also command senders,
44
+ # graphs, and any other user defined widgets. The TlmViewer class itself is
45
+ # responsible for reading the tlm_viewer.txt file and building the list of
46
+ # screens. The actual rendering of the screen is defered to the various
47
+ # widget classes.
48
+ class TlmViewer < QtTool
49
+ @@instance = nil
50
+
51
+ def self.instance
52
+ @@instance
53
+ end
54
+
55
+ def self.load_config(filename)
56
+ # Determine MD5 over main config file and all screens
57
+ tlmviewer_files = [filename, System.initial_filename]
58
+ additional_data = ''
59
+ System.targets.each do |target_name, target|
60
+ tlmviewer_files << target.filename if File.exist?(target.filename)
61
+ screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', target.original_name, 'screens')
62
+ if File.exist?(screen_dir)
63
+ if target.substitute
64
+ additional_data << target.original_name
65
+ additional_data << target.name
66
+ else
67
+ additional_data << target.original_name
68
+ end
69
+ Dir.new(screen_dir).each do |screen_dir_filename|
70
+ if screen_dir_filename[0..0] != '.'
71
+ tlmviewer_files << File.join(screen_dir, screen_dir_filename)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ md5 = Cosmos.md5_files(tlmviewer_files, additional_data)
78
+ md5_string = md5.hexdigest
79
+
80
+ # Build filename for marshal file
81
+ marshal_filename = File.join(System.paths['TMP'], 'tlmviewer_' << md5_string << '.bin')
82
+
83
+ # Attempt to load marshal file
84
+ config = Cosmos.marshal_load(marshal_filename)
85
+ unless config
86
+ # Marshal file load failed - Manually load configuration
87
+ config = TlmViewerConfig.new(filename)
88
+
89
+ # Create marshal file for next time
90
+ Cosmos.marshal_dump(marshal_filename, config)
91
+ end
92
+
93
+ return config
94
+ end
95
+
96
+ def initialize(options)
97
+ # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
98
+ super(options)
99
+ Cosmos.load_cosmos_icon("tlm_viewer.png")
100
+ setMinimumWidth(300)
101
+ @@instance = self
102
+
103
+ # Get Params from Config File
104
+ if options.config_file
105
+ filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
106
+ else
107
+ filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
108
+ end
109
+
110
+ Splash.execute(self, true) do |splash|
111
+ ConfigParser.splash = splash
112
+ splash.message = "Starting TlmViewer"
113
+ System.telemetry
114
+ @tlm_viewer_config = self.class.load_config(filename)
115
+ ConfigParser.splash = nil
116
+ end
117
+
118
+ initialize_actions()
119
+ initialize_menus(options)
120
+ initialize_central_widget(options)
121
+ complete_initialize()
122
+
123
+ Splash.execute(self) do |splash|
124
+ ConfigParser.splash = splash
125
+ splash.message = "Displaying requested screens"
126
+
127
+ # Startup desired screens once we're running
128
+ @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
129
+ if screen_info.show_on_startup
130
+ display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
131
+ end
132
+ end
133
+
134
+ if options.listen
135
+ # Start DRb with access control
136
+ @json_drb = JsonDRb.new
137
+ port = System.ports['TLMVIEWER_API']
138
+ acl = ACL.new(['allow', '127.0.0.1'], ACL::ALLOW_DENY)
139
+ @json_drb.acl = acl
140
+ whitelist = [
141
+ 'display',
142
+ 'clear']
143
+ @json_drb.method_whitelist = whitelist
144
+ begin
145
+ @json_drb.start_service "localhost", port, self
146
+ rescue Exception
147
+ raise FatalError.new("Error starting JsonDRb on port #{port}.\nPerhaps a Telemetry Viewer is already running?")
148
+ end
149
+ else
150
+ @json_drb = nil
151
+ end
152
+
153
+ @all_telemetry = System.telemetry.all_item_strings(false, splash)
154
+
155
+ Qt.execute_in_main_thread(true) do
156
+ @search_box.completion_list = @tlm_viewer_config.completion_list
157
+ @search_box.callback = lambda do |tlm|
158
+ mapping = @tlm_viewer_config.tlm_to_screen_mapping[tlm]
159
+ if mapping
160
+ mapping.each do |screen_name|
161
+ display(screen_name)
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ ConfigParser.splash = nil
168
+ end
169
+ end
170
+
171
+ def initialize_actions
172
+ super()
173
+
174
+ # File actions
175
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save Configuration'), self)
176
+ @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
177
+ @file_save.shortcut = @file_save_keyseq
178
+ @file_save.statusTip = tr('Save all screen positions')
179
+ @file_save.connect(SIGNAL('triggered()')) { file_save() }
180
+
181
+ @file_generate = Qt::Action.new(tr('&Generate Screens'), self)
182
+ @file_generate_keyseq = Qt::KeySequence.new(tr('Ctrl+G'))
183
+ @file_generate.shortcut = @file_generate_keyseq
184
+ @file_generate.statusTip = tr('Generate screen definition files')
185
+ @file_generate.connect(SIGNAL('triggered()')) { file_generate() }
186
+
187
+ @file_audit = Qt::Action.new(tr('Audi&t Screens vs Tlm'), self)
188
+ @file_audit_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
189
+ @file_audit.shortcut = @file_audit_keyseq
190
+ @file_audit.statusTip = tr('Create a report listing which telemetry points are not on screens')
191
+ @file_audit.connect(SIGNAL('triggered()')) { file_audit() }
192
+ end
193
+
194
+ def initialize_menus(options)
195
+ # File Menu
196
+ @file_menu = menuBar.addMenu(tr('&File'))
197
+ @file_menu.addAction(@file_save)
198
+ @file_menu.addAction(@file_generate)
199
+ @file_menu.addAction(@file_audit)
200
+ @file_menu.addSeparator()
201
+ @file_menu.addAction(@exit_action)
202
+
203
+ # Help Menu
204
+ @about_string = "Telemetry Viewer provides a view of every telemetry packet in the system."
205
+ @about_string << " Packets can be viewed in numerous representations ranging from the raw data to formatted with units."
206
+
207
+ initialize_help_menu()
208
+ end
209
+
210
+ def initialize_central_widget(options)
211
+ # Create the central widget
212
+ @central_widget = Qt::Widget.new
213
+ setCentralWidget(@central_widget)
214
+ @top_layout = Qt::VBoxLayout.new
215
+
216
+ # Create Search box
217
+ @search_layout = Qt::HBoxLayout.new
218
+ @search_box = FullTextSearchLineEdit.new(self)
219
+ @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;")
220
+ @search_layout.addWidget(@search_box)
221
+ @top_layout.addLayout(@search_layout)
222
+
223
+ # Create Screen Drop Down Lists
224
+ @selection_pane = Qt::HBoxLayout.new
225
+ @top_layout.addLayout(@selection_pane)
226
+ @column_widgets = []
227
+ @tlm_viewer_config.columns.each_with_index do |target_screen_infos, column_index|
228
+ @column_widgets[column_index] = {}
229
+ if column_index != 0
230
+ # Separator before editor
231
+ @column_widgets[column_index][:sep1] = Qt::Frame.new(@central_widget)
232
+ @column_widgets[column_index][:sep1].setFrameStyle(Qt::Frame::VLine | Qt::Frame::Sunken)
233
+ @selection_pane.addWidget(@column_widgets[column_index][:sep1])
234
+ end
235
+ @column_widgets[column_index][:grid] = Qt::GridLayout.new
236
+ @selection_pane.addLayout(@column_widgets[column_index][:grid])
237
+ row = 0
238
+ @column_widgets[column_index][:rows] = []
239
+ target_screen_infos.each do |target_name, screen_infos|
240
+ @column_widgets[column_index][:rows][row] = {}
241
+
242
+ # Create Label for Category
243
+ @column_widgets[column_index][:rows][row][:label] = Qt::Label.new("#{target_name}:")
244
+ @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:label], row, 0)
245
+
246
+ # Create Drop Down Menu for Category
247
+ @column_widgets[column_index][:rows][row][:screen_select] = Qt::ComboBox.new
248
+ @variants = []
249
+ screen_infos.each do |screen_name, screen_info|
250
+ @variants << Qt::Variant.new(screen_info.full_name)
251
+ @column_widgets[column_index][:rows][row][:screen_select].addItem(screen_info.name, @variants[-1])
252
+ end
253
+ if screen_infos.length >= 20
254
+ @column_widgets[column_index][:rows][row][:screen_select].setMaxVisibleItems(20)
255
+ else
256
+ @column_widgets[column_index][:rows][row][:screen_select].setMaxVisibleItems(screen_infos.length)
257
+ end
258
+ my_row = row
259
+ handler = lambda do
260
+ screen_full_name = @column_widgets[column_index][:rows][my_row][:screen_select].itemData(@column_widgets[column_index][:rows][my_row][:screen_select].currentIndex)
261
+ display(screen_full_name.value)
262
+ end
263
+ @column_widgets[column_index][:rows][row][:screen_select].connect(SIGNAL('activated(int)')) { handler.call }
264
+ @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:screen_select], row, 1)
265
+
266
+ @column_widgets[column_index][:rows][row][:show_screen] = Qt::PushButton.new("Show Screen")
267
+ @column_widgets[column_index][:rows][row][:show_screen].connect(SIGNAL('clicked(bool)')) { handler.call }
268
+ @column_widgets[column_index][:grid].addWidget(@column_widgets[column_index][:rows][row][:show_screen], row, 2)
269
+
270
+ row += 1
271
+ end
272
+ end
273
+
274
+ @central_widget.setLayout(@top_layout)
275
+ end
276
+
277
+ # Handles saving the current configuration to a file
278
+ def file_save
279
+ filename = Qt::FileDialog.getSaveFileName(self, "Save Configuration", @tlm_viewer_config.filename, "Config Files (*.txt);;All Files (*)")
280
+ if filename and not filename.empty?
281
+ # Update config with open screen positions and show on startup
282
+ Screen.open_screens.clone.each do |screen|
283
+ @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
284
+ if screen_full_name == screen.full_name
285
+ begin
286
+ screen_info.x_pos = screen.window.x
287
+ screen_info.y_pos = screen.window.y
288
+ screen_info.show_on_startup = true
289
+ rescue
290
+ # Screen probably already closed - continue
291
+ end
292
+ break
293
+ end
294
+ end
295
+ end
296
+
297
+ filename << '.txt' if File.extname(filename).empty?
298
+ @tlm_viewer_config.save(filename)
299
+ end
300
+ end # def on_file_save_config
301
+
302
+ def generate_target(target_name)
303
+ target = System.targets[target_name]
304
+
305
+ results = ''
306
+ screen_dir = File.join(USERPATH, 'config', 'targets', target.original_name, 'screens')
307
+ Dir.mkdir(screen_dir, 0777) unless File.exist?(screen_dir)
308
+
309
+ System.telemetry.packets(target.name).each do |packet_name, packet|
310
+ filename = File.join(screen_dir, packet_name.downcase + '.txt')
311
+ unless File.exist?(filename)
312
+ results << "Creating #{filename}...\n"
313
+ File.open(filename, 'w') do |file|
314
+ items = packet.sorted_items
315
+ if items.length > 34
316
+ file.puts "SCREEN 250 800 1.0"
317
+ file.puts ""
318
+ file.puts "SCROLLWINDOW"
319
+ else
320
+ file.puts "SCREEN AUTO AUTO 1.0"
321
+ end
322
+ file.puts ""
323
+ file.puts " VERTICALBOX"
324
+ items.each do |item|
325
+ file.puts " LABELVALUE #{target.original_name} #{packet_name} #{item.name} # #{item.description}"
326
+ end
327
+ file.puts " END"
328
+ file.puts ""
329
+ file.puts "END" if items.length > 34
330
+ end
331
+ else
332
+ results << "Skipping #{filename}... already exists\n"
333
+ end
334
+ end
335
+
336
+ return results
337
+ end
338
+
339
+ def file_generate
340
+ target_names = System.telemetry.target_names
341
+ target_names.delete('UNKNOWN')
342
+ target_names.unshift('ALL')
343
+
344
+ dialog = SelectDialog.new(self, 'Target Name:', target_names, 'Select Target Name to Generate Screens')
345
+ target_name = dialog.result
346
+ if target_name
347
+ ProgressDialog.execute(self, 'Generating Telemetry Screens', 500, 10, false, false, true, true, false) do |progress_dialog|
348
+ if target_name == 'ALL'
349
+ System.telemetry.target_names.each do |my_target_name|
350
+ next if my_target_name == 'UNKNOWN'
351
+ progress_dialog.append_text(generate_target(my_target_name))
352
+ end
353
+ else
354
+ progress_dialog.append_text(generate_target(target_name))
355
+ end
356
+ progress_dialog.complete
357
+ end
358
+ end
359
+ end
360
+
361
+ def file_audit
362
+ output_filename = ''
363
+ all_telemetry = @all_telemetry.clone
364
+
365
+ # Open a progress dialog with out a step progress
366
+ @cancel_audit = false
367
+ ProgressDialog.execute(self, 'Audit Progress', 650, 400, true, false) do |progress|
368
+ progress.cancel_callback = lambda {|dialog| @cancel_audit = true; [true, false]}
369
+ progress.enable_cancel_button
370
+ begin
371
+ index = 1
372
+ @tlm_viewer_config.screen_infos.each do |name, info|
373
+ break if @cancel_audit
374
+ progress.append_text("Processing screen #{name}")
375
+ screen_text = File.read(info.filename).upcase
376
+ found = []
377
+ all_telemetry.each do |tlm|
378
+ break if @cancel_audit
379
+ found << tlm if screen_text.include? tlm
380
+ end
381
+ all_telemetry -= found
382
+
383
+ progress.set_overall_progress(index.to_f / @tlm_viewer_config.screen_infos.length.to_f)
384
+ index += 1
385
+ end
386
+
387
+ unless @cancel_audit
388
+ output_filename = File.join(System.paths['LOGS'],
389
+ File.build_timestamped_filename(['screen','audit'], '.txt'))
390
+ File.open(output_filename, 'w') do |file|
391
+ file.puts "Telemetry Viewer audit created on #{Time.now.formatted}.\n"
392
+ if all_telemetry.empty?
393
+ msg = "\nAll telemetry points accounted for in screens."
394
+ progress.append_text(msg)
395
+ file.puts msg
396
+ else
397
+ progress.append_text("\nThere were #{all_telemetry.length} telemetry points not accounted for.")
398
+ file.puts "\nThe following telemetry points were not on any screens:"
399
+ all_telemetry.map {|item| file.puts item }
400
+ end
401
+ end
402
+ end
403
+ rescue => error
404
+ progress.append_text("Error processing:\n#{error.formatted}\n")
405
+ ensure
406
+ progress.append_text("\nWriting audit to #{output_filename}")
407
+ progress.set_overall_progress(1.0)
408
+ progress.complete
409
+ end
410
+ end
411
+ # Open the file as a convenience
412
+ Cosmos.open_in_text_editor(output_filename) if output_filename
413
+ end
414
+
415
+ # Method called by screens to notify that they have been closed
416
+ def notify(closed_screen)
417
+ screen_full_name = closed_screen.full_name
418
+ begin
419
+ screen_info = find_screen_info(screen_full_name)
420
+ screen_info.screen = nil
421
+ rescue
422
+ # Oh well
423
+ end
424
+ end
425
+
426
+ def closeEvent(event)
427
+ # Are you sure if any screens are open
428
+ if Screen.open_screens.length > 0
429
+ result = Qt::MessageBox.warning(self, "Confirm Close",
430
+ "Are you sure? All Open Telemetry Screens will be Closed.",
431
+ Qt::MessageBox::Yes | Qt::MessageBox::No)
432
+ if result != Qt::MessageBox::Yes
433
+ event.ignore()
434
+ else
435
+ # Close any open screens
436
+ script_disconnect()
437
+ Screen.close_all_screens(self)
438
+ shutdown_cmd_tlm()
439
+ @json_drb.stop_service if @json_drb
440
+ super(event)
441
+ end
442
+ else
443
+ shutdown_cmd_tlm()
444
+ @json_drb.stop_service if @json_drb
445
+ super(event)
446
+ end
447
+ end
448
+
449
+ def find_screen_info(screen_full_name)
450
+ screen_info = @tlm_viewer_config.screen_infos[screen_full_name.upcase]
451
+ raise "Unknown screen: #{screen_full_name.upcase}" unless screen_info
452
+ screen_info
453
+ end
454
+
455
+ def display(screen_full_name, x_pos = nil, y_pos = nil)
456
+ return unless screen_full_name
457
+ # Find the specified screen
458
+ screen_info = find_screen_info(screen_full_name)
459
+
460
+ # Raise Screens that are already open
461
+ if screen_info.screen
462
+ success = false
463
+ Qt.execute_in_main_thread(true) do
464
+ begin
465
+ if screen_info.screen.window
466
+ screen_info.screen.window.raise
467
+ screen_info.screen.window.activateWindow
468
+ screen_info.screen.window.showNormal
469
+ success = true
470
+ end
471
+ rescue
472
+ # Screen probably was closed - continue
473
+ screen_info.screen = nil
474
+ end
475
+ end
476
+ return if success
477
+ end
478
+
479
+ # Create screens that are not open yet
480
+ Qt.execute_in_main_thread(true) do
481
+ if x_pos and y_pos
482
+ screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, self, :REALTIME, x_pos, y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute)
483
+ else
484
+ screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, self, :REALTIME, screen_info.x_pos, screen_info.y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute)
485
+ end
486
+ if screen_info.screen.window
487
+ screen_info.screen.window.raise
488
+ screen_info.screen.window.activateWindow
489
+ screen_info.screen.window.showNormal
490
+ end
491
+ end
492
+ end
493
+
494
+ # Close the specified screen
495
+ def clear(screen_full_name)
496
+ # Find the specified screen
497
+ screen_info = find_screen_info(screen_full_name)
498
+
499
+ # Close the screen
500
+ Qt.execute_in_main_thread(true) do
501
+ begin
502
+ screen_info.screen.window.close if screen_info.screen
503
+ ensure
504
+ screen_info.screen = nil
505
+ end
506
+ end
507
+ end
508
+
509
+ def self.run(option_parser = nil, options = nil)
510
+ Cosmos.catch_fatal_exception do
511
+ unless option_parser and options
512
+ option_parser, options = create_default_options()
513
+ options.title = 'Telemetry Viewer'
514
+ options.screen = nil
515
+ options.listen = true
516
+ options.config_file = nil
517
+ options.restore_size = false
518
+
519
+ option_parser.separator "Telemetry Viewer Specific Options:"
520
+ option_parser.on("-c", "--config FILE", "Use the specified config file") { |arg| options.config_file = arg }
521
+ option_parser.on("-s", "--screen FILE", "Start up the specified screen") { |arg| options.screen = arg }
522
+ option_parser.on("-n", "--nolisten", "Don't listen for requests") do
523
+ options.listen = false
524
+ options.title += ' : Not Listening'
525
+ end
526
+ option_parser.parse!(ARGV)
527
+ end
528
+
529
+ if options.screen
530
+ application = nil
531
+ begin
532
+ QtTool.redirect_io
533
+ System.telemetry
534
+ application = Qt::Application.new(ARGV)
535
+ application.addLibraryPath(Qt::PLUGIN_PATH) if Kernel.is_windows?
536
+ if options.config_file
537
+ filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
538
+ else
539
+ filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
540
+ end
541
+ tlm_viewer_config = load_config(filename)
542
+ screen_info = tlm_viewer_config.screen_infos[options.screen.upcase]
543
+ raise "Unknown screen: #{options.screen.upcase}" unless screen_info
544
+ if not options.auto_position
545
+ screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, nil, :REALTIME, options.x, options.y, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute, true)
546
+ else
547
+ screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, nil, :REALTIME, screen_info.x_pos, screen_info.y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute, true)
548
+ end
549
+ application.exec
550
+ rescue Exception => error
551
+ unless error.class == SystemExit or error.class == Interrupt
552
+ Cosmos.handle_fatal_exception(error, false)
553
+ end
554
+ end
555
+ else
556
+ super(option_parser, options)
557
+ end
558
+ end
559
+ end
560
+
561
+ end # class TlmViewer
562
+
563
+ end # module Cosmos