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,50 +1,50 @@
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/conversions/conversion'
12
-
13
- module Cosmos
14
-
15
- # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds
16
- class UnixTimeConversion < Conversion
17
-
18
- # Initializes the time item to grab from the packet
19
- #
20
- # @param seconds_item_name [String] The telemetry item in the packet which
21
- # represents the number of seconds since the UNIX time epoch
22
- # @param microseconds_item_name [String] The telemetry item in the packet
23
- # which represents microseconds
24
- def initialize(seconds_item_name, microseconds_item_name = nil)
25
- @seconds_item_name = seconds_item_name
26
- @microseconds_item_name = microseconds_item_name
27
- end
28
-
29
- # @param (see Conversion#call)
30
- # @return [Float] Packet time in seconds since UNIX epoch
31
- def call(value, packet, buffer)
32
- if @microseconds_item_name
33
- return Time.at(packet.read(@seconds_item_name, :RAW, buffer), packet.read(@microseconds_item_name, :RAW, buffer))
34
- else
35
- return Time.at(packet.read(@seconds_item_name, :RAW, buffer), 0)
36
- end
37
- end
38
-
39
- # @return [String] The name of the class followed by the time conversion
40
- def to_s
41
- if @microseconds_item_name
42
- return "Time.at(packet.read('#{@seconds_item_name}', :RAW, buffer), packet.read('#{@microseconds_item_name}', :RAW, buffer))"
43
- else
44
- return "Time.at(packet.read('#{@seconds_item_name}', :RAW, buffer), 0)"
45
- end
46
- end
47
-
48
- end # class UnixTimeConversion
49
-
50
- 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/conversions/conversion'
12
+
13
+ module Cosmos
14
+
15
+ # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds
16
+ class UnixTimeConversion < Conversion
17
+
18
+ # Initializes the time item to grab from the packet
19
+ #
20
+ # @param seconds_item_name [String] The telemetry item in the packet which
21
+ # represents the number of seconds since the UNIX time epoch
22
+ # @param microseconds_item_name [String] The telemetry item in the packet
23
+ # which represents microseconds
24
+ def initialize(seconds_item_name, microseconds_item_name = nil)
25
+ @seconds_item_name = seconds_item_name
26
+ @microseconds_item_name = microseconds_item_name
27
+ end
28
+
29
+ # @param (see Conversion#call)
30
+ # @return [Float] Packet time in seconds since UNIX epoch
31
+ def call(value, packet, buffer)
32
+ if @microseconds_item_name
33
+ return Time.at(packet.read(@seconds_item_name, :RAW, buffer), packet.read(@microseconds_item_name, :RAW, buffer))
34
+ else
35
+ return Time.at(packet.read(@seconds_item_name, :RAW, buffer), 0)
36
+ end
37
+ end
38
+
39
+ # @return [String] The name of the class followed by the time conversion
40
+ def to_s
41
+ if @microseconds_item_name
42
+ return "Time.at(packet.read('#{@seconds_item_name}', :RAW, buffer), packet.read('#{@microseconds_item_name}', :RAW, buffer))"
43
+ else
44
+ return "Time.at(packet.read('#{@seconds_item_name}', :RAW, buffer), 0)"
45
+ end
46
+ end
47
+
48
+ end # class UnixTimeConversion
49
+
50
+ end # module Cosmos
@@ -1,44 +1,44 @@
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/conversions/unix_time_conversion'
12
-
13
- module Cosmos
14
-
15
- # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds,
16
- # into a formatted string.
17
- class UnixTimeFormattedConversion < UnixTimeConversion
18
-
19
- # Initializes converted_type to :STRING and converted_bit_size to 0
20
- #
21
- # @param seconds_item_name [String] The telemetry item in the packet which
22
- # represents the number of seconds since the UNIX time epoch
23
- # @param microseconds_item_name [String] The telemetry item in the packet
24
- # which represents microseconds
25
- def initialize(seconds_item_name, microseconds_item_name = nil)
26
- super(seconds_item_name, microseconds_item_name)
27
- @converted_type = :STRING
28
- @converted_bit_size = 0
29
- end
30
-
31
- # @param (see Conversion#call)
32
- # @return [String] Formatted packet time
33
- def call(value, packet, buffer)
34
- super.formatted
35
- end
36
-
37
- # @return [String] The name of the class followed by the time conversion
38
- def to_s
39
- super << ".formatted"
40
- end
41
-
42
- end # class UnixTimeFormattedConversion
43
-
44
- 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/conversions/unix_time_conversion'
12
+
13
+ module Cosmos
14
+
15
+ # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds,
16
+ # into a formatted string.
17
+ class UnixTimeFormattedConversion < UnixTimeConversion
18
+
19
+ # Initializes converted_type to :STRING and converted_bit_size to 0
20
+ #
21
+ # @param seconds_item_name [String] The telemetry item in the packet which
22
+ # represents the number of seconds since the UNIX time epoch
23
+ # @param microseconds_item_name [String] The telemetry item in the packet
24
+ # which represents microseconds
25
+ def initialize(seconds_item_name, microseconds_item_name = nil)
26
+ super(seconds_item_name, microseconds_item_name)
27
+ @converted_type = :STRING
28
+ @converted_bit_size = 0
29
+ end
30
+
31
+ # @param (see Conversion#call)
32
+ # @return [String] Formatted packet time
33
+ def call(value, packet, buffer)
34
+ super.formatted
35
+ end
36
+
37
+ # @return [String] The name of the class followed by the time conversion
38
+ def to_s
39
+ super << ".formatted"
40
+ end
41
+
42
+ end # class UnixTimeFormattedConversion
43
+
44
+ end # module Cosmos
@@ -1,44 +1,44 @@
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/conversions/unix_time_conversion'
12
-
13
- module Cosmos
14
-
15
- # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds,
16
- # into a floating point number.
17
- class UnixTimeSecondsConversion < UnixTimeConversion
18
-
19
- # Initializes converted_type to :FLOAT and converted_bit_size to 64
20
- #
21
- # @param seconds_item_name [String] The telemetry item in the packet which
22
- # represents the number of seconds since the UNIX time epoch
23
- # @param microseconds_item_name [String] The telemetry item in the packet
24
- # which represents microseconds
25
- def initialize(seconds_item_name, microseconds_item_name = nil)
26
- super(seconds_item_name, microseconds_item_name)
27
- @converted_type = :FLOAT
28
- @converted_bit_size = 64
29
- end
30
-
31
- # @param (see Conversion#call)
32
- # @return [Float] Packet time in seconds since UNIX epoch
33
- def call(value, packet, buffer)
34
- super.to_f
35
- end
36
-
37
- # @return [String] The name of the class followed by the time conversion
38
- def to_s
39
- super << ".to_f"
40
- end
41
-
42
- end # class UnixTimeSecondsConversion
43
-
44
- 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/conversions/unix_time_conversion'
12
+
13
+ module Cosmos
14
+
15
+ # Converts a unix format time: Epoch Jan 1 1970, seconds and microseconds,
16
+ # into a floating point number.
17
+ class UnixTimeSecondsConversion < UnixTimeConversion
18
+
19
+ # Initializes converted_type to :FLOAT and converted_bit_size to 64
20
+ #
21
+ # @param seconds_item_name [String] The telemetry item in the packet which
22
+ # represents the number of seconds since the UNIX time epoch
23
+ # @param microseconds_item_name [String] The telemetry item in the packet
24
+ # which represents microseconds
25
+ def initialize(seconds_item_name, microseconds_item_name = nil)
26
+ super(seconds_item_name, microseconds_item_name)
27
+ @converted_type = :FLOAT
28
+ @converted_bit_size = 64
29
+ end
30
+
31
+ # @param (see Conversion#call)
32
+ # @return [Float] Packet time in seconds since UNIX epoch
33
+ def call(value, packet, buffer)
34
+ super.to_f
35
+ end
36
+
37
+ # @return [String] The name of the class followed by the time conversion
38
+ def to_s
39
+ super << ".to_f"
40
+ end
41
+
42
+ end # class UnixTimeSecondsConversion
43
+
44
+ end # module Cosmos
@@ -1,18 +1,18 @@
1
- # encoding: ascii-8bit
2
-
3
- require 'cosmos/core_ext/array'
4
- require 'cosmos/core_ext/class'
5
- require 'cosmos/core_ext/cosmos_io'
6
- require 'cosmos/core_ext/exception'
7
- require 'cosmos/core_ext/file'
8
- require 'cosmos/core_ext/hash'
9
- require 'cosmos/core_ext/io'
10
- require 'cosmos/core_ext/kernel'
11
- require 'cosmos/core_ext/math'
12
- require 'cosmos/core_ext/matrix'
13
- require 'cosmos/core_ext/range'
14
- require 'cosmos/core_ext/socket'
15
- require 'cosmos/core_ext/string'
16
- require 'cosmos/core_ext/stringio'
17
- require 'cosmos/core_ext/time'
18
- require 'cosmos/core_ext/objectspace'
1
+ # encoding: ascii-8bit
2
+
3
+ require 'cosmos/core_ext/array'
4
+ require 'cosmos/core_ext/class'
5
+ require 'cosmos/core_ext/cosmos_io'
6
+ require 'cosmos/core_ext/exception'
7
+ require 'cosmos/core_ext/file'
8
+ require 'cosmos/core_ext/hash'
9
+ require 'cosmos/core_ext/io'
10
+ require 'cosmos/core_ext/kernel'
11
+ require 'cosmos/core_ext/math'
12
+ require 'cosmos/core_ext/matrix'
13
+ require 'cosmos/core_ext/range'
14
+ require 'cosmos/core_ext/socket'
15
+ require 'cosmos/core_ext/string'
16
+ require 'cosmos/core_ext/stringio'
17
+ require 'cosmos/core_ext/time'
18
+ require 'cosmos/core_ext/objectspace'
@@ -1,354 +1,354 @@
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/ext/array'
12
-
13
- # COSMOS specific additions to the Ruby Array class
14
- class Array
15
- # Redefine inspect to only print for small numbers of
16
- # items. Prevents exceptions taking forever to be raise with
17
- # large objects. See http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/105145
18
- alias old_inspect inspect
19
-
20
- # @param max_elements [Integer] The maximum number of elements in the array to
21
- # print out before simply displaying the array class and object id
22
- # @return [String] String representation of the array
23
- def inspect(max_elements = 10)
24
- if self.length <= max_elements
25
- old_inspect()
26
- else
27
- '#<' + self.class.to_s + ':' + self.object_id.to_s + '>'
28
- end
29
- end
30
-
31
- # @return [Array] Cloned array after all elements called to_f
32
- def clone_to_f
33
- new_array = self.class.new(0)
34
- self.each do |value|
35
- new_array << value.to_f
36
- end
37
- new_array
38
- end
39
-
40
- # Returns the array index nearest to the passed in value. This only makes sense
41
- # for numerical arrays containing integers or floats. It has an optimized
42
- # algorithm if the array is sorted but will fail if passed unsorted data with
43
- # the sorted option.
44
- #
45
- # @param value [Numeric] A value to search for in the array
46
- # @param ordered_data [Boolean] Whether or not the data is sorted
47
- # @return [Integer] The index of the element closest to value
48
- def nearest_index(value, ordered_data = true)
49
- raise "Cannot search on empty array" if self.empty?
50
-
51
- if ordered_data
52
- last_index = self.length - 1
53
- first_value = self[0].to_f
54
- last_value = self[-1].to_f
55
- return 0 if first_value == last_value
56
- slope = last_index.to_f / (last_value - first_value)
57
- offset = -(slope * first_value)
58
- guess_index = ((slope * value.to_f) + offset).to_i
59
-
60
- # Return immediately for boundary conditions
61
- return 0 if guess_index < 0
62
- return last_index if guess_index > last_index
63
-
64
- # Verify guess index
65
- previous_guess_index = nil
66
- previous_guess_value = nil
67
-
68
- # While in the valid range of indexes
69
- while (guess_index >= 0 and guess_index <= last_index)
70
-
71
- # Retrieve the value at our current guess index
72
- guess_value = self[guess_index]
73
-
74
- # We're done if we found the exact value
75
- return guess_index if guess_value == value
76
-
77
- if previous_guess_value # Determine if we did better or worse
78
- # Was previous guess better or worse?
79
- if (guess_value - value).abs <= (previous_guess_value - value).abs
80
- # Previous Guess Worse or the same
81
- if guess_value > value # Moving with decreasing indexes
82
- if previous_guess_value > value # Still moving in right direction
83
- previous_guess_index = guess_index
84
- guess_index -= 1
85
- else # We passed the value
86
- return guess_index
87
- end
88
- else # guess_value < value and moving with increasing indexes
89
- if previous_guess_value < value # Still moving in right direction
90
- previous_guess_index = guess_index
91
- guess_index += 1
92
- else # We passed the value
93
- return guess_index
94
- end
95
- end
96
- else
97
- # Previous Guess Better
98
- return previous_guess_index
99
- end
100
- else # Move to the next point
101
- previous_guess_index = guess_index
102
- if guess_value > value
103
- guess_index -= 1
104
- else #guess_value < value
105
- guess_index += 1
106
- end
107
- end
108
- previous_guess_value = guess_value
109
- end
110
-
111
- # Return our best guess
112
- return 0 if guess_index < 0
113
- return last_index
114
- else # Brute force search
115
- # Calculate the initial delta
116
- min_delta = (self[0] - value).abs
117
- closest_index = 0
118
- self.each_with_index do |self_value, index|
119
- # Calculate the delta between the current value and value we are
120
- # searching for
121
- delta = (value - self_value).abs
122
- # If the newly calculate delta is less than or equal to are previous
123
- # minimum delta then we proceed
124
- if delta <= min_delta
125
- # There is a special case if the delta is equal to the previously
126
- # calculated delta. We want to round up in this case so we check if
127
- # the value we are searching for is greater than the current value.
128
- # If so we skip this value since we don't want to round down.
129
- next if (delta == min_delta) and (value > self_value)
130
- min_delta = delta
131
- closest_index = index
132
- end
133
- end
134
- return closest_index
135
- end
136
- end
137
-
138
- # Returns the index of the first element which is less than or equal to the
139
- # passed in value.
140
- #
141
- # NOTE: This routine only works on sorted data!
142
- #
143
- # @param value [Numeric] The value to search for in the array
144
- # @return [Fixnum] The index of the element which is less than or equal to
145
- # the value
146
- def index_lt_eq(value)
147
- index = nearest_index(value)
148
-
149
- # Keep backing up if self[index - 1] == value to move past duplicates
150
- while (index > 0 and self[index - 1] == value)
151
- index -= 1
152
- end
153
-
154
- return index if self[index] <= value
155
- index -= 1 if index > 0
156
- return index
157
- end
158
-
159
- # Returns the index of the last element which is greater than or equal to the
160
- # passed in value.
161
- #
162
- # NOTE: This routine only works on sorted data!
163
- #
164
- # @param value [Numeric] The value to search for in the array
165
- # @return [Fixnum] The index of the element which is greater than or equal to
166
- # the value
167
- def index_gt_eq(value)
168
- index = nearest_index(value)
169
- last_index = self.length - 1
170
-
171
- # Keep moving forward if self[index - 1] == value to move past duplicates
172
- while (index < last_index and self[index + 1] == value)
173
- index += 1
174
- end
175
-
176
- return index if self[index] >= value
177
- index += 1 if (self.length - 1) > index
178
- return index
179
- end
180
-
181
- # Returns the range of array elements which contain both the start value and
182
- # end value.
183
- #
184
- # NOTE: This routine only works on sorted data!
185
- #
186
- # @param start_value [Numeric] The start value to search for (must be less
187
- # than end_value)
188
- # @param end_value [Numeric] The end value to search for
189
- # @return [Range] The range of array elements which contain both the
190
- # start_value and end_value
191
- def range_containing(start_value, end_value)
192
- raise "end_value: #{end_value} must be greater than start_value: #{start_value}" if end_value < start_value
193
- Range.new(index_lt_eq(start_value), index_gt_eq(end_value))
194
- end
195
-
196
- # Returns the range of array elements which within both the start value and
197
- # end value.
198
- #
199
- # NOTE: This routine only works on sorted data!
200
- #
201
- # @param start_value [Numeric] The start value to search for (must be less
202
- # than end_value)
203
- # @param end_value [Numeric] The end value to search for
204
- # @return [Range] The range of array elements which contain both the
205
- # start_value and end_value
206
- def range_within(start_value, end_value)
207
- raise "end_value: #{end_value} must be greater than start_value: #{start_value}" if end_value < start_value
208
- Range.new(index_gt_eq(start_value), index_lt_eq(end_value))
209
- end
210
-
211
- if !(self.method_defined?(:sum))
212
- # @return [Numeric] The sum of all the elements in the array
213
- def sum
214
- self.inject(0, :+)
215
- end
216
- end
217
-
218
- # return [Float] The mean of all the elements in the array
219
- def mean
220
- return 0.0 if self.empty?
221
- return self.sum / self.length.to_f
222
- end
223
-
224
- # return [Array] A new array with each value of the original squared
225
- def squared
226
- self.map {|value| value * value}
227
- end
228
-
229
- # return [Numeric, Fixnum] The first maximum value and its index
230
- # def max_with_index
231
-
232
- # return [Numeric, Fixnum] The first minimum value and its index
233
- # def min_with_index
234
-
235
- # @param num_buckets [Integer] The number of buckets (groups of numbers) that
236
- # will be used when histogramming. nil indicates to use as many buckets as
237
- # necessary to cause each bucket to have a unique element.
238
- # @param numeric [Boolean] Whether the array data is numeric
239
- # @param block [Proc] If a block is given it will be called to sort buckets
240
- # with the same object. This might be necessary if your data is not numeric
241
- # and you want to override the way your objects compare.
242
- # @return [Array<Array(first_value, last_value, num_values)>] Array of buckets
243
- # which are arrays containing the first value that is found in the bucket,
244
- # the last value found in the bucket, and the total number of values in the
245
- # bucket.
246
- def histogram(num_buckets = nil, numeric = false, &block)
247
- buckets = {}
248
-
249
- # Count the occurance of each value
250
- self.each do |value|
251
- buckets[value] ||= 0
252
- buckets[value] += 1
253
- end
254
-
255
- # Sort buckets by value, use block for sorting if given
256
- if block_given?
257
- sorted_buckets = buckets.sort {|x, y| yield(x,y)}
258
- else
259
- sorted_buckets = buckets.sort
260
- end
261
-
262
- reduced_buckets = []
263
- if num_buckets
264
- # Validate num_buckets
265
- raise "Invalid num_buckets #{num_buckets}" if num_buckets.to_i <= 0
266
-
267
- # Handle histogram types
268
- if numeric
269
- # Numeric histograms use the same sized range for each bucket
270
- first_value = sorted_buckets[0][0]
271
- last_value = sorted_buckets[-1][0]
272
- delta = last_value - first_value
273
- bucket_size = delta.to_f / num_buckets.to_f
274
- integers = false
275
- integers = true if first_value.kind_of?(Integer) and last_value.kind_of?(Integer)
276
- if integers
277
- bucket_size = bucket_size.ceil
278
- last_value = first_value + bucket_size*num_buckets - 1
279
- delta = last_value - first_value
280
- (delta + 1).times do |index|
281
- buckets[first_value + index] ||= 0
282
- end
283
- if block_given?
284
- sorted_buckets = buckets.sort {|val1, val2| yield(val1, val2) }
285
- else
286
- sorted_buckets = buckets.sort
287
- end
288
- end
289
- bucket_ranges = []
290
- current_value = first_value
291
- num_buckets.times do |bucket_index|
292
- if bucket_index == (num_buckets - 1)
293
- bucket_ranges[bucket_index] = (current_value)..(last_value)
294
- else
295
- if integers
296
- bucket_ranges[bucket_index] = (current_value)..(current_value + bucket_size - 1)
297
- else
298
- bucket_ranges[bucket_index] = (current_value)..(current_value + bucket_size)
299
- end
300
- end
301
- current_value += bucket_size
302
- end
303
-
304
- # Build the final buckets
305
- first_index = 0
306
- sorted_index = 0
307
- num_buckets.times do |bucket_index|
308
- break if sorted_index > (sorted_buckets.length - 1)
309
- sum = 0
310
- bucket_range = bucket_ranges[bucket_index]
311
- while (bucket_range.include?(sorted_buckets[sorted_index][0]))
312
- sum += sorted_buckets[sorted_index][1]
313
- sorted_index += 1
314
- break if sorted_index > (sorted_buckets.length - 1)
315
- end
316
- reduced_buckets[bucket_index] = [bucket_range.first, bucket_range.last, sum]
317
- end
318
- else
319
- # Non-numeric histograms use the same number of items per bucket
320
- items_per_bucket = sorted_buckets.length / num_buckets.to_i
321
- items_per_bucket = 1 if items_per_bucket < 1
322
- bucket_sizes = [items_per_bucket] * num_buckets
323
- excess_items = sorted_buckets.length - (items_per_bucket * num_buckets)
324
- if excess_items > 0
325
- bucket_sizes.length.times do |bucket_size_index|
326
- break if excess_items <= 0
327
- bucket_sizes[bucket_size_index] += 1
328
- excess_items -= 1
329
- end
330
- end
331
-
332
- # Build the final buckets
333
- first_index = 0
334
- num_buckets.times do |bucket_index|
335
- break if first_index > (sorted_buckets.length - 1)
336
- if bucket_index == (num_buckets - 1)
337
- last_index = sorted_buckets.length - 1
338
- else
339
- last_index = first_index + bucket_sizes[bucket_index] - 1
340
- last_index = sorted_buckets.length - 1 if last_index > (sorted_buckets.length - 1)
341
- end
342
- sum = 0
343
- sorted_buckets[first_index..last_index].each {|key, value| sum += value}
344
- reduced_buckets[bucket_index] = [sorted_buckets[first_index][0], sorted_buckets[last_index][0], sum]
345
- first_index = first_index + bucket_sizes[bucket_index]
346
- end
347
- end
348
- else
349
- sorted_buckets.each {|key, value| reduced_buckets << [key, key, value]}
350
- end
351
- reduced_buckets
352
- end
353
-
354
- end # class Array
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/ext/array'
12
+
13
+ # COSMOS specific additions to the Ruby Array class
14
+ class Array
15
+ # Redefine inspect to only print for small numbers of
16
+ # items. Prevents exceptions taking forever to be raise with
17
+ # large objects. See http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/105145
18
+ alias old_inspect inspect
19
+
20
+ # @param max_elements [Integer] The maximum number of elements in the array to
21
+ # print out before simply displaying the array class and object id
22
+ # @return [String] String representation of the array
23
+ def inspect(max_elements = 10)
24
+ if self.length <= max_elements
25
+ old_inspect()
26
+ else
27
+ '#<' + self.class.to_s + ':' + self.object_id.to_s + '>'
28
+ end
29
+ end
30
+
31
+ # @return [Array] Cloned array after all elements called to_f
32
+ def clone_to_f
33
+ new_array = self.class.new(0)
34
+ self.each do |value|
35
+ new_array << value.to_f
36
+ end
37
+ new_array
38
+ end
39
+
40
+ # Returns the array index nearest to the passed in value. This only makes sense
41
+ # for numerical arrays containing integers or floats. It has an optimized
42
+ # algorithm if the array is sorted but will fail if passed unsorted data with
43
+ # the sorted option.
44
+ #
45
+ # @param value [Numeric] A value to search for in the array
46
+ # @param ordered_data [Boolean] Whether or not the data is sorted
47
+ # @return [Integer] The index of the element closest to value
48
+ def nearest_index(value, ordered_data = true)
49
+ raise "Cannot search on empty array" if self.empty?
50
+
51
+ if ordered_data
52
+ last_index = self.length - 1
53
+ first_value = self[0].to_f
54
+ last_value = self[-1].to_f
55
+ return 0 if first_value == last_value
56
+ slope = last_index.to_f / (last_value - first_value)
57
+ offset = -(slope * first_value)
58
+ guess_index = ((slope * value.to_f) + offset).to_i
59
+
60
+ # Return immediately for boundary conditions
61
+ return 0 if guess_index < 0
62
+ return last_index if guess_index > last_index
63
+
64
+ # Verify guess index
65
+ previous_guess_index = nil
66
+ previous_guess_value = nil
67
+
68
+ # While in the valid range of indexes
69
+ while (guess_index >= 0 and guess_index <= last_index)
70
+
71
+ # Retrieve the value at our current guess index
72
+ guess_value = self[guess_index]
73
+
74
+ # We're done if we found the exact value
75
+ return guess_index if guess_value == value
76
+
77
+ if previous_guess_value # Determine if we did better or worse
78
+ # Was previous guess better or worse?
79
+ if (guess_value - value).abs <= (previous_guess_value - value).abs
80
+ # Previous Guess Worse or the same
81
+ if guess_value > value # Moving with decreasing indexes
82
+ if previous_guess_value > value # Still moving in right direction
83
+ previous_guess_index = guess_index
84
+ guess_index -= 1
85
+ else # We passed the value
86
+ return guess_index
87
+ end
88
+ else # guess_value < value and moving with increasing indexes
89
+ if previous_guess_value < value # Still moving in right direction
90
+ previous_guess_index = guess_index
91
+ guess_index += 1
92
+ else # We passed the value
93
+ return guess_index
94
+ end
95
+ end
96
+ else
97
+ # Previous Guess Better
98
+ return previous_guess_index
99
+ end
100
+ else # Move to the next point
101
+ previous_guess_index = guess_index
102
+ if guess_value > value
103
+ guess_index -= 1
104
+ else #guess_value < value
105
+ guess_index += 1
106
+ end
107
+ end
108
+ previous_guess_value = guess_value
109
+ end
110
+
111
+ # Return our best guess
112
+ return 0 if guess_index < 0
113
+ return last_index
114
+ else # Brute force search
115
+ # Calculate the initial delta
116
+ min_delta = (self[0] - value).abs
117
+ closest_index = 0
118
+ self.each_with_index do |self_value, index|
119
+ # Calculate the delta between the current value and value we are
120
+ # searching for
121
+ delta = (value - self_value).abs
122
+ # If the newly calculate delta is less than or equal to are previous
123
+ # minimum delta then we proceed
124
+ if delta <= min_delta
125
+ # There is a special case if the delta is equal to the previously
126
+ # calculated delta. We want to round up in this case so we check if
127
+ # the value we are searching for is greater than the current value.
128
+ # If so we skip this value since we don't want to round down.
129
+ next if (delta == min_delta) and (value > self_value)
130
+ min_delta = delta
131
+ closest_index = index
132
+ end
133
+ end
134
+ return closest_index
135
+ end
136
+ end
137
+
138
+ # Returns the index of the first element which is less than or equal to the
139
+ # passed in value.
140
+ #
141
+ # NOTE: This routine only works on sorted data!
142
+ #
143
+ # @param value [Numeric] The value to search for in the array
144
+ # @return [Fixnum] The index of the element which is less than or equal to
145
+ # the value
146
+ def index_lt_eq(value)
147
+ index = nearest_index(value)
148
+
149
+ # Keep backing up if self[index - 1] == value to move past duplicates
150
+ while (index > 0 and self[index - 1] == value)
151
+ index -= 1
152
+ end
153
+
154
+ return index if self[index] <= value
155
+ index -= 1 if index > 0
156
+ return index
157
+ end
158
+
159
+ # Returns the index of the last element which is greater than or equal to the
160
+ # passed in value.
161
+ #
162
+ # NOTE: This routine only works on sorted data!
163
+ #
164
+ # @param value [Numeric] The value to search for in the array
165
+ # @return [Fixnum] The index of the element which is greater than or equal to
166
+ # the value
167
+ def index_gt_eq(value)
168
+ index = nearest_index(value)
169
+ last_index = self.length - 1
170
+
171
+ # Keep moving forward if self[index - 1] == value to move past duplicates
172
+ while (index < last_index and self[index + 1] == value)
173
+ index += 1
174
+ end
175
+
176
+ return index if self[index] >= value
177
+ index += 1 if (self.length - 1) > index
178
+ return index
179
+ end
180
+
181
+ # Returns the range of array elements which contain both the start value and
182
+ # end value.
183
+ #
184
+ # NOTE: This routine only works on sorted data!
185
+ #
186
+ # @param start_value [Numeric] The start value to search for (must be less
187
+ # than end_value)
188
+ # @param end_value [Numeric] The end value to search for
189
+ # @return [Range] The range of array elements which contain both the
190
+ # start_value and end_value
191
+ def range_containing(start_value, end_value)
192
+ raise "end_value: #{end_value} must be greater than start_value: #{start_value}" if end_value < start_value
193
+ Range.new(index_lt_eq(start_value), index_gt_eq(end_value))
194
+ end
195
+
196
+ # Returns the range of array elements which within both the start value and
197
+ # end value.
198
+ #
199
+ # NOTE: This routine only works on sorted data!
200
+ #
201
+ # @param start_value [Numeric] The start value to search for (must be less
202
+ # than end_value)
203
+ # @param end_value [Numeric] The end value to search for
204
+ # @return [Range] The range of array elements which contain both the
205
+ # start_value and end_value
206
+ def range_within(start_value, end_value)
207
+ raise "end_value: #{end_value} must be greater than start_value: #{start_value}" if end_value < start_value
208
+ Range.new(index_gt_eq(start_value), index_lt_eq(end_value))
209
+ end
210
+
211
+ if !(self.method_defined?(:sum))
212
+ # @return [Numeric] The sum of all the elements in the array
213
+ def sum
214
+ self.inject(0, :+)
215
+ end
216
+ end
217
+
218
+ # return [Float] The mean of all the elements in the array
219
+ def mean
220
+ return 0.0 if self.empty?
221
+ return self.sum / self.length.to_f
222
+ end
223
+
224
+ # return [Array] A new array with each value of the original squared
225
+ def squared
226
+ self.map {|value| value * value}
227
+ end
228
+
229
+ # return [Numeric, Fixnum] The first maximum value and its index
230
+ # def max_with_index
231
+
232
+ # return [Numeric, Fixnum] The first minimum value and its index
233
+ # def min_with_index
234
+
235
+ # @param num_buckets [Integer] The number of buckets (groups of numbers) that
236
+ # will be used when histogramming. nil indicates to use as many buckets as
237
+ # necessary to cause each bucket to have a unique element.
238
+ # @param numeric [Boolean] Whether the array data is numeric
239
+ # @param block [Proc] If a block is given it will be called to sort buckets
240
+ # with the same object. This might be necessary if your data is not numeric
241
+ # and you want to override the way your objects compare.
242
+ # @return [Array<Array(first_value, last_value, num_values)>] Array of buckets
243
+ # which are arrays containing the first value that is found in the bucket,
244
+ # the last value found in the bucket, and the total number of values in the
245
+ # bucket.
246
+ def histogram(num_buckets = nil, numeric = false, &block)
247
+ buckets = {}
248
+
249
+ # Count the occurance of each value
250
+ self.each do |value|
251
+ buckets[value] ||= 0
252
+ buckets[value] += 1
253
+ end
254
+
255
+ # Sort buckets by value, use block for sorting if given
256
+ if block_given?
257
+ sorted_buckets = buckets.sort {|x, y| yield(x,y)}
258
+ else
259
+ sorted_buckets = buckets.sort
260
+ end
261
+
262
+ reduced_buckets = []
263
+ if num_buckets
264
+ # Validate num_buckets
265
+ raise "Invalid num_buckets #{num_buckets}" if num_buckets.to_i <= 0
266
+
267
+ # Handle histogram types
268
+ if numeric
269
+ # Numeric histograms use the same sized range for each bucket
270
+ first_value = sorted_buckets[0][0]
271
+ last_value = sorted_buckets[-1][0]
272
+ delta = last_value - first_value
273
+ bucket_size = delta.to_f / num_buckets.to_f
274
+ integers = false
275
+ integers = true if first_value.kind_of?(Integer) and last_value.kind_of?(Integer)
276
+ if integers
277
+ bucket_size = bucket_size.ceil
278
+ last_value = first_value + bucket_size*num_buckets - 1
279
+ delta = last_value - first_value
280
+ (delta + 1).times do |index|
281
+ buckets[first_value + index] ||= 0
282
+ end
283
+ if block_given?
284
+ sorted_buckets = buckets.sort {|val1, val2| yield(val1, val2) }
285
+ else
286
+ sorted_buckets = buckets.sort
287
+ end
288
+ end
289
+ bucket_ranges = []
290
+ current_value = first_value
291
+ num_buckets.times do |bucket_index|
292
+ if bucket_index == (num_buckets - 1)
293
+ bucket_ranges[bucket_index] = (current_value)..(last_value)
294
+ else
295
+ if integers
296
+ bucket_ranges[bucket_index] = (current_value)..(current_value + bucket_size - 1)
297
+ else
298
+ bucket_ranges[bucket_index] = (current_value)..(current_value + bucket_size)
299
+ end
300
+ end
301
+ current_value += bucket_size
302
+ end
303
+
304
+ # Build the final buckets
305
+ first_index = 0
306
+ sorted_index = 0
307
+ num_buckets.times do |bucket_index|
308
+ break if sorted_index > (sorted_buckets.length - 1)
309
+ sum = 0
310
+ bucket_range = bucket_ranges[bucket_index]
311
+ while (bucket_range.include?(sorted_buckets[sorted_index][0]))
312
+ sum += sorted_buckets[sorted_index][1]
313
+ sorted_index += 1
314
+ break if sorted_index > (sorted_buckets.length - 1)
315
+ end
316
+ reduced_buckets[bucket_index] = [bucket_range.first, bucket_range.last, sum]
317
+ end
318
+ else
319
+ # Non-numeric histograms use the same number of items per bucket
320
+ items_per_bucket = sorted_buckets.length / num_buckets.to_i
321
+ items_per_bucket = 1 if items_per_bucket < 1
322
+ bucket_sizes = [items_per_bucket] * num_buckets
323
+ excess_items = sorted_buckets.length - (items_per_bucket * num_buckets)
324
+ if excess_items > 0
325
+ bucket_sizes.length.times do |bucket_size_index|
326
+ break if excess_items <= 0
327
+ bucket_sizes[bucket_size_index] += 1
328
+ excess_items -= 1
329
+ end
330
+ end
331
+
332
+ # Build the final buckets
333
+ first_index = 0
334
+ num_buckets.times do |bucket_index|
335
+ break if first_index > (sorted_buckets.length - 1)
336
+ if bucket_index == (num_buckets - 1)
337
+ last_index = sorted_buckets.length - 1
338
+ else
339
+ last_index = first_index + bucket_sizes[bucket_index] - 1
340
+ last_index = sorted_buckets.length - 1 if last_index > (sorted_buckets.length - 1)
341
+ end
342
+ sum = 0
343
+ sorted_buckets[first_index..last_index].each {|key, value| sum += value}
344
+ reduced_buckets[bucket_index] = [sorted_buckets[first_index][0], sorted_buckets[last_index][0], sum]
345
+ first_index = first_index + bucket_sizes[bucket_index]
346
+ end
347
+ end
348
+ else
349
+ sorted_buckets.each {|key, value| reduced_buckets << [key, key, value]}
350
+ end
351
+ reduced_buckets
352
+ end
353
+
354
+ end # class Array