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,6 +1,6 @@
1
- # encoding: ascii-8bit
2
-
3
- require 'cosmos/packet_logs/packet_log_writer'
4
- require 'cosmos/packet_logs/meta_packet_log_writer'
5
- require 'cosmos/packet_logs/packet_log_writer_pair'
6
- require 'cosmos/packet_logs/packet_log_reader'
1
+ # encoding: ascii-8bit
2
+
3
+ require 'cosmos/packet_logs/packet_log_writer'
4
+ require 'cosmos/packet_logs/meta_packet_log_writer'
5
+ require 'cosmos/packet_logs/packet_log_writer_pair'
6
+ require 'cosmos/packet_logs/packet_log_reader'
@@ -1,107 +1,107 @@
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
- # Usage Notes:
12
- # The metadata packet must exist with exactly the same fields as both a command and as a telemetry packet
13
- # The new_packet_log_conversion.rb WRITE_CONVERSION should be placed on at least one item in the meta packets
14
-
15
- require 'cosmos/packet_logs/packet_log_writer'
16
-
17
- module Cosmos
18
-
19
- # Writes a given packet at the beginning of each telemetry packet log file
20
- class MetaPacketLogWriter < PacketLogWriter
21
-
22
- # See PacketLogWriter#initialize
23
- # @param target_name [String] Target name of the metadata packet
24
- # @param packet_name [String] Packet name of the metadata packet
25
- # @param meta_default_filename [String] Filename containing key/value pairs for default meta packet values
26
- # @param log_meta_packet [Boolean] true to log the metadata packet if received during logging. false to only
27
- # log metadata packets at the beginning of the log.
28
- # @param use_tlm_packet [Boolean] true to put the data from the telemetry packet into
29
- # each log. false to put the data from the command packet.
30
- def initialize(
31
- log_type,
32
- target_name = nil,
33
- packet_name = nil,
34
- meta_default_filename = nil,
35
- log_meta_packet = false,
36
- use_tlm_packet = true,
37
- log_name = nil,
38
- logging_enabled = true,
39
- cycle_time = nil,
40
- cycle_size = 2000000000,
41
- log_directory = nil,
42
- asynchronous = false
43
- )
44
- @target_name = ConfigParser.handle_nil(target_name)
45
- @packet_name = ConfigParser.handle_nil(packet_name)
46
- @packet = nil
47
- @log_meta_packet = ConfigParser.handle_true_false(log_meta_packet)
48
- @meta_default_filename = ConfigParser.handle_nil(meta_default_filename)
49
- @use_tlm_packet = ConfigParser.handle_true_false(use_tlm_packet)
50
-
51
- # Make sure the packet exists in both commands and telemetry (if given)
52
- if @target_name and @packet_name
53
- packet = System.telemetry.packet(@target_name, @packet_name)
54
- @packet = packet if @use_tlm_packet
55
- packet = System.commands.packet(@target_name, @packet_name)
56
- @packet = packet if !@use_tlm_packet
57
- end
58
-
59
- # Initialize the meta packet (if given)
60
- if @meta_default_filename and @packet
61
- parser = ConfigParser.new
62
- Cosmos.set_working_dir do
63
- parser.parse_file(@meta_default_filename) do |keyword, params|
64
- begin
65
- item = @packet.get_item(keyword)
66
- if item.data_type == :STRING or item.data_type == :BLOCK
67
- value = params[0]
68
- else
69
- value = params[0].convert_to_value
70
- end
71
- @packet.write(keyword, value)
72
- rescue => err
73
- raise parser.error(err, "ITEM_NAME VALUE")
74
- end
75
- end
76
- end
77
- end
78
-
79
- super(log_type, log_name, logging_enabled, cycle_time, cycle_size, log_directory, asynchronous)
80
- end
81
-
82
- # Optionally doesn't write the meta packet
83
- def write(packet)
84
- if @log_meta_packet or !(packet.target_name == @target_name and packet.packet_name == @packet_name)
85
- super(packet)
86
- end
87
- end
88
-
89
- protected
90
-
91
- # Adds the meta packet at the beginning of telemetry packet logs
92
- # Mutex is held during this hook
93
- def start_new_file_hook
94
- if @target_name and @packet_name
95
- if @use_tlm_packet
96
- packet = System.telemetry.packet(@target_name, @packet_name)
97
- else
98
- packet = System.commands.packet(@target_name, @packet_name)
99
- end
100
- # Don't take the mutex because it is already held
101
- write_packet(packet, false)
102
- end
103
- end
104
-
105
- end # class MetaPacketLogWriter
106
-
107
- 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
+ # Usage Notes:
12
+ # The metadata packet must exist with exactly the same fields as both a command and as a telemetry packet
13
+ # The new_packet_log_conversion.rb WRITE_CONVERSION should be placed on at least one item in the meta packets
14
+
15
+ require 'cosmos/packet_logs/packet_log_writer'
16
+
17
+ module Cosmos
18
+
19
+ # Writes a given packet at the beginning of each telemetry packet log file
20
+ class MetaPacketLogWriter < PacketLogWriter
21
+
22
+ # See PacketLogWriter#initialize
23
+ # @param target_name [String] Target name of the metadata packet
24
+ # @param packet_name [String] Packet name of the metadata packet
25
+ # @param meta_default_filename [String] Filename containing key/value pairs for default meta packet values
26
+ # @param log_meta_packet [Boolean] true to log the metadata packet if received during logging. false to only
27
+ # log metadata packets at the beginning of the log.
28
+ # @param use_tlm_packet [Boolean] true to put the data from the telemetry packet into
29
+ # each log. false to put the data from the command packet.
30
+ def initialize(
31
+ log_type,
32
+ target_name = nil,
33
+ packet_name = nil,
34
+ meta_default_filename = nil,
35
+ log_meta_packet = false,
36
+ use_tlm_packet = true,
37
+ log_name = nil,
38
+ logging_enabled = true,
39
+ cycle_time = nil,
40
+ cycle_size = 2000000000,
41
+ log_directory = nil,
42
+ asynchronous = false
43
+ )
44
+ @target_name = ConfigParser.handle_nil(target_name)
45
+ @packet_name = ConfigParser.handle_nil(packet_name)
46
+ @packet = nil
47
+ @log_meta_packet = ConfigParser.handle_true_false(log_meta_packet)
48
+ @meta_default_filename = ConfigParser.handle_nil(meta_default_filename)
49
+ @use_tlm_packet = ConfigParser.handle_true_false(use_tlm_packet)
50
+
51
+ # Make sure the packet exists in both commands and telemetry (if given)
52
+ if @target_name and @packet_name
53
+ packet = System.telemetry.packet(@target_name, @packet_name)
54
+ @packet = packet if @use_tlm_packet
55
+ packet = System.commands.packet(@target_name, @packet_name)
56
+ @packet = packet if !@use_tlm_packet
57
+ end
58
+
59
+ # Initialize the meta packet (if given)
60
+ if @meta_default_filename and @packet
61
+ parser = ConfigParser.new
62
+ Cosmos.set_working_dir do
63
+ parser.parse_file(@meta_default_filename) do |keyword, params|
64
+ begin
65
+ item = @packet.get_item(keyword)
66
+ if item.data_type == :STRING or item.data_type == :BLOCK
67
+ value = params[0]
68
+ else
69
+ value = params[0].convert_to_value
70
+ end
71
+ @packet.write(keyword, value)
72
+ rescue => err
73
+ raise parser.error(err, "ITEM_NAME VALUE")
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ super(log_type, log_name, logging_enabled, cycle_time, cycle_size, log_directory, asynchronous)
80
+ end
81
+
82
+ # Optionally doesn't write the meta packet
83
+ def write(packet)
84
+ if @log_meta_packet or !(packet.target_name == @target_name and packet.packet_name == @packet_name)
85
+ super(packet)
86
+ end
87
+ end
88
+
89
+ protected
90
+
91
+ # Adds the meta packet at the beginning of telemetry packet logs
92
+ # Mutex is held during this hook
93
+ def start_new_file_hook
94
+ if @target_name and @packet_name
95
+ if @use_tlm_packet
96
+ packet = System.telemetry.packet(@target_name, @packet_name)
97
+ else
98
+ packet = System.commands.packet(@target_name, @packet_name)
99
+ end
100
+ # Don't take the mutex because it is already held
101
+ write_packet(packet, false)
102
+ end
103
+ end
104
+
105
+ end # class MetaPacketLogWriter
106
+
107
+ end # module Cosmos
@@ -1,439 +1,441 @@
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/core_ext/io'
12
- require 'cosmos/packets/packet'
13
- require 'cosmos/io/buffered_file'
14
-
15
- module Cosmos
16
-
17
- # Reads a packet log of either commands or telemetry.
18
- class PacketLogReader
19
- attr_reader :log_type
20
- attr_reader :configuration_name
21
- attr_reader :hostname
22
-
23
- # COSMOS 2.0 log file header definition
24
- COSMOS2_MARKER = 'COSMOS2_'
25
- COSMOS2_HEADER_LENGTH = 128
26
- COSMOS2_MARKER_RANGE = 0..7
27
- COSMOS2_LOG_TYPE_RANGE = 8..10
28
- COSMOS2_CONFIGURATION_NAME_RANGE = 12..43
29
- COSMOS2_HOSTNAME_RANGE = 45..127
30
-
31
- # COSMOS 1.0 log file header definition
32
- COSMOS1_MARKER = 'COSMOS'
33
- COSMOS1_HEADER_LENGTH = 42
34
- COSMOS1_MARKER_RANGE = 0..5
35
- COSMOS1_LOG_TYPE_RANGE = 6..8
36
- COSMOS1_CONFIGURATION_NAME_RANGE = 10..41
37
-
38
- # Create a new log file reader
39
- def initialize
40
- reset()
41
- end
42
-
43
- # Yields back each packet as it is found in the log file.
44
- #
45
- # @param filename [String] The log file to read
46
- # @param identify_and_define [Boolean] Once the packet has been read from
47
- # the log file, whether to both identify the packet by setting the target
48
- # and packet name, and define the packet by populating all the items.
49
- # @param start_time [Time|nil] Time at which to start returning packets.
50
- # Packets found with a timestamp before this time are ignored. Pass nil
51
- # to return all packets.
52
- # @param end_time [Time|nil] Time at which to stop returning packets.
53
- # Packets found with a timestamp after this time are ignored. Pass nil
54
- # to return all packets.
55
- # @yieldparam packet [Packet]
56
- def each(filename, identify_and_define = true, start_time = nil, end_time = nil)
57
- open(filename)
58
-
59
- seek_to_time(start_time) if start_time
60
-
61
- while true
62
- packet = read(identify_and_define)
63
- break unless packet
64
-
65
- received_time = packet.received_time
66
- if received_time
67
- next if start_time and received_time < start_time
68
- break if end_time and received_time > end_time
69
- end
70
-
71
- yield packet
72
- end
73
- ensure
74
- close()
75
- end
76
-
77
- # Returns an analysis of the log file by reading all the packets and
78
- # returning information about each packet. This information maps directly
79
- # to the parameters need by the {#read_at_offset} method and thus should be
80
- # called before using {#read_at_offset}.
81
- #
82
- # @param filename [String] The filename to analyze
83
- # @param progress_callback [Proc] Callback that should receive a single
84
- # floating point parameter which is the percentage done
85
- # @return [Array<Array<Integer, Integer, String, String, Time, Time>] Array
86
- # of arrays for each packet found in the log file consisting of:
87
- # [File position, length, target name, packet name, time formatted,
88
- # received time].
89
- def packet_offsets(filename, progress_callback = nil)
90
- open(filename)
91
- offsets = []
92
- filesize = size().to_f
93
-
94
- while true
95
- current_pos = @file.pos
96
- packet = read(false)
97
- break unless packet
98
- offsets << current_pos
99
- progress_callback.call(current_pos / filesize) if progress_callback
100
- end
101
-
102
- return offsets
103
- ensure
104
- close()
105
- end
106
-
107
- # @param filename [String] The log filename to open
108
- def open(filename)
109
- close()
110
- reset()
111
- @filename = filename
112
- @file = BufferedFile.open(@filename, 'rb')
113
- @bytes_read = 0
114
- read_file_header()
115
- rescue => err
116
- close()
117
- raise err
118
- end
119
-
120
- # Closes the current log file
121
- def close
122
- @file.close if @file and !@file.closed?
123
- end
124
-
125
- # Read a packet from the log file
126
- #
127
- # @param identify_and_define (see #each)
128
- # @return [Packet]
129
- def read(identify_and_define = true)
130
- # Read the Packet Header
131
- success, target_name, packet_name, received_time = read_entry_header()
132
- return nil unless success
133
-
134
- # Read Packet Data
135
- packet_data = @file.read_length_bytes(4)
136
- return nil unless packet_data and packet_data.length > 0
137
-
138
- if identify_and_define
139
- packet = identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
140
- else
141
- # Build Packet
142
- packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
143
- packet.set_received_time_fast(received_time)
144
- end
145
-
146
- packet
147
- rescue => err
148
- close()
149
- raise err
150
- end
151
-
152
- # Reads a packet from the opened log file. Should only be used in
153
- # conjunction with {#packet_offsets}.
154
- #
155
- # @param file_offset [Integer] Byte offset into the log file to start
156
- # reading
157
- # @param identify_and_define (see #each)
158
- # @return [Packet]
159
- def read_at_offset(file_offset, identify_and_define = true)
160
- @file.seek(file_offset, IO::SEEK_SET)
161
- return read(identify_and_define)
162
- rescue => err
163
- close()
164
- raise err
165
- end
166
-
167
- # Read the first packet from the log file and reset the file position back
168
- # to the current position. This allows the client to call read multiple
169
- # times to return packets, call first, and continue calling read which will
170
- # return the next packet in the file.
171
- #
172
- # @return [Packet]
173
- def first
174
- original_position = @file.pos
175
- @file.seek(0, IO::SEEK_SET)
176
- read_file_header()
177
- packet = read()
178
- raise "No first packet found" unless packet
179
- @file.seek(original_position, IO::SEEK_SET)
180
- packet.clone
181
- rescue => err
182
- close()
183
- raise err
184
- end
185
-
186
- # Read the last packet from the log file and reset the file position back
187
- # to the current position. This allows the client to call read multiple
188
- # times to return packets, call last, and continue calling read which will
189
- # return the next packet in the file.
190
- #
191
- # @return [Packet]
192
- def last
193
- original_position = @file.pos
194
- @file.seek(-1, IO::SEEK_END)
195
- packet = search(-1)
196
- raise "No last packet found" unless packet
197
- @file.seek(original_position, IO::SEEK_SET)
198
- packet.clone
199
- rescue => err
200
- close()
201
- raise err
202
- end
203
-
204
- # @return [Integer] The size of the log file being processed
205
- def size
206
- @file.stat.size
207
- end
208
-
209
- # @return [Integer] The current file position in the log file
210
- def bytes_read
211
- @file.pos
212
- end
213
-
214
- protected
215
-
216
- def reset
217
- @file = nil
218
- @filename = nil
219
- @log_type = :TLM
220
- @configuration_name = nil
221
- @hostname = nil
222
- @file_header_length = COSMOS2_HEADER_LENGTH
223
- end
224
-
225
- # This is best effort. May return unidentified/undefined packets
226
- def identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
227
- packet = nil
228
- unless (target_name and packet_name)
229
- if @log_type == :TLM
230
- packet = System.telemetry.identify!(packet_data)
231
- else
232
- packet = System.commands.identify(packet_data)
233
- end
234
- packet.set_received_time_fast(received_time) if packet
235
- else
236
- begin
237
- if @log_type == :TLM
238
- packet = System.telemetry.packet(target_name, packet_name)
239
- else
240
- packet = System.commands.packet(target_name, packet_name)
241
- end
242
- packet.buffer = packet_data
243
- packet.set_received_time_fast(received_time)
244
- rescue
245
- # Could not find a definition for this packet
246
- Logger.instance.error "Unknown packet #{target_name} #{packet_name}"
247
- packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
248
- packet.set_received_time_fast(received_time)
249
- end
250
- end
251
- packet
252
- end
253
-
254
- def read_file_header
255
- header = @file.read(COSMOS2_HEADER_LENGTH)
256
- if header and header.length == COSMOS2_HEADER_LENGTH
257
- if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
258
- # Found COSMOS 2 File Header
259
- @log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
260
- @configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
261
- @hostname = header[COSMOS2_HOSTNAME_RANGE].strip
262
- @file_header_length = COSMOS2_HEADER_LENGTH
263
- System.load_configuration(@configuration_name)
264
- elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
265
- # Found COSMOS 1 File Header
266
- @log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
267
- @configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
268
- @hostname = nil
269
- @file_header_length = COSMOS1_HEADER_LENGTH
270
- # Move back to beginning of first packet
271
- @file.seek(COSMOS1_HEADER_LENGTH, IO::SEEK_SET)
272
- System.load_configuration(@configuration_name)
273
- else
274
- raise "COSMOS file header not found on packet log"
275
- end
276
- raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
277
- else
278
- raise "Failed to read at least #{COSMOS2_HEADER_LENGTH} bytes from packet log"
279
- end
280
- end
281
-
282
- def read_entry_header
283
- # Read Received Time
284
- time_seconds = @file.read(4)
285
- return [nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
286
- time_seconds = time_seconds.unpack('N')[0]
287
- time_microseconds = @file.read(4)
288
- return [nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
289
- time_microseconds = time_microseconds.unpack('N')[0]
290
- received_time = Time.at(time_seconds, time_microseconds)
291
-
292
- # Read Target Name
293
- target_name = @file.read_length_bytes(1)
294
- return [nil, nil, nil, nil] unless target_name and target_name.length > 0
295
-
296
- # Read Packet Name
297
- packet_name = @file.read_length_bytes(1)
298
- return [nil, nil, nil, nil] unless packet_name and packet_name.length > 0
299
-
300
- return [true, target_name, packet_name, received_time]
301
- end
302
-
303
- def test
304
- found = false
305
-
306
- # Save original position
307
- original_position = @file.pos
308
-
309
- begin
310
- # Try to read the packet header
311
- # This will fail with file read errors and invalid timestamps
312
- success, target_name, packet_name, _ = read_entry_header()
313
- if success
314
- if target_name !~ File::NON_ASCII_PRINTABLE and packet_name !~ File::NON_ASCII_PRINTABLE
315
- packet_data_length = @file.read(4)
316
- if packet_data_length.length == 4 and packet_data_length.unpack('N')[0] > 0
317
- if @log_type == :TLM
318
- if System.telemetry.packet(target_name, packet_name)
319
- found = true
320
- end
321
- else
322
- if System.commands.packet(target_name, packet_name)
323
- found = true
324
- end
325
- end
326
- end
327
- end
328
- end
329
- rescue
330
- # Packet not found
331
- end
332
-
333
- # Return to the original position
334
- @file.seek(original_position, IO::SEEK_SET)
335
-
336
- # Indicate if a packet was found
337
- found
338
- end
339
-
340
- # Searchs for the nearest packet to the current io position
341
- # Returns the packet if found, and leaves the io position
342
- # either before or after the packet found
343
- def search(offset_increment, leave_position = :AFTER)
344
- position = @file.pos
345
- @file.seek(0, IO::SEEK_END)
346
- size = @file.pos
347
- @file.seek(position, IO::SEEK_SET)
348
-
349
- while (@file.pos > 0 and @file.pos < size)
350
- if test()
351
- # Save position
352
- position = @file.pos
353
-
354
- packet = read()
355
-
356
- if packet
357
- if leave_position != :AFTER
358
- # Restore position
359
- @file.seek(position, IO::SEEK_SET)
360
- end
361
-
362
- return packet
363
- end
364
-
365
- # Restore position
366
- @file.seek(position, IO::SEEK_SET)
367
- end
368
- @file.seek(offset_increment, IO::SEEK_CUR)
369
- end
370
-
371
- # Return nil if we search beyond the size of the file
372
- nil
373
- end
374
-
375
- def seek_to_time(time)
376
- if time
377
- position = @file.pos
378
-
379
- begin
380
- # Read the first packet in the log
381
- first_packet = first()
382
- raise "Error reading first packet" unless first
383
- raise "First Packet does not contain a packet received time" unless first_packet.received_time
384
-
385
- # Read the last packet in the log
386
- file_size = size()
387
- last_packet = last()
388
- raise "Search failed looking for last packet" unless last_packet
389
- raise "Last Packet does not contain a packet received time" unless last_packet.received_time
390
-
391
- if time >= first_packet.received_time and time <= last_packet.received_time
392
- # Guess at where to start looking for time in log
393
- percentage = (time - first_packet.received_time) / (last_packet.received_time - first_packet.received_time)
394
- offset = (percentage * file_size.to_f).to_i
395
- offset = @file_header_length if offset < @file_header_length
396
- @file.seek(offset, IO::SEEK_SET)
397
-
398
- # Move backwards until a packet before the time is found
399
- while true
400
- packet = search(-1, :BEFORE)
401
- break if !packet or packet.received_time <= time
402
-
403
- # Guess again
404
- percentage = 1.0 - ((packet.received_time - time) / (packet.received_time - first_packet.received_time))
405
- offset = (percentage * @file.pos.to_f).to_i
406
- offset = @file_header_length if offset < @file_header_length
407
- @file.seek(offset, IO::SEEK_SET)
408
- end
409
-
410
- # Move forwards until a packet equal to or after the time is found
411
- while true
412
- position = @file.pos
413
- packet = read(false)
414
- raise "Search failed looking for packet after time" unless packet
415
- if packet.received_time >= time
416
- # Back up this packet so the read can get it because we want it
417
- @file.seek(position, IO::SEEK_SET)
418
- break
419
- end
420
- end
421
-
422
- else
423
- if time > last_packet.received_time
424
- # File is entirely before time, so jump to the end
425
- @file.seek(0, IO::SEEK_END)
426
- else
427
- raise "File does not include time"
428
- end
429
- end
430
- rescue # Optimized search failed or not supported
431
- # Restore position
432
- @file.seek(position, IO::SEEK_SET)
433
- end
434
- end
435
- end
436
-
437
- end # class PacketLogReader
438
-
439
- 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/core_ext/io'
12
+ require 'cosmos/packets/packet'
13
+ require 'cosmos/io/buffered_file'
14
+
15
+ module Cosmos
16
+
17
+ # Reads a packet log of either commands or telemetry.
18
+ class PacketLogReader
19
+ attr_reader :log_type
20
+ attr_reader :configuration_name
21
+ attr_reader :hostname
22
+
23
+ # COSMOS 2.0 log file header definition
24
+ COSMOS2_MARKER = 'COSMOS2_'
25
+ COSMOS2_HEADER_LENGTH = 128
26
+ COSMOS2_MARKER_RANGE = 0..7
27
+ COSMOS2_LOG_TYPE_RANGE = 8..10
28
+ COSMOS2_CONFIGURATION_NAME_RANGE = 12..43
29
+ COSMOS2_HOSTNAME_RANGE = 45..127
30
+
31
+ # COSMOS 1.0 log file header definition
32
+ COSMOS1_MARKER = 'COSMOS'
33
+ COSMOS1_HEADER_LENGTH = 42
34
+ COSMOS1_MARKER_RANGE = 0..5
35
+ COSMOS1_LOG_TYPE_RANGE = 6..8
36
+ COSMOS1_CONFIGURATION_NAME_RANGE = 10..41
37
+
38
+ # Create a new log file reader
39
+ def initialize
40
+ reset()
41
+ end
42
+
43
+ # Yields back each packet as it is found in the log file.
44
+ #
45
+ # @param filename [String] The log file to read
46
+ # @param identify_and_define [Boolean] Once the packet has been read from
47
+ # the log file, whether to both identify the packet by setting the target
48
+ # and packet name, and define the packet by populating all the items.
49
+ # @param start_time [Time|nil] Time at which to start returning packets.
50
+ # Packets found with a timestamp before this time are ignored. Pass nil
51
+ # to return all packets.
52
+ # @param end_time [Time|nil] Time at which to stop returning packets.
53
+ # Packets found with a timestamp after this time are ignored. Pass nil
54
+ # to return all packets.
55
+ # @yieldparam packet [Packet]
56
+ def each(filename, identify_and_define = true, start_time = nil, end_time = nil)
57
+ open(filename)
58
+
59
+ seek_to_time(start_time) if start_time
60
+
61
+ while true
62
+ packet = read(identify_and_define)
63
+ break unless packet
64
+
65
+ received_time = packet.received_time
66
+ if received_time
67
+ next if start_time and received_time < start_time
68
+ break if end_time and received_time > end_time
69
+ end
70
+
71
+ yield packet
72
+ end
73
+ ensure
74
+ close()
75
+ end
76
+
77
+ # Returns an analysis of the log file by reading all the packets and
78
+ # returning information about each packet. This information maps directly
79
+ # to the parameters need by the {#read_at_offset} method and thus should be
80
+ # called before using {#read_at_offset}.
81
+ #
82
+ # @param filename [String] The filename to analyze
83
+ # @param progress_callback [Proc] Callback that should receive a single
84
+ # floating point parameter which is the percentage done
85
+ # @return [Array<Array<Integer, Integer, String, String, Time, Time>] Array
86
+ # of arrays for each packet found in the log file consisting of:
87
+ # [File position, length, target name, packet name, time formatted,
88
+ # received time].
89
+ def packet_offsets(filename, progress_callback = nil)
90
+ open(filename)
91
+ offsets = []
92
+ filesize = size().to_f
93
+
94
+ while true
95
+ current_pos = @file.pos
96
+ packet = read(false)
97
+ break unless packet
98
+ offsets << current_pos
99
+ if progress_callback
100
+ break if progress_callback.call(current_pos / filesize)
101
+ end
102
+ end
103
+
104
+ return offsets
105
+ ensure
106
+ close()
107
+ end
108
+
109
+ # @param filename [String] The log filename to open
110
+ def open(filename)
111
+ close()
112
+ reset()
113
+ @filename = filename
114
+ @file = BufferedFile.open(@filename, 'rb')
115
+ @bytes_read = 0
116
+ read_file_header()
117
+ rescue => err
118
+ close()
119
+ raise err
120
+ end
121
+
122
+ # Closes the current log file
123
+ def close
124
+ @file.close if @file and !@file.closed?
125
+ end
126
+
127
+ # Read a packet from the log file
128
+ #
129
+ # @param identify_and_define (see #each)
130
+ # @return [Packet]
131
+ def read(identify_and_define = true)
132
+ # Read the Packet Header
133
+ success, target_name, packet_name, received_time = read_entry_header()
134
+ return nil unless success
135
+
136
+ # Read Packet Data
137
+ packet_data = @file.read_length_bytes(4)
138
+ return nil unless packet_data and packet_data.length > 0
139
+
140
+ if identify_and_define
141
+ packet = identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
142
+ else
143
+ # Build Packet
144
+ packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
145
+ packet.set_received_time_fast(received_time)
146
+ end
147
+
148
+ packet
149
+ rescue => err
150
+ close()
151
+ raise err
152
+ end
153
+
154
+ # Reads a packet from the opened log file. Should only be used in
155
+ # conjunction with {#packet_offsets}.
156
+ #
157
+ # @param file_offset [Integer] Byte offset into the log file to start
158
+ # reading
159
+ # @param identify_and_define (see #each)
160
+ # @return [Packet]
161
+ def read_at_offset(file_offset, identify_and_define = true)
162
+ @file.seek(file_offset, IO::SEEK_SET)
163
+ return read(identify_and_define)
164
+ rescue => err
165
+ close()
166
+ raise err
167
+ end
168
+
169
+ # Read the first packet from the log file and reset the file position back
170
+ # to the current position. This allows the client to call read multiple
171
+ # times to return packets, call first, and continue calling read which will
172
+ # return the next packet in the file.
173
+ #
174
+ # @return [Packet]
175
+ def first
176
+ original_position = @file.pos
177
+ @file.seek(0, IO::SEEK_SET)
178
+ read_file_header()
179
+ packet = read()
180
+ raise "No first packet found" unless packet
181
+ @file.seek(original_position, IO::SEEK_SET)
182
+ packet.clone
183
+ rescue => err
184
+ close()
185
+ raise err
186
+ end
187
+
188
+ # Read the last packet from the log file and reset the file position back
189
+ # to the current position. This allows the client to call read multiple
190
+ # times to return packets, call last, and continue calling read which will
191
+ # return the next packet in the file.
192
+ #
193
+ # @return [Packet]
194
+ def last
195
+ original_position = @file.pos
196
+ @file.seek(-1, IO::SEEK_END)
197
+ packet = search(-1)
198
+ raise "No last packet found" unless packet
199
+ @file.seek(original_position, IO::SEEK_SET)
200
+ packet.clone
201
+ rescue => err
202
+ close()
203
+ raise err
204
+ end
205
+
206
+ # @return [Integer] The size of the log file being processed
207
+ def size
208
+ @file.stat.size
209
+ end
210
+
211
+ # @return [Integer] The current file position in the log file
212
+ def bytes_read
213
+ @file.pos
214
+ end
215
+
216
+ protected
217
+
218
+ def reset
219
+ @file = nil
220
+ @filename = nil
221
+ @log_type = :TLM
222
+ @configuration_name = nil
223
+ @hostname = nil
224
+ @file_header_length = COSMOS2_HEADER_LENGTH
225
+ end
226
+
227
+ # This is best effort. May return unidentified/undefined packets
228
+ def identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
229
+ packet = nil
230
+ unless (target_name and packet_name)
231
+ if @log_type == :TLM
232
+ packet = System.telemetry.identify!(packet_data)
233
+ else
234
+ packet = System.commands.identify(packet_data)
235
+ end
236
+ packet.set_received_time_fast(received_time) if packet
237
+ else
238
+ begin
239
+ if @log_type == :TLM
240
+ packet = System.telemetry.packet(target_name, packet_name)
241
+ else
242
+ packet = System.commands.packet(target_name, packet_name)
243
+ end
244
+ packet.buffer = packet_data
245
+ packet.set_received_time_fast(received_time)
246
+ rescue
247
+ # Could not find a definition for this packet
248
+ Logger.instance.error "Unknown packet #{target_name} #{packet_name}"
249
+ packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
250
+ packet.set_received_time_fast(received_time)
251
+ end
252
+ end
253
+ packet
254
+ end
255
+
256
+ def read_file_header
257
+ header = @file.read(COSMOS2_HEADER_LENGTH)
258
+ if header and header.length == COSMOS2_HEADER_LENGTH
259
+ if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
260
+ # Found COSMOS 2 File Header
261
+ @log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
262
+ @configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
263
+ @hostname = header[COSMOS2_HOSTNAME_RANGE].strip
264
+ @file_header_length = COSMOS2_HEADER_LENGTH
265
+ System.load_configuration(@configuration_name)
266
+ elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
267
+ # Found COSMOS 1 File Header
268
+ @log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
269
+ @configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
270
+ @hostname = nil
271
+ @file_header_length = COSMOS1_HEADER_LENGTH
272
+ # Move back to beginning of first packet
273
+ @file.seek(COSMOS1_HEADER_LENGTH, IO::SEEK_SET)
274
+ System.load_configuration(@configuration_name)
275
+ else
276
+ raise "COSMOS file header not found on packet log"
277
+ end
278
+ raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
279
+ else
280
+ raise "Failed to read at least #{COSMOS2_HEADER_LENGTH} bytes from packet log"
281
+ end
282
+ end
283
+
284
+ def read_entry_header
285
+ # Read Received Time
286
+ time_seconds = @file.read(4)
287
+ return [nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
288
+ time_seconds = time_seconds.unpack('N')[0]
289
+ time_microseconds = @file.read(4)
290
+ return [nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
291
+ time_microseconds = time_microseconds.unpack('N')[0]
292
+ received_time = Time.at(time_seconds, time_microseconds)
293
+
294
+ # Read Target Name
295
+ target_name = @file.read_length_bytes(1)
296
+ return [nil, nil, nil, nil] unless target_name and target_name.length > 0
297
+
298
+ # Read Packet Name
299
+ packet_name = @file.read_length_bytes(1)
300
+ return [nil, nil, nil, nil] unless packet_name and packet_name.length > 0
301
+
302
+ return [true, target_name, packet_name, received_time]
303
+ end
304
+
305
+ def test
306
+ found = false
307
+
308
+ # Save original position
309
+ original_position = @file.pos
310
+
311
+ begin
312
+ # Try to read the packet header
313
+ # This will fail with file read errors and invalid timestamps
314
+ success, target_name, packet_name, _ = read_entry_header()
315
+ if success
316
+ if target_name !~ File::NON_ASCII_PRINTABLE and packet_name !~ File::NON_ASCII_PRINTABLE
317
+ packet_data_length = @file.read(4)
318
+ if packet_data_length.length == 4 and packet_data_length.unpack('N')[0] > 0
319
+ if @log_type == :TLM
320
+ if System.telemetry.packet(target_name, packet_name)
321
+ found = true
322
+ end
323
+ else
324
+ if System.commands.packet(target_name, packet_name)
325
+ found = true
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
331
+ rescue
332
+ # Packet not found
333
+ end
334
+
335
+ # Return to the original position
336
+ @file.seek(original_position, IO::SEEK_SET)
337
+
338
+ # Indicate if a packet was found
339
+ found
340
+ end
341
+
342
+ # Searchs for the nearest packet to the current io position
343
+ # Returns the packet if found, and leaves the io position
344
+ # either before or after the packet found
345
+ def search(offset_increment, leave_position = :AFTER)
346
+ position = @file.pos
347
+ @file.seek(0, IO::SEEK_END)
348
+ size = @file.pos
349
+ @file.seek(position, IO::SEEK_SET)
350
+
351
+ while (@file.pos > 0 and @file.pos < size)
352
+ if test()
353
+ # Save position
354
+ position = @file.pos
355
+
356
+ packet = read()
357
+
358
+ if packet
359
+ if leave_position != :AFTER
360
+ # Restore position
361
+ @file.seek(position, IO::SEEK_SET)
362
+ end
363
+
364
+ return packet
365
+ end
366
+
367
+ # Restore position
368
+ @file.seek(position, IO::SEEK_SET)
369
+ end
370
+ @file.seek(offset_increment, IO::SEEK_CUR)
371
+ end
372
+
373
+ # Return nil if we search beyond the size of the file
374
+ nil
375
+ end
376
+
377
+ def seek_to_time(time)
378
+ if time
379
+ position = @file.pos
380
+
381
+ begin
382
+ # Read the first packet in the log
383
+ first_packet = first()
384
+ raise "Error reading first packet" unless first
385
+ raise "First Packet does not contain a packet received time" unless first_packet.received_time
386
+
387
+ # Read the last packet in the log
388
+ file_size = size()
389
+ last_packet = last()
390
+ raise "Search failed looking for last packet" unless last_packet
391
+ raise "Last Packet does not contain a packet received time" unless last_packet.received_time
392
+
393
+ if time >= first_packet.received_time and time <= last_packet.received_time
394
+ # Guess at where to start looking for time in log
395
+ percentage = (time - first_packet.received_time) / (last_packet.received_time - first_packet.received_time)
396
+ offset = (percentage * file_size.to_f).to_i
397
+ offset = @file_header_length if offset < @file_header_length
398
+ @file.seek(offset, IO::SEEK_SET)
399
+
400
+ # Move backwards until a packet before the time is found
401
+ while true
402
+ packet = search(-1, :BEFORE)
403
+ break if !packet or packet.received_time <= time
404
+
405
+ # Guess again
406
+ percentage = 1.0 - ((packet.received_time - time) / (packet.received_time - first_packet.received_time))
407
+ offset = (percentage * @file.pos.to_f).to_i
408
+ offset = @file_header_length if offset < @file_header_length
409
+ @file.seek(offset, IO::SEEK_SET)
410
+ end
411
+
412
+ # Move forwards until a packet equal to or after the time is found
413
+ while true
414
+ position = @file.pos
415
+ packet = read(false)
416
+ raise "Search failed looking for packet after time" unless packet
417
+ if packet.received_time >= time
418
+ # Back up this packet so the read can get it because we want it
419
+ @file.seek(position, IO::SEEK_SET)
420
+ break
421
+ end
422
+ end
423
+
424
+ else
425
+ if time > last_packet.received_time
426
+ # File is entirely before time, so jump to the end
427
+ @file.seek(0, IO::SEEK_END)
428
+ else
429
+ raise "File does not include time"
430
+ end
431
+ end
432
+ rescue # Optimized search failed or not supported
433
+ # Restore position
434
+ @file.seek(position, IO::SEEK_SET)
435
+ end
436
+ end
437
+ end
438
+
439
+ end # class PacketLogReader
440
+
441
+ end # module Cosmos