cosmos 3.5.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +24 -24
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,66 +1,66 @@
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/tools/cmd_tlm_server/interface_thread'
12
-
13
- module Cosmos
14
-
15
- # Overrides the packet handling method in InterfaceThread to sends all
16
- # packets to {Commanding#send_command_to_interface}
17
- class RouterThread < InterfaceThread
18
-
19
- protected
20
-
21
- def handle_packet(packet)
22
- # Start out assuming we will route to all associated interfaces
23
- interfaces = @interface.interfaces
24
-
25
- # Identified packets we may handle differently...
26
- if packet.identified?
27
- target = System.targets[packet.target_name.upcase]
28
- if target
29
- if target.interface
30
- # If target exists and has an interface we will only send the packet to that interface
31
- interfaces = [target.interface]
32
- else
33
- # If target exists and has no interface we will not send the packet anywhere
34
- interfaces = []
35
- Logger.warn "Received command for target with no interface: #{packet.target_name} #{packet.packet_name}"
36
- end
37
- end
38
-
39
- # Make sure identified packet exists
40
- begin
41
- System.commands.packet(packet.target_name, packet.packet_name)
42
- rescue
43
- Logger.warn "Received unknown identified command: #{packet.target_name} #{packet.packet_name}"
44
-
45
- # Clear identification
46
- packet.target_name = nil
47
- packet.packet_name = nil
48
- end
49
- end
50
-
51
- interfaces.each do |interface|
52
- if interface.connected?
53
- begin
54
- CmdTlmServer.commanding.send_command_to_interface(interface, packet)
55
- rescue Exception => err
56
- Logger.error "Error routing command from #{@interface.name} to interface #{interface.name}\n#{err.formatted}"
57
- end
58
- else
59
- Logger.error "Attempted to route command from #{@interface.name} to disconnected interface #{interface.name}"
60
- end
61
- end
62
- end
63
-
64
- end # class RouterThread
65
-
66
- 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/tools/cmd_tlm_server/interface_thread'
12
+
13
+ module Cosmos
14
+
15
+ # Overrides the packet handling method in InterfaceThread to sends all
16
+ # packets to {Commanding#send_command_to_interface}
17
+ class RouterThread < InterfaceThread
18
+
19
+ protected
20
+
21
+ def handle_packet(packet)
22
+ # Start out assuming we will route to all associated interfaces
23
+ interfaces = @interface.interfaces
24
+
25
+ # Identified packets we may handle differently...
26
+ if packet.identified?
27
+ target = System.targets[packet.target_name.upcase]
28
+ if target
29
+ if target.interface
30
+ # If target exists and has an interface we will only send the packet to that interface
31
+ interfaces = [target.interface]
32
+ else
33
+ # If target exists and has no interface we will not send the packet anywhere
34
+ interfaces = []
35
+ Logger.warn "Received command for target with no interface: #{packet.target_name} #{packet.packet_name}"
36
+ end
37
+ end
38
+
39
+ # Make sure identified packet exists
40
+ begin
41
+ System.commands.packet(packet.target_name, packet.packet_name)
42
+ rescue
43
+ Logger.warn "Received unknown identified command: #{packet.target_name} #{packet.packet_name}"
44
+
45
+ # Clear identification
46
+ packet.target_name = nil
47
+ packet.packet_name = nil
48
+ end
49
+ end
50
+
51
+ interfaces.each do |interface|
52
+ if interface.connected?
53
+ begin
54
+ CmdTlmServer.commanding.send_command_to_interface(interface, packet)
55
+ rescue Exception => err
56
+ Logger.error "Error routing command from #{@interface.name} to interface #{interface.name}\n#{err.formatted}"
57
+ end
58
+ else
59
+ Logger.error "Attempted to route command from #{@interface.name} to disconnected interface #{interface.name}"
60
+ end
61
+ end
62
+ end
63
+
64
+ end # class RouterThread
65
+
66
+ end # module Cosmos
@@ -1,97 +1,97 @@
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/tools/cmd_tlm_server/connections'
12
- require 'cosmos/tools/cmd_tlm_server/router_thread'
13
- require 'cosmos/interfaces/tcpip_server_interface'
14
-
15
- module Cosmos
16
-
17
- # Controls the routers as defined in the Command/Telemetry configuration
18
- # file. Routers are just interfaces which receive command packets from their
19
- # remote connection and send them out to their interfaces. They receive
20
- # telemetry packets from their interfaces and send them to their remote
21
- # connections. This allows them to be intermediaries between an external
22
- # client and the actual device.
23
- class Routers < Connections
24
- # @param cmd_tlm_server_config [CmdTlmServerConfig] The configuration which
25
- # defines all the routers
26
- def initialize(cmd_tlm_server_config)
27
- super(:ROUTERS, cmd_tlm_server_config)
28
- end
29
-
30
- # Adds a Preidentified router to the system with given name and port.
31
- # All interfaces defined by the Command/Telemetry configuration are
32
- # directed to this router for both commands and telemetry.
33
- #
34
- # @param router_name [String] Name of the router
35
- # @param port [Integer] Port to pass to the {TcpipServerInterface}
36
- def add_preidentified(router_name, port)
37
- router_name = router_name.upcase
38
- router = TcpipServerInterface.new(port, port, 10.0, nil, 'PREIDENTIFIED')
39
- router.name = router_name
40
- router.disable_disconnect = true
41
- @config.routers[router_name] = router
42
- @config.interfaces.each do |interface_name, interface|
43
- router.interfaces << interface
44
- interface.routers << router
45
- end
46
- end
47
-
48
- # Recreate a router with new initialization parameters
49
- #
50
- # @param router_name [String] Name of the router
51
- # @param params [Array] Array of parameters to pass to the router
52
- # constructor
53
- def recreate(router_name, *params)
54
- router = @config.routers[router_name.upcase]
55
- raise "Unknown router: #{router_name}" unless router
56
-
57
- # Build New Router
58
- new_router = router.class.new(*params)
59
- router.copy_to(new_router)
60
-
61
- # Remove old router and add new to each interface
62
- router.interfaces.each do |interface|
63
- interface.routers.delete(router)
64
- interface.routers << new_router
65
- end
66
-
67
- # Replace interface in @interfaces array
68
- @config.routers[router_name.upcase] = new_router
69
-
70
- # Make sure there is no thread
71
- stop_thread(router)
72
-
73
- return new_router
74
- end
75
-
76
- protected
77
-
78
- # Start an router's packet reading thread
79
- def start_thread(router)
80
- Logger.info "Creating thread for router #{router.name}"
81
- router_thread = RouterThread.new(router)
82
- router_thread.start
83
- end
84
-
85
- # Stop an router's packet reading thread
86
- def stop_thread(router)
87
- if router.thread
88
- Logger.info "Killing thread for router #{router.name}"
89
- to_stop = router.thread
90
- router.thread = nil
91
- to_stop.stop
92
- end
93
- end
94
-
95
- end # class Routers
96
-
97
- 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/tools/cmd_tlm_server/connections'
12
+ require 'cosmos/tools/cmd_tlm_server/router_thread'
13
+ require 'cosmos/interfaces/tcpip_server_interface'
14
+
15
+ module Cosmos
16
+
17
+ # Controls the routers as defined in the Command/Telemetry configuration
18
+ # file. Routers are just interfaces which receive command packets from their
19
+ # remote connection and send them out to their interfaces. They receive
20
+ # telemetry packets from their interfaces and send them to their remote
21
+ # connections. This allows them to be intermediaries between an external
22
+ # client and the actual device.
23
+ class Routers < Connections
24
+ # @param cmd_tlm_server_config [CmdTlmServerConfig] The configuration which
25
+ # defines all the routers
26
+ def initialize(cmd_tlm_server_config)
27
+ super(:ROUTERS, cmd_tlm_server_config)
28
+ end
29
+
30
+ # Adds a Preidentified router to the system with given name and port.
31
+ # All interfaces defined by the Command/Telemetry configuration are
32
+ # directed to this router for both commands and telemetry.
33
+ #
34
+ # @param router_name [String] Name of the router
35
+ # @param port [Integer] Port to pass to the {TcpipServerInterface}
36
+ def add_preidentified(router_name, port)
37
+ router_name = router_name.upcase
38
+ router = TcpipServerInterface.new(port, port, 10.0, nil, 'PREIDENTIFIED')
39
+ router.name = router_name
40
+ router.disable_disconnect = true
41
+ @config.routers[router_name] = router
42
+ @config.interfaces.each do |interface_name, interface|
43
+ router.interfaces << interface
44
+ interface.routers << router
45
+ end
46
+ end
47
+
48
+ # Recreate a router with new initialization parameters
49
+ #
50
+ # @param router_name [String] Name of the router
51
+ # @param params [Array] Array of parameters to pass to the router
52
+ # constructor
53
+ def recreate(router_name, *params)
54
+ router = @config.routers[router_name.upcase]
55
+ raise "Unknown router: #{router_name}" unless router
56
+
57
+ # Build New Router
58
+ new_router = router.class.new(*params)
59
+ router.copy_to(new_router)
60
+
61
+ # Remove old router and add new to each interface
62
+ router.interfaces.each do |interface|
63
+ interface.routers.delete(router)
64
+ interface.routers << new_router
65
+ end
66
+
67
+ # Replace interface in @interfaces array
68
+ @config.routers[router_name.upcase] = new_router
69
+
70
+ # Make sure there is no thread
71
+ stop_thread(router)
72
+
73
+ return new_router
74
+ end
75
+
76
+ protected
77
+
78
+ # Start an router's packet reading thread
79
+ def start_thread(router)
80
+ Logger.info "Creating thread for router #{router.name}"
81
+ router_thread = RouterThread.new(router)
82
+ router_thread.start
83
+ end
84
+
85
+ # Stop an router's packet reading thread
86
+ def stop_thread(router)
87
+ if router.thread
88
+ Logger.info "Killing thread for router #{router.name}"
89
+ to_stop = router.thread
90
+ router.thread = nil
91
+ to_stop.stop
92
+ end
93
+ end
94
+
95
+ end # class Routers
96
+
97
+ end # module Cosmos
@@ -1,621 +1,621 @@
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/config/config_parser'
15
- require 'cosmos/gui/qt_tool'
16
- require 'cosmos/gui/dialogs/splash'
17
- require 'cosmos/gui/dialogs/progress_dialog'
18
- require 'cosmos/gui/dialogs/exception_dialog'
19
- require 'cosmos/gui/dialogs/packet_log_dialog'
20
- require 'cosmos/gui/dialogs/find_replace_dialog'
21
- require 'cosmos/gui/widgets/realtime_button_bar'
22
- require 'cosmos/tools/data_viewer/data_viewer_component'
23
- require 'cosmos/tools/data_viewer/dump_component'
24
- end
25
-
26
- module Cosmos
27
-
28
- class DataViewer < QtTool
29
- slots 'context_menu(const QPoint&)'
30
- slots 'handle_tab_change(int)'
31
-
32
- def initialize(options)
33
- super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
34
- Cosmos.load_cosmos_icon("data_viewer.png")
35
-
36
- initialize_actions()
37
- initialize_menus()
38
- initialize_central_widget()
39
- complete_initialize()
40
-
41
- # Initialize instance variables
42
- @auto_start = false
43
- @pause = false
44
- @log_file_directory = System.paths['LOGS']
45
- @tlm_log_system = nil
46
- @subscription_thread = nil
47
- @subscription_id = nil
48
- @packet_log_reader = System.default_packet_log_reader.new
49
- @time_start = nil
50
- @time_end = nil
51
- @log_filenames = []
52
- @cancel_thread = false
53
- @sleeper = Sleeper.new
54
-
55
- # Process config file and create a tab for each data viewer component
56
- @component_mutex = Mutex.new
57
- @components = []
58
- @packets = []
59
- @packet_to_components_mapping = {}
60
- @config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', 'data_viewer', options.config_file)
61
- process_config()
62
-
63
- # Load System Definition and Event Data
64
- Splash.execute(self) do |splash|
65
- Qt.execute_in_main_thread(true) do
66
- ConfigParser.splash = splash
67
- System.telemetry
68
- @components.each do |component|
69
- # Create tab for each component
70
- component.initialize_gui
71
- @tab_book.addTab(component, component.tab_name)
72
- end
73
- if @auto_start
74
- handle_start()
75
- end
76
- ConfigParser.splash = nil
77
- end
78
- end
79
-
80
- # Add GUI Update Timeout
81
- @timer = Qt::Timer.new(self)
82
- @timer.connect(SIGNAL('timeout()')) { update_gui() }
83
- @timer.method_missing(:start, 100)
84
- end
85
-
86
- def initialize_actions
87
- super()
88
-
89
- # File Menu Actions
90
- @open_log = Qt::Action.new(tr('&Open Log File'), self)
91
- @open_log_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
92
- @open_log.shortcut = @open_log_keyseq
93
- @open_log.statusTip = tr('Open telemetry log file for processing')
94
- @open_log.connect(SIGNAL('triggered()')) { handle_open_log_file() }
95
-
96
- @handle_reset = Qt::Action.new(tr('&Reset'), self)
97
- @handle_reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
98
- @handle_reset.shortcut = @handle_reset_keyseq
99
- @handle_reset.statusTip = tr('Reset Components')
100
- @handle_reset.connect(SIGNAL('triggered()')) { handle_reset() }
101
-
102
- # Search Actions
103
- @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
104
- @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
105
- @search_find.shortcut = @search_find_keyseq
106
- @search_find.statusTip = tr('Find text')
107
- @search_find.connect(SIGNAL('triggered()')) { find() }
108
-
109
- @search_find_next = Qt::Action.new(tr('Find &Next'), self)
110
- @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
111
- @search_find_next.shortcut = @search_find_next_keyseq
112
- @search_find_next.statusTip = tr('Find next instance')
113
- @search_find_next.connect(SIGNAL('triggered()')) { find_next() }
114
-
115
- @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
116
- @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
117
- @search_find_previous.shortcut = @search_find_previous_keyseq
118
- @search_find_previous.statusTip = tr('Find previous instance')
119
- @search_find_previous.connect(SIGNAL('triggered()')) { find_previous() }
120
-
121
- # Tab Menu Actions
122
- @delete_tab = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
123
- @delete_tab.statusTip = tr('Delete active tab')
124
- @delete_tab.connect(SIGNAL('triggered()')) { on_tab_delete() }
125
- end
126
-
127
- def initialize_menus
128
- # File Menu
129
- file_menu = menuBar.addMenu(tr('&File'))
130
- file_menu.addAction(@open_log)
131
- file_menu.addAction(@handle_reset)
132
- file_menu.addSeparator()
133
- file_menu.addAction(@exit_action)
134
-
135
- # Tab Menu
136
- @tab_menu = menuBar.addMenu(tr('&Tab'))
137
- @tab_menu.addAction(@delete_tab)
138
- @tab_menu.addSeparator()
139
- @tab_menu_actions = []
140
-
141
- # Search Menu
142
- view_menu = menuBar.addMenu(tr('&Search'))
143
- view_menu.addAction(@search_find)
144
- view_menu.addAction(@search_find_next)
145
- view_menu.addAction(@search_find_previous)
146
-
147
- # Help Menu
148
- @about_string = "Data Viewer is designed to allow users view data that is not easily displayed on telemetry screens."
149
- initialize_help_menu()
150
- end
151
-
152
- def initialize_central_widget
153
- # Create the central widget
154
- @central_widget = Qt::Widget.new
155
- setCentralWidget(@central_widget)
156
-
157
- # Create the top level vertical layout
158
- @top_layout = Qt::VBoxLayout.new(@central_widget)
159
-
160
- # Realtime Button Bar
161
- @realtime_button_bar = RealtimeButtonBar.new(self)
162
- @realtime_button_bar.start_callback = method(:handle_start)
163
- @realtime_button_bar.pause_callback = method(:handle_pause)
164
- @realtime_button_bar.stop_callback = method(:handle_stop)
165
- @realtime_button_bar.state = 'Stopped'
166
- @top_layout.addWidget(@realtime_button_bar)
167
-
168
- # Create tab book
169
- @tab_book = Qt::TabWidget.new
170
- @tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
171
- connect(@tab_book, SIGNAL('currentChanged(int)'), self, SLOT('handle_tab_change(int)'))
172
- connect(@tab_book, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
173
- @top_layout.addWidget(@tab_book)
174
- end
175
-
176
- def current_component
177
- @component_mutex.synchronize do
178
- yield @components[@tab_book.currentIndex()]
179
- end
180
- end
181
-
182
- def find
183
- current_component do |component|
184
- FindReplaceDialog.show_find(component.text)
185
- end
186
- end
187
-
188
- def find_next
189
- current_component do |component|
190
- FindReplaceDialog.find_next(component.text)
191
- end
192
- end
193
-
194
- def find_previous
195
- current_component do |component|
196
- FindReplaceDialog.find_previous(component.text)
197
- end
198
- end
199
-
200
- def handle_tab_change(index)
201
- # Remove existing actions
202
- @tab_menu_actions.each do |action|
203
- @tab_menu.removeAction(action)
204
- action.dispose
205
- end
206
- @tab_menu_actions = []
207
-
208
- # Add new actions
209
- unless @components.empty?
210
- @component_mutex.synchronize do
211
- component = @components[index]
212
- component.packets.each do |target_name, packet_name|
213
- action = Qt::Action.new("#{target_name} #{packet_name}", @tab_menu)
214
- action.setCheckable(true)
215
- key = target_name + ' ' + packet_name
216
- components = @packet_to_components_mapping[key]
217
- if components.include?(component)
218
- action.setChecked(true)
219
- else
220
- action.setChecked(false)
221
- end
222
- action.connect(SIGNAL('triggered()')) { enable_disable_component_packet(index, target_name, packet_name, action.checked?) }
223
- @tab_menu.addAction(action)
224
- @tab_menu_actions << action
225
- end
226
- end
227
- end
228
- end
229
-
230
- def context_menu(point)
231
- index = 0
232
- (0..@tab_book.tabBar.count).each do |i|
233
- index = i if @tab_book.tabBar.tabRect(i).contains(point)
234
- end
235
-
236
- return if (index == @tab_book.tabBar.count)
237
-
238
- # Bring the right clicked tab to the front
239
- @tab_book.setCurrentIndex(index)
240
- @tab_menu.exec(@tab_book.mapToGlobal(point))
241
- end
242
-
243
- def start_subscription_thread
244
- unless @subscription_thread
245
- # Start Thread to Gather Events
246
- @subscription_thread = Thread.new do
247
- @cancel_thread = false
248
- @sleeper = Sleeper.new
249
- if !@packets.empty?
250
- begin
251
- while true
252
- break if @cancel_thread
253
- begin
254
- @subscription_id = subscribe_packet_data(@packets, 10000)
255
- break if @cancel_thread
256
- if @pause
257
- Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Paused' }
258
- else
259
- Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
260
- end
261
- Qt.execute_in_main_thread(true) { statusBar.showMessage("Connected to Command and Telemetry Server: #{Time.now.formatted}") }
262
- rescue DRb::DRbConnError
263
- break if @cancel_thread
264
- Qt.execute_in_main_thread(true) do
265
- @realtime_button_bar.state = 'Connecting'
266
- statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
267
- end
268
- break if @sleeper.sleep(1)
269
- break if @cancel_thread
270
- retry
271
- end
272
-
273
- while true
274
- break if @cancel_thread
275
- begin
276
- # Get a subscribed to packet
277
- packet_data, target_name, packet_name, received_time, received_count = get_packet_data(@subscription_id)
278
-
279
- # Put packet data into its packet
280
- packet = System.telemetry.packet(target_name, packet_name)
281
- packet.buffer = packet_data
282
- packet.received_time = received_time
283
- packet.received_count = received_count
284
-
285
- # Route packet to its component(s)
286
- index = packet.target_name + ' ' + packet.packet_name
287
- @component_mutex.synchronize do
288
- components = @packet_to_components_mapping[index]
289
- if components
290
- components.each do |component|
291
- component.process_packet(packet)
292
- end
293
- end
294
- end
295
- rescue DRb::DRbConnError
296
- break if @cancel_thread
297
- Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server")) }
298
- break # Let outer loop resubscribe
299
- rescue RuntimeError => error
300
- raise error unless error.message =~ /queue/
301
- break if @cancel_thread
302
- Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Connection Dropped by Command and Telemetry Server: #{Time.now.formatted}")) }
303
- break # Let outer loop resubscribe
304
- end
305
- end
306
- end
307
- rescue Exception => error
308
- break if @cancel_thread
309
- Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Data Viewer : Subscription Thread")}
310
- end
311
- end # if !@packets.empty
312
- end
313
- else
314
- Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
315
- end
316
- end
317
-
318
- def kill_subscription_thread
319
- Cosmos.kill_thread(self, @subscription_thread)
320
- @subscription_thread = nil
321
- end
322
-
323
- def graceful_kill
324
- @cancel_thread = true
325
- @sleeper.cancel
326
- script_disconnect() # This will break out of get_packet_data
327
- Qt::CoreApplication.processEvents
328
- end
329
-
330
- def handle_reset
331
- @component_mutex.synchronize do
332
- @components.each do |component|
333
- component.reset
334
- end
335
- end
336
- System.telemetry.reset
337
- end
338
-
339
- def handle_start
340
- if windowTitle() != 'Data Viewer'
341
- # Clear Title
342
- setWindowTitle('Data Viewer')
343
-
344
- # Return to default configuration
345
- # Show splash during possible reconfiguration
346
- Splash.execute(self) do |splash|
347
- ConfigParser.splash = splash
348
- System.load_configuration
349
- ConfigParser.splash = nil
350
- end
351
-
352
- # Reset Components
353
- handle_reset()
354
- end
355
-
356
- # Restart GUI Updates if necessary
357
- if @pause
358
- @pause = false
359
- @timer.method_missing(:start, 100)
360
- end
361
-
362
- # Restart Subscription Thread if necessary
363
- start_subscription_thread()
364
- end
365
-
366
- def handle_pause
367
- @pause = true
368
- if @subscription_thread
369
- @realtime_button_bar.state = 'Paused'
370
- end
371
- end
372
-
373
- def handle_stop
374
- # Shutdown packet subscription thread
375
- kill_subscription_thread()
376
-
377
- # Unsubscribe from subscription
378
- if @subscription_id
379
- begin
380
- unsubscribe_packet_data(@subscription_id)
381
- rescue DRb::DRbConnError
382
- # Do Nothing
383
- end
384
- end
385
-
386
- # Restart GUI Updates if necessary
387
- if @pause
388
- @pause = false
389
- @timer.method_missing(:start, 100)
390
- end
391
-
392
- @realtime_button_bar.state = 'Stopped'
393
- end
394
-
395
- def handle_open_log_file
396
- # Prompt user for filename
397
- packet_log_dialog = PacketLogDialog.new(self, 'Open Log File(s):', @log_file_directory, @packet_log_reader, [], nil, false, true, true, Cosmos::TLM_FILE_PATTERN)
398
- begin
399
- packet_log_dialog.time_start = @time_start
400
- packet_log_dialog.time_end = @time_end
401
- case packet_log_dialog.exec
402
- when Qt::Dialog::Accepted
403
- @packet_log_reader = packet_log_dialog.packet_log_reader
404
- @log_filenames = packet_log_dialog.filenames.sort
405
- @time_start = packet_log_dialog.time_start
406
- @time_end = packet_log_dialog.time_end
407
- @log_file_directory = File.dirname(@log_filenames[0])
408
- @log_file_directory << '/' unless @log_file_directory[-1..-1] == '\\'
409
-
410
- # Stop realtime collection
411
- handle_stop()
412
-
413
- # Reset components
414
- handle_reset()
415
-
416
- @cancel_progress = false
417
- ProgressDialog.execute(self, 'Processing Log File', 500, 200, @log_filenames.length > 1, true, true, true, true) do |dialog|
418
- dialog.cancel_callback = method(:cancel_callback)
419
- dialog.enable_cancel_button
420
-
421
- @log_filenames.each_with_index do |filename, file_index|
422
- break if @cancel_progress
423
- Qt.execute_in_main_thread(true) do
424
- self.setWindowTitle("Data Viewer : #{filename}")
425
- end
426
-
427
- file_size = File.size(filename).to_f
428
- dialog.append_text("Processing: #{filename}")
429
-
430
- Cosmos.check_log_configuration(@packet_log_reader, filename)
431
- @packet_log_reader.each(filename, true, @time_start, @time_end) do |packet|
432
- break if @cancel_progress
433
- progress = @packet_log_reader.bytes_read.to_f / file_size
434
- dialog.set_step_progress(progress)
435
-
436
- # Route packet to its component(s)
437
- index = packet.target_name + ' ' + packet.packet_name
438
- components = @packet_to_components_mapping[index]
439
- if components
440
- @component_mutex.synchronize do
441
- components.each do |component|
442
- component.process_packet(packet)
443
- end
444
- end
445
- end
446
- end
447
-
448
- dialog.set_overall_progress((file_index + 1).to_f / @log_filenames.length) if @log_filenames.length > 1
449
- end
450
-
451
- dialog.append_text("Done!")
452
- dialog.set_step_progress(1.0)
453
- dialog.set_overall_progress(1.0) if @log_filenames.length > 1
454
- dialog.complete
455
- end
456
- end
457
- ensure
458
- packet_log_dialog.dispose if packet_log_dialog
459
- end
460
- end
461
-
462
- def cancel_callback(progress_dialog = nil)
463
- @cancel_progress = true
464
- return true, false
465
- end
466
-
467
- def update_gui
468
- if @pause
469
- @timer.method_missing(:stop)
470
- else
471
- Qt.execute_in_main_thread(true) do
472
- @component_mutex.synchronize do
473
- @components.each do |component|
474
- break if @pause
475
- component.update_gui
476
- end
477
- end
478
- end
479
- end
480
- end
481
-
482
- def closeEvent(event)
483
- # Stop GUI update timeout
484
- @pause = true
485
-
486
- # Stop Processing Packets
487
- handle_stop()
488
-
489
- # Shutdown each component
490
- @component_mutex.synchronize do
491
- @components.each {|component| component.shutdown}
492
- end
493
-
494
- # Give things time to complete
495
- sleep(0.1)
496
-
497
- # Standard COSMOS Shutdown
498
- shutdown_cmd_tlm()
499
-
500
- # Accept closure
501
- super(event)
502
- end
503
-
504
- def process_config
505
- # ensure the file exists
506
- unless test ?f, @config_filename
507
- raise "Configuration File Does not Exist: #{@config_filename}"
508
- end
509
-
510
- parser = ConfigParser.new
511
- parser.parse_file(@config_filename) do |keyword, params|
512
- case keyword
513
-
514
- when 'AUTO_START'
515
- usage = "#{keyword}"
516
- parser.verify_num_parameters(0, 0, usage)
517
- @auto_start = true
518
-
519
- when 'COMPONENT'
520
- usage = "#{keyword} <tab name> <component class filename> <component specific options...>"
521
- parser.verify_num_parameters(2, nil, usage)
522
- component_class = Cosmos.require_class(params[1])
523
- if params.length >= 3
524
- @components << component_class.new(self, params[0], *params[2..-1])
525
- else
526
- @components << component_class.new(self, params[0])
527
- end
528
-
529
- when 'PACKET'
530
- usage = "#{keyword} <target_name> <packet_name>"
531
- parser.verify_num_parameters(2, 2, usage)
532
- target_name = params[0].upcase
533
- packet_name = params[1].upcase
534
- @packets << [target_name, packet_name]
535
- @components[-1].add_packet(target_name, packet_name)
536
- index = target_name + ' ' + packet_name
537
- @packet_to_components_mapping[index] ||= []
538
- @packet_to_components_mapping[index] << @components[-1]
539
-
540
- # Unknown keyword
541
- else
542
- raise "Unhandled keyword: #{keyword}" if keyword
543
- end
544
- end
545
- end
546
-
547
- def delete_component(index)
548
- @component_mutex.synchronize do
549
- # Get the component to be deleted
550
- component = @components[index]
551
-
552
- # Delete from the components array
553
- @components.delete_at(index)
554
-
555
- # Delete from mapping
556
- @packet_to_components_mapping.each do |key, components|
557
- components.delete(component)
558
- end
559
- end
560
- end
561
-
562
- def enable_disable_component_packet(index, target_name, packet_name, enabled)
563
- @component_mutex.synchronize do
564
- # Get the component to be deleted
565
- component = @components[index]
566
-
567
- key = target_name + ' ' + packet_name
568
- if enabled
569
- # Add to mapping
570
- components = @packet_to_components_mapping[key]
571
- components << component unless components.include?(component)
572
- else
573
- # Delete from mapping
574
- components = @packet_to_components_mapping[key]
575
- components.delete(component)
576
- end
577
- end
578
- end
579
-
580
- # Handles deleting the current tab
581
- def on_tab_delete
582
- if @tab_book.currentIndex() and @tab_book.currentIndex() >= 0
583
- case Qt::MessageBox.warning(self, 'Warning!', "Are you sure you want to delete the active tab?", Qt::MessageBox::Yes | Qt::MessageBox::No, Qt::MessageBox::No)
584
- when Qt::MessageBox::Yes
585
- # Remove component
586
- tab_index = @tab_book.currentIndex()
587
- delete_component(tab_index)
588
- @tab_book.removeTab(tab_index)
589
-
590
- statusBar.showMessage(tr("Tab Deleted"))
591
- end
592
- else
593
- Qt::MessageBox.information(self, 'Info', "No tabs exist")
594
- end
595
- end # def on_tab_delete
596
-
597
- #############################
598
- # Class methods
599
- #############################
600
-
601
- def self.run(option_parser = nil, options = nil)
602
- Cosmos.catch_fatal_exception do
603
- unless option_parser and options
604
- option_parser, options = create_default_options()
605
- options.width = 550
606
- options.height = 500
607
- options.title = "Data Viewer"
608
- options.config_file = 'data_viewer.txt'
609
- option_parser.separator "Data Viewer Specific Options:"
610
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
611
- options.config_file = arg
612
- end
613
- end
614
-
615
- super(option_parser, options)
616
- end
617
- end
618
-
619
- end # class DataViewer
620
-
621
- 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/config/config_parser'
15
+ require 'cosmos/gui/qt_tool'
16
+ require 'cosmos/gui/dialogs/splash'
17
+ require 'cosmos/gui/dialogs/progress_dialog'
18
+ require 'cosmos/gui/dialogs/exception_dialog'
19
+ require 'cosmos/gui/dialogs/packet_log_dialog'
20
+ require 'cosmos/gui/dialogs/find_replace_dialog'
21
+ require 'cosmos/gui/widgets/realtime_button_bar'
22
+ require 'cosmos/tools/data_viewer/data_viewer_component'
23
+ require 'cosmos/tools/data_viewer/dump_component'
24
+ end
25
+
26
+ module Cosmos
27
+
28
+ class DataViewer < QtTool
29
+ slots 'context_menu(const QPoint&)'
30
+ slots 'handle_tab_change(int)'
31
+
32
+ def initialize(options)
33
+ super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
34
+ Cosmos.load_cosmos_icon("data_viewer.png")
35
+
36
+ initialize_actions()
37
+ initialize_menus()
38
+ initialize_central_widget()
39
+ complete_initialize()
40
+
41
+ # Initialize instance variables
42
+ @auto_start = false
43
+ @pause = false
44
+ @log_file_directory = System.paths['LOGS']
45
+ @tlm_log_system = nil
46
+ @subscription_thread = nil
47
+ @subscription_id = nil
48
+ @packet_log_reader = System.default_packet_log_reader.new
49
+ @time_start = nil
50
+ @time_end = nil
51
+ @log_filenames = []
52
+ @cancel_thread = false
53
+ @sleeper = Sleeper.new
54
+
55
+ # Process config file and create a tab for each data viewer component
56
+ @component_mutex = Mutex.new
57
+ @components = []
58
+ @packets = []
59
+ @packet_to_components_mapping = {}
60
+ @config_filename = File.join(Cosmos::USERPATH, 'config', 'tools', 'data_viewer', options.config_file)
61
+ process_config()
62
+
63
+ # Load System Definition and Event Data
64
+ Splash.execute(self) do |splash|
65
+ Qt.execute_in_main_thread(true) do
66
+ ConfigParser.splash = splash
67
+ System.telemetry
68
+ @components.each do |component|
69
+ # Create tab for each component
70
+ component.initialize_gui
71
+ @tab_book.addTab(component, component.tab_name)
72
+ end
73
+ if @auto_start
74
+ handle_start()
75
+ end
76
+ ConfigParser.splash = nil
77
+ end
78
+ end
79
+
80
+ # Add GUI Update Timeout
81
+ @timer = Qt::Timer.new(self)
82
+ @timer.connect(SIGNAL('timeout()')) { update_gui() }
83
+ @timer.method_missing(:start, 100)
84
+ end
85
+
86
+ def initialize_actions
87
+ super()
88
+
89
+ # File Menu Actions
90
+ @open_log = Qt::Action.new(tr('&Open Log File'), self)
91
+ @open_log_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
92
+ @open_log.shortcut = @open_log_keyseq
93
+ @open_log.statusTip = tr('Open telemetry log file for processing')
94
+ @open_log.connect(SIGNAL('triggered()')) { handle_open_log_file() }
95
+
96
+ @handle_reset = Qt::Action.new(tr('&Reset'), self)
97
+ @handle_reset_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
98
+ @handle_reset.shortcut = @handle_reset_keyseq
99
+ @handle_reset.statusTip = tr('Reset Components')
100
+ @handle_reset.connect(SIGNAL('triggered()')) { handle_reset() }
101
+
102
+ # Search Actions
103
+ @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
104
+ @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
105
+ @search_find.shortcut = @search_find_keyseq
106
+ @search_find.statusTip = tr('Find text')
107
+ @search_find.connect(SIGNAL('triggered()')) { find() }
108
+
109
+ @search_find_next = Qt::Action.new(tr('Find &Next'), self)
110
+ @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
111
+ @search_find_next.shortcut = @search_find_next_keyseq
112
+ @search_find_next.statusTip = tr('Find next instance')
113
+ @search_find_next.connect(SIGNAL('triggered()')) { find_next() }
114
+
115
+ @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
116
+ @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
117
+ @search_find_previous.shortcut = @search_find_previous_keyseq
118
+ @search_find_previous.statusTip = tr('Find previous instance')
119
+ @search_find_previous.connect(SIGNAL('triggered()')) { find_previous() }
120
+
121
+ # Tab Menu Actions
122
+ @delete_tab = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
123
+ @delete_tab.statusTip = tr('Delete active tab')
124
+ @delete_tab.connect(SIGNAL('triggered()')) { on_tab_delete() }
125
+ end
126
+
127
+ def initialize_menus
128
+ # File Menu
129
+ file_menu = menuBar.addMenu(tr('&File'))
130
+ file_menu.addAction(@open_log)
131
+ file_menu.addAction(@handle_reset)
132
+ file_menu.addSeparator()
133
+ file_menu.addAction(@exit_action)
134
+
135
+ # Tab Menu
136
+ @tab_menu = menuBar.addMenu(tr('&Tab'))
137
+ @tab_menu.addAction(@delete_tab)
138
+ @tab_menu.addSeparator()
139
+ @tab_menu_actions = []
140
+
141
+ # Search Menu
142
+ view_menu = menuBar.addMenu(tr('&Search'))
143
+ view_menu.addAction(@search_find)
144
+ view_menu.addAction(@search_find_next)
145
+ view_menu.addAction(@search_find_previous)
146
+
147
+ # Help Menu
148
+ @about_string = "Data Viewer is designed to allow users view data that is not easily displayed on telemetry screens."
149
+ initialize_help_menu()
150
+ end
151
+
152
+ def initialize_central_widget
153
+ # Create the central widget
154
+ @central_widget = Qt::Widget.new
155
+ setCentralWidget(@central_widget)
156
+
157
+ # Create the top level vertical layout
158
+ @top_layout = Qt::VBoxLayout.new(@central_widget)
159
+
160
+ # Realtime Button Bar
161
+ @realtime_button_bar = RealtimeButtonBar.new(self)
162
+ @realtime_button_bar.start_callback = method(:handle_start)
163
+ @realtime_button_bar.pause_callback = method(:handle_pause)
164
+ @realtime_button_bar.stop_callback = method(:handle_stop)
165
+ @realtime_button_bar.state = 'Stopped'
166
+ @top_layout.addWidget(@realtime_button_bar)
167
+
168
+ # Create tab book
169
+ @tab_book = Qt::TabWidget.new
170
+ @tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
171
+ connect(@tab_book, SIGNAL('currentChanged(int)'), self, SLOT('handle_tab_change(int)'))
172
+ connect(@tab_book, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
173
+ @top_layout.addWidget(@tab_book)
174
+ end
175
+
176
+ def current_component
177
+ @component_mutex.synchronize do
178
+ yield @components[@tab_book.currentIndex()]
179
+ end
180
+ end
181
+
182
+ def find
183
+ current_component do |component|
184
+ FindReplaceDialog.show_find(component.text)
185
+ end
186
+ end
187
+
188
+ def find_next
189
+ current_component do |component|
190
+ FindReplaceDialog.find_next(component.text)
191
+ end
192
+ end
193
+
194
+ def find_previous
195
+ current_component do |component|
196
+ FindReplaceDialog.find_previous(component.text)
197
+ end
198
+ end
199
+
200
+ def handle_tab_change(index)
201
+ # Remove existing actions
202
+ @tab_menu_actions.each do |action|
203
+ @tab_menu.removeAction(action)
204
+ action.dispose
205
+ end
206
+ @tab_menu_actions = []
207
+
208
+ # Add new actions
209
+ unless @components.empty?
210
+ @component_mutex.synchronize do
211
+ component = @components[index]
212
+ component.packets.each do |target_name, packet_name|
213
+ action = Qt::Action.new("#{target_name} #{packet_name}", @tab_menu)
214
+ action.setCheckable(true)
215
+ key = target_name + ' ' + packet_name
216
+ components = @packet_to_components_mapping[key]
217
+ if components.include?(component)
218
+ action.setChecked(true)
219
+ else
220
+ action.setChecked(false)
221
+ end
222
+ action.connect(SIGNAL('triggered()')) { enable_disable_component_packet(index, target_name, packet_name, action.checked?) }
223
+ @tab_menu.addAction(action)
224
+ @tab_menu_actions << action
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ def context_menu(point)
231
+ index = 0
232
+ (0..@tab_book.tabBar.count).each do |i|
233
+ index = i if @tab_book.tabBar.tabRect(i).contains(point)
234
+ end
235
+
236
+ return if (index == @tab_book.tabBar.count)
237
+
238
+ # Bring the right clicked tab to the front
239
+ @tab_book.setCurrentIndex(index)
240
+ @tab_menu.exec(@tab_book.mapToGlobal(point))
241
+ end
242
+
243
+ def start_subscription_thread
244
+ unless @subscription_thread
245
+ # Start Thread to Gather Events
246
+ @subscription_thread = Thread.new do
247
+ @cancel_thread = false
248
+ @sleeper = Sleeper.new
249
+ if !@packets.empty?
250
+ begin
251
+ while true
252
+ break if @cancel_thread
253
+ begin
254
+ @subscription_id = subscribe_packet_data(@packets, 10000)
255
+ break if @cancel_thread
256
+ if @pause
257
+ Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Paused' }
258
+ else
259
+ Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
260
+ end
261
+ Qt.execute_in_main_thread(true) { statusBar.showMessage("Connected to Command and Telemetry Server: #{Time.now.formatted}") }
262
+ rescue DRb::DRbConnError
263
+ break if @cancel_thread
264
+ Qt.execute_in_main_thread(true) do
265
+ @realtime_button_bar.state = 'Connecting'
266
+ statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
267
+ end
268
+ break if @sleeper.sleep(1)
269
+ break if @cancel_thread
270
+ retry
271
+ end
272
+
273
+ while true
274
+ break if @cancel_thread
275
+ begin
276
+ # Get a subscribed to packet
277
+ packet_data, target_name, packet_name, received_time, received_count = get_packet_data(@subscription_id)
278
+
279
+ # Put packet data into its packet
280
+ packet = System.telemetry.packet(target_name, packet_name)
281
+ packet.buffer = packet_data
282
+ packet.received_time = received_time
283
+ packet.received_count = received_count
284
+
285
+ # Route packet to its component(s)
286
+ index = packet.target_name + ' ' + packet.packet_name
287
+ @component_mutex.synchronize do
288
+ components = @packet_to_components_mapping[index]
289
+ if components
290
+ components.each do |component|
291
+ component.process_packet(packet)
292
+ end
293
+ end
294
+ end
295
+ rescue DRb::DRbConnError
296
+ break if @cancel_thread
297
+ Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server")) }
298
+ break # Let outer loop resubscribe
299
+ rescue RuntimeError => error
300
+ raise error unless error.message =~ /queue/
301
+ break if @cancel_thread
302
+ Qt.execute_in_main_thread(true) { statusBar.showMessage(tr("Connection Dropped by Command and Telemetry Server: #{Time.now.formatted}")) }
303
+ break # Let outer loop resubscribe
304
+ end
305
+ end
306
+ end
307
+ rescue Exception => error
308
+ break if @cancel_thread
309
+ Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Data Viewer : Subscription Thread")}
310
+ end
311
+ end # if !@packets.empty
312
+ end
313
+ else
314
+ Qt.execute_in_main_thread(true) { @realtime_button_bar.state = 'Running' }
315
+ end
316
+ end
317
+
318
+ def kill_subscription_thread
319
+ Cosmos.kill_thread(self, @subscription_thread)
320
+ @subscription_thread = nil
321
+ end
322
+
323
+ def graceful_kill
324
+ @cancel_thread = true
325
+ @sleeper.cancel
326
+ script_disconnect() # This will break out of get_packet_data
327
+ Qt::CoreApplication.processEvents
328
+ end
329
+
330
+ def handle_reset
331
+ @component_mutex.synchronize do
332
+ @components.each do |component|
333
+ component.reset
334
+ end
335
+ end
336
+ System.telemetry.reset
337
+ end
338
+
339
+ def handle_start
340
+ if windowTitle() != 'Data Viewer'
341
+ # Clear Title
342
+ setWindowTitle('Data Viewer')
343
+
344
+ # Return to default configuration
345
+ # Show splash during possible reconfiguration
346
+ Splash.execute(self) do |splash|
347
+ ConfigParser.splash = splash
348
+ System.load_configuration
349
+ ConfigParser.splash = nil
350
+ end
351
+
352
+ # Reset Components
353
+ handle_reset()
354
+ end
355
+
356
+ # Restart GUI Updates if necessary
357
+ if @pause
358
+ @pause = false
359
+ @timer.method_missing(:start, 100)
360
+ end
361
+
362
+ # Restart Subscription Thread if necessary
363
+ start_subscription_thread()
364
+ end
365
+
366
+ def handle_pause
367
+ @pause = true
368
+ if @subscription_thread
369
+ @realtime_button_bar.state = 'Paused'
370
+ end
371
+ end
372
+
373
+ def handle_stop
374
+ # Shutdown packet subscription thread
375
+ kill_subscription_thread()
376
+
377
+ # Unsubscribe from subscription
378
+ if @subscription_id
379
+ begin
380
+ unsubscribe_packet_data(@subscription_id)
381
+ rescue DRb::DRbConnError
382
+ # Do Nothing
383
+ end
384
+ end
385
+
386
+ # Restart GUI Updates if necessary
387
+ if @pause
388
+ @pause = false
389
+ @timer.method_missing(:start, 100)
390
+ end
391
+
392
+ @realtime_button_bar.state = 'Stopped'
393
+ end
394
+
395
+ def handle_open_log_file
396
+ # Prompt user for filename
397
+ packet_log_dialog = PacketLogDialog.new(self, 'Open Log File(s):', @log_file_directory, @packet_log_reader, [], nil, false, true, true, Cosmos::TLM_FILE_PATTERN)
398
+ begin
399
+ packet_log_dialog.time_start = @time_start
400
+ packet_log_dialog.time_end = @time_end
401
+ case packet_log_dialog.exec
402
+ when Qt::Dialog::Accepted
403
+ @packet_log_reader = packet_log_dialog.packet_log_reader
404
+ @log_filenames = packet_log_dialog.filenames.sort
405
+ @time_start = packet_log_dialog.time_start
406
+ @time_end = packet_log_dialog.time_end
407
+ @log_file_directory = File.dirname(@log_filenames[0])
408
+ @log_file_directory << '/' unless @log_file_directory[-1..-1] == '\\'
409
+
410
+ # Stop realtime collection
411
+ handle_stop()
412
+
413
+ # Reset components
414
+ handle_reset()
415
+
416
+ @cancel_progress = false
417
+ ProgressDialog.execute(self, 'Processing Log File', 500, 200, @log_filenames.length > 1, true, true, true, true) do |dialog|
418
+ dialog.cancel_callback = method(:cancel_callback)
419
+ dialog.enable_cancel_button
420
+
421
+ @log_filenames.each_with_index do |filename, file_index|
422
+ break if @cancel_progress
423
+ Qt.execute_in_main_thread(true) do
424
+ self.setWindowTitle("Data Viewer : #{filename}")
425
+ end
426
+
427
+ file_size = File.size(filename).to_f
428
+ dialog.append_text("Processing: #{filename}")
429
+
430
+ Cosmos.check_log_configuration(@packet_log_reader, filename)
431
+ @packet_log_reader.each(filename, true, @time_start, @time_end) do |packet|
432
+ break if @cancel_progress
433
+ progress = @packet_log_reader.bytes_read.to_f / file_size
434
+ dialog.set_step_progress(progress)
435
+
436
+ # Route packet to its component(s)
437
+ index = packet.target_name + ' ' + packet.packet_name
438
+ components = @packet_to_components_mapping[index]
439
+ if components
440
+ @component_mutex.synchronize do
441
+ components.each do |component|
442
+ component.process_packet(packet)
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ dialog.set_overall_progress((file_index + 1).to_f / @log_filenames.length) if @log_filenames.length > 1
449
+ end
450
+
451
+ dialog.append_text("Done!")
452
+ dialog.set_step_progress(1.0)
453
+ dialog.set_overall_progress(1.0) if @log_filenames.length > 1
454
+ dialog.complete
455
+ end
456
+ end
457
+ ensure
458
+ packet_log_dialog.dispose if packet_log_dialog
459
+ end
460
+ end
461
+
462
+ def cancel_callback(progress_dialog = nil)
463
+ @cancel_progress = true
464
+ return true, false
465
+ end
466
+
467
+ def update_gui
468
+ if @pause
469
+ @timer.method_missing(:stop)
470
+ else
471
+ Qt.execute_in_main_thread(true) do
472
+ @component_mutex.synchronize do
473
+ @components.each do |component|
474
+ break if @pause
475
+ component.update_gui
476
+ end
477
+ end
478
+ end
479
+ end
480
+ end
481
+
482
+ def closeEvent(event)
483
+ # Stop GUI update timeout
484
+ @pause = true
485
+
486
+ # Stop Processing Packets
487
+ handle_stop()
488
+
489
+ # Shutdown each component
490
+ @component_mutex.synchronize do
491
+ @components.each {|component| component.shutdown}
492
+ end
493
+
494
+ # Give things time to complete
495
+ sleep(0.1)
496
+
497
+ # Standard COSMOS Shutdown
498
+ shutdown_cmd_tlm()
499
+
500
+ # Accept closure
501
+ super(event)
502
+ end
503
+
504
+ def process_config
505
+ # ensure the file exists
506
+ unless test ?f, @config_filename
507
+ raise "Configuration File Does not Exist: #{@config_filename}"
508
+ end
509
+
510
+ parser = ConfigParser.new
511
+ parser.parse_file(@config_filename) do |keyword, params|
512
+ case keyword
513
+
514
+ when 'AUTO_START'
515
+ usage = "#{keyword}"
516
+ parser.verify_num_parameters(0, 0, usage)
517
+ @auto_start = true
518
+
519
+ when 'COMPONENT'
520
+ usage = "#{keyword} <tab name> <component class filename> <component specific options...>"
521
+ parser.verify_num_parameters(2, nil, usage)
522
+ component_class = Cosmos.require_class(params[1])
523
+ if params.length >= 3
524
+ @components << component_class.new(self, params[0], *params[2..-1])
525
+ else
526
+ @components << component_class.new(self, params[0])
527
+ end
528
+
529
+ when 'PACKET'
530
+ usage = "#{keyword} <target_name> <packet_name>"
531
+ parser.verify_num_parameters(2, 2, usage)
532
+ target_name = params[0].upcase
533
+ packet_name = params[1].upcase
534
+ @packets << [target_name, packet_name]
535
+ @components[-1].add_packet(target_name, packet_name)
536
+ index = target_name + ' ' + packet_name
537
+ @packet_to_components_mapping[index] ||= []
538
+ @packet_to_components_mapping[index] << @components[-1]
539
+
540
+ # Unknown keyword
541
+ else
542
+ raise "Unhandled keyword: #{keyword}" if keyword
543
+ end
544
+ end
545
+ end
546
+
547
+ def delete_component(index)
548
+ @component_mutex.synchronize do
549
+ # Get the component to be deleted
550
+ component = @components[index]
551
+
552
+ # Delete from the components array
553
+ @components.delete_at(index)
554
+
555
+ # Delete from mapping
556
+ @packet_to_components_mapping.each do |key, components|
557
+ components.delete(component)
558
+ end
559
+ end
560
+ end
561
+
562
+ def enable_disable_component_packet(index, target_name, packet_name, enabled)
563
+ @component_mutex.synchronize do
564
+ # Get the component to be deleted
565
+ component = @components[index]
566
+
567
+ key = target_name + ' ' + packet_name
568
+ if enabled
569
+ # Add to mapping
570
+ components = @packet_to_components_mapping[key]
571
+ components << component unless components.include?(component)
572
+ else
573
+ # Delete from mapping
574
+ components = @packet_to_components_mapping[key]
575
+ components.delete(component)
576
+ end
577
+ end
578
+ end
579
+
580
+ # Handles deleting the current tab
581
+ def on_tab_delete
582
+ if @tab_book.currentIndex() and @tab_book.currentIndex() >= 0
583
+ case Qt::MessageBox.warning(self, 'Warning!', "Are you sure you want to delete the active tab?", Qt::MessageBox::Yes | Qt::MessageBox::No, Qt::MessageBox::No)
584
+ when Qt::MessageBox::Yes
585
+ # Remove component
586
+ tab_index = @tab_book.currentIndex()
587
+ delete_component(tab_index)
588
+ @tab_book.removeTab(tab_index)
589
+
590
+ statusBar.showMessage(tr("Tab Deleted"))
591
+ end
592
+ else
593
+ Qt::MessageBox.information(self, 'Info', "No tabs exist")
594
+ end
595
+ end # def on_tab_delete
596
+
597
+ #############################
598
+ # Class methods
599
+ #############################
600
+
601
+ def self.run(option_parser = nil, options = nil)
602
+ Cosmos.catch_fatal_exception do
603
+ unless option_parser and options
604
+ option_parser, options = create_default_options()
605
+ options.width = 550
606
+ options.height = 500
607
+ options.title = "Data Viewer"
608
+ options.config_file = 'data_viewer.txt'
609
+ option_parser.separator "Data Viewer Specific Options:"
610
+ option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
611
+ options.config_file = arg
612
+ end
613
+ end
614
+
615
+ super(option_parser, options)
616
+ end
617
+ end
618
+
619
+ end # class DataViewer
620
+
621
+ end # module Cosmos