cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,488 +1,495 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos'
12
- Cosmos.catch_fatal_exception do
13
- require 'cosmos/gui/qt_tool'
14
- require 'cosmos/gui/dialogs/splash'
15
- require 'cosmos/gui/dialogs/progress_dialog'
16
- require 'cosmos/tools/replay/replay_server'
17
- require 'cosmos/gui/choosers/string_chooser'
18
- end
19
-
20
- module Cosmos
21
-
22
- class Replay < QtTool
23
- # The number of bytes to print when an UNKNOWN packet is received
24
- UNKNOWN_BYTES_TO_PRINT = 36
25
-
26
- def initialize(options)
27
- # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
28
- super(options)
29
- Cosmos.load_cosmos_icon("replay.png")
30
-
31
- initialize_actions()
32
- initialize_menus()
33
- initialize_central_widget()
34
- complete_initialize()
35
-
36
- @ready = false
37
- Splash.execute(self) do |splash|
38
- ConfigParser.splash = splash
39
- splash.message = "Initializing Replay Server"
40
-
41
- # Start the thread that will process server messages and add them to the output text
42
- process_server_messages(options)
43
-
44
- ReplayServer.new(options.config_file, false, false, false)
45
- @ready = true
46
-
47
- ConfigParser.splash = nil
48
- end
49
-
50
- # Initialize variables
51
- @packet_log_reader = System.default_packet_log_reader.new
52
- @log_directory = System.paths['LOGS']
53
- @log_directory += '/' unless @log_directory[-1..-1] == '\\' or @log_directory[-1..-1] == '/'
54
- @log_filename = nil
55
- @playing = false
56
- @playback_thread = nil
57
- @playback_index = 0
58
- @packet_offsets = []
59
- end
60
-
61
- def initialize_menus
62
- # File Menu
63
- @file_menu = menuBar.addMenu(tr('&File'))
64
- @file_menu.addAction(@exit_action)
65
-
66
- # Help Menu
67
- @about_string = "Telemetry Viewer provides a view of every telemetry packet in the system."
68
- @about_string << " Packets can be viewed in numerous represenations ranging from the raw data to formatted with units."
69
-
70
- initialize_help_menu()
71
- end
72
-
73
- def initialize_central_widget
74
- # Create the central widget
75
- @central_widget = Qt::Widget.new
76
- setCentralWidget(@central_widget)
77
-
78
- @top_layout = Qt::VBoxLayout.new
79
-
80
- @log_widget = Qt::Widget.new
81
- @log_widget.setSizePolicy(Qt::SizePolicy::MinimumExpanding, Qt::SizePolicy::MinimumExpanding)
82
- @log_layout = Qt::VBoxLayout.new()
83
-
84
- # This widget goes inside the top layout so we want 0 contents margins
85
- @log_layout.setContentsMargins(0,0,0,0)
86
- @log_widget.setLayout(@log_layout)
87
-
88
- # Create the log file GUI
89
- @log_file_selection = Qt::GroupBox.new("Log File Selection")
90
- @log_select = Qt::HBoxLayout.new(@log_file_selection)
91
- @log_name = Qt::LineEdit.new
92
- @log_name.setReadOnly(true)
93
- @log_select.addWidget(@log_name)
94
- @log_open = Qt::PushButton.new("Browse...")
95
- @log_select.addWidget(@log_open)
96
- @log_layout.addWidget(@log_file_selection)
97
-
98
- @log_open.connect(SIGNAL('clicked()')) { select_log_file() }
99
-
100
- # Create the operation buttons GUI
101
- @op = Qt::GroupBox.new(tr("Playback Control"))
102
- @op_layout = Qt::VBoxLayout.new(@op)
103
- @op_button_layout = Qt::HBoxLayout.new
104
- @move_start = Qt::PushButton.new(Cosmos.get_icon('skip_to_start-26.png'), '')
105
- @move_start.connect(SIGNAL('clicked()')) { move_start() }
106
- @op_button_layout.addWidget(@move_start)
107
- @step_back = Qt::PushButton.new(Cosmos.get_icon('rewind-26.png'), '')
108
- @step_back_timer = Qt::Timer.new
109
- @step_back_timeout = 100
110
- @step_back_timer.connect(SIGNAL('timeout()')) { step_back(); @step_back_timeout = (@step_back_timeout / 2).to_i; @step_back_timer.start(@step_back_timeout) }
111
- @step_back.connect(SIGNAL('pressed()')) { step_back(); @step_back_timeout = 300; @step_back_timer.start(@step_back_timeout) }
112
- @step_back.connect(SIGNAL('released()')) { @step_back_timer.stop }
113
- @op_button_layout.addWidget(@step_back)
114
- @reverse_play = Qt::PushButton.new(Cosmos.get_icon('reverse-play-26.png'), '')
115
- @reverse_play.connect(SIGNAL('clicked()')) { reverse_play() }
116
- @op_button_layout.addWidget(@reverse_play)
117
- @stop = Qt::PushButton.new(Cosmos.get_icon('stop-26.png'), '')
118
- @stop.connect(SIGNAL('clicked()')) { stop() }
119
- @op_button_layout.addWidget(@stop)
120
- @play = Qt::PushButton.new(Cosmos.get_icon('play-26.png'), '')
121
- @play.connect(SIGNAL('clicked()')) { play() }
122
- @op_button_layout.addWidget(@play)
123
- @step_forward = Qt::PushButton.new(Cosmos.get_icon('fast_forward-26.png'), '')
124
- @step_forward_timer = Qt::Timer.new
125
- @step_forward_timeout = 100
126
- @step_forward_timer.connect(SIGNAL('timeout()')) { step_forward(); @step_forward_timeout = (@step_forward_timeout / 2).to_i; @step_forward_timer.start(@step_forward_timeout) }
127
- @step_forward.connect(SIGNAL('pressed()')) { step_forward(); @step_forward_timeout = 300; @step_forward_timer.start(@step_forward_timeout) }
128
- @step_forward.connect(SIGNAL('released()')) { @step_forward_timer.stop }
129
- @op_button_layout.addWidget(@step_forward)
130
- @move_end = Qt::PushButton.new(Cosmos.get_icon('end-26.png'), '')
131
- @move_end.connect(SIGNAL('clicked()')) { move_end() }
132
- @op_button_layout.addWidget(@move_end)
133
- @op_layout.addLayout(@op_button_layout)
134
-
135
- # Speed Selection
136
- @playback_delay = nil
137
- @speed_select = Qt::ComboBox.new
138
- @variants = []
139
- @variants << Qt::Variant.new(nil)
140
- @speed_select.addItem("No Delay", @variants[-1])
141
- @variants << Qt::Variant.new(0.001)
142
- @speed_select.addItem("1ms Delay", @variants[-1])
143
- @variants << Qt::Variant.new(0.002)
144
- @speed_select.addItem("2ms Delay", @variants[-1])
145
- @variants << Qt::Variant.new(0.005)
146
- @speed_select.addItem("5ms Delay", @variants[-1])
147
- @variants << Qt::Variant.new(0.01)
148
- @speed_select.addItem("10ms Delay", @variants[-1])
149
- @variants << Qt::Variant.new(0.05)
150
- @speed_select.addItem("50ms Delay", @variants[-1])
151
- @variants << Qt::Variant.new(0.125)
152
- @speed_select.addItem("125ms Delay", @variants[-1])
153
- @variants << Qt::Variant.new(0.25)
154
- @speed_select.addItem("250ms Delay", @variants[-1])
155
- @variants << Qt::Variant.new(0.5)
156
- @speed_select.addItem("500ms Delay", @variants[-1])
157
- @variants << Qt::Variant.new(1.0)
158
- @speed_select.addItem("1s Delay", @variants[-1])
159
- @variants << Qt::Variant.new(-1.0)
160
- @speed_select.addItem("Realtime", @variants[-1])
161
- @speed_select.setMaxVisibleItems(11)
162
- @speed_select.connect(SIGNAL('currentIndexChanged(int)')) do
163
- @playback_delay = @speed_select.itemData(@speed_select.currentIndex).value
164
- end
165
- @speed_layout = Qt::FormLayout.new()
166
- @speed_layout.addRow("&Delay:", @speed_select)
167
- @status = Qt::LineEdit.new
168
- @status.setReadOnly(true)
169
- @status.setText('Stopped')
170
- @speed_layout.addRow("&Status:", @status)
171
- @op_layout.addLayout(@speed_layout)
172
- @log_layout.addWidget(@op)
173
-
174
- @file_pos = Qt::GroupBox.new(tr("File Position"))
175
- @file_pos_layout = Qt::VBoxLayout.new(@file_pos)
176
- @slider = Qt::Slider.new(Qt::Horizontal)
177
- @slider.setRange(0, 10000)
178
- @slider.setTickInterval(1000)
179
- @slider.setTickPosition(Qt::Slider::TicksBothSides)
180
- @slider.setTracking(false)
181
- @slider.connect(SIGNAL('sliderReleased()')) { slider_released() }
182
- @time_layout = Qt::HBoxLayout.new()
183
- @start_time = StringChooser.new(self, 'Start:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
184
- @end_time = StringChooser.new(self, 'End:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
185
- @current_time = StringChooser.new(self, 'Current:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
186
- @time_layout.addWidget(@start_time)
187
- @time_layout.addWidget(@current_time)
188
- @time_layout.addWidget(@end_time)
189
- @file_pos_layout.addLayout(@time_layout)
190
- @file_pos_layout.addWidget(@slider)
191
- @log_layout.addWidget(@file_pos)
192
- @top_layout.addWidget(@log_widget)
193
-
194
- # Add the message output
195
- @output = Qt::PlainTextEdit.new
196
- @output.setReadOnly(true)
197
- @output.setMaximumBlockCount(10000) # 10000 lines of history will be displayed
198
-
199
- @top_layout.addWidget(@output, 500)
200
-
201
- # Override stdout to the message window
202
- # All code attempting to print into the GUI must use $stdout rather than STDOUT
203
- @string_output = StringIO.new("", "r+")
204
- $stdout = @string_output
205
- Logger.level = Logger::INFO
206
-
207
- @central_widget.setLayout(@top_layout)
208
- end
209
-
210
- def select_log_file
211
- unless @playback_thread
212
- selection = Qt::FileDialog.getOpenFileName(
213
- self, "Select Log File", @log_directory, Cosmos::TLM_FILE_PATTERN)
214
- if selection
215
- stop()
216
- @log_directory = File.dirname(selection)
217
- @log_name.text = selection
218
- @log_filename = selection
219
-
220
- System.telemetry.reset
221
-
222
- ProgressDialog.execute(self, 'Analyzing Log File', 500, 10, true, false, true, false, true) do |progress_dialog|
223
- progress_dialog.append_text("Processing File: #{selection}\n")
224
- progress_dialog.set_overall_progress(0.0)
225
- progress_dialog.enable_cancel_button
226
- @packet_offsets = @packet_log_reader.packet_offsets(selection, lambda {|percentage| progress_dialog.set_overall_progress(percentage)})
227
- @playback_index = 0
228
- update_slider_and_current_time(nil)
229
- @packet_log_reader.open(selection)
230
- progress_dialog.close_done
231
- end
232
-
233
- if ProgressDialog.canceled?
234
- @packet_log_reader.close
235
- @log_name.text = ''
236
- @log_filename = nil
237
- @packet_offsets = []
238
- @playback_index = 0
239
- @start_time.value = ''
240
- @current_time.value = ''
241
- @end_time.value = ''
242
- else
243
- move_end()
244
- move_start()
245
- end
246
- end
247
- end
248
- end
249
-
250
- def move_start
251
- if @log_filename and !@playback_thread
252
- packet = read_at_index(0, :FORWARD)
253
- @start_time.value = packet.received_time.formatted if packet and packet.received_time
254
- else
255
- stop()
256
- end
257
- end
258
-
259
- def step_back
260
- if @log_filename and !@playback_thread
261
- @playback_index = @packet_offsets.length - 2 if @playback_index >= @packet_offsets.length
262
- read_at_index(@playback_index, :BACKWARD)
263
- else
264
- stop()
265
- end
266
- end
267
-
268
- def reverse_play
269
- if @log_filename and !@playback_thread
270
- @playback_index = @packet_offsets.length - 2 if @playback_index >= @packet_offsets.length
271
- start_playback(:BACKWARD)
272
- else
273
- stop()
274
- end
275
- end
276
-
277
- def stop
278
- @playing = false
279
- end
280
-
281
- def play
282
- if @log_filename and !@playback_thread
283
- @playback_index = 1 if @playback_index < 0
284
- start_playback(:FORWARD)
285
- else
286
- stop()
287
- end
288
- end
289
-
290
- def step_forward
291
- if @log_filename and !@playback_thread
292
- @playback_index = 1 if @playback_index < 0
293
- read_at_index(@playback_index, :FORWARD)
294
- else
295
- stop()
296
- end
297
- end
298
-
299
- def move_end
300
- if @log_filename and !@playback_thread
301
- packet = read_at_index(@packet_offsets.length - 1, :FORWARD)
302
- @end_time.value = packet.received_time.formatted if packet and packet.received_time
303
- else
304
- stop()
305
- end
306
- end
307
-
308
- def slider_released
309
- if @log_filename and !@playback_thread
310
- read_at_index(((@slider.sliderPosition / 10000.0) * (@packet_offsets.length - 1)).to_i, :FORWARD)
311
- end
312
- end
313
-
314
- def start_playback(direction)
315
- @playback_thread = Thread.new do
316
- error = nil
317
- begin
318
- @playing = true
319
- Qt.execute_in_main_thread(true) do
320
- @status.setText('Playing')
321
- end
322
- previous_packet = nil
323
- while (@playing)
324
- if @playback_delay
325
- packet_start = Time.now
326
- packet = read_at_index(@playback_index, direction)
327
- break unless packet
328
- delay_time = 0.0
329
- if @playback_delay > 0.0
330
- delay_time = @playback_delay - (Time.now - packet_start)
331
- elsif previous_packet and packet.received_time and previous_packet.received_time
332
- if direction == :FORWARD
333
- delay_time = packet.received_time - previous_packet.received_time - (Time.now - packet_start)
334
- else
335
- delay_time = previous_packet.received_time - packet.received_time - (Time.now - packet_start)
336
- end
337
- end
338
- sleep(delay_time) if delay_time > 0.0
339
- previous_packet = packet
340
- else
341
- packet = read_at_index(@playback_index, direction)
342
- break unless packet
343
- end
344
- end
345
- rescue Exception => error
346
- Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Playback Thread")}
347
- ensure
348
- Qt.execute_in_main_thread(true) do
349
- @status.setText('Stopped')
350
- end
351
- @playing = false
352
- @playback_thread = nil
353
- end
354
- end
355
- end
356
-
357
- def read_at_index(index, direction)
358
- packet_offset = nil
359
- packet_offset = @packet_offsets[index] if index >= 0
360
- if packet_offset
361
- # Read the packet
362
- packet = @packet_log_reader.read_at_offset(packet_offset, false)
363
- handle_packet(packet)
364
-
365
- # Adjust index for next read
366
- if direction == :FORWARD
367
- @playback_index = index + 1
368
- else
369
- @playback_index = index - 1
370
- end
371
- update_slider_and_current_time(packet)
372
-
373
- return packet
374
- else
375
- return nil
376
- end
377
- end
378
-
379
- def update_slider_and_current_time(packet)
380
- Qt.execute_in_main_thread(false) do
381
- value = (((@playback_index - 1) / @packet_offsets.length.to_f) * 10000).to_i
382
- @slider.setSliderPosition(value)
383
- @slider.setValue(value)
384
- @current_time.value = packet.received_time.formatted if packet and packet.received_time
385
- end
386
- end
387
-
388
- def handle_packet(packet)
389
- interface = nil
390
-
391
- # Identify and update packet
392
- if packet.identified?
393
- # Preidentifed packet - place it into the current value table
394
- identified_packet = System.telemetry.update!(packet.target_name,
395
- packet.packet_name,
396
- packet.buffer)
397
- else
398
- # Packet needs to be identified
399
- identified_packet = System.telemetry.identify!(packet.buffer)
400
- end
401
-
402
- if identified_packet and packet.target_name != 'UNKNOWN'
403
- identified_packet.received_time = packet.received_time
404
- packet = identified_packet
405
- target = System.targets[packet.target_name.upcase]
406
- interface = target.interface if target
407
- else
408
- unknown_packet = System.telemetry.update!('UNKNOWN', 'UNKNOWN', packet.buffer)
409
- unknown_packet.received_time = packet.received_time
410
- packet = unknown_packet
411
- data_length = packet.length
412
- string = "Unknown #{data_length} byte packet starting: "
413
- num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
414
- data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
415
- data_to_print.each_byte do |byte|
416
- string << sprintf("%02X", byte)
417
- end
418
- time_string = ''
419
- time_string = packet.received_time.formatted << ' ' if packet.received_time
420
- puts "#{time_string}ERROR: #{string}"
421
- end
422
-
423
- target = System.targets[packet.target_name]
424
- target.tlm_cnt += 1 if target
425
- packet.received_count += 1
426
- packet.check_limits(System.limits_set)
427
- ReplayServer.instance.post_packet(packet)
428
-
429
- # Write to routers
430
- if interface
431
- interface.routers.each do |router|
432
- begin
433
- router.write(packet) if router.write_allowed? and router.connected?
434
- rescue => err
435
- Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
436
- end
437
- end
438
- end
439
- end
440
-
441
- def process_server_messages(options)
442
- # Start thread to read server messages
443
- @output_thread = Thread.new do
444
- begin
445
- while !@ready
446
- sleep(1)
447
- end
448
- while true
449
- if @string_output.string[-1..-1] == "\n"
450
- Qt.execute_in_main_thread(true) do
451
- string = @string_output.string.clone
452
- @string_output.string = @string_output.string[string.length..-1]
453
- string.each_line {|out_line| @output.add_formatted_text(out_line) }
454
- @output.flush
455
- end
456
- end
457
- sleep(1)
458
- end
459
- rescue Exception => error
460
- Qt.execute_in_main_thread(true) do
461
- ExceptionDialog.new(self, error, "#{options.title}: Messages Thread")
462
- end
463
- end
464
- end
465
- end
466
-
467
- def self.run(option_parser = nil, options = nil)
468
- Cosmos.catch_fatal_exception do
469
- unless option_parser and options
470
- option_parser, options = create_default_options()
471
- options.title = 'Replay'
472
- options.width = 800
473
- options.height = 500
474
- options.auto_size = false
475
- options.config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
476
- option_parser.separator "Replay Specific Options:"
477
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
478
- options.config_file = arg
479
- end
480
- end
481
-
482
- super(option_parser, options)
483
- end
484
- end
485
-
486
- end # class TlmViewer
487
-
488
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/gui/qt_tool'
14
+ require 'cosmos/gui/dialogs/splash'
15
+ require 'cosmos/gui/dialogs/progress_dialog'
16
+ require 'cosmos/tools/replay/replay_server'
17
+ require 'cosmos/gui/choosers/string_chooser'
18
+ end
19
+
20
+ module Cosmos
21
+
22
+ class Replay < QtTool
23
+ # The number of bytes to print when an UNKNOWN packet is received
24
+ UNKNOWN_BYTES_TO_PRINT = 36
25
+
26
+ def initialize(options)
27
+ # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
28
+ super(options)
29
+ Cosmos.load_cosmos_icon("replay.png")
30
+
31
+ initialize_actions()
32
+ initialize_menus()
33
+ initialize_central_widget()
34
+ complete_initialize()
35
+
36
+ @ready = false
37
+ Splash.execute(self) do |splash|
38
+ ConfigParser.splash = splash
39
+ splash.message = "Initializing Replay Server"
40
+
41
+ # Start the thread that will process server messages and add them to the output text
42
+ process_server_messages(options)
43
+
44
+ ReplayServer.new(options.config_file, false, false, false)
45
+ @ready = true
46
+
47
+ ConfigParser.splash = nil
48
+ end
49
+
50
+ # Initialize variables
51
+ @packet_log_reader = System.default_packet_log_reader.new
52
+ @log_directory = System.paths['LOGS']
53
+ @log_directory += '/' unless @log_directory[-1..-1] == '\\' or @log_directory[-1..-1] == '/'
54
+ @log_filename = nil
55
+ @playing = false
56
+ @playback_thread = nil
57
+ @playback_index = 0
58
+ @packet_offsets = []
59
+ end
60
+
61
+ def initialize_menus
62
+ # File Menu
63
+ @file_menu = menuBar.addMenu(tr('&File'))
64
+ @file_menu.addAction(@exit_action)
65
+
66
+ # Help Menu
67
+ @about_string = "Telemetry Viewer provides a view of every telemetry packet in the system."
68
+ @about_string << " Packets can be viewed in numerous represenations ranging from the raw data to formatted with units."
69
+
70
+ initialize_help_menu()
71
+ end
72
+
73
+ def initialize_central_widget
74
+ # Create the central widget
75
+ @central_widget = Qt::Widget.new
76
+ setCentralWidget(@central_widget)
77
+
78
+ @top_layout = Qt::VBoxLayout.new
79
+
80
+ @log_widget = Qt::Widget.new
81
+ @log_widget.setSizePolicy(Qt::SizePolicy::MinimumExpanding, Qt::SizePolicy::MinimumExpanding)
82
+ @log_layout = Qt::VBoxLayout.new()
83
+
84
+ # This widget goes inside the top layout so we want 0 contents margins
85
+ @log_layout.setContentsMargins(0,0,0,0)
86
+ @log_widget.setLayout(@log_layout)
87
+
88
+ # Create the log file GUI
89
+ @log_file_selection = Qt::GroupBox.new("Log File Selection")
90
+ @log_select = Qt::HBoxLayout.new(@log_file_selection)
91
+ @log_name = Qt::LineEdit.new
92
+ @log_name.setReadOnly(true)
93
+ @log_select.addWidget(@log_name)
94
+ @log_open = Qt::PushButton.new("Browse...")
95
+ @log_select.addWidget(@log_open)
96
+ @log_layout.addWidget(@log_file_selection)
97
+
98
+ @log_open.connect(SIGNAL('clicked()')) { select_log_file() }
99
+
100
+ # Create the operation buttons GUI
101
+ @op = Qt::GroupBox.new(tr("Playback Control"))
102
+ @op_layout = Qt::VBoxLayout.new(@op)
103
+ @op_button_layout = Qt::HBoxLayout.new
104
+ @move_start = Qt::PushButton.new(Cosmos.get_icon('skip_to_start-26.png'), '')
105
+ @move_start.connect(SIGNAL('clicked()')) { move_start() }
106
+ @op_button_layout.addWidget(@move_start)
107
+ @step_back = Qt::PushButton.new(Cosmos.get_icon('rewind-26.png'), '')
108
+ @step_back_timer = Qt::Timer.new
109
+ @step_back_timeout = 100
110
+ @step_back_timer.connect(SIGNAL('timeout()')) { step_back(); @step_back_timeout = (@step_back_timeout / 2).to_i; @step_back_timer.start(@step_back_timeout) }
111
+ @step_back.connect(SIGNAL('pressed()')) { step_back(); @step_back_timeout = 300; @step_back_timer.start(@step_back_timeout) }
112
+ @step_back.connect(SIGNAL('released()')) { @step_back_timer.stop }
113
+ @op_button_layout.addWidget(@step_back)
114
+ @reverse_play = Qt::PushButton.new(Cosmos.get_icon('reverse-play-26.png'), '')
115
+ @reverse_play.connect(SIGNAL('clicked()')) { reverse_play() }
116
+ @op_button_layout.addWidget(@reverse_play)
117
+ @stop = Qt::PushButton.new(Cosmos.get_icon('stop-26.png'), '')
118
+ @stop.connect(SIGNAL('clicked()')) { stop() }
119
+ @op_button_layout.addWidget(@stop)
120
+ @play = Qt::PushButton.new(Cosmos.get_icon('play-26.png'), '')
121
+ @play.connect(SIGNAL('clicked()')) { play() }
122
+ @op_button_layout.addWidget(@play)
123
+ @step_forward = Qt::PushButton.new(Cosmos.get_icon('fast_forward-26.png'), '')
124
+ @step_forward_timer = Qt::Timer.new
125
+ @step_forward_timeout = 100
126
+ @step_forward_timer.connect(SIGNAL('timeout()')) { step_forward(); @step_forward_timeout = (@step_forward_timeout / 2).to_i; @step_forward_timer.start(@step_forward_timeout) }
127
+ @step_forward.connect(SIGNAL('pressed()')) { step_forward(); @step_forward_timeout = 300; @step_forward_timer.start(@step_forward_timeout) }
128
+ @step_forward.connect(SIGNAL('released()')) { @step_forward_timer.stop }
129
+ @op_button_layout.addWidget(@step_forward)
130
+ @move_end = Qt::PushButton.new(Cosmos.get_icon('end-26.png'), '')
131
+ @move_end.connect(SIGNAL('clicked()')) { move_end() }
132
+ @op_button_layout.addWidget(@move_end)
133
+ @op_layout.addLayout(@op_button_layout)
134
+
135
+ # Speed Selection
136
+ @playback_delay = nil
137
+ @speed_select = Qt::ComboBox.new
138
+ @variants = []
139
+ @variants << Qt::Variant.new(nil)
140
+ @speed_select.addItem("No Delay", @variants[-1])
141
+ @variants << Qt::Variant.new(0.001)
142
+ @speed_select.addItem("1ms Delay", @variants[-1])
143
+ @variants << Qt::Variant.new(0.002)
144
+ @speed_select.addItem("2ms Delay", @variants[-1])
145
+ @variants << Qt::Variant.new(0.005)
146
+ @speed_select.addItem("5ms Delay", @variants[-1])
147
+ @variants << Qt::Variant.new(0.01)
148
+ @speed_select.addItem("10ms Delay", @variants[-1])
149
+ @variants << Qt::Variant.new(0.05)
150
+ @speed_select.addItem("50ms Delay", @variants[-1])
151
+ @variants << Qt::Variant.new(0.125)
152
+ @speed_select.addItem("125ms Delay", @variants[-1])
153
+ @variants << Qt::Variant.new(0.25)
154
+ @speed_select.addItem("250ms Delay", @variants[-1])
155
+ @variants << Qt::Variant.new(0.5)
156
+ @speed_select.addItem("500ms Delay", @variants[-1])
157
+ @variants << Qt::Variant.new(1.0)
158
+ @speed_select.addItem("1s Delay", @variants[-1])
159
+ @variants << Qt::Variant.new(-1.0)
160
+ @speed_select.addItem("Realtime", @variants[-1])
161
+ @speed_select.setMaxVisibleItems(11)
162
+ @speed_select.connect(SIGNAL('currentIndexChanged(int)')) do
163
+ @playback_delay = @speed_select.itemData(@speed_select.currentIndex).value
164
+ end
165
+ @speed_layout = Qt::FormLayout.new()
166
+ @speed_layout.addRow("&Delay:", @speed_select)
167
+ @status = Qt::LineEdit.new
168
+ @status.setReadOnly(true)
169
+ @status.setText('Stopped')
170
+ @speed_layout.addRow("&Status:", @status)
171
+ @op_layout.addLayout(@speed_layout)
172
+ @log_layout.addWidget(@op)
173
+
174
+ @file_pos = Qt::GroupBox.new(tr("File Position"))
175
+ @file_pos_layout = Qt::VBoxLayout.new(@file_pos)
176
+ @slider = Qt::Slider.new(Qt::Horizontal)
177
+ @slider.setRange(0, 10000)
178
+ @slider.setTickInterval(1000)
179
+ @slider.setTickPosition(Qt::Slider::TicksBothSides)
180
+ @slider.setTracking(false)
181
+ @slider.connect(SIGNAL('sliderReleased()')) { slider_released() }
182
+ @time_layout = Qt::HBoxLayout.new()
183
+ @start_time = StringChooser.new(self, 'Start:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
184
+ @end_time = StringChooser.new(self, 'End:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
185
+ @current_time = StringChooser.new(self, 'Current:', '', 200, true, true, Qt::AlignCenter | Qt::AlignVCenter)
186
+ @time_layout.addWidget(@start_time)
187
+ @time_layout.addWidget(@current_time)
188
+ @time_layout.addWidget(@end_time)
189
+ @file_pos_layout.addLayout(@time_layout)
190
+ @file_pos_layout.addWidget(@slider)
191
+ @log_layout.addWidget(@file_pos)
192
+ @top_layout.addWidget(@log_widget)
193
+
194
+ # Add the message output
195
+ @output = Qt::PlainTextEdit.new
196
+ @output.setReadOnly(true)
197
+ @output.setMaximumBlockCount(10000) # 10000 lines of history will be displayed
198
+
199
+ @top_layout.addWidget(@output, 500)
200
+
201
+ # Override stdout to the message window
202
+ # All code attempting to print into the GUI must use $stdout rather than STDOUT
203
+ @string_output = StringIO.new("", "r+")
204
+ $stdout = @string_output
205
+ Logger.level = Logger::INFO
206
+
207
+ @central_widget.setLayout(@top_layout)
208
+ end
209
+
210
+ def select_log_file
211
+ unless @playback_thread
212
+ selection = Qt::FileDialog.getOpenFileName(
213
+ self, "Select Log File", @log_directory, Cosmos::TLM_FILE_PATTERN)
214
+ if selection
215
+ stop()
216
+ @log_directory = File.dirname(selection)
217
+ @log_name.text = selection
218
+ @log_filename = selection
219
+
220
+ System.telemetry.reset
221
+
222
+ @cancel = false
223
+ ProgressDialog.execute(self, 'Analyzing Log File', 500, 10, true, false, true, false, true) do |progress_dialog|
224
+ progress_dialog.append_text("Processing File: #{selection}\n")
225
+ progress_dialog.set_overall_progress(0.0)
226
+ progress_dialog.cancel_callback = method(:cancel_callback)
227
+ progress_dialog.enable_cancel_button
228
+ @packet_offsets = @packet_log_reader.packet_offsets(selection, lambda {|percentage| progress_dialog.set_overall_progress(percentage); @cancel})
229
+ @playback_index = 0
230
+ update_slider_and_current_time(nil)
231
+ @packet_log_reader.open(selection)
232
+ progress_dialog.close_done
233
+ end
234
+
235
+ if ProgressDialog.canceled?
236
+ @packet_log_reader.close
237
+ @log_name.text = ''
238
+ @log_filename = nil
239
+ @packet_offsets = []
240
+ @playback_index = 0
241
+ @start_time.value = ''
242
+ @current_time.value = ''
243
+ @end_time.value = ''
244
+ else
245
+ move_end()
246
+ move_start()
247
+ end
248
+ end
249
+ end
250
+ end
251
+
252
+ def cancel_callback(progress_dialog = nil)
253
+ @cancel = true
254
+ return true, false
255
+ end
256
+
257
+ def move_start
258
+ if @log_filename and !@playback_thread
259
+ packet = read_at_index(0, :FORWARD)
260
+ @start_time.value = packet.received_time.formatted if packet and packet.received_time
261
+ else
262
+ stop()
263
+ end
264
+ end
265
+
266
+ def step_back
267
+ if @log_filename and !@playback_thread
268
+ @playback_index = @packet_offsets.length - 2 if @playback_index >= @packet_offsets.length
269
+ read_at_index(@playback_index, :BACKWARD)
270
+ else
271
+ stop()
272
+ end
273
+ end
274
+
275
+ def reverse_play
276
+ if @log_filename and !@playback_thread
277
+ @playback_index = @packet_offsets.length - 2 if @playback_index >= @packet_offsets.length
278
+ start_playback(:BACKWARD)
279
+ else
280
+ stop()
281
+ end
282
+ end
283
+
284
+ def stop
285
+ @playing = false
286
+ end
287
+
288
+ def play
289
+ if @log_filename and !@playback_thread
290
+ @playback_index = 1 if @playback_index < 0
291
+ start_playback(:FORWARD)
292
+ else
293
+ stop()
294
+ end
295
+ end
296
+
297
+ def step_forward
298
+ if @log_filename and !@playback_thread
299
+ @playback_index = 1 if @playback_index < 0
300
+ read_at_index(@playback_index, :FORWARD)
301
+ else
302
+ stop()
303
+ end
304
+ end
305
+
306
+ def move_end
307
+ if @log_filename and !@playback_thread
308
+ packet = read_at_index(@packet_offsets.length - 1, :FORWARD)
309
+ @end_time.value = packet.received_time.formatted if packet and packet.received_time
310
+ else
311
+ stop()
312
+ end
313
+ end
314
+
315
+ def slider_released
316
+ if @log_filename and !@playback_thread
317
+ read_at_index(((@slider.sliderPosition / 10000.0) * (@packet_offsets.length - 1)).to_i, :FORWARD)
318
+ end
319
+ end
320
+
321
+ def start_playback(direction)
322
+ @playback_thread = Thread.new do
323
+ error = nil
324
+ begin
325
+ @playing = true
326
+ Qt.execute_in_main_thread(true) do
327
+ @status.setText('Playing')
328
+ end
329
+ previous_packet = nil
330
+ while (@playing)
331
+ if @playback_delay
332
+ packet_start = Time.now
333
+ packet = read_at_index(@playback_index, direction)
334
+ break unless packet
335
+ delay_time = 0.0
336
+ if @playback_delay > 0.0
337
+ delay_time = @playback_delay - (Time.now - packet_start)
338
+ elsif previous_packet and packet.received_time and previous_packet.received_time
339
+ if direction == :FORWARD
340
+ delay_time = packet.received_time - previous_packet.received_time - (Time.now - packet_start)
341
+ else
342
+ delay_time = previous_packet.received_time - packet.received_time - (Time.now - packet_start)
343
+ end
344
+ end
345
+ sleep(delay_time) if delay_time > 0.0
346
+ previous_packet = packet
347
+ else
348
+ packet = read_at_index(@playback_index, direction)
349
+ break unless packet
350
+ end
351
+ end
352
+ rescue Exception => error
353
+ Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(self, error, "Playback Thread")}
354
+ ensure
355
+ Qt.execute_in_main_thread(true) do
356
+ @status.setText('Stopped')
357
+ end
358
+ @playing = false
359
+ @playback_thread = nil
360
+ end
361
+ end
362
+ end
363
+
364
+ def read_at_index(index, direction)
365
+ packet_offset = nil
366
+ packet_offset = @packet_offsets[index] if index >= 0
367
+ if packet_offset
368
+ # Read the packet
369
+ packet = @packet_log_reader.read_at_offset(packet_offset, false)
370
+ handle_packet(packet)
371
+
372
+ # Adjust index for next read
373
+ if direction == :FORWARD
374
+ @playback_index = index + 1
375
+ else
376
+ @playback_index = index - 1
377
+ end
378
+ update_slider_and_current_time(packet)
379
+
380
+ return packet
381
+ else
382
+ return nil
383
+ end
384
+ end
385
+
386
+ def update_slider_and_current_time(packet)
387
+ Qt.execute_in_main_thread(false) do
388
+ value = (((@playback_index - 1) / @packet_offsets.length.to_f) * 10000).to_i
389
+ @slider.setSliderPosition(value)
390
+ @slider.setValue(value)
391
+ @current_time.value = packet.received_time.formatted if packet and packet.received_time
392
+ end
393
+ end
394
+
395
+ def handle_packet(packet)
396
+ interface = nil
397
+
398
+ # Identify and update packet
399
+ if packet.identified?
400
+ # Preidentifed packet - place it into the current value table
401
+ identified_packet = System.telemetry.update!(packet.target_name,
402
+ packet.packet_name,
403
+ packet.buffer)
404
+ else
405
+ # Packet needs to be identified
406
+ identified_packet = System.telemetry.identify!(packet.buffer)
407
+ end
408
+
409
+ if identified_packet and packet.target_name != 'UNKNOWN'
410
+ identified_packet.received_time = packet.received_time
411
+ packet = identified_packet
412
+ target = System.targets[packet.target_name.upcase]
413
+ interface = target.interface if target
414
+ else
415
+ unknown_packet = System.telemetry.update!('UNKNOWN', 'UNKNOWN', packet.buffer)
416
+ unknown_packet.received_time = packet.received_time
417
+ packet = unknown_packet
418
+ data_length = packet.length
419
+ string = "Unknown #{data_length} byte packet starting: "
420
+ num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
421
+ data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
422
+ data_to_print.each_byte do |byte|
423
+ string << sprintf("%02X", byte)
424
+ end
425
+ time_string = ''
426
+ time_string = packet.received_time.formatted << ' ' if packet.received_time
427
+ puts "#{time_string}ERROR: #{string}"
428
+ end
429
+
430
+ target = System.targets[packet.target_name]
431
+ target.tlm_cnt += 1 if target
432
+ packet.received_count += 1
433
+ packet.check_limits(System.limits_set)
434
+ ReplayServer.instance.post_packet(packet)
435
+
436
+ # Write to routers
437
+ if interface
438
+ interface.routers.each do |router|
439
+ begin
440
+ router.write(packet) if router.write_allowed? and router.connected?
441
+ rescue => err
442
+ Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ def process_server_messages(options)
449
+ # Start thread to read server messages
450
+ @output_thread = Thread.new do
451
+ begin
452
+ while !@ready
453
+ sleep(1)
454
+ end
455
+ while true
456
+ if @string_output.string[-1..-1] == "\n"
457
+ Qt.execute_in_main_thread(true) do
458
+ string = @string_output.string.clone
459
+ @string_output.string = @string_output.string[string.length..-1]
460
+ string.each_line {|out_line| @output.add_formatted_text(out_line) }
461
+ @output.flush
462
+ end
463
+ end
464
+ sleep(1)
465
+ end
466
+ rescue Exception => error
467
+ Qt.execute_in_main_thread(true) do
468
+ ExceptionDialog.new(self, error, "#{options.title}: Messages Thread")
469
+ end
470
+ end
471
+ end
472
+ end
473
+
474
+ def self.run(option_parser = nil, options = nil)
475
+ Cosmos.catch_fatal_exception do
476
+ unless option_parser and options
477
+ option_parser, options = create_default_options()
478
+ options.title = 'Replay'
479
+ options.width = 800
480
+ options.height = 500
481
+ options.auto_size = false
482
+ options.config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
483
+ option_parser.separator "Replay Specific Options:"
484
+ option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
485
+ options.config_file = arg
486
+ end
487
+ end
488
+
489
+ super(option_parser, options)
490
+ end
491
+ end
492
+
493
+ end # class TlmViewer
494
+
495
+ end # module Cosmos