cosmos 3.5.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +24 -24
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,30 +1,30 @@
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
- module Cosmos
12
-
13
- # Holds a cmd/tlm pair of packet log writers
14
- class PacketLogWriterPair
15
-
16
- # @return [PacketLogWriter] The comamnd log writer
17
- attr_reader :cmd_log_writer
18
- # @return [PacketLogWriter] The telemetry log writer
19
- attr_reader :tlm_log_writer
20
-
21
- # @param cmd_log_writer [PacketLogWriter] The command log writer
22
- # @param tlm_log_writer [PacketLogWriter] The telemetry log writer
23
- def initialize(cmd_log_writer, tlm_log_writer)
24
- @cmd_log_writer = cmd_log_writer
25
- @tlm_log_writer = tlm_log_writer
26
- end
27
-
28
- end # class PacketLogWriterPair
29
-
30
- 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
+ module Cosmos
12
+
13
+ # Holds a cmd/tlm pair of packet log writers
14
+ class PacketLogWriterPair
15
+
16
+ # @return [PacketLogWriter] The comamnd log writer
17
+ attr_reader :cmd_log_writer
18
+ # @return [PacketLogWriter] The telemetry log writer
19
+ attr_reader :tlm_log_writer
20
+
21
+ # @param cmd_log_writer [PacketLogWriter] The command log writer
22
+ # @param tlm_log_writer [PacketLogWriter] The telemetry log writer
23
+ def initialize(cmd_log_writer, tlm_log_writer)
24
+ @cmd_log_writer = cmd_log_writer
25
+ @tlm_log_writer = tlm_log_writer
26
+ end
27
+
28
+ end # class PacketLogWriterPair
29
+
30
+ end # module Cosmos
@@ -1,634 +1,634 @@
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 Lesser 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
- # This file contains the implementation of the BinaryAccessor class.
12
- # This class allows for easy reading and writing of binary data in Ruby
13
-
14
- require 'cosmos/ext/packet'
15
-
16
- module Cosmos
17
-
18
- # Provides methods for binary reading and writing
19
- class BinaryAccessor
20
-
21
- # Constants for ruby packing directives
22
- PACK_8_BIT_INT = 'c'
23
- PACK_NATIVE_16_BIT_INT = 's'
24
- PACK_LITTLE_ENDIAN_16_BIT_UINT = 'v'
25
- PACK_BIG_ENDIAN_16_BIT_UINT = 'n'
26
- PACK_NATIVE_32_BIT_INT = 'l'
27
- PACK_NATIVE_32_BIT_UINT = 'L'
28
- PACK_NATIVE_64_BIT_INT = 'q'
29
- PACK_NATIVE_64_BIT_UINT = 'Q'
30
- PACK_LITTLE_ENDIAN_32_BIT_UINT = 'V'
31
- PACK_BIG_ENDIAN_32_BIT_UINT = 'N'
32
- PACK_LITTLE_ENDIAN_32_BIT_FLOAT = 'e'
33
- PACK_LITTLE_ENDIAN_64_BIT_FLOAT = 'E'
34
- PACK_BIG_ENDIAN_32_BIT_FLOAT = 'g'
35
- PACK_BIG_ENDIAN_64_BIT_FLOAT = 'G'
36
- PACK_NULL_TERMINATED_STRING = 'Z*'
37
- PACK_BLOCK = 'a*'
38
- PACK_8_BIT_INT_ARRAY = 'c*'
39
- PACK_8_BIT_UINT_ARRAY = 'C*'
40
- PACK_NATIVE_16_BIT_INT_ARRAY = 's*'
41
- PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY = 'n*'
42
- PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY = 'v*'
43
- PACK_NATIVE_32_BIT_INT_ARRAY = 'l*'
44
- PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY = 'N*'
45
- PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY = 'V*'
46
- PACK_NATIVE_64_BIT_INT_ARRAY = 'q*'
47
- PACK_NATIVE_64_BIT_UINT_ARRAY = 'Q*'
48
- PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY = 'e*'
49
- PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY = 'E*'
50
- PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY = 'g*'
51
- PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY = 'G*'
52
-
53
- # Additional Constants
54
- ZERO_STRING = "\000"
55
-
56
- # Valid data types
57
- DATA_TYPES = [:INT, :UINT, :FLOAT, :STRING, :BLOCK]
58
-
59
- # Valid overflow types
60
- OVERFLOW_TYPES = [:TRUNCATE, :SATURATE, :ERROR, :ERROR_ALLOW_HEX]
61
-
62
- protected
63
-
64
- # Determines the endianness of the host running this code
65
- #
66
- # This method is protected to force the use of the constant
67
- # HOST_ENDIANNESS rather than this method
68
- #
69
- # @return [Symbol] :BIG_ENDIAN or :LITTLE_ENDIAN
70
- def self.get_host_endianness
71
- value = 0x01020304
72
- packed = [value].pack(PACK_NATIVE_32_BIT_UINT)
73
- unpacked = packed.unpack(PACK_LITTLE_ENDIAN_32_BIT_UINT)[0]
74
- if unpacked == value
75
- :LITTLE_ENDIAN
76
- else
77
- :BIG_ENDIAN
78
- end
79
- end
80
-
81
- def self.raise_buffer_error(read_write, buffer, data_type, given_bit_offset, given_bit_size)
82
- raise ArgumentError, "#{buffer.length} byte buffer insufficient to #{read_write} #{data_type} at bit_offset #{given_bit_offset} with bit_size #{given_bit_size}"
83
- end
84
-
85
- public
86
-
87
- # Store the host endianness so that it only has to be determined once
88
- HOST_ENDIANNESS = get_host_endianness()
89
- # Valid endianess
90
- ENDIANNESS = [:BIG_ENDIAN, :LITTLE_ENDIAN]
91
-
92
- # Reads binary data of any data type from a buffer
93
- #
94
- # @param bit_offset [Integer] Bit offset to the start of the item. A
95
- # negative number means to offset from the end of the buffer.
96
- # @param bit_size [Integer] Size of the item in bits
97
- # @param data_type [Symbol] {DATA_TYPES}
98
- # @param buffer [String] Binary string buffer to read from
99
- # @param endianness [Symbol] {ENDIANNESS}
100
- # @return [Integer] value read from the buffer
101
- # def self.read(bit_offset, bit_size, data_type, buffer, endianness)
102
-
103
- # Writes binary data of any data type to a buffer
104
- #
105
- # @param value [Varies] Value to write into the buffer
106
- # @param bit_offset [Integer] Bit offset to the start of the item. A
107
- # negative number means to offset from the end of the buffer.
108
- # @param bit_size [Integer] Size of the item in bits
109
- # @param data_type [Symbol] {DATA_TYPES}
110
- # @param buffer [String] Binary string buffer to write to
111
- # @param endianness [Symbol] {ENDIANNESS}
112
- # @param overflow [Symbol] {OVERFLOW_TYPES}
113
- # @return [Integer] value passed in as a parameter
114
- # def self.write(value, bit_offset, bit_size, data_type, buffer, endianness, overflow)
115
-
116
- # Reads an array of binary data of any data type from a buffer
117
- #
118
- # @param bit_offset [Integer] Bit offset to the start of the array. A
119
- # negative number means to offset from the end of the buffer.
120
- # @param bit_size [Integer] Size of each item in the array in bits
121
- # @param data_type [Symbol] {DATA_TYPES}
122
- # @param array_size [Integer] Size in bits of the array. 0 or negative means
123
- # fill the array with as many bit_size number of items that exist (negative
124
- # means excluding the final X number of bits).
125
- # @param buffer [String] Binary string buffer to read from
126
- # @param endianness [Symbol] {ENDIANNESS}
127
- # @return [Array] Array created from reading the buffer
128
- def self.read_array(bit_offset, bit_size, data_type, array_size, buffer, endianness)
129
- # Save given values of bit offset, bit size, and array_size
130
- given_bit_offset = bit_offset
131
- given_bit_size = bit_size
132
- given_array_size = array_size
133
-
134
- # Handle negative and zero bit sizes
135
- raise ArgumentError, "bit_size #{given_bit_size} must be positive for arrays" if bit_size <= 0
136
-
137
- # Handle negative bit offsets
138
- if bit_offset < 0
139
- bit_offset = ((buffer.length * 8) + bit_offset)
140
- raise_buffer_error(:read, buffer, data_type, given_bit_offset, given_bit_size) if bit_offset < 0
141
- end
142
-
143
- # Handle negative and zero array sizes
144
- if array_size <= 0
145
- if given_bit_offset < 0
146
- raise ArgumentError, "negative or zero array_size (#{given_array_size}) cannot be given with negative bit_offset (#{given_bit_offset})"
147
- else
148
- array_size = ((buffer.length * 8) - bit_offset + array_size)
149
- if array_size == 0
150
- return []
151
- elsif array_size < 0
152
- raise_buffer_error(:read, buffer, data_type, given_bit_offset, given_bit_size)
153
- end
154
- end
155
- end
156
-
157
- # Calculate number of items in the array
158
- # If there is a remainder then we have a problem
159
- raise ArgumentError, "array_size #{given_array_size} not a multiple of bit_size #{given_bit_size}" if array_size % bit_size != 0
160
- num_items = array_size / bit_size
161
-
162
- # Define bounds of string to access this item
163
- lower_bound = bit_offset / 8
164
- upper_bound = (bit_offset + array_size - 1) / 8
165
-
166
- # Check for byte alignment
167
- byte_aligned = ((bit_offset % 8) == 0)
168
-
169
- case data_type
170
- when :STRING, :BLOCK
171
- #######################################
172
- # Handle :STRING and :BLOCK data types
173
- #######################################
174
-
175
- if byte_aligned
176
- value = []
177
- num_items.times do
178
- value << self.read(bit_offset, bit_size, data_type, buffer, endianness)
179
- bit_offset += bit_size
180
- end
181
- else
182
- raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
183
- end
184
-
185
- when :INT, :UINT
186
- ###################################
187
- # Handle :INT and :UINT data types
188
- ###################################
189
-
190
- if byte_aligned and (bit_size == 8 or bit_size == 16 or bit_size == 32 or bit_size == 64)
191
- ###########################################################
192
- # Handle byte-aligned 8, 16, 32, and 64 bit :INT and :UINT
193
- ###########################################################
194
-
195
- case bit_size
196
- when 8
197
- if data_type == :INT
198
- value = buffer[lower_bound..upper_bound].unpack(PACK_8_BIT_INT_ARRAY)
199
- else # data_type == :UINT
200
- value = buffer[lower_bound..upper_bound].unpack(PACK_8_BIT_UINT_ARRAY)
201
- end
202
-
203
- when 16
204
- if data_type == :INT
205
- if endianness == HOST_ENDIANNESS
206
- value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_16_BIT_INT_ARRAY)
207
- else # endianness != HOST_ENDIANNESS
208
- temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 2)
209
- value = temp.to_s.unpack(PACK_NATIVE_16_BIT_INT_ARRAY)
210
- end
211
- else # data_type == :UINT
212
- if endianness == :BIG_ENDIAN
213
- value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY)
214
- else # endianness == :LITTLE_ENDIAN
215
- value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY)
216
- end
217
- end
218
-
219
- when 32
220
- if data_type == :INT
221
- if endianness == HOST_ENDIANNESS
222
- value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_32_BIT_INT_ARRAY)
223
- else # endianness != HOST_ENDIANNESS
224
- temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 4)
225
- value = temp.to_s.unpack(PACK_NATIVE_32_BIT_INT_ARRAY)
226
- end
227
- else # data_type == :UINT
228
- if endianness == :BIG_ENDIAN
229
- value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY)
230
- else # endianness == :LITTLE_ENDIAN
231
- value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY)
232
- end
233
- end
234
-
235
- when 64
236
- if data_type == :INT
237
- if endianness == HOST_ENDIANNESS
238
- value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_64_BIT_INT_ARRAY)
239
- else # endianness != HOST_ENDIANNESS
240
- temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 8)
241
- value = temp.to_s.unpack(PACK_NATIVE_64_BIT_INT_ARRAY)
242
- end
243
- else # data_type == :UINT
244
- if endianness == HOST_ENDIANNESS
245
- value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_64_BIT_UINT_ARRAY)
246
- else # endianness != HOST_ENDIANNESS
247
- temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 8)
248
- value = temp.to_s.unpack(PACK_NATIVE_64_BIT_UINT_ARRAY)
249
- end
250
- end
251
- end
252
-
253
- else
254
- ##################################
255
- # Handle :INT and :UINT Bitfields
256
- ##################################
257
- raise ArgumentError, "read_array does not support little endian bit fields with bit_size greater than 1-bit" if endianness == :LITTLE_ENDIAN and bit_size > 1
258
-
259
- value = []
260
- num_items.times do
261
- value << self.read(bit_offset, bit_size, data_type, buffer, endianness)
262
- bit_offset += bit_size
263
- end
264
- end
265
-
266
- when :FLOAT
267
- ##########################
268
- # Handle :FLOAT data type
269
- ##########################
270
-
271
- if byte_aligned
272
- case bit_size
273
- when 32
274
- if endianness == :BIG_ENDIAN
275
- value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY)
276
- else # endianness == :LITTLE_ENDIAN
277
- value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY)
278
- end
279
-
280
- when 64
281
- if endianness == :BIG_ENDIAN
282
- value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY)
283
- else # endianness == :LITTLE_ENDIAN
284
- value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY)
285
- end
286
-
287
- else
288
- raise ArgumentError, "bit_size is #{given_bit_size} but must be 32 or 64 for data_type #{data_type}"
289
- end
290
-
291
- else
292
- raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
293
- end
294
-
295
- else
296
- ############################
297
- # Handle Unknown data types
298
- ############################
299
-
300
- raise ArgumentError, "data_type #{data_type} is not recognized"
301
- end
302
-
303
- value
304
- end # def read_array
305
-
306
- # Writes an array of binary data of any data type to a buffer
307
- #
308
- # @param values [Array] Values to write into the buffer
309
- # @param bit_offset [Integer] Bit offset to the start of the array. A
310
- # negative number means to offset from the end of the buffer.
311
- # @param bit_size [Integer] Size of each item in the array in bits
312
- # @param data_type [Symbol] {DATA_TYPES}
313
- # @param array_size [Integer] Size in bits of the array as represented in the buffer.
314
- # Size 0 means to fill the buffer with as many bit_size number of items that exist
315
- # (negative means excluding the final X number of bits).
316
- # @param buffer [String] Binary string buffer to write to
317
- # @param endianness [Symbol] {ENDIANNESS}
318
- # @return [Array] values passed in as a parameter
319
- def self.write_array(values, bit_offset, bit_size, data_type, array_size, buffer, endianness, overflow)
320
- # Save given values of bit offset, bit size, and array_size
321
- given_bit_offset = bit_offset
322
- given_bit_size = bit_size
323
- given_array_size = array_size
324
-
325
- # Verify an array was given
326
- raise ArgumentError, "values must be an Array type class is #{values.class}" unless values.kind_of? Array
327
-
328
- # Handle negative and zero bit sizes
329
- raise ArgumentError, "bit_size #{given_bit_size} must be positive for arrays" if bit_size <= 0
330
-
331
- # Handle negative bit offsets
332
- if bit_offset < 0
333
- bit_offset = ((buffer.length * 8) + bit_offset)
334
- raise_buffer_error(:write, buffer, data_type, given_bit_offset, given_bit_size) if bit_offset < 0
335
- end
336
-
337
- # Handle negative and zero array sizes
338
- if array_size <= 0
339
- if given_bit_offset < 0
340
- raise ArgumentError, "negative or zero array_size (#{given_array_size}) cannot be given with negative bit_offset (#{given_bit_offset})"
341
- else
342
- end_bytes = -(given_array_size / 8)
343
- lower_bound = bit_offset / 8
344
- upper_bound = (bit_offset + (bit_size * values.length) - 1) / 8
345
- old_upper_bound = buffer.length - 1 - end_bytes
346
-
347
- if upper_bound < old_upper_bound
348
- # Remove extra bytes from old buffer
349
- buffer[(upper_bound + 1)..old_upper_bound] = ''
350
- elsif upper_bound > old_upper_bound
351
- # Grow buffer and preserve bytes at end of buffer if necesssary
352
- buffer_length = buffer.length
353
- diff = upper_bound - old_upper_bound
354
- buffer << ZERO_STRING * diff
355
- if end_bytes > 0
356
- buffer[(upper_bound + 1)..(buffer.length - 1)] = buffer[(old_upper_bound + 1)..(buffer_length - 1)]
357
- end
358
- end
359
-
360
- array_size = ((buffer.length * 8) - bit_offset + array_size)
361
- end
362
- end
363
-
364
- # Get data bounds for this array
365
- lower_bound = bit_offset / 8
366
- upper_bound = (bit_offset + array_size - 1) / 8
367
- num_bytes = upper_bound - lower_bound + 1
368
-
369
- # Check for byte alignment
370
- byte_aligned = ((bit_offset % 8) == 0)
371
-
372
- # Calculate the number of writes
373
- num_writes = array_size / bit_size
374
- # Check for a negative array_size and adjust the number of writes
375
- # to simply be the number of values in the passed in array
376
- if given_array_size <= 0
377
- num_writes = values.length
378
- end
379
-
380
- # Ensure the buffer has enough room
381
- if bit_offset + num_writes * bit_size > buffer.length * 8
382
- raise_buffer_error(:write, buffer, data_type, given_bit_offset, given_bit_size)
383
- end
384
-
385
- # Ensure the given_array_size is an even multiple of bit_size
386
- raise ArgumentError, "array_size #{given_array_size} not a multiple of bit_size #{given_bit_size}" if array_size % bit_size != 0
387
-
388
- raise ArgumentError, "too many values #{values.length} for given array_size #{given_array_size} and bit_size #{given_bit_size}" if num_writes < values.length
389
-
390
- # Check overflow type
391
- raise "unknown overflow type #{overflow}" unless OVERFLOW_TYPES.include?(overflow)
392
-
393
- case data_type
394
- when :STRING, :BLOCK
395
- #######################################
396
- # Handle :STRING and :BLOCK data types
397
- #######################################
398
-
399
- if byte_aligned
400
- num_writes.times do |index|
401
- self.write(values[index], bit_offset, bit_size, data_type, buffer, endianness, overflow)
402
- bit_offset += bit_size
403
- end
404
- else
405
- raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
406
- end
407
-
408
- when :INT, :UINT
409
- ###################################
410
- # Handle :INT and :UINT data types
411
- ###################################
412
-
413
- if byte_aligned and (bit_size == 8 or bit_size == 16 or bit_size == 32 or bit_size == 64)
414
- ###########################################################
415
- # Handle byte-aligned 8, 16, 32, and 64 bit :INT and :UINT
416
- ###########################################################
417
-
418
- case bit_size
419
- when 8
420
- if data_type == :INT
421
- values = self.check_overflow_array(values, -128, 127, 255, bit_size, data_type, overflow)
422
- packed = values.pack(PACK_8_BIT_INT_ARRAY)
423
- else # data_type == :UINT
424
- values = self.check_overflow_array(values, 0, 255, 255, bit_size, data_type, overflow)
425
- packed = values.pack(PACK_8_BIT_UINT_ARRAY)
426
- end
427
-
428
- when 16
429
- if data_type == :INT
430
- values = self.check_overflow_array(values, -32768, 32767, 65535, bit_size, data_type, overflow)
431
- if endianness == HOST_ENDIANNESS
432
- packed = values.pack(PACK_NATIVE_16_BIT_INT_ARRAY)
433
- else # endianness != HOST_ENDIANNESS
434
- packed = values.pack(PACK_NATIVE_16_BIT_INT_ARRAY)
435
- self.byte_swap_buffer!(packed, 2)
436
- end
437
- else # data_type == :UINT
438
- values = self.check_overflow_array(values, 0, 65535, 65535, bit_size, data_type, overflow)
439
- if endianness == :BIG_ENDIAN
440
- packed = values.pack(PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY)
441
- else # endianness == :LITTLE_ENDIAN
442
- packed = values.pack(PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY)
443
- end
444
- end
445
-
446
- when 32
447
- if data_type == :INT
448
- values = self.check_overflow_array(values, -2147483648, 2147483647, 4294967295, bit_size, data_type, overflow)
449
- if endianness == HOST_ENDIANNESS
450
- packed = values.pack(PACK_NATIVE_32_BIT_INT_ARRAY)
451
- else # endianness != HOST_ENDIANNESS
452
- packed = values.pack(PACK_NATIVE_32_BIT_INT_ARRAY)
453
- self.byte_swap_buffer!(packed, 4)
454
- end
455
- else # data_type == :UINT
456
- values = self.check_overflow_array(values, 0, 4294967295, 4294967295, bit_size, data_type, overflow)
457
- if endianness == :BIG_ENDIAN
458
- packed = values.pack(PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY)
459
- else # endianness == :LITTLE_ENDIAN
460
- packed = values.pack(PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY)
461
- end
462
- end
463
-
464
- when 64
465
- if data_type == :INT
466
- values = self.check_overflow_array(values, -9223372036854775808, 9223372036854775807, 18446744073709551615, bit_size, data_type, overflow)
467
- if endianness == HOST_ENDIANNESS
468
- packed = values.pack(PACK_NATIVE_64_BIT_INT_ARRAY)
469
- else # endianness != HOST_ENDIANNESS
470
- packed = values.pack(PACK_NATIVE_64_BIT_INT_ARRAY)
471
- self.byte_swap_buffer!(packed, 8)
472
- end
473
- else # data_type == :UINT
474
- values = self.check_overflow_array(values, 0, 18446744073709551615, 18446744073709551615, bit_size, data_type, overflow)
475
- if endianness == HOST_ENDIANNESS
476
- packed = values.pack(PACK_NATIVE_64_BIT_UINT_ARRAY)
477
- else # endianness != HOST_ENDIANNESS
478
- packed = values.pack(PACK_NATIVE_64_BIT_UINT_ARRAY)
479
- self.byte_swap_buffer!(packed, 8)
480
- end
481
- end
482
- end
483
-
484
- # Adjust packed size to hold number of items written
485
- buffer[lower_bound..upper_bound] = adjust_packed_size(num_bytes, packed) if num_bytes > 0
486
-
487
- else
488
- ##################################
489
- # Handle :INT and :UINT Bitfields
490
- ##################################
491
-
492
- raise ArgumentError, "write_array does not support little endian bit fields with bit_size greater than 1-bit" if endianness == :LITTLE_ENDIAN and bit_size > 1
493
-
494
- num_writes.times do |index|
495
- self.write(values[index], bit_offset, bit_size, data_type, buffer, endianness, overflow)
496
- bit_offset += bit_size
497
- end
498
- end
499
-
500
- when :FLOAT
501
- ##########################
502
- # Handle :FLOAT data type
503
- ##########################
504
-
505
- if byte_aligned
506
- case bit_size
507
- when 32
508
- if endianness == :BIG_ENDIAN
509
- packed = values.pack(PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY)
510
- else # endianness == :LITTLE_ENDIAN
511
- packed = values.pack(PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY)
512
- end
513
-
514
- when 64
515
- if endianness == :BIG_ENDIAN
516
- packed = values.pack(PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY)
517
- else # endianness == :LITTLE_ENDIAN
518
- packed = values.pack(PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY)
519
- end
520
-
521
- else
522
- raise ArgumentError, "bit_size is #{given_bit_size} but must be 32 or 64 for data_type #{data_type}"
523
- end
524
-
525
- # Adjust packed size to hold number of items written
526
- buffer[lower_bound..upper_bound] = adjust_packed_size(num_bytes, packed) if num_bytes > 0
527
-
528
- else
529
- raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
530
- end
531
-
532
- else
533
- ############################
534
- # Handle Unknown data types
535
- ############################
536
- raise ArgumentError, "data_type #{data_type} is not recognized"
537
- end # case data_type
538
-
539
- values
540
- end # def write_array
541
-
542
- # Adjusts the packed array to be the given number of bytes
543
- #
544
- # @param num_bytes [Integer] The desired number of bytes
545
- # @param packet [Array] The packed data buffer
546
- def self.adjust_packed_size(num_bytes, packed)
547
- difference = num_bytes - packed.length
548
- if difference > 0
549
- packed << (ZERO_STRING * difference)
550
- elsif difference < 0
551
- packed = packed[0..(packed.length - 1 + difference)]
552
- end
553
- packed
554
- end
555
-
556
- # Byte swaps every X bytes of data in a buffer overwriting the buffer
557
- #
558
- # @param buffer [String] Buffer to modify
559
- # @param num_bytes_per_word [Integer] Number of bytes per word that will be swapped
560
- # @return [String] buffer passed in as a parameter
561
- def self.byte_swap_buffer!(buffer, num_bytes_per_word)
562
- num_swaps = buffer.length / num_bytes_per_word
563
- index = 0
564
- num_swaps.times do
565
- range = index..(index + num_bytes_per_word - 1)
566
- buffer[range] = buffer[range].reverse
567
- index += num_bytes_per_word
568
- end
569
- buffer
570
- end
571
-
572
- # Byte swaps every X bytes of data in a buffer into a new buffer
573
- #
574
- # @param buffer [String] Buffer that will be copied then modified
575
- # @param num_bytes_per_word [Integer] Number of bytes per word that will be swapped
576
- # @return [String] modified buffer
577
- def self.byte_swap_buffer(buffer, num_bytes_per_word)
578
- buffer = buffer.clone
579
- self.byte_swap_buffer!(buffer, num_bytes_per_word)
580
- end
581
-
582
- # Checks for overflow of an integer data type
583
- #
584
- # @param value [Integer] Value to write into the buffer
585
- # @param min_value [Integer] Minimum allowed value
586
- # @param max_value [Integer] Maximum allowed value
587
- # @param hex_max_value [Integer] Maximum allowed value if specified in hex
588
- # @param bit_size [Integer] Size of the item in bits
589
- # @param data_type [Symbol] {DATA_TYPES}
590
- # @param overflow [Symbol] {OVERFLOW_TYPES}
591
- # @return [Integer] Potentially modified value
592
- def self.check_overflow(value, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
593
- if overflow != :TRUNCATE
594
- if value > max_value
595
- if overflow == :SATURATE
596
- value = max_value
597
- else
598
- if overflow == :ERROR or value > hex_max_value
599
- raise ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}"
600
- end
601
- end
602
- elsif value < min_value
603
- if overflow == :SATURATE
604
- value = min_value
605
- else
606
- raise ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}"
607
- end
608
- end
609
- end
610
- value
611
- end
612
-
613
- # Checks for overflow of an array of integer data types
614
- #
615
- # @param values [Array[Integer]] Values to write into the buffer
616
- # @param min_value [Integer] Minimum allowed value
617
- # @param max_value [Integer] Maximum allowed value
618
- # @param hex_max_value [Integer] Maximum allowed value if specified in hex
619
- # @param bit_size [Integer] Size of the item in bits
620
- # @param data_type [Symbol] {DATA_TYPES}
621
- # @param overflow [Symbol] {OVERFLOW_TYPES}
622
- # @return [Array[Integer]] Potentially modified values
623
- def self.check_overflow_array(values, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
624
- if overflow != :TRUNCATE
625
- values.each_with_index do |value, index|
626
- values[index] = check_overflow(value, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
627
- end
628
- end
629
- values
630
- end
631
-
632
- end # class BinaryAccessor
633
-
634
- 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 Lesser 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
+ # This file contains the implementation of the BinaryAccessor class.
12
+ # This class allows for easy reading and writing of binary data in Ruby
13
+
14
+ require 'cosmos/ext/packet'
15
+
16
+ module Cosmos
17
+
18
+ # Provides methods for binary reading and writing
19
+ class BinaryAccessor
20
+
21
+ # Constants for ruby packing directives
22
+ PACK_8_BIT_INT = 'c'
23
+ PACK_NATIVE_16_BIT_INT = 's'
24
+ PACK_LITTLE_ENDIAN_16_BIT_UINT = 'v'
25
+ PACK_BIG_ENDIAN_16_BIT_UINT = 'n'
26
+ PACK_NATIVE_32_BIT_INT = 'l'
27
+ PACK_NATIVE_32_BIT_UINT = 'L'
28
+ PACK_NATIVE_64_BIT_INT = 'q'
29
+ PACK_NATIVE_64_BIT_UINT = 'Q'
30
+ PACK_LITTLE_ENDIAN_32_BIT_UINT = 'V'
31
+ PACK_BIG_ENDIAN_32_BIT_UINT = 'N'
32
+ PACK_LITTLE_ENDIAN_32_BIT_FLOAT = 'e'
33
+ PACK_LITTLE_ENDIAN_64_BIT_FLOAT = 'E'
34
+ PACK_BIG_ENDIAN_32_BIT_FLOAT = 'g'
35
+ PACK_BIG_ENDIAN_64_BIT_FLOAT = 'G'
36
+ PACK_NULL_TERMINATED_STRING = 'Z*'
37
+ PACK_BLOCK = 'a*'
38
+ PACK_8_BIT_INT_ARRAY = 'c*'
39
+ PACK_8_BIT_UINT_ARRAY = 'C*'
40
+ PACK_NATIVE_16_BIT_INT_ARRAY = 's*'
41
+ PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY = 'n*'
42
+ PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY = 'v*'
43
+ PACK_NATIVE_32_BIT_INT_ARRAY = 'l*'
44
+ PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY = 'N*'
45
+ PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY = 'V*'
46
+ PACK_NATIVE_64_BIT_INT_ARRAY = 'q*'
47
+ PACK_NATIVE_64_BIT_UINT_ARRAY = 'Q*'
48
+ PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY = 'e*'
49
+ PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY = 'E*'
50
+ PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY = 'g*'
51
+ PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY = 'G*'
52
+
53
+ # Additional Constants
54
+ ZERO_STRING = "\000"
55
+
56
+ # Valid data types
57
+ DATA_TYPES = [:INT, :UINT, :FLOAT, :STRING, :BLOCK]
58
+
59
+ # Valid overflow types
60
+ OVERFLOW_TYPES = [:TRUNCATE, :SATURATE, :ERROR, :ERROR_ALLOW_HEX]
61
+
62
+ protected
63
+
64
+ # Determines the endianness of the host running this code
65
+ #
66
+ # This method is protected to force the use of the constant
67
+ # HOST_ENDIANNESS rather than this method
68
+ #
69
+ # @return [Symbol] :BIG_ENDIAN or :LITTLE_ENDIAN
70
+ def self.get_host_endianness
71
+ value = 0x01020304
72
+ packed = [value].pack(PACK_NATIVE_32_BIT_UINT)
73
+ unpacked = packed.unpack(PACK_LITTLE_ENDIAN_32_BIT_UINT)[0]
74
+ if unpacked == value
75
+ :LITTLE_ENDIAN
76
+ else
77
+ :BIG_ENDIAN
78
+ end
79
+ end
80
+
81
+ def self.raise_buffer_error(read_write, buffer, data_type, given_bit_offset, given_bit_size)
82
+ raise ArgumentError, "#{buffer.length} byte buffer insufficient to #{read_write} #{data_type} at bit_offset #{given_bit_offset} with bit_size #{given_bit_size}"
83
+ end
84
+
85
+ public
86
+
87
+ # Store the host endianness so that it only has to be determined once
88
+ HOST_ENDIANNESS = get_host_endianness()
89
+ # Valid endianess
90
+ ENDIANNESS = [:BIG_ENDIAN, :LITTLE_ENDIAN]
91
+
92
+ # Reads binary data of any data type from a buffer
93
+ #
94
+ # @param bit_offset [Integer] Bit offset to the start of the item. A
95
+ # negative number means to offset from the end of the buffer.
96
+ # @param bit_size [Integer] Size of the item in bits
97
+ # @param data_type [Symbol] {DATA_TYPES}
98
+ # @param buffer [String] Binary string buffer to read from
99
+ # @param endianness [Symbol] {ENDIANNESS}
100
+ # @return [Integer] value read from the buffer
101
+ # def self.read(bit_offset, bit_size, data_type, buffer, endianness)
102
+
103
+ # Writes binary data of any data type to a buffer
104
+ #
105
+ # @param value [Varies] Value to write into the buffer
106
+ # @param bit_offset [Integer] Bit offset to the start of the item. A
107
+ # negative number means to offset from the end of the buffer.
108
+ # @param bit_size [Integer] Size of the item in bits
109
+ # @param data_type [Symbol] {DATA_TYPES}
110
+ # @param buffer [String] Binary string buffer to write to
111
+ # @param endianness [Symbol] {ENDIANNESS}
112
+ # @param overflow [Symbol] {OVERFLOW_TYPES}
113
+ # @return [Integer] value passed in as a parameter
114
+ # def self.write(value, bit_offset, bit_size, data_type, buffer, endianness, overflow)
115
+
116
+ # Reads an array of binary data of any data type from a buffer
117
+ #
118
+ # @param bit_offset [Integer] Bit offset to the start of the array. A
119
+ # negative number means to offset from the end of the buffer.
120
+ # @param bit_size [Integer] Size of each item in the array in bits
121
+ # @param data_type [Symbol] {DATA_TYPES}
122
+ # @param array_size [Integer] Size in bits of the array. 0 or negative means
123
+ # fill the array with as many bit_size number of items that exist (negative
124
+ # means excluding the final X number of bits).
125
+ # @param buffer [String] Binary string buffer to read from
126
+ # @param endianness [Symbol] {ENDIANNESS}
127
+ # @return [Array] Array created from reading the buffer
128
+ def self.read_array(bit_offset, bit_size, data_type, array_size, buffer, endianness)
129
+ # Save given values of bit offset, bit size, and array_size
130
+ given_bit_offset = bit_offset
131
+ given_bit_size = bit_size
132
+ given_array_size = array_size
133
+
134
+ # Handle negative and zero bit sizes
135
+ raise ArgumentError, "bit_size #{given_bit_size} must be positive for arrays" if bit_size <= 0
136
+
137
+ # Handle negative bit offsets
138
+ if bit_offset < 0
139
+ bit_offset = ((buffer.length * 8) + bit_offset)
140
+ raise_buffer_error(:read, buffer, data_type, given_bit_offset, given_bit_size) if bit_offset < 0
141
+ end
142
+
143
+ # Handle negative and zero array sizes
144
+ if array_size <= 0
145
+ if given_bit_offset < 0
146
+ raise ArgumentError, "negative or zero array_size (#{given_array_size}) cannot be given with negative bit_offset (#{given_bit_offset})"
147
+ else
148
+ array_size = ((buffer.length * 8) - bit_offset + array_size)
149
+ if array_size == 0
150
+ return []
151
+ elsif array_size < 0
152
+ raise_buffer_error(:read, buffer, data_type, given_bit_offset, given_bit_size)
153
+ end
154
+ end
155
+ end
156
+
157
+ # Calculate number of items in the array
158
+ # If there is a remainder then we have a problem
159
+ raise ArgumentError, "array_size #{given_array_size} not a multiple of bit_size #{given_bit_size}" if array_size % bit_size != 0
160
+ num_items = array_size / bit_size
161
+
162
+ # Define bounds of string to access this item
163
+ lower_bound = bit_offset / 8
164
+ upper_bound = (bit_offset + array_size - 1) / 8
165
+
166
+ # Check for byte alignment
167
+ byte_aligned = ((bit_offset % 8) == 0)
168
+
169
+ case data_type
170
+ when :STRING, :BLOCK
171
+ #######################################
172
+ # Handle :STRING and :BLOCK data types
173
+ #######################################
174
+
175
+ if byte_aligned
176
+ value = []
177
+ num_items.times do
178
+ value << self.read(bit_offset, bit_size, data_type, buffer, endianness)
179
+ bit_offset += bit_size
180
+ end
181
+ else
182
+ raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
183
+ end
184
+
185
+ when :INT, :UINT
186
+ ###################################
187
+ # Handle :INT and :UINT data types
188
+ ###################################
189
+
190
+ if byte_aligned and (bit_size == 8 or bit_size == 16 or bit_size == 32 or bit_size == 64)
191
+ ###########################################################
192
+ # Handle byte-aligned 8, 16, 32, and 64 bit :INT and :UINT
193
+ ###########################################################
194
+
195
+ case bit_size
196
+ when 8
197
+ if data_type == :INT
198
+ value = buffer[lower_bound..upper_bound].unpack(PACK_8_BIT_INT_ARRAY)
199
+ else # data_type == :UINT
200
+ value = buffer[lower_bound..upper_bound].unpack(PACK_8_BIT_UINT_ARRAY)
201
+ end
202
+
203
+ when 16
204
+ if data_type == :INT
205
+ if endianness == HOST_ENDIANNESS
206
+ value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_16_BIT_INT_ARRAY)
207
+ else # endianness != HOST_ENDIANNESS
208
+ temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 2)
209
+ value = temp.to_s.unpack(PACK_NATIVE_16_BIT_INT_ARRAY)
210
+ end
211
+ else # data_type == :UINT
212
+ if endianness == :BIG_ENDIAN
213
+ value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY)
214
+ else # endianness == :LITTLE_ENDIAN
215
+ value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY)
216
+ end
217
+ end
218
+
219
+ when 32
220
+ if data_type == :INT
221
+ if endianness == HOST_ENDIANNESS
222
+ value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_32_BIT_INT_ARRAY)
223
+ else # endianness != HOST_ENDIANNESS
224
+ temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 4)
225
+ value = temp.to_s.unpack(PACK_NATIVE_32_BIT_INT_ARRAY)
226
+ end
227
+ else # data_type == :UINT
228
+ if endianness == :BIG_ENDIAN
229
+ value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY)
230
+ else # endianness == :LITTLE_ENDIAN
231
+ value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY)
232
+ end
233
+ end
234
+
235
+ when 64
236
+ if data_type == :INT
237
+ if endianness == HOST_ENDIANNESS
238
+ value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_64_BIT_INT_ARRAY)
239
+ else # endianness != HOST_ENDIANNESS
240
+ temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 8)
241
+ value = temp.to_s.unpack(PACK_NATIVE_64_BIT_INT_ARRAY)
242
+ end
243
+ else # data_type == :UINT
244
+ if endianness == HOST_ENDIANNESS
245
+ value = buffer[lower_bound..upper_bound].unpack(PACK_NATIVE_64_BIT_UINT_ARRAY)
246
+ else # endianness != HOST_ENDIANNESS
247
+ temp = self.byte_swap_buffer(buffer[lower_bound..upper_bound], 8)
248
+ value = temp.to_s.unpack(PACK_NATIVE_64_BIT_UINT_ARRAY)
249
+ end
250
+ end
251
+ end
252
+
253
+ else
254
+ ##################################
255
+ # Handle :INT and :UINT Bitfields
256
+ ##################################
257
+ raise ArgumentError, "read_array does not support little endian bit fields with bit_size greater than 1-bit" if endianness == :LITTLE_ENDIAN and bit_size > 1
258
+
259
+ value = []
260
+ num_items.times do
261
+ value << self.read(bit_offset, bit_size, data_type, buffer, endianness)
262
+ bit_offset += bit_size
263
+ end
264
+ end
265
+
266
+ when :FLOAT
267
+ ##########################
268
+ # Handle :FLOAT data type
269
+ ##########################
270
+
271
+ if byte_aligned
272
+ case bit_size
273
+ when 32
274
+ if endianness == :BIG_ENDIAN
275
+ value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY)
276
+ else # endianness == :LITTLE_ENDIAN
277
+ value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY)
278
+ end
279
+
280
+ when 64
281
+ if endianness == :BIG_ENDIAN
282
+ value = buffer[lower_bound..upper_bound].unpack(PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY)
283
+ else # endianness == :LITTLE_ENDIAN
284
+ value = buffer[lower_bound..upper_bound].unpack(PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY)
285
+ end
286
+
287
+ else
288
+ raise ArgumentError, "bit_size is #{given_bit_size} but must be 32 or 64 for data_type #{data_type}"
289
+ end
290
+
291
+ else
292
+ raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
293
+ end
294
+
295
+ else
296
+ ############################
297
+ # Handle Unknown data types
298
+ ############################
299
+
300
+ raise ArgumentError, "data_type #{data_type} is not recognized"
301
+ end
302
+
303
+ value
304
+ end # def read_array
305
+
306
+ # Writes an array of binary data of any data type to a buffer
307
+ #
308
+ # @param values [Array] Values to write into the buffer
309
+ # @param bit_offset [Integer] Bit offset to the start of the array. A
310
+ # negative number means to offset from the end of the buffer.
311
+ # @param bit_size [Integer] Size of each item in the array in bits
312
+ # @param data_type [Symbol] {DATA_TYPES}
313
+ # @param array_size [Integer] Size in bits of the array as represented in the buffer.
314
+ # Size 0 means to fill the buffer with as many bit_size number of items that exist
315
+ # (negative means excluding the final X number of bits).
316
+ # @param buffer [String] Binary string buffer to write to
317
+ # @param endianness [Symbol] {ENDIANNESS}
318
+ # @return [Array] values passed in as a parameter
319
+ def self.write_array(values, bit_offset, bit_size, data_type, array_size, buffer, endianness, overflow)
320
+ # Save given values of bit offset, bit size, and array_size
321
+ given_bit_offset = bit_offset
322
+ given_bit_size = bit_size
323
+ given_array_size = array_size
324
+
325
+ # Verify an array was given
326
+ raise ArgumentError, "values must be an Array type class is #{values.class}" unless values.kind_of? Array
327
+
328
+ # Handle negative and zero bit sizes
329
+ raise ArgumentError, "bit_size #{given_bit_size} must be positive for arrays" if bit_size <= 0
330
+
331
+ # Handle negative bit offsets
332
+ if bit_offset < 0
333
+ bit_offset = ((buffer.length * 8) + bit_offset)
334
+ raise_buffer_error(:write, buffer, data_type, given_bit_offset, given_bit_size) if bit_offset < 0
335
+ end
336
+
337
+ # Handle negative and zero array sizes
338
+ if array_size <= 0
339
+ if given_bit_offset < 0
340
+ raise ArgumentError, "negative or zero array_size (#{given_array_size}) cannot be given with negative bit_offset (#{given_bit_offset})"
341
+ else
342
+ end_bytes = -(given_array_size / 8)
343
+ lower_bound = bit_offset / 8
344
+ upper_bound = (bit_offset + (bit_size * values.length) - 1) / 8
345
+ old_upper_bound = buffer.length - 1 - end_bytes
346
+
347
+ if upper_bound < old_upper_bound
348
+ # Remove extra bytes from old buffer
349
+ buffer[(upper_bound + 1)..old_upper_bound] = ''
350
+ elsif upper_bound > old_upper_bound
351
+ # Grow buffer and preserve bytes at end of buffer if necesssary
352
+ buffer_length = buffer.length
353
+ diff = upper_bound - old_upper_bound
354
+ buffer << ZERO_STRING * diff
355
+ if end_bytes > 0
356
+ buffer[(upper_bound + 1)..(buffer.length - 1)] = buffer[(old_upper_bound + 1)..(buffer_length - 1)]
357
+ end
358
+ end
359
+
360
+ array_size = ((buffer.length * 8) - bit_offset + array_size)
361
+ end
362
+ end
363
+
364
+ # Get data bounds for this array
365
+ lower_bound = bit_offset / 8
366
+ upper_bound = (bit_offset + array_size - 1) / 8
367
+ num_bytes = upper_bound - lower_bound + 1
368
+
369
+ # Check for byte alignment
370
+ byte_aligned = ((bit_offset % 8) == 0)
371
+
372
+ # Calculate the number of writes
373
+ num_writes = array_size / bit_size
374
+ # Check for a negative array_size and adjust the number of writes
375
+ # to simply be the number of values in the passed in array
376
+ if given_array_size <= 0
377
+ num_writes = values.length
378
+ end
379
+
380
+ # Ensure the buffer has enough room
381
+ if bit_offset + num_writes * bit_size > buffer.length * 8
382
+ raise_buffer_error(:write, buffer, data_type, given_bit_offset, given_bit_size)
383
+ end
384
+
385
+ # Ensure the given_array_size is an even multiple of bit_size
386
+ raise ArgumentError, "array_size #{given_array_size} not a multiple of bit_size #{given_bit_size}" if array_size % bit_size != 0
387
+
388
+ raise ArgumentError, "too many values #{values.length} for given array_size #{given_array_size} and bit_size #{given_bit_size}" if num_writes < values.length
389
+
390
+ # Check overflow type
391
+ raise "unknown overflow type #{overflow}" unless OVERFLOW_TYPES.include?(overflow)
392
+
393
+ case data_type
394
+ when :STRING, :BLOCK
395
+ #######################################
396
+ # Handle :STRING and :BLOCK data types
397
+ #######################################
398
+
399
+ if byte_aligned
400
+ num_writes.times do |index|
401
+ self.write(values[index], bit_offset, bit_size, data_type, buffer, endianness, overflow)
402
+ bit_offset += bit_size
403
+ end
404
+ else
405
+ raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
406
+ end
407
+
408
+ when :INT, :UINT
409
+ ###################################
410
+ # Handle :INT and :UINT data types
411
+ ###################################
412
+
413
+ if byte_aligned and (bit_size == 8 or bit_size == 16 or bit_size == 32 or bit_size == 64)
414
+ ###########################################################
415
+ # Handle byte-aligned 8, 16, 32, and 64 bit :INT and :UINT
416
+ ###########################################################
417
+
418
+ case bit_size
419
+ when 8
420
+ if data_type == :INT
421
+ values = self.check_overflow_array(values, -128, 127, 255, bit_size, data_type, overflow)
422
+ packed = values.pack(PACK_8_BIT_INT_ARRAY)
423
+ else # data_type == :UINT
424
+ values = self.check_overflow_array(values, 0, 255, 255, bit_size, data_type, overflow)
425
+ packed = values.pack(PACK_8_BIT_UINT_ARRAY)
426
+ end
427
+
428
+ when 16
429
+ if data_type == :INT
430
+ values = self.check_overflow_array(values, -32768, 32767, 65535, bit_size, data_type, overflow)
431
+ if endianness == HOST_ENDIANNESS
432
+ packed = values.pack(PACK_NATIVE_16_BIT_INT_ARRAY)
433
+ else # endianness != HOST_ENDIANNESS
434
+ packed = values.pack(PACK_NATIVE_16_BIT_INT_ARRAY)
435
+ self.byte_swap_buffer!(packed, 2)
436
+ end
437
+ else # data_type == :UINT
438
+ values = self.check_overflow_array(values, 0, 65535, 65535, bit_size, data_type, overflow)
439
+ if endianness == :BIG_ENDIAN
440
+ packed = values.pack(PACK_BIG_ENDIAN_16_BIT_UINT_ARRAY)
441
+ else # endianness == :LITTLE_ENDIAN
442
+ packed = values.pack(PACK_LITTLE_ENDIAN_16_BIT_UINT_ARRAY)
443
+ end
444
+ end
445
+
446
+ when 32
447
+ if data_type == :INT
448
+ values = self.check_overflow_array(values, -2147483648, 2147483647, 4294967295, bit_size, data_type, overflow)
449
+ if endianness == HOST_ENDIANNESS
450
+ packed = values.pack(PACK_NATIVE_32_BIT_INT_ARRAY)
451
+ else # endianness != HOST_ENDIANNESS
452
+ packed = values.pack(PACK_NATIVE_32_BIT_INT_ARRAY)
453
+ self.byte_swap_buffer!(packed, 4)
454
+ end
455
+ else # data_type == :UINT
456
+ values = self.check_overflow_array(values, 0, 4294967295, 4294967295, bit_size, data_type, overflow)
457
+ if endianness == :BIG_ENDIAN
458
+ packed = values.pack(PACK_BIG_ENDIAN_32_BIT_UINT_ARRAY)
459
+ else # endianness == :LITTLE_ENDIAN
460
+ packed = values.pack(PACK_LITTLE_ENDIAN_32_BIT_UINT_ARRAY)
461
+ end
462
+ end
463
+
464
+ when 64
465
+ if data_type == :INT
466
+ values = self.check_overflow_array(values, -9223372036854775808, 9223372036854775807, 18446744073709551615, bit_size, data_type, overflow)
467
+ if endianness == HOST_ENDIANNESS
468
+ packed = values.pack(PACK_NATIVE_64_BIT_INT_ARRAY)
469
+ else # endianness != HOST_ENDIANNESS
470
+ packed = values.pack(PACK_NATIVE_64_BIT_INT_ARRAY)
471
+ self.byte_swap_buffer!(packed, 8)
472
+ end
473
+ else # data_type == :UINT
474
+ values = self.check_overflow_array(values, 0, 18446744073709551615, 18446744073709551615, bit_size, data_type, overflow)
475
+ if endianness == HOST_ENDIANNESS
476
+ packed = values.pack(PACK_NATIVE_64_BIT_UINT_ARRAY)
477
+ else # endianness != HOST_ENDIANNESS
478
+ packed = values.pack(PACK_NATIVE_64_BIT_UINT_ARRAY)
479
+ self.byte_swap_buffer!(packed, 8)
480
+ end
481
+ end
482
+ end
483
+
484
+ # Adjust packed size to hold number of items written
485
+ buffer[lower_bound..upper_bound] = adjust_packed_size(num_bytes, packed) if num_bytes > 0
486
+
487
+ else
488
+ ##################################
489
+ # Handle :INT and :UINT Bitfields
490
+ ##################################
491
+
492
+ raise ArgumentError, "write_array does not support little endian bit fields with bit_size greater than 1-bit" if endianness == :LITTLE_ENDIAN and bit_size > 1
493
+
494
+ num_writes.times do |index|
495
+ self.write(values[index], bit_offset, bit_size, data_type, buffer, endianness, overflow)
496
+ bit_offset += bit_size
497
+ end
498
+ end
499
+
500
+ when :FLOAT
501
+ ##########################
502
+ # Handle :FLOAT data type
503
+ ##########################
504
+
505
+ if byte_aligned
506
+ case bit_size
507
+ when 32
508
+ if endianness == :BIG_ENDIAN
509
+ packed = values.pack(PACK_BIG_ENDIAN_32_BIT_FLOAT_ARRAY)
510
+ else # endianness == :LITTLE_ENDIAN
511
+ packed = values.pack(PACK_LITTLE_ENDIAN_32_BIT_FLOAT_ARRAY)
512
+ end
513
+
514
+ when 64
515
+ if endianness == :BIG_ENDIAN
516
+ packed = values.pack(PACK_BIG_ENDIAN_64_BIT_FLOAT_ARRAY)
517
+ else # endianness == :LITTLE_ENDIAN
518
+ packed = values.pack(PACK_LITTLE_ENDIAN_64_BIT_FLOAT_ARRAY)
519
+ end
520
+
521
+ else
522
+ raise ArgumentError, "bit_size is #{given_bit_size} but must be 32 or 64 for data_type #{data_type}"
523
+ end
524
+
525
+ # Adjust packed size to hold number of items written
526
+ buffer[lower_bound..upper_bound] = adjust_packed_size(num_bytes, packed) if num_bytes > 0
527
+
528
+ else
529
+ raise ArgumentError, "bit_offset #{given_bit_offset} is not byte aligned for data_type #{data_type}"
530
+ end
531
+
532
+ else
533
+ ############################
534
+ # Handle Unknown data types
535
+ ############################
536
+ raise ArgumentError, "data_type #{data_type} is not recognized"
537
+ end # case data_type
538
+
539
+ values
540
+ end # def write_array
541
+
542
+ # Adjusts the packed array to be the given number of bytes
543
+ #
544
+ # @param num_bytes [Integer] The desired number of bytes
545
+ # @param packet [Array] The packed data buffer
546
+ def self.adjust_packed_size(num_bytes, packed)
547
+ difference = num_bytes - packed.length
548
+ if difference > 0
549
+ packed << (ZERO_STRING * difference)
550
+ elsif difference < 0
551
+ packed = packed[0..(packed.length - 1 + difference)]
552
+ end
553
+ packed
554
+ end
555
+
556
+ # Byte swaps every X bytes of data in a buffer overwriting the buffer
557
+ #
558
+ # @param buffer [String] Buffer to modify
559
+ # @param num_bytes_per_word [Integer] Number of bytes per word that will be swapped
560
+ # @return [String] buffer passed in as a parameter
561
+ def self.byte_swap_buffer!(buffer, num_bytes_per_word)
562
+ num_swaps = buffer.length / num_bytes_per_word
563
+ index = 0
564
+ num_swaps.times do
565
+ range = index..(index + num_bytes_per_word - 1)
566
+ buffer[range] = buffer[range].reverse
567
+ index += num_bytes_per_word
568
+ end
569
+ buffer
570
+ end
571
+
572
+ # Byte swaps every X bytes of data in a buffer into a new buffer
573
+ #
574
+ # @param buffer [String] Buffer that will be copied then modified
575
+ # @param num_bytes_per_word [Integer] Number of bytes per word that will be swapped
576
+ # @return [String] modified buffer
577
+ def self.byte_swap_buffer(buffer, num_bytes_per_word)
578
+ buffer = buffer.clone
579
+ self.byte_swap_buffer!(buffer, num_bytes_per_word)
580
+ end
581
+
582
+ # Checks for overflow of an integer data type
583
+ #
584
+ # @param value [Integer] Value to write into the buffer
585
+ # @param min_value [Integer] Minimum allowed value
586
+ # @param max_value [Integer] Maximum allowed value
587
+ # @param hex_max_value [Integer] Maximum allowed value if specified in hex
588
+ # @param bit_size [Integer] Size of the item in bits
589
+ # @param data_type [Symbol] {DATA_TYPES}
590
+ # @param overflow [Symbol] {OVERFLOW_TYPES}
591
+ # @return [Integer] Potentially modified value
592
+ def self.check_overflow(value, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
593
+ if overflow != :TRUNCATE
594
+ if value > max_value
595
+ if overflow == :SATURATE
596
+ value = max_value
597
+ else
598
+ if overflow == :ERROR or value > hex_max_value
599
+ raise ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}"
600
+ end
601
+ end
602
+ elsif value < min_value
603
+ if overflow == :SATURATE
604
+ value = min_value
605
+ else
606
+ raise ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}"
607
+ end
608
+ end
609
+ end
610
+ value
611
+ end
612
+
613
+ # Checks for overflow of an array of integer data types
614
+ #
615
+ # @param values [Array[Integer]] Values to write into the buffer
616
+ # @param min_value [Integer] Minimum allowed value
617
+ # @param max_value [Integer] Maximum allowed value
618
+ # @param hex_max_value [Integer] Maximum allowed value if specified in hex
619
+ # @param bit_size [Integer] Size of the item in bits
620
+ # @param data_type [Symbol] {DATA_TYPES}
621
+ # @param overflow [Symbol] {OVERFLOW_TYPES}
622
+ # @return [Array[Integer]] Potentially modified values
623
+ def self.check_overflow_array(values, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
624
+ if overflow != :TRUNCATE
625
+ values.each_with_index do |value, index|
626
+ values[index] = check_overflow(value, min_value, max_value, hex_max_value, bit_size, data_type, overflow)
627
+ end
628
+ end
629
+ values
630
+ end
631
+
632
+ end # class BinaryAccessor
633
+
634
+ end # module Cosmos