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,24 +1,24 @@
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 'stringio'
12
- require 'cosmos/core_ext/cosmos_io'
13
-
14
- # COSMOS specific additions to the Ruby IO class
15
- class StringIO
16
- include CosmosIO
17
-
18
- if !(StringIO.method_defined?(:path))
19
- # @return [nil]
20
- def path
21
- nil
22
- end
23
- end
24
- end
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 'stringio'
12
+ require 'cosmos/core_ext/cosmos_io'
13
+
14
+ # COSMOS specific additions to the Ruby IO class
15
+ class StringIO
16
+ include CosmosIO
17
+
18
+ if !(StringIO.method_defined?(:path))
19
+ # @return [nil]
20
+ def path
21
+ nil
22
+ end
23
+ end
24
+ end
@@ -1,446 +1,446 @@
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 'date'
12
-
13
- # This file contains the COSMOS specific additions to the Ruby Time class
14
- #
15
- # Time is expressed in many different ways and with many different epochs.
16
- # This file supports the following formats:
17
- # Julian Date (jd or julian)
18
- # Modified Julian Date (mjd)
19
- # yds (year, day, and seconds of day)
20
- # mdy (year, month, day, hour, minute, second, us of second)
21
- # ccsds (day, ms, us from Jan 1, 1958 midnight)
22
- # time (a ruby time object with unix epoch Jan 1, 1970 midnight)
23
- # sec (seconds since an arbitrary epoch)
24
- class Time
25
- # There are 365.25 days per year because of leap years. In the Gregorian
26
- # calendar some centuries have 36524 days because of the divide by 400 rule
27
- # while others have 36525 days. The Julian century is DEFINED as having 36525
28
- # days.
29
- JULIAN_DAYS_PER_CENTURY = 36525.0
30
- # -4713/01/01 Noon
31
- JULIAN_DATE_OF_JULIAN_EPOCH = 0.0
32
- # 1858/11/17 Midnight
33
- JULIAN_DATE_OF_MJD_EPOCH = 2400000.5
34
- # 1980/01/06 Midnight
35
- JULIAN_DATE_OF_GPS_EPOCH = 2444244.5
36
- # 2000/01/01 Noon
37
- JULIAN_DATE_OF_J2000_EPOCH = 2451545.0
38
- # 1958/01/01 Midnight
39
- JULIAN_DATE_OF_CCSDS_EPOCH = 2436204.5
40
-
41
- DATE_TIME_MJD_EPOCH = DateTime.new(1858, 11, 17)
42
-
43
- USEC_PER_MSEC = 1000
44
- MSEC_PER_SECOND = 1000
45
- SEC_PER_MINUTE = 60
46
- MINUTES_PER_HOUR = 60
47
- HOURS_PER_DAY = 24
48
- USEC_PER_SECOND = USEC_PER_MSEC * MSEC_PER_SECOND
49
- MSEC_PER_MINUTE = 60 * MSEC_PER_SECOND
50
- MSEC_PER_HOUR = 60 * MSEC_PER_MINUTE
51
- MSEC_PER_DAY = HOURS_PER_DAY * MSEC_PER_HOUR
52
- SEC_PER_HOUR = SEC_PER_MINUTE * MINUTES_PER_HOUR
53
- SEC_PER_DAY = HOURS_PER_DAY * SEC_PER_HOUR
54
- USEC_PER_DAY = USEC_PER_SECOND * SEC_PER_DAY
55
- MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY
56
-
57
- USEC_PER_MSEC_FLOAT = USEC_PER_MSEC.to_f
58
- MSEC_PER_SECOND_FLOAT = MSEC_PER_SECOND.to_f
59
- SEC_PER_MINUTE_FLOAT = SEC_PER_MINUTE.to_f
60
- MINUTES_PER_HOUR_FLOAT = MINUTES_PER_HOUR.to_f
61
- HOURS_PER_DAY_FLOAT = HOURS_PER_DAY.to_f
62
- USEC_PER_SECOND_FLOAT = USEC_PER_SECOND.to_f
63
- MSEC_PER_MINUTE_FLOAT = MSEC_PER_MINUTE.to_f
64
- MSEC_PER_HOUR_FLOAT = MSEC_PER_HOUR.to_f
65
- MSEC_PER_DAY_FLOAT = MSEC_PER_DAY.to_f
66
- SEC_PER_HOUR_FLOAT = SEC_PER_HOUR.to_f
67
- SEC_PER_DAY_FLOAT = SEC_PER_DAY.to_f
68
- USEC_PER_DAY_FLOAT = USEC_PER_DAY.to_f
69
- MINUTES_PER_DAY_FLOAT = MINUTES_PER_DAY.to_f
70
-
71
- # @param seconds [Numeric] Total number of seconds
72
- # @return [String] Seconds formatted as a human readable string with days,
73
- # hours, minutes, and seconds.
74
- def self.format_seconds(seconds)
75
- result = ""
76
- mm, ss = seconds.divmod(60)
77
- hh, mm = mm.divmod(60)
78
- dd, hh = hh.divmod(24)
79
- if dd != 0
80
- if dd == 1
81
- result += "%d day, " % dd
82
- else
83
- result += "%d days, " % dd
84
- end
85
- end
86
- if hh != 0
87
- if hh == 1
88
- result += "%d hour, " % hh
89
- else
90
- result += "%d hours, " % hh
91
- end
92
- end
93
- if mm != 0
94
- if mm == 1
95
- result += "%d minute, " % mm
96
- else
97
- result += "%d minutes, " % mm
98
- end
99
- end
100
- if ss > 0
101
- result += "%.2f seconds" % ss
102
- else
103
- result = result[0..-3]
104
- end
105
- result
106
- end
107
-
108
- if not defined?(LeapYearMonthDays)
109
- # The number of days in each month during a leap year
110
- LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
111
- end
112
-
113
- if not defined?(CommonYearMonthDays)
114
- # The number of days in each month during a year (not a leap year)
115
- CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
116
- end
117
-
118
- # Convert the given year, month, day, hour, minute, second, and us
119
- # into a Julian date. Julian dates are the number of days (plus fractional
120
- # days) since Jan 1, 4713 BC at noon.
121
- #
122
- # @param year [Integer]
123
- # @param month [Integer]
124
- # @param day [Integer]
125
- # @param hour [Integer]
126
- # @param minute [Integer]
127
- # @param second [Integer]
128
- # @param us [Integer]
129
- # @return [Float] The given time as a Julian date
130
- def self.mdy2julian(year, month=1, day=1, hour=0, minute=0, second=0, us=0)
131
- # Note DateTime does not support fractions of seconds
132
- date_time = DateTime.new(year, month, day, hour, minute, second)
133
- (date_time - DATE_TIME_MJD_EPOCH).to_f + JULIAN_DATE_OF_MJD_EPOCH + us / USEC_PER_DAY_FLOAT
134
- end
135
-
136
- # @return [Float] The Time converted to a julian date
137
- def to_julian
138
- return Time.mdy2julian(self.year, self.month, self.day, self.hour, self.min, self.sec, self.usec)
139
- end
140
- alias to_jd to_julian
141
-
142
- # Convert the given year, month, day, hour, minute, second, and us
143
- # into a Modified Julian date. Modified Julian dates have an Epoch of Nov 17,
144
- # 1858 at midnight.
145
- #
146
- # @param year [Integer]
147
- # @param month [Integer]
148
- # @param day [Integer]
149
- # @param hour [Integer]
150
- # @param minute [Integer]
151
- # @param second [Integer]
152
- # @param us [Integer]
153
- # @return [Time] The given time as a Julian date
154
- def self.mdy2mjd(year, month=1, day=1, hour=0, minute=0, second=0, us=0)
155
- return Time.mdy2julian(year, month, day, hour, minute, second, us) - JULIAN_DATE_OF_MJD_EPOCH
156
- end
157
-
158
- # Convert a time object to the modified julian date
159
- def to_mjd
160
- return Time.mdy2mjd(self.year, self.month, self.day, self.hour, self.min, self.sec, self.usec)
161
- end
162
-
163
- # Create a new time object given year, day of year (1-366), and seconds of day
164
- #
165
- # @param year [Integer]
166
- # @param day_of_year [Integer] (1-366)
167
- # @param sec_of_day [Integer]
168
- def self.yds(year, day_of_year, sec_of_day)
169
- return Time.utc(*yds2mdy(year, day_of_year, sec_of_day))
170
- end
171
-
172
- # @param year [Integer]
173
- # @return [Boolean] Whether the year is a leap year
174
- def self.leap_year? (year)
175
- return_value = false
176
-
177
- if (year % 4) == 0
178
- return_value = true
179
-
180
- if (year % 100) == 0
181
- return_value = false
182
-
183
- if (year % 400) == 0
184
- return_value = true
185
- end
186
- end
187
- end
188
-
189
- return return_value
190
- end
191
-
192
- # @return [Boolean] Whether the year is a leap year
193
- def leap_year?
194
- Time.leap_year?(self.year)
195
- end
196
-
197
- # @param hour [Integer]
198
- # @param minute [Integer]
199
- # @param second [Integer]
200
- # @param us [Integer]
201
- # @return [Float] The number of seconds represented by the hours, minutes,
202
- # seconds and microseconds
203
- def self.total_seconds(hour, minute, second, us)
204
- (hour * SEC_PER_HOUR_FLOAT) + (minute * SEC_PER_MINUTE_FLOAT) + second + (us / USEC_PER_SECOND_FLOAT)
205
- end
206
-
207
- # @return [Float] The number of seconds in the day (0-86399.99)
208
- def seconds_of_day
209
- Time.total_seconds(self.hour, self.min, self.sec, self.usec)
210
- end
211
-
212
- # @return [String] Date formatted as YYYY/MM/DD HH:MM:SS.US
213
- def formatted(include_year = true, fractional_digits = 3)
214
- if include_year
215
- self.strftime("%Y/%m/%d %H:%M:%S.%#{fractional_digits}N")
216
- else
217
- self.strftime("%H:%M:%S.%#{fractional_digits}N")
218
- end
219
- end
220
-
221
- # @param time [Time]
222
- # @return [Float] Number of julian days since Jan 1, 2000 at noon
223
- def self.days_from_j2000(time)
224
- time.to_julian - JULIAN_DATE_OF_J2000_EPOCH
225
- end
226
-
227
- # @param time [Time]
228
- # @return [Float] Number of julian centuries since Jan 1, 2000 at noon
229
- def self.julian_centuries_since_j2000(time)
230
- self.days_from_j2000(time) / JULIAN_DAYS_PER_CENTURY
231
- end
232
-
233
- # Convert a Julian Date to mdy format
234
- # Note that an array is returned rather than a Time object because Time objects cannot represent
235
- # all possible Julian dates
236
- #
237
- # @param jdate [Float] Julian date
238
- # @return [Array<Year, Month, Day, Hour, Minute, Second, Microsecond>] Julian date converted to an array of values
239
- def self.julian2mdy(jdate)
240
- z = (jdate + 0.5).to_i
241
- w = ((z - 1867216.25) / 36524.25).to_i
242
- x = w / 4
243
- a = z + 1 + w - x
244
- b = a + 1524
245
- c = ((b - 122.1) / 365.25).to_i
246
- d = (365.25 * c).to_i
247
- e = ((b - d) / 30.6001).to_i
248
- f = (30.6001 * e).to_i
249
-
250
- day = b - d - f
251
- if e > 13
252
- month = e - 13
253
- else
254
- month = e - 1
255
- end
256
- if month > 2
257
- year = c - 4716
258
- else
259
- year = c - 4715
260
- end
261
-
262
- fraction = jdate - jdate.to_i
263
-
264
- if fraction >= 0.5
265
- hour = (fraction - 0.5) * 24.0
266
- else
267
- hour = (fraction * 24.0) + 12.0
268
- end
269
-
270
- fraction = hour - hour.to_i
271
- hour = hour.to_i
272
-
273
- minute = fraction * 60.0
274
-
275
- fraction = minute - minute.to_i
276
- minute = minute.to_i
277
-
278
- second = fraction * 60.0
279
-
280
- fraction = second - second.to_i
281
- second = second.to_i
282
-
283
- us = fraction * 1000000.0
284
- us = us.to_i
285
-
286
- return [year, month, day, hour, minute, second, us]
287
- end
288
-
289
- # Convert a CCSDS Date to mdy format
290
- # Note that an array is returned rather than a Time object because Time objects cannot represent
291
- # all possible CCSDS dates
292
- #
293
- # @param day [Float] CCSDS day
294
- # @param ms [Integer] CCSDS milliseconds
295
- # @param us [Integer] CCSDS microseconds
296
- # @return [Array<Year, Month, Day, Hour, Minute, Second, Microsecond>] CCSDS date converted to an array of values
297
- def self.ccsds2mdy(day, ms, us)
298
- jdate = day + JULIAN_DATE_OF_CCSDS_EPOCH
299
- year, month, day, hour, minute, second, _ = julian2mdy(jdate)
300
- hour = (ms / MSEC_PER_HOUR).to_i
301
- temp = ms - (hour * MSEC_PER_HOUR)
302
- minute = (temp / MSEC_PER_MINUTE).to_i
303
- temp -= minute * MSEC_PER_MINUTE
304
- second = temp / MSEC_PER_SECOND
305
- temp -= second * MSEC_PER_SECOND
306
- us = us + (temp * USEC_PER_MSEC)
307
- return [year, month, day, hour, minute, second, us]
308
- end
309
-
310
- # Convert from mdy format to CCSDS Date
311
- # Note that an array is used rather than a Time object because Time objects cannot represent
312
- # all possible CCSDS dates
313
- #
314
- # @param year [Integer]
315
- # @param month [Integer]
316
- # @param day [Integer]
317
- # @param hour [Integer]
318
- # @param minute [Integer]
319
- # @param second [Integer]
320
- # @param us [Integer]
321
- # @return [Array<day, ms, us>] MDY converted to CCSDS
322
- def self.mdy2ccsds(year, month, day, hour, minute, second, us)
323
- ms = (hour * MSEC_PER_HOUR) + (minute * MSEC_PER_MINUTE) + (second * MSEC_PER_SECOND) + (us / USEC_PER_MSEC)
324
- us = us % USEC_PER_MSEC
325
- jd = Time.mdy2julian(year, month, day, 0, 0, 0, 0)
326
- day = (jd - JULIAN_DATE_OF_CCSDS_EPOCH).round
327
- return [day, ms, us]
328
- end
329
-
330
- # @param day [Float] CCSDS day
331
- # @param ms [Integer] CCSDS milliseconds
332
- # @param us [Integer] CCSDS microseconds
333
- # @return [Float] The CCSDS date converted to a julian date
334
- def self.ccsds2julian(day, ms, us)
335
- (day + JULIAN_DATE_OF_CCSDS_EPOCH) + ((ms.to_f + (us / 1000.0)) / MSEC_PER_DAY_FLOAT)
336
- end
337
-
338
- # @param [Float] julian date
339
- # @return [Array<day, ms, us>] Julian converted to CCSDS
340
- def self.julian2ccsds(jdate)
341
- day = jdate - JULIAN_DATE_OF_CCSDS_EPOCH
342
- fraction = day % 1.0
343
- day = day.to_i
344
- ms = fraction * MSEC_PER_DAY_FLOAT
345
- fraction = ms % 1.0
346
- ms = ms.to_i
347
- us = fraction * USEC_PER_MSEC
348
- us = us.to_i
349
- return [day, ms, us]
350
- end
351
-
352
- # @param day [Float] CCSDS day
353
- # @param ms [Integer] CCSDS milliseconds
354
- # @param us [Integer] CCSDS microseconds
355
- # @param sec_epoch_jd [Float] Epoch to convert seconds from as a julian date
356
- def self.ccsds2sec (day, ms, us, sec_epoch_jd = JULIAN_DATE_OF_CCSDS_EPOCH)
357
- (self.ccsds2julian(day, ms, us) - sec_epoch_jd) * SEC_PER_DAY_FLOAT
358
- end
359
-
360
- # @param seconds [Float]
361
- # @param sec_epoch_jd [Float] Epoch to of seconds value
362
- # @return [Array<day, ms, us>] CCSDS date
363
- def self.sec2ccsds (sec, sec_epoch_jd = JULIAN_DATE_OF_CCSDS_EPOCH)
364
- self.julian2ccsds((sec / SEC_PER_DAY_FLOAT) + sec_epoch_jd)
365
- end
366
-
367
- # @param year [Integer] Year
368
- # @param day [Integer] Day of the year
369
- # @param sec [Float] Seconds in the day
370
- # @return [Array] [year, month, day, hour, minute, second, usec]
371
- def self.yds2mdy(year, day, sec)
372
- # Convert day of year (1-366) to day of month (1-31)
373
- if self.leap_year?(year)
374
- array = Time::LeapYearMonthDays
375
- else
376
- array = Time::CommonYearMonthDays
377
- end
378
-
379
- month = 1
380
- array.each do |days|
381
- if (day - days) >= 1
382
- day -= days
383
- month += 1
384
- else
385
- break
386
- end
387
- end
388
-
389
- # Calculate hour of day (0-23)
390
- hour = (sec / SEC_PER_HOUR).to_i
391
- sec -= (hour * SEC_PER_HOUR).to_f
392
-
393
- # Calculate minute of hour (0-59)
394
- min = (sec / SEC_PER_MINUTE).to_i
395
- sec -= (min * SEC_PER_MINUTE).to_f
396
-
397
- # Calculate second of minute (0-60)
398
- seconds = sec.to_i
399
- sec -= seconds.to_f
400
-
401
- # Calculate useconds of second (0-999999)
402
- usec = (sec * 1000000.0).to_i
403
-
404
- return [year, month, day, hour, min, seconds, usec]
405
- end
406
-
407
- # @param year [Integer] Year
408
- # @param day [Integer] Day of the year
409
- # @param sec [Integer] Seconds in the day
410
- # @return [Float] Year, day, seconds converted to the Julian date
411
- def self.yds2julian(year, day, sec)
412
- year, month, day, hour, min, seconds, usec = self.yds2mdy(year, day, sec)
413
- Time.mdy2julian(year, month, day, hour, min, seconds, usec)
414
- end
415
-
416
- # Ruby time objects cannot handle times before the Unix Epoch. Calculate a delta (in seconds) to be used
417
- # when real epochs are before the Unix Epoch. Each received timestamp will be adjusted by this delta
418
- # so a ruby time object can be used to parse the time.
419
- # @param epoch [String] epoch is a string in the following format: "yyyy/mm/dd hh:mm:ss"
420
- # @return [Float] unix_epohc_delta
421
- def self.init_epoch_delta (epoch)
422
- # UnixEpoch - Jan 1, 1970 00:00:00
423
- unix_epoch = DateTime.new(1970, 1, 1, 0, 0, 0)
424
-
425
- split_epoch = epoch.split
426
- epoch_date = split_epoch[0].split("/")
427
- epoch_time = split_epoch[1].split(":")
428
-
429
- if epoch_date[0].to_i < 1970 then
430
- # Calculate delta between epoch and unix epoch
431
- real_epoch = DateTime.new(epoch_date[0].to_i, epoch_date[1].to_i, epoch_date[2].to_i, epoch_time[0].to_i, epoch_time[1].to_i, epoch_time[2].to_i)
432
- day_delta = (unix_epoch - real_epoch).to_i
433
- unix_epoch_delta = day_delta * 86400
434
- if real_epoch.hour != 0 or real_epoch.min != 0 or real_epoch.sec != 0
435
- hour_delta = 23 - real_epoch.hour
436
- min_delta = 59 - real_epoch.min
437
- sec_delta = 60 - real_epoch.sec
438
- unix_epoch_delta += ((hour_delta * 3600) + (min_delta * 60) + sec_delta)
439
- end
440
- else
441
- unix_epoch_delta = 0
442
- end
443
-
444
- unix_epoch_delta
445
- end
446
- end
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 'date'
12
+
13
+ # This file contains the COSMOS specific additions to the Ruby Time class
14
+ #
15
+ # Time is expressed in many different ways and with many different epochs.
16
+ # This file supports the following formats:
17
+ # Julian Date (jd or julian)
18
+ # Modified Julian Date (mjd)
19
+ # yds (year, day, and seconds of day)
20
+ # mdy (year, month, day, hour, minute, second, us of second)
21
+ # ccsds (day, ms, us from Jan 1, 1958 midnight)
22
+ # time (a ruby time object with unix epoch Jan 1, 1970 midnight)
23
+ # sec (seconds since an arbitrary epoch)
24
+ class Time
25
+ # There are 365.25 days per year because of leap years. In the Gregorian
26
+ # calendar some centuries have 36524 days because of the divide by 400 rule
27
+ # while others have 36525 days. The Julian century is DEFINED as having 36525
28
+ # days.
29
+ JULIAN_DAYS_PER_CENTURY = 36525.0
30
+ # -4713/01/01 Noon
31
+ JULIAN_DATE_OF_JULIAN_EPOCH = 0.0
32
+ # 1858/11/17 Midnight
33
+ JULIAN_DATE_OF_MJD_EPOCH = 2400000.5
34
+ # 1980/01/06 Midnight
35
+ JULIAN_DATE_OF_GPS_EPOCH = 2444244.5
36
+ # 2000/01/01 Noon
37
+ JULIAN_DATE_OF_J2000_EPOCH = 2451545.0
38
+ # 1958/01/01 Midnight
39
+ JULIAN_DATE_OF_CCSDS_EPOCH = 2436204.5
40
+
41
+ DATE_TIME_MJD_EPOCH = DateTime.new(1858, 11, 17)
42
+
43
+ USEC_PER_MSEC = 1000
44
+ MSEC_PER_SECOND = 1000
45
+ SEC_PER_MINUTE = 60
46
+ MINUTES_PER_HOUR = 60
47
+ HOURS_PER_DAY = 24
48
+ USEC_PER_SECOND = USEC_PER_MSEC * MSEC_PER_SECOND
49
+ MSEC_PER_MINUTE = 60 * MSEC_PER_SECOND
50
+ MSEC_PER_HOUR = 60 * MSEC_PER_MINUTE
51
+ MSEC_PER_DAY = HOURS_PER_DAY * MSEC_PER_HOUR
52
+ SEC_PER_HOUR = SEC_PER_MINUTE * MINUTES_PER_HOUR
53
+ SEC_PER_DAY = HOURS_PER_DAY * SEC_PER_HOUR
54
+ USEC_PER_DAY = USEC_PER_SECOND * SEC_PER_DAY
55
+ MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY
56
+
57
+ USEC_PER_MSEC_FLOAT = USEC_PER_MSEC.to_f
58
+ MSEC_PER_SECOND_FLOAT = MSEC_PER_SECOND.to_f
59
+ SEC_PER_MINUTE_FLOAT = SEC_PER_MINUTE.to_f
60
+ MINUTES_PER_HOUR_FLOAT = MINUTES_PER_HOUR.to_f
61
+ HOURS_PER_DAY_FLOAT = HOURS_PER_DAY.to_f
62
+ USEC_PER_SECOND_FLOAT = USEC_PER_SECOND.to_f
63
+ MSEC_PER_MINUTE_FLOAT = MSEC_PER_MINUTE.to_f
64
+ MSEC_PER_HOUR_FLOAT = MSEC_PER_HOUR.to_f
65
+ MSEC_PER_DAY_FLOAT = MSEC_PER_DAY.to_f
66
+ SEC_PER_HOUR_FLOAT = SEC_PER_HOUR.to_f
67
+ SEC_PER_DAY_FLOAT = SEC_PER_DAY.to_f
68
+ USEC_PER_DAY_FLOAT = USEC_PER_DAY.to_f
69
+ MINUTES_PER_DAY_FLOAT = MINUTES_PER_DAY.to_f
70
+
71
+ # @param seconds [Numeric] Total number of seconds
72
+ # @return [String] Seconds formatted as a human readable string with days,
73
+ # hours, minutes, and seconds.
74
+ def self.format_seconds(seconds)
75
+ result = ""
76
+ mm, ss = seconds.divmod(60)
77
+ hh, mm = mm.divmod(60)
78
+ dd, hh = hh.divmod(24)
79
+ if dd != 0
80
+ if dd == 1
81
+ result += "%d day, " % dd
82
+ else
83
+ result += "%d days, " % dd
84
+ end
85
+ end
86
+ if hh != 0
87
+ if hh == 1
88
+ result += "%d hour, " % hh
89
+ else
90
+ result += "%d hours, " % hh
91
+ end
92
+ end
93
+ if mm != 0
94
+ if mm == 1
95
+ result += "%d minute, " % mm
96
+ else
97
+ result += "%d minutes, " % mm
98
+ end
99
+ end
100
+ if ss > 0
101
+ result += "%.2f seconds" % ss
102
+ else
103
+ result = result[0..-3]
104
+ end
105
+ result
106
+ end
107
+
108
+ if not defined?(LeapYearMonthDays)
109
+ # The number of days in each month during a leap year
110
+ LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
111
+ end
112
+
113
+ if not defined?(CommonYearMonthDays)
114
+ # The number of days in each month during a year (not a leap year)
115
+ CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
116
+ end
117
+
118
+ # Convert the given year, month, day, hour, minute, second, and us
119
+ # into a Julian date. Julian dates are the number of days (plus fractional
120
+ # days) since Jan 1, 4713 BC at noon.
121
+ #
122
+ # @param year [Integer]
123
+ # @param month [Integer]
124
+ # @param day [Integer]
125
+ # @param hour [Integer]
126
+ # @param minute [Integer]
127
+ # @param second [Integer]
128
+ # @param us [Integer]
129
+ # @return [Float] The given time as a Julian date
130
+ def self.mdy2julian(year, month=1, day=1, hour=0, minute=0, second=0, us=0)
131
+ # Note DateTime does not support fractions of seconds
132
+ date_time = DateTime.new(year, month, day, hour, minute, second)
133
+ (date_time - DATE_TIME_MJD_EPOCH).to_f + JULIAN_DATE_OF_MJD_EPOCH + us / USEC_PER_DAY_FLOAT
134
+ end
135
+
136
+ # @return [Float] The Time converted to a julian date
137
+ def to_julian
138
+ return Time.mdy2julian(self.year, self.month, self.day, self.hour, self.min, self.sec, self.usec)
139
+ end
140
+ alias to_jd to_julian
141
+
142
+ # Convert the given year, month, day, hour, minute, second, and us
143
+ # into a Modified Julian date. Modified Julian dates have an Epoch of Nov 17,
144
+ # 1858 at midnight.
145
+ #
146
+ # @param year [Integer]
147
+ # @param month [Integer]
148
+ # @param day [Integer]
149
+ # @param hour [Integer]
150
+ # @param minute [Integer]
151
+ # @param second [Integer]
152
+ # @param us [Integer]
153
+ # @return [Time] The given time as a Julian date
154
+ def self.mdy2mjd(year, month=1, day=1, hour=0, minute=0, second=0, us=0)
155
+ return Time.mdy2julian(year, month, day, hour, minute, second, us) - JULIAN_DATE_OF_MJD_EPOCH
156
+ end
157
+
158
+ # Convert a time object to the modified julian date
159
+ def to_mjd
160
+ return Time.mdy2mjd(self.year, self.month, self.day, self.hour, self.min, self.sec, self.usec)
161
+ end
162
+
163
+ # Create a new time object given year, day of year (1-366), and seconds of day
164
+ #
165
+ # @param year [Integer]
166
+ # @param day_of_year [Integer] (1-366)
167
+ # @param sec_of_day [Integer]
168
+ def self.yds(year, day_of_year, sec_of_day)
169
+ return Time.utc(*yds2mdy(year, day_of_year, sec_of_day))
170
+ end
171
+
172
+ # @param year [Integer]
173
+ # @return [Boolean] Whether the year is a leap year
174
+ def self.leap_year? (year)
175
+ return_value = false
176
+
177
+ if (year % 4) == 0
178
+ return_value = true
179
+
180
+ if (year % 100) == 0
181
+ return_value = false
182
+
183
+ if (year % 400) == 0
184
+ return_value = true
185
+ end
186
+ end
187
+ end
188
+
189
+ return return_value
190
+ end
191
+
192
+ # @return [Boolean] Whether the year is a leap year
193
+ def leap_year?
194
+ Time.leap_year?(self.year)
195
+ end
196
+
197
+ # @param hour [Integer]
198
+ # @param minute [Integer]
199
+ # @param second [Integer]
200
+ # @param us [Integer]
201
+ # @return [Float] The number of seconds represented by the hours, minutes,
202
+ # seconds and microseconds
203
+ def self.total_seconds(hour, minute, second, us)
204
+ (hour * SEC_PER_HOUR_FLOAT) + (minute * SEC_PER_MINUTE_FLOAT) + second + (us / USEC_PER_SECOND_FLOAT)
205
+ end
206
+
207
+ # @return [Float] The number of seconds in the day (0-86399.99)
208
+ def seconds_of_day
209
+ Time.total_seconds(self.hour, self.min, self.sec, self.usec)
210
+ end
211
+
212
+ # @return [String] Date formatted as YYYY/MM/DD HH:MM:SS.US
213
+ def formatted(include_year = true, fractional_digits = 3)
214
+ if include_year
215
+ self.strftime("%Y/%m/%d %H:%M:%S.%#{fractional_digits}N")
216
+ else
217
+ self.strftime("%H:%M:%S.%#{fractional_digits}N")
218
+ end
219
+ end
220
+
221
+ # @param time [Time]
222
+ # @return [Float] Number of julian days since Jan 1, 2000 at noon
223
+ def self.days_from_j2000(time)
224
+ time.to_julian - JULIAN_DATE_OF_J2000_EPOCH
225
+ end
226
+
227
+ # @param time [Time]
228
+ # @return [Float] Number of julian centuries since Jan 1, 2000 at noon
229
+ def self.julian_centuries_since_j2000(time)
230
+ self.days_from_j2000(time) / JULIAN_DAYS_PER_CENTURY
231
+ end
232
+
233
+ # Convert a Julian Date to mdy format
234
+ # Note that an array is returned rather than a Time object because Time objects cannot represent
235
+ # all possible Julian dates
236
+ #
237
+ # @param jdate [Float] Julian date
238
+ # @return [Array<Year, Month, Day, Hour, Minute, Second, Microsecond>] Julian date converted to an array of values
239
+ def self.julian2mdy(jdate)
240
+ z = (jdate + 0.5).to_i
241
+ w = ((z - 1867216.25) / 36524.25).to_i
242
+ x = w / 4
243
+ a = z + 1 + w - x
244
+ b = a + 1524
245
+ c = ((b - 122.1) / 365.25).to_i
246
+ d = (365.25 * c).to_i
247
+ e = ((b - d) / 30.6001).to_i
248
+ f = (30.6001 * e).to_i
249
+
250
+ day = b - d - f
251
+ if e > 13
252
+ month = e - 13
253
+ else
254
+ month = e - 1
255
+ end
256
+ if month > 2
257
+ year = c - 4716
258
+ else
259
+ year = c - 4715
260
+ end
261
+
262
+ fraction = jdate - jdate.to_i
263
+
264
+ if fraction >= 0.5
265
+ hour = (fraction - 0.5) * 24.0
266
+ else
267
+ hour = (fraction * 24.0) + 12.0
268
+ end
269
+
270
+ fraction = hour - hour.to_i
271
+ hour = hour.to_i
272
+
273
+ minute = fraction * 60.0
274
+
275
+ fraction = minute - minute.to_i
276
+ minute = minute.to_i
277
+
278
+ second = fraction * 60.0
279
+
280
+ fraction = second - second.to_i
281
+ second = second.to_i
282
+
283
+ us = fraction * 1000000.0
284
+ us = us.to_i
285
+
286
+ return [year, month, day, hour, minute, second, us]
287
+ end
288
+
289
+ # Convert a CCSDS Date to mdy format
290
+ # Note that an array is returned rather than a Time object because Time objects cannot represent
291
+ # all possible CCSDS dates
292
+ #
293
+ # @param day [Float] CCSDS day
294
+ # @param ms [Integer] CCSDS milliseconds
295
+ # @param us [Integer] CCSDS microseconds
296
+ # @return [Array<Year, Month, Day, Hour, Minute, Second, Microsecond>] CCSDS date converted to an array of values
297
+ def self.ccsds2mdy(day, ms, us)
298
+ jdate = day + JULIAN_DATE_OF_CCSDS_EPOCH
299
+ year, month, day, hour, minute, second, _ = julian2mdy(jdate)
300
+ hour = (ms / MSEC_PER_HOUR).to_i
301
+ temp = ms - (hour * MSEC_PER_HOUR)
302
+ minute = (temp / MSEC_PER_MINUTE).to_i
303
+ temp -= minute * MSEC_PER_MINUTE
304
+ second = temp / MSEC_PER_SECOND
305
+ temp -= second * MSEC_PER_SECOND
306
+ us = us + (temp * USEC_PER_MSEC)
307
+ return [year, month, day, hour, minute, second, us]
308
+ end
309
+
310
+ # Convert from mdy format to CCSDS Date
311
+ # Note that an array is used rather than a Time object because Time objects cannot represent
312
+ # all possible CCSDS dates
313
+ #
314
+ # @param year [Integer]
315
+ # @param month [Integer]
316
+ # @param day [Integer]
317
+ # @param hour [Integer]
318
+ # @param minute [Integer]
319
+ # @param second [Integer]
320
+ # @param us [Integer]
321
+ # @return [Array<day, ms, us>] MDY converted to CCSDS
322
+ def self.mdy2ccsds(year, month, day, hour, minute, second, us)
323
+ ms = (hour * MSEC_PER_HOUR) + (minute * MSEC_PER_MINUTE) + (second * MSEC_PER_SECOND) + (us / USEC_PER_MSEC)
324
+ us = us % USEC_PER_MSEC
325
+ jd = Time.mdy2julian(year, month, day, 0, 0, 0, 0)
326
+ day = (jd - JULIAN_DATE_OF_CCSDS_EPOCH).round
327
+ return [day, ms, us]
328
+ end
329
+
330
+ # @param day [Float] CCSDS day
331
+ # @param ms [Integer] CCSDS milliseconds
332
+ # @param us [Integer] CCSDS microseconds
333
+ # @return [Float] The CCSDS date converted to a julian date
334
+ def self.ccsds2julian(day, ms, us)
335
+ (day + JULIAN_DATE_OF_CCSDS_EPOCH) + ((ms.to_f + (us / 1000.0)) / MSEC_PER_DAY_FLOAT)
336
+ end
337
+
338
+ # @param [Float] julian date
339
+ # @return [Array<day, ms, us>] Julian converted to CCSDS
340
+ def self.julian2ccsds(jdate)
341
+ day = jdate - JULIAN_DATE_OF_CCSDS_EPOCH
342
+ fraction = day % 1.0
343
+ day = day.to_i
344
+ ms = fraction * MSEC_PER_DAY_FLOAT
345
+ fraction = ms % 1.0
346
+ ms = ms.to_i
347
+ us = fraction * USEC_PER_MSEC
348
+ us = us.to_i
349
+ return [day, ms, us]
350
+ end
351
+
352
+ # @param day [Float] CCSDS day
353
+ # @param ms [Integer] CCSDS milliseconds
354
+ # @param us [Integer] CCSDS microseconds
355
+ # @param sec_epoch_jd [Float] Epoch to convert seconds from as a julian date
356
+ def self.ccsds2sec (day, ms, us, sec_epoch_jd = JULIAN_DATE_OF_CCSDS_EPOCH)
357
+ (self.ccsds2julian(day, ms, us) - sec_epoch_jd) * SEC_PER_DAY_FLOAT
358
+ end
359
+
360
+ # @param seconds [Float]
361
+ # @param sec_epoch_jd [Float] Epoch to of seconds value
362
+ # @return [Array<day, ms, us>] CCSDS date
363
+ def self.sec2ccsds (sec, sec_epoch_jd = JULIAN_DATE_OF_CCSDS_EPOCH)
364
+ self.julian2ccsds((sec / SEC_PER_DAY_FLOAT) + sec_epoch_jd)
365
+ end
366
+
367
+ # @param year [Integer] Year
368
+ # @param day [Integer] Day of the year
369
+ # @param sec [Float] Seconds in the day
370
+ # @return [Array] [year, month, day, hour, minute, second, usec]
371
+ def self.yds2mdy(year, day, sec)
372
+ # Convert day of year (1-366) to day of month (1-31)
373
+ if self.leap_year?(year)
374
+ array = Time::LeapYearMonthDays
375
+ else
376
+ array = Time::CommonYearMonthDays
377
+ end
378
+
379
+ month = 1
380
+ array.each do |days|
381
+ if (day - days) >= 1
382
+ day -= days
383
+ month += 1
384
+ else
385
+ break
386
+ end
387
+ end
388
+
389
+ # Calculate hour of day (0-23)
390
+ hour = (sec / SEC_PER_HOUR).to_i
391
+ sec -= (hour * SEC_PER_HOUR).to_f
392
+
393
+ # Calculate minute of hour (0-59)
394
+ min = (sec / SEC_PER_MINUTE).to_i
395
+ sec -= (min * SEC_PER_MINUTE).to_f
396
+
397
+ # Calculate second of minute (0-60)
398
+ seconds = sec.to_i
399
+ sec -= seconds.to_f
400
+
401
+ # Calculate useconds of second (0-999999)
402
+ usec = (sec * 1000000.0).to_i
403
+
404
+ return [year, month, day, hour, min, seconds, usec]
405
+ end
406
+
407
+ # @param year [Integer] Year
408
+ # @param day [Integer] Day of the year
409
+ # @param sec [Integer] Seconds in the day
410
+ # @return [Float] Year, day, seconds converted to the Julian date
411
+ def self.yds2julian(year, day, sec)
412
+ year, month, day, hour, min, seconds, usec = self.yds2mdy(year, day, sec)
413
+ Time.mdy2julian(year, month, day, hour, min, seconds, usec)
414
+ end
415
+
416
+ # Ruby time objects cannot handle times before the Unix Epoch. Calculate a delta (in seconds) to be used
417
+ # when real epochs are before the Unix Epoch. Each received timestamp will be adjusted by this delta
418
+ # so a ruby time object can be used to parse the time.
419
+ # @param epoch [String] epoch is a string in the following format: "yyyy/mm/dd hh:mm:ss"
420
+ # @return [Float] unix_epohc_delta
421
+ def self.init_epoch_delta (epoch)
422
+ # UnixEpoch - Jan 1, 1970 00:00:00
423
+ unix_epoch = DateTime.new(1970, 1, 1, 0, 0, 0)
424
+
425
+ split_epoch = epoch.split
426
+ epoch_date = split_epoch[0].split("/")
427
+ epoch_time = split_epoch[1].split(":")
428
+
429
+ if epoch_date[0].to_i < 1970 then
430
+ # Calculate delta between epoch and unix epoch
431
+ real_epoch = DateTime.new(epoch_date[0].to_i, epoch_date[1].to_i, epoch_date[2].to_i, epoch_time[0].to_i, epoch_time[1].to_i, epoch_time[2].to_i)
432
+ day_delta = (unix_epoch - real_epoch).to_i
433
+ unix_epoch_delta = day_delta * 86400
434
+ if real_epoch.hour != 0 or real_epoch.min != 0 or real_epoch.sec != 0
435
+ hour_delta = 23 - real_epoch.hour
436
+ min_delta = 59 - real_epoch.min
437
+ sec_delta = 60 - real_epoch.sec
438
+ unix_epoch_delta += ((hour_delta * 3600) + (min_delta * 60) + sec_delta)
439
+ end
440
+ else
441
+ unix_epoch_delta = 0
442
+ end
443
+
444
+ unix_epoch_delta
445
+ end
446
+ end