cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,894 +1,894 @@
1
- /*
2
- # Copyright 2014 Ball Aerospace & Technologies Corp.
3
- # All Rights Reserved.
4
- #
5
- # This program is free software; you can modify and/or redistribute it
6
- # under the terms of the GNU Lesser General Public License
7
- # as published by the Free Software Foundation; version 3 with
8
- # attribution addendums as found in the LICENSE.txt
9
- */
10
-
11
- #include "ruby.h"
12
- #include "stdio.h"
13
-
14
- static const int endianness_check = 1;
15
- static VALUE HOST_ENDIANNESS = Qnil;
16
- static VALUE ZERO_STRING = Qnil;
17
- static VALUE ASCII_8BIT_STRING = Qnil;
18
-
19
- static VALUE mCosmos = Qnil;
20
- static VALUE cBinaryAccessor = Qnil;
21
- static VALUE cStructure = Qnil;
22
- static VALUE cStructureItem = Qnil;
23
-
24
- static ID id_method_to_s = 0;
25
- static ID id_method_raise_buffer_error = 0;
26
- static ID id_method_read_array = 0;
27
- static ID id_method_force_encoding = 0;
28
- static ID id_method_freeze = 0;
29
-
30
- static ID id_ivar_buffer = 0;
31
- static ID id_ivar_bit_offset = 0;
32
- static ID id_ivar_bit_size = 0;
33
- static ID id_ivar_array_size = 0;
34
- static ID id_ivar_endianness = 0;
35
- static ID id_ivar_data_type = 0;
36
- static ID id_ivar_default_endianness = 0;
37
- static ID id_ivar_item_class = 0;
38
- static ID id_ivar_items = 0;
39
- static ID id_ivar_sorted_items = 0;
40
- static ID id_ivar_defined_length = 0;
41
- static ID id_ivar_defined_length_bits = 0;
42
- static ID id_ivar_pos_bit_size = 0;
43
- static ID id_ivar_neg_bit_size = 0;
44
- static ID id_ivar_fixed_size = 0;
45
- static ID id_ivar_short_buffer_allowed = 0;
46
- static ID id_ivar_mutex = 0;
47
-
48
- static ID id_const_ZERO_STRING = 0;
49
-
50
- static VALUE symbol_LITTLE_ENDIAN = Qnil;
51
- static VALUE symbol_BIG_ENDIAN = Qnil;
52
- static VALUE symbol_INT = Qnil;
53
- static VALUE symbol_UINT = Qnil;
54
- static VALUE symbol_FLOAT = Qnil;
55
- static VALUE symbol_STRING = Qnil;
56
- static VALUE symbol_BLOCK = Qnil;
57
- static VALUE symbol_DERIVED = Qnil;
58
- static VALUE symbol_read = Qnil;
59
-
60
- /*
61
- * Perform an left bit shift on a string
62
- */
63
- static void left_shift_byte_array (unsigned char* array, int array_length, int shift)
64
- {
65
- int current_index = 0;
66
- int previous_index = 0;
67
- unsigned char saved_bits = 0;
68
- unsigned char saved_bits_mask = (0xFF << (8 - shift));
69
- unsigned char sign_extension_remove_mask = ~(0xFF << shift);
70
-
71
- for (current_index = 0; current_index < array_length; current_index++)
72
- {
73
- /* Save bits that will be lost */
74
- saved_bits = ((array[current_index] & saved_bits_mask) >> (8 - shift)) & sign_extension_remove_mask;
75
-
76
- /* Perform shift on current byte */
77
- array[current_index] <<= shift;
78
-
79
- /* Add Saved bits to end of previous byte */
80
- if (current_index > 0)
81
- {
82
- array[previous_index] |= saved_bits;
83
- }
84
-
85
- /* Update previous index */
86
- previous_index = current_index;
87
- }
88
- }
89
-
90
- /*
91
- * Perform an unsigned right bit shift on a string
92
- */
93
- static void unsigned_right_shift_byte_array (unsigned char* array, int array_length, int shift)
94
- {
95
- int current_index = 0;
96
- int previous_index = 0;
97
- unsigned char saved_bits = 0;
98
- unsigned char saved_bits_mask = ~(0xFF << shift);
99
- unsigned char sign_extension_remove_mask = ~(0xFF << (8 - shift));
100
-
101
- for (current_index = array_length - 1; current_index >= 0; current_index--)
102
- {
103
- /* Save bits that will be lost */
104
- saved_bits = (array[current_index] & saved_bits_mask) << (8 - shift);
105
-
106
- /* Perform shift on current byte */
107
- array[current_index] = (array[current_index] >> shift) & sign_extension_remove_mask;
108
-
109
- /* Add Saved bits to beginning of previous byte */
110
- if (current_index != (array_length - 1))
111
- {
112
- array[previous_index] |= saved_bits;
113
- }
114
-
115
- /* Update previous index */
116
- previous_index = current_index;
117
- }
118
- }
119
-
120
- /*
121
- * Perform an signed right bit shift on a string
122
- */
123
- static void signed_right_shift_byte_array (unsigned char* array, int array_length, int shift)
124
- {
125
- unsigned char start_bits_mask = (0xFF << (8 - shift));
126
- int is_signed = (0x80 & array[0]);
127
-
128
- unsigned_right_shift_byte_array(array, array_length, shift);
129
-
130
- if (is_signed)
131
- {
132
- array[0] |= start_bits_mask;
133
- }
134
- }
135
-
136
- /*
137
- * Perform an unsigned bit shift on a string
138
- */
139
- static void unsigned_shift_byte_array (unsigned char* array, int array_length, int shift)
140
- {
141
- if (shift < 0)
142
- {
143
- left_shift_byte_array(array, array_length, -shift);
144
- }
145
- else if (shift > 0)
146
- {
147
- unsigned_right_shift_byte_array(array, array_length, shift);
148
- }
149
- }
150
-
151
- /*
152
- * Reverse the byte order in a string.
153
- */
154
- static void reverse_bytes (unsigned char* array, int array_length)
155
- {
156
- int first_index = 0;
157
- int second_index = 0;
158
- unsigned char temp_byte = 0;
159
-
160
- for (first_index = 0; first_index < (array_length / 2); first_index++)
161
- {
162
- second_index = array_length - 1 - first_index;
163
- temp_byte = array[first_index];
164
- array[first_index] = array[second_index];
165
- array[second_index] = temp_byte;
166
- }
167
- }
168
-
169
- static void read_aligned_16(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
170
- if (endianness == HOST_ENDIANNESS)
171
- {
172
- read_value[1] = buffer[upper_bound];
173
- read_value[0] = buffer[lower_bound];
174
- }
175
- else
176
- {
177
- read_value[0] = buffer[upper_bound];
178
- read_value[1] = buffer[lower_bound];
179
- }
180
- }
181
-
182
- static void read_aligned_32(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
183
- if (endianness == HOST_ENDIANNESS)
184
- {
185
- read_value[3] = buffer[upper_bound];
186
- read_value[2] = buffer[upper_bound - 1];
187
- read_value[1] = buffer[lower_bound + 1];
188
- read_value[0] = buffer[lower_bound];
189
- }
190
- else
191
- {
192
- read_value[0] = buffer[upper_bound];
193
- read_value[1] = buffer[upper_bound - 1];
194
- read_value[2] = buffer[lower_bound + 1];
195
- read_value[3] = buffer[lower_bound];
196
- }
197
- }
198
-
199
- static void read_aligned_64(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
200
- if (endianness == HOST_ENDIANNESS)
201
- {
202
- read_value[7] = buffer[upper_bound];
203
- read_value[6] = buffer[upper_bound - 1];
204
- read_value[5] = buffer[upper_bound - 2];
205
- read_value[4] = buffer[upper_bound - 3];
206
- read_value[3] = buffer[lower_bound + 3];
207
- read_value[2] = buffer[lower_bound + 2];
208
- read_value[1] = buffer[lower_bound + 1];
209
- read_value[0] = buffer[lower_bound];
210
- }
211
- else
212
- {
213
- read_value[0] = buffer[upper_bound];
214
- read_value[1] = buffer[upper_bound - 1];
215
- read_value[2] = buffer[upper_bound - 2];
216
- read_value[3] = buffer[upper_bound - 3];
217
- read_value[4] = buffer[lower_bound + 3];
218
- read_value[5] = buffer[lower_bound + 2];
219
- read_value[6] = buffer[lower_bound + 1];
220
- read_value[7] = buffer[lower_bound];
221
- }
222
- }
223
-
224
- static void read_bitfield(int lower_bound, int upper_bound, int bit_offset, int bit_size, int given_bit_offset, int given_bit_size, VALUE endianness, unsigned char* buffer, int buffer_length, unsigned char* read_value) {
225
- /* Local variables */
226
- int num_bytes = 0;
227
- int total_bits = 0;
228
- int start_bits = 0;
229
- int end_bits = 0;
230
- int temp_upper = 0;
231
- unsigned char end_mask = 0;
232
-
233
- /* Copy Data For Bitfield into read_value */
234
- if (endianness == symbol_LITTLE_ENDIAN)
235
- {
236
- /* Bitoffset always refers to the most significant bit of a bitfield */
237
- num_bytes = (((bit_offset % 8) + bit_size - 1) / 8) + 1;
238
- upper_bound = bit_offset / 8;
239
- lower_bound = upper_bound - num_bytes + 1;
240
-
241
- if (lower_bound < 0) {
242
- rb_raise(rb_eArgError, "LITTLE_ENDIAN bitfield with bit_offset %d and bit_size %d is invalid", given_bit_offset, given_bit_size);
243
- }
244
-
245
- memcpy(read_value, &buffer[lower_bound], num_bytes);
246
- reverse_bytes(read_value, num_bytes);
247
- }
248
- else
249
- {
250
- num_bytes = upper_bound - lower_bound + 1;
251
- memcpy(read_value, &buffer[lower_bound], num_bytes);
252
- }
253
-
254
- /* Determine temp upper bound */
255
- temp_upper = upper_bound - lower_bound;
256
-
257
- /* Handle Bitfield */
258
- total_bits = (temp_upper + 1) * 8;
259
- start_bits = bit_offset % 8;
260
- end_bits = total_bits - start_bits - bit_size;
261
- end_mask = 0xFF << end_bits;
262
-
263
- /* Mask off unwanted bits at end */
264
- read_value[temp_upper] &= end_mask;
265
-
266
- /* Shift off unwanted bits at beginning */
267
- unsigned_shift_byte_array(read_value, num_bytes, -start_bits);
268
- }
269
-
270
- /*
271
- * Reads binary data of any data type from a buffer
272
- *
273
- * @param bit_offset [Integer] Bit offset to the start of the item. A
274
- * negative number means to offset from the end of the buffer.
275
- * @param bit_size [Integer] Size of the item in bits
276
- * @param data_type [Symbol] {DATA_TYPES}
277
- * @param buffer [String] Binary string buffer to read from
278
- * @param endianness [Symbol] {ENDIANNESS}
279
- * @return [Integer] value read from the buffer
280
- */
281
- static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE param_bit_size, VALUE param_data_type, VALUE param_buffer, VALUE param_endianness)
282
- {
283
- /* Convert Parameters to C Data Types */
284
- int bit_offset = FIX2INT(param_bit_offset);
285
- int bit_size = FIX2INT(param_bit_size);
286
-
287
- /* Local Variables */
288
- int given_bit_offset = bit_offset;
289
- int given_bit_size = bit_size;
290
- signed char signed_char_value = 0;
291
- unsigned char unsigned_char_value = 0;
292
- signed short signed_short_value = 0;
293
- unsigned short unsigned_short_value = 0;
294
- signed int signed_int_value = 0;
295
- signed long signed_long_value = 0;
296
- unsigned int unsigned_int_value = 0;
297
- signed long long signed_long_long_value = 0;
298
- unsigned long long unsigned_long_long_value = 0;
299
- unsigned char* unsigned_char_array = NULL;
300
- int array_length = 0;
301
- char* string = NULL;
302
- int string_length = 0;
303
- float float_value = 0.0;
304
- double double_value = 0.0;
305
- int shift_needed = 0;
306
- int shift_count = 0;
307
- int index = 0;
308
- int num_bits = 0;
309
- int num_bytes = 0;
310
- int num_words = 0;
311
- int upper_bound = 0;
312
- int lower_bound = 0;
313
- int byte_aligned = 0;
314
- VALUE temp_value = Qnil;
315
- VALUE return_value = Qnil;
316
-
317
- unsigned char* buffer = NULL;
318
- long buffer_length = 0;
319
-
320
- Check_Type(param_buffer, T_STRING);
321
- buffer = (unsigned char*) RSTRING_PTR(param_buffer);
322
- buffer_length = RSTRING_LEN(param_buffer);
323
-
324
- /* Handle negative bit offsets */
325
- if (bit_offset < 0) {
326
- if (given_bit_size <= 0) {
327
- rb_raise(rb_eArgError, "negative or zero bit_sizes (%d) cannot be given with negative bit_offsets (%d)", given_bit_size, given_bit_offset);
328
- } else {
329
- bit_offset = (((int)buffer_length * 8) + bit_offset);
330
- if (bit_offset < 0) {
331
- rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
332
- }
333
- }
334
- }
335
-
336
- /* Handle negative and zero bit sizes */
337
- if (bit_size <= 0) {
338
- if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
339
- bit_size = (((int)buffer_length * 8) - bit_offset + bit_size);
340
- if (bit_size == 0) {
341
- return rb_str_new2("");
342
- } else if (bit_size < 0) {
343
- rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
344
- }
345
- } else {
346
- rb_raise(rb_eArgError, "bit_size %d must be positive for data types other than :STRING and :BLOCK", given_bit_size);
347
- }
348
- }
349
-
350
- /* define bounds of string to access this item */
351
- lower_bound = (bit_offset / 8);
352
- upper_bound = ((bit_offset + bit_size - 1) / 8);
353
-
354
- /* Check for byte alignment */
355
- byte_aligned = ((bit_offset % 8) == 0);
356
-
357
- /* Sanity check buffer size */
358
- if (upper_bound >= buffer_length) {
359
- /* Check special case of little endian bit field */
360
- if ((param_endianness == symbol_LITTLE_ENDIAN) && ((param_data_type == symbol_INT) || (param_data_type == symbol_UINT)) && (!((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64)))) && (lower_bound < buffer_length)) {
361
- /* Ok little endian bit field */
362
- } else {
363
- rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
364
- }
365
- }
366
-
367
- if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
368
-
369
- /*#######################################
370
- *# Handle :STRING and :BLOCK data types
371
- *#######################################*/
372
-
373
- if (byte_aligned) {
374
- string_length = upper_bound - lower_bound + 1;
375
- string = malloc(string_length + 1);
376
- memcpy(string, buffer + lower_bound, string_length);
377
- string[string_length] = 0;
378
- if (param_data_type == symbol_STRING) {
379
- return_value = rb_str_new2(string);
380
- } else /* param_data_type == symbol_BLOCK */ {
381
- return_value = rb_str_new(string, string_length);
382
- }
383
- free(string);
384
- } else {
385
- rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
386
- }
387
-
388
- } else if (param_data_type == symbol_INT) {
389
-
390
- /*###################################
391
- *# Handle :INT data type
392
- *###################################*/
393
-
394
- if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
395
- /*###########################################################
396
- *# Handle byte-aligned 8, 16, 32, and 64 bit :INT
397
- *###########################################################*/
398
-
399
- if (bit_size == 8)
400
- {
401
- signed_char_value = *((signed char*) &buffer[lower_bound]);
402
- return_value = INT2FIX(signed_char_value);
403
- }
404
- else if (bit_size == 16)
405
- {
406
- read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_short_value);
407
- return_value = INT2FIX(signed_short_value);
408
- }
409
- else if (bit_size == 32)
410
- {
411
- read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_int_value);
412
- return_value = INT2NUM(signed_int_value);
413
- }
414
- else /* bit_size == 64 */
415
- {
416
- read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_long_long_value);
417
- return_value = LL2NUM(signed_long_long_value);
418
- }
419
- } else {
420
- string_length = ((bit_size - 1)/ 8) + 1;
421
- array_length = string_length + 4; /* Required number of bytes plus slack */
422
- unsigned_char_array = (unsigned char*) malloc(array_length);
423
- read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
424
-
425
- num_words = ((string_length - 1) / 4) + 1;
426
- num_bytes = num_words * 4;
427
- num_bits = num_bytes * 8;
428
- shift_needed = num_bits - bit_size;
429
- shift_count = shift_needed / 8;
430
- shift_needed = shift_needed % 8;
431
-
432
- if (bit_size > 1) {
433
- for (index = 0; index < shift_count; index++) {
434
- signed_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
435
- }
436
-
437
- if (shift_needed > 0) {
438
- signed_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
439
- }
440
- } else {
441
- for (index = 0; index < shift_count; index++) {
442
- unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
443
- }
444
-
445
- if (shift_needed > 0) {
446
- unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
447
- }
448
- }
449
-
450
- if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
451
- for (index = 0; index < num_bytes; index += 4) {
452
- reverse_bytes(&(unsigned_char_array[index]), 4);
453
- }
454
- }
455
-
456
- if (bit_size <= 31) {
457
- return_value = INT2FIX(*((int*) unsigned_char_array));
458
- } else if (bit_size == 32) {
459
- return_value = INT2NUM(*((int*) unsigned_char_array));
460
- } else {
461
- return_value = rb_int2big(*((int*) unsigned_char_array));
462
- temp_value = INT2FIX(32);
463
- for (index = 4; index < num_bytes; index += 4) {
464
- return_value = rb_big_lshift(return_value, temp_value);
465
- if (FIXNUM_P(return_value)) {
466
- signed_long_value = FIX2LONG(return_value);
467
- return_value = rb_int2big(signed_long_value);
468
- }
469
- return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
470
- if (FIXNUM_P(return_value)) {
471
- signed_long_value = FIX2LONG(return_value);
472
- return_value = rb_int2big(signed_long_value);
473
- }
474
- }
475
- return_value = rb_big_norm(return_value);
476
- }
477
-
478
- free(unsigned_char_array);
479
- }
480
-
481
- } else if (param_data_type == symbol_UINT) {
482
-
483
- /*###################################
484
- *# Handle :UINT data type
485
- *###################################*/
486
-
487
- if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
488
- /*###########################################################
489
- *# Handle byte-aligned 8, 16, 32, and 64 bit :UINT
490
- *###########################################################*/
491
-
492
- if (bit_size == 8)
493
- {
494
- unsigned_char_value = buffer[lower_bound];
495
- return_value = INT2FIX(unsigned_char_value);
496
- }
497
- else if (bit_size == 16)
498
- {
499
- read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_short_value);
500
- return_value = INT2FIX(unsigned_short_value);
501
- }
502
- else if (bit_size == 32)
503
- {
504
- read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_int_value);
505
- return_value = UINT2NUM(unsigned_int_value);
506
- }
507
- else /* bit_size == 64 */
508
- {
509
- read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_long_long_value);
510
- return_value = ULL2NUM(unsigned_long_long_value);
511
- }
512
- } else {
513
- string_length = ((bit_size - 1)/ 8) + 1;
514
- array_length = string_length + 4; /* Required number of bytes plus slack */
515
- unsigned_char_array = (unsigned char*) malloc(array_length);
516
- read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
517
-
518
- num_words = ((string_length - 1) / 4) + 1;
519
- num_bytes = num_words * 4;
520
- num_bits = num_bytes * 8;
521
- shift_needed = num_bits - bit_size;
522
- shift_count = shift_needed / 8;
523
- shift_needed = shift_needed % 8;
524
-
525
- for (index = 0; index < shift_count; index++) {
526
- unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
527
- }
528
-
529
- if (shift_needed > 0) {
530
- unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
531
- }
532
-
533
- if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
534
- for (index = 0; index < num_bytes; index += 4) {
535
- reverse_bytes(&(unsigned_char_array[index]), 4);
536
- }
537
- }
538
-
539
- if (bit_size <= 30) {
540
- return_value = INT2FIX(*((int*) unsigned_char_array));
541
- } else if (bit_size <= 32) {
542
- return_value = UINT2NUM(*((unsigned int*) unsigned_char_array));
543
- } else {
544
- return_value = rb_uint2big(*((unsigned int*) unsigned_char_array));
545
- temp_value = INT2FIX(32);
546
- for (index = 4; index < num_bytes; index += 4) {
547
- return_value = rb_big_lshift(return_value, temp_value);
548
- if (FIXNUM_P(return_value)) {
549
- signed_long_value = FIX2LONG(return_value);
550
- return_value = rb_int2big(signed_long_value);
551
- }
552
- return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
553
- if (FIXNUM_P(return_value)) {
554
- signed_long_value = FIX2LONG(return_value);
555
- return_value = rb_int2big(signed_long_value);
556
- }
557
- }
558
- return_value = rb_big_norm(return_value);
559
- }
560
-
561
- free(unsigned_char_array);
562
- }
563
-
564
- } else if (param_data_type == symbol_FLOAT) {
565
-
566
- /*##########################
567
- *# Handle :FLOAT data type
568
- *##########################*/
569
-
570
- if (byte_aligned) {
571
- switch (bit_size) {
572
- case 32:
573
- read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &float_value);
574
- return_value = rb_float_new(float_value);
575
- break;
576
-
577
- case 64:
578
- read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &double_value);
579
- return_value = rb_float_new(double_value);
580
- break;
581
-
582
- default:
583
- rb_raise(rb_eArgError, "bit_size is %d but must be 32 or 64 for data_type %s", given_bit_size, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
584
- break;
585
- };
586
- } else {
587
- rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
588
- }
589
-
590
- } else {
591
-
592
- /*############################
593
- *# Handle Unknown data types
594
- *############################*/
595
-
596
- rb_raise(rb_eArgError, "data_type %s is not recognized", RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
597
- }
598
-
599
- return return_value;
600
- }
601
-
602
- /*
603
- * Returns the actual length as an integer.
604
- *
605
- * get_int_length(self) #=> 324
606
- */
607
- static int get_int_length(VALUE self)
608
- {
609
- VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
610
- if (RTEST(buffer)) {
611
- return (int)RSTRING_LEN(buffer);
612
- } else {
613
- return 0;
614
- }
615
- }
616
-
617
- /*
618
- * Returns the actual structure length.
619
- *
620
- * structure.length #=> 324
621
- */
622
- static VALUE structure_length(VALUE self) {
623
- return INT2FIX(get_int_length(self));
624
- }
625
-
626
- static VALUE read_item_internal(VALUE self, VALUE item, VALUE buffer) {
627
- VALUE bit_offset = Qnil;
628
- VALUE bit_size = Qnil;
629
- VALUE data_type = Qnil;
630
- VALUE array_size = Qnil;
631
- VALUE endianness = Qnil;
632
-
633
- data_type = rb_ivar_get(item, id_ivar_data_type);
634
- if (data_type == symbol_DERIVED) {
635
- return Qnil;
636
- }
637
-
638
- if (RTEST(buffer)) {
639
- bit_offset = rb_ivar_get(item, id_ivar_bit_offset);
640
- bit_size = rb_ivar_get(item, id_ivar_bit_size);
641
- array_size = rb_ivar_get(item, id_ivar_array_size);
642
- endianness = rb_ivar_get(item, id_ivar_endianness);
643
- if (RTEST(array_size)) {
644
- return rb_funcall(cBinaryAccessor, id_method_read_array, 6, bit_offset, bit_size, data_type, array_size, buffer, endianness);
645
- } else {
646
- return binary_accessor_read(cBinaryAccessor, bit_offset, bit_size, data_type, buffer, endianness);
647
- }
648
- } else {
649
- rb_raise(rb_eRuntimeError, "No buffer given to read_item");
650
- }
651
- }
652
-
653
- /*
654
- * Read an item in the structure
655
- *
656
- * @param item [StructureItem] Instance of StructureItem or one of its subclasses
657
- * @param value_type [Symbol] Not used. Subclasses should overload this
658
- * parameter to check whether to perform conversions on the item.
659
- * @param buffer [String] The binary buffer to read the item from
660
- * @return Value based on the item definition. This could be a string, integer,
661
- * float, or array of values.
662
- */
663
- static VALUE read_item(int argc, VALUE* argv, VALUE self)
664
- {
665
- VALUE item = Qnil;
666
- VALUE buffer = Qnil;
667
-
668
- switch (argc)
669
- {
670
- case 1:
671
- case 2:
672
- item = argv[0];
673
- buffer = rb_ivar_get(self, id_ivar_buffer);
674
- break;
675
- case 3:
676
- item = argv[0];
677
- buffer = argv[2];
678
- break;
679
- default:
680
- /* Invalid number of arguments given */
681
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
682
- break;
683
- };
684
-
685
- return read_item_internal(self, item, buffer);
686
- }
687
-
688
- /*
689
- * Comparison Operator based on bit_offset. This means that StructureItems
690
- * with different names or bit sizes are equal if they have the same bit
691
- * offset.
692
- */
693
- static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
694
- int bit_offset = FIX2INT(rb_ivar_get(self, id_ivar_bit_offset));
695
- int other_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_offset));
696
- int bit_size = 0;
697
- int other_bit_size = 0;
698
-
699
- /* Handle same bit offset case */
700
- if ((bit_offset == 0) && (other_bit_offset == 0)) {
701
- /* Both bit_offsets are 0 so sort by bit_size
702
- * This allows derived items with bit_size of 0 to be listed first
703
- * Compare based on bit size */
704
- bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
705
- other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
706
- if (bit_size == other_bit_size) {
707
- return INT2FIX(0);
708
- } if (bit_size < other_bit_size) {
709
- return INT2FIX(-1);
710
- } else {
711
- return INT2FIX(1);
712
- }
713
- }
714
-
715
- /* Handle different bit offsets */
716
- if (((bit_offset >= 0) && (other_bit_offset >= 0)) || ((bit_offset < 0) && (other_bit_offset < 0))) {
717
- /* Both Have Same Sign */
718
- if (bit_offset == other_bit_offset) {
719
- return INT2FIX(0);
720
- } else if (bit_offset < other_bit_offset) {
721
- return INT2FIX(-1);
722
- } else {
723
- return INT2FIX(1);
724
- }
725
- } else {
726
- /* Different Signs */
727
- if (bit_offset == other_bit_offset) {
728
- return INT2FIX(0);
729
- } else if (bit_offset < other_bit_offset) {
730
- return INT2FIX(1);
731
- } else {
732
- return INT2FIX(-1);
733
- }
734
- }
735
- }
736
-
737
- /* Structure constructor
738
- *
739
- * @param default_endianness [Symbol] Must be one of
740
- * {BinaryAccessor::ENDIANNESS}. By default it uses
741
- * BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
742
- * @param buffer [String] Buffer used to store the structure
743
- * @param item_class [Class] Class used to instantiate new structure items.
744
- * Must be StructureItem or one of its subclasses.
745
- */
746
- static VALUE structure_initialize(int argc, VALUE* argv, VALUE self) {
747
- VALUE default_endianness = Qnil;
748
- VALUE buffer = Qnil;
749
- VALUE item_class = Qnil;
750
-
751
- switch (argc)
752
- {
753
- case 0:
754
- default_endianness = HOST_ENDIANNESS;
755
- buffer = rb_str_new2("");
756
- item_class = cStructureItem;
757
- break;
758
- case 1:
759
- default_endianness = argv[0];
760
- buffer = rb_str_new2("");
761
- item_class = cStructureItem;
762
- break;
763
- case 2:
764
- default_endianness = argv[0];
765
- buffer = argv[1];
766
- item_class = cStructureItem;
767
- break;
768
- case 3:
769
- default_endianness = argv[0];
770
- buffer = argv[1];
771
- item_class = argv[2];
772
- break;
773
- default:
774
- /* Invalid number of arguments given */
775
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..3)", argc);
776
- break;
777
- };
778
-
779
- if ((default_endianness == symbol_BIG_ENDIAN) || (default_endianness == symbol_LITTLE_ENDIAN)) {
780
- rb_ivar_set(self, id_ivar_default_endianness, default_endianness);
781
- if (RTEST(buffer)) {
782
- Check_Type(buffer, T_STRING);
783
- rb_funcall(buffer, id_method_force_encoding, 1, ASCII_8BIT_STRING);
784
- rb_ivar_set(self, id_ivar_buffer, buffer);
785
- } else {
786
- rb_ivar_set(self, id_ivar_buffer, Qnil);
787
- }
788
- rb_ivar_set(self, id_ivar_item_class, item_class);
789
- rb_ivar_set(self, id_ivar_items, rb_hash_new());
790
- rb_ivar_set(self, id_ivar_sorted_items, rb_ary_new());
791
- rb_ivar_set(self, id_ivar_defined_length, INT2FIX(0));
792
- rb_ivar_set(self, id_ivar_defined_length_bits, INT2FIX(0));
793
- rb_ivar_set(self, id_ivar_pos_bit_size, INT2FIX(0));
794
- rb_ivar_set(self, id_ivar_neg_bit_size, INT2FIX(0));
795
- rb_ivar_set(self, id_ivar_fixed_size, Qtrue);
796
- rb_ivar_set(self, id_ivar_short_buffer_allowed, Qfalse);
797
- rb_ivar_set(self, id_ivar_mutex, Qnil);
798
- } else {
799
- rb_raise(rb_eArgError, "Unrecognized endianness: %s - Must be :BIG_ENDIAN or :LITTLE_ENDIAN", RSTRING_PTR(rb_funcall(default_endianness, id_method_to_s, 0)));
800
- }
801
-
802
- return self;
803
- }
804
-
805
- /*
806
- * Resize the buffer at least the defined length of the structure
807
- */
808
- static VALUE resize_buffer(VALUE self)
809
- {
810
- VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
811
- if (RTEST(buffer)) {
812
- VALUE value_defined_length = rb_ivar_get(self, id_ivar_defined_length);
813
- long defined_length = FIX2INT(value_defined_length);
814
- long current_length = RSTRING_LEN(buffer);
815
-
816
- /* Extend data size */
817
- if (current_length < defined_length)
818
- {
819
- rb_str_concat(buffer, rb_str_times(ZERO_STRING, INT2FIX(defined_length - current_length)));
820
- }
821
- }
822
-
823
- return self;
824
- }
825
-
826
- /*
827
- * Initialize all Packet methods
828
- */
829
- void Init_structure (void)
830
- {
831
- int zero = 0;
832
-
833
- id_method_to_s = rb_intern("to_s");
834
- id_method_raise_buffer_error = rb_intern("raise_buffer_error");
835
- id_method_read_array = rb_intern("read_array");
836
- id_method_force_encoding = rb_intern("force_encoding");
837
- id_method_freeze = rb_intern("freeze");
838
-
839
- ASCII_8BIT_STRING = rb_str_new2("ASCII-8BIT");
840
- rb_funcall(ASCII_8BIT_STRING, id_method_freeze, 0);
841
-
842
- ZERO_STRING = rb_str_new((char*) &zero, 1);
843
- rb_funcall(ZERO_STRING, id_method_freeze, 0);
844
- id_const_ZERO_STRING = rb_intern("ZERO_STRING");
845
-
846
- id_ivar_buffer = rb_intern("@buffer");
847
- id_ivar_bit_offset = rb_intern("@bit_offset");
848
- id_ivar_bit_size = rb_intern("@bit_size");
849
- id_ivar_array_size = rb_intern("@array_size");
850
- id_ivar_endianness = rb_intern("@endianness");
851
- id_ivar_data_type = rb_intern("@data_type");
852
- id_ivar_default_endianness = rb_intern("@default_endianness");
853
- id_ivar_item_class = rb_intern("@item_class");
854
- id_ivar_items = rb_intern("@items");
855
- id_ivar_sorted_items = rb_intern("@sorted_items");
856
- id_ivar_defined_length = rb_intern("@defined_length");
857
- id_ivar_defined_length_bits = rb_intern("@defined_length_bits");
858
- id_ivar_pos_bit_size = rb_intern("@pos_bit_size");
859
- id_ivar_neg_bit_size = rb_intern("@neg_bit_size");
860
- id_ivar_fixed_size = rb_intern("@fixed_size");
861
- id_ivar_short_buffer_allowed = rb_intern("@short_buffer_allowed");
862
- id_ivar_mutex = rb_intern("@mutex");
863
-
864
- symbol_LITTLE_ENDIAN = ID2SYM(rb_intern("LITTLE_ENDIAN"));
865
- symbol_BIG_ENDIAN = ID2SYM(rb_intern("BIG_ENDIAN"));
866
- symbol_INT = ID2SYM(rb_intern("INT"));
867
- symbol_UINT = ID2SYM(rb_intern("UINT"));
868
- symbol_FLOAT = ID2SYM(rb_intern("FLOAT"));
869
- symbol_STRING = ID2SYM(rb_intern("STRING"));
870
- symbol_BLOCK = ID2SYM(rb_intern("BLOCK"));
871
- symbol_DERIVED = ID2SYM(rb_intern("DERIVED"));
872
- symbol_read = ID2SYM(rb_intern("read"));
873
-
874
- if ((*((char *) &endianness_check)) == 1) {
875
- HOST_ENDIANNESS = symbol_LITTLE_ENDIAN;
876
- } else {
877
- HOST_ENDIANNESS = symbol_BIG_ENDIAN;
878
- }
879
-
880
- mCosmos = rb_define_module("Cosmos");
881
-
882
- cBinaryAccessor = rb_define_class_under(mCosmos, "BinaryAccessor", rb_cObject);
883
- rb_define_singleton_method(cBinaryAccessor, "read", binary_accessor_read, 5);
884
-
885
- cStructure = rb_define_class_under(mCosmos, "Structure", rb_cObject);
886
- rb_const_set(cStructure, id_const_ZERO_STRING, ZERO_STRING);
887
- rb_define_method(cStructure, "initialize", structure_initialize, -1);
888
- rb_define_method(cStructure, "length", structure_length, 0);
889
- rb_define_method(cStructure, "read_item", read_item, -1);
890
- rb_define_method(cStructure, "resize_buffer", resize_buffer, 0);
891
-
892
- cStructureItem = rb_define_class_under(mCosmos, "StructureItem", rb_cObject);
893
- rb_define_method(cStructureItem, "<=>", structure_item_spaceship, 1);
894
- }
1
+ /*
2
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
3
+ # All Rights Reserved.
4
+ #
5
+ # This program is free software; you can modify and/or redistribute it
6
+ # under the terms of the GNU Lesser General Public License
7
+ # as published by the Free Software Foundation; version 3 with
8
+ # attribution addendums as found in the LICENSE.txt
9
+ */
10
+
11
+ #include "ruby.h"
12
+ #include "stdio.h"
13
+
14
+ static const int endianness_check = 1;
15
+ static VALUE HOST_ENDIANNESS = Qnil;
16
+ static VALUE ZERO_STRING = Qnil;
17
+ static VALUE ASCII_8BIT_STRING = Qnil;
18
+
19
+ static VALUE mCosmos = Qnil;
20
+ static VALUE cBinaryAccessor = Qnil;
21
+ static VALUE cStructure = Qnil;
22
+ static VALUE cStructureItem = Qnil;
23
+
24
+ static ID id_method_to_s = 0;
25
+ static ID id_method_raise_buffer_error = 0;
26
+ static ID id_method_read_array = 0;
27
+ static ID id_method_force_encoding = 0;
28
+ static ID id_method_freeze = 0;
29
+
30
+ static ID id_ivar_buffer = 0;
31
+ static ID id_ivar_bit_offset = 0;
32
+ static ID id_ivar_bit_size = 0;
33
+ static ID id_ivar_array_size = 0;
34
+ static ID id_ivar_endianness = 0;
35
+ static ID id_ivar_data_type = 0;
36
+ static ID id_ivar_default_endianness = 0;
37
+ static ID id_ivar_item_class = 0;
38
+ static ID id_ivar_items = 0;
39
+ static ID id_ivar_sorted_items = 0;
40
+ static ID id_ivar_defined_length = 0;
41
+ static ID id_ivar_defined_length_bits = 0;
42
+ static ID id_ivar_pos_bit_size = 0;
43
+ static ID id_ivar_neg_bit_size = 0;
44
+ static ID id_ivar_fixed_size = 0;
45
+ static ID id_ivar_short_buffer_allowed = 0;
46
+ static ID id_ivar_mutex = 0;
47
+
48
+ static ID id_const_ZERO_STRING = 0;
49
+
50
+ static VALUE symbol_LITTLE_ENDIAN = Qnil;
51
+ static VALUE symbol_BIG_ENDIAN = Qnil;
52
+ static VALUE symbol_INT = Qnil;
53
+ static VALUE symbol_UINT = Qnil;
54
+ static VALUE symbol_FLOAT = Qnil;
55
+ static VALUE symbol_STRING = Qnil;
56
+ static VALUE symbol_BLOCK = Qnil;
57
+ static VALUE symbol_DERIVED = Qnil;
58
+ static VALUE symbol_read = Qnil;
59
+
60
+ /*
61
+ * Perform an left bit shift on a string
62
+ */
63
+ static void left_shift_byte_array (unsigned char* array, int array_length, int shift)
64
+ {
65
+ int current_index = 0;
66
+ int previous_index = 0;
67
+ unsigned char saved_bits = 0;
68
+ unsigned char saved_bits_mask = (0xFF << (8 - shift));
69
+ unsigned char sign_extension_remove_mask = ~(0xFF << shift);
70
+
71
+ for (current_index = 0; current_index < array_length; current_index++)
72
+ {
73
+ /* Save bits that will be lost */
74
+ saved_bits = ((array[current_index] & saved_bits_mask) >> (8 - shift)) & sign_extension_remove_mask;
75
+
76
+ /* Perform shift on current byte */
77
+ array[current_index] <<= shift;
78
+
79
+ /* Add Saved bits to end of previous byte */
80
+ if (current_index > 0)
81
+ {
82
+ array[previous_index] |= saved_bits;
83
+ }
84
+
85
+ /* Update previous index */
86
+ previous_index = current_index;
87
+ }
88
+ }
89
+
90
+ /*
91
+ * Perform an unsigned right bit shift on a string
92
+ */
93
+ static void unsigned_right_shift_byte_array (unsigned char* array, int array_length, int shift)
94
+ {
95
+ int current_index = 0;
96
+ int previous_index = 0;
97
+ unsigned char saved_bits = 0;
98
+ unsigned char saved_bits_mask = ~(0xFF << shift);
99
+ unsigned char sign_extension_remove_mask = ~(0xFF << (8 - shift));
100
+
101
+ for (current_index = array_length - 1; current_index >= 0; current_index--)
102
+ {
103
+ /* Save bits that will be lost */
104
+ saved_bits = (array[current_index] & saved_bits_mask) << (8 - shift);
105
+
106
+ /* Perform shift on current byte */
107
+ array[current_index] = (array[current_index] >> shift) & sign_extension_remove_mask;
108
+
109
+ /* Add Saved bits to beginning of previous byte */
110
+ if (current_index != (array_length - 1))
111
+ {
112
+ array[previous_index] |= saved_bits;
113
+ }
114
+
115
+ /* Update previous index */
116
+ previous_index = current_index;
117
+ }
118
+ }
119
+
120
+ /*
121
+ * Perform an signed right bit shift on a string
122
+ */
123
+ static void signed_right_shift_byte_array (unsigned char* array, int array_length, int shift)
124
+ {
125
+ unsigned char start_bits_mask = (0xFF << (8 - shift));
126
+ int is_signed = (0x80 & array[0]);
127
+
128
+ unsigned_right_shift_byte_array(array, array_length, shift);
129
+
130
+ if (is_signed)
131
+ {
132
+ array[0] |= start_bits_mask;
133
+ }
134
+ }
135
+
136
+ /*
137
+ * Perform an unsigned bit shift on a string
138
+ */
139
+ static void unsigned_shift_byte_array (unsigned char* array, int array_length, int shift)
140
+ {
141
+ if (shift < 0)
142
+ {
143
+ left_shift_byte_array(array, array_length, -shift);
144
+ }
145
+ else if (shift > 0)
146
+ {
147
+ unsigned_right_shift_byte_array(array, array_length, shift);
148
+ }
149
+ }
150
+
151
+ /*
152
+ * Reverse the byte order in a string.
153
+ */
154
+ static void reverse_bytes (unsigned char* array, int array_length)
155
+ {
156
+ int first_index = 0;
157
+ int second_index = 0;
158
+ unsigned char temp_byte = 0;
159
+
160
+ for (first_index = 0; first_index < (array_length / 2); first_index++)
161
+ {
162
+ second_index = array_length - 1 - first_index;
163
+ temp_byte = array[first_index];
164
+ array[first_index] = array[second_index];
165
+ array[second_index] = temp_byte;
166
+ }
167
+ }
168
+
169
+ static void read_aligned_16(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
170
+ if (endianness == HOST_ENDIANNESS)
171
+ {
172
+ read_value[1] = buffer[upper_bound];
173
+ read_value[0] = buffer[lower_bound];
174
+ }
175
+ else
176
+ {
177
+ read_value[0] = buffer[upper_bound];
178
+ read_value[1] = buffer[lower_bound];
179
+ }
180
+ }
181
+
182
+ static void read_aligned_32(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
183
+ if (endianness == HOST_ENDIANNESS)
184
+ {
185
+ read_value[3] = buffer[upper_bound];
186
+ read_value[2] = buffer[upper_bound - 1];
187
+ read_value[1] = buffer[lower_bound + 1];
188
+ read_value[0] = buffer[lower_bound];
189
+ }
190
+ else
191
+ {
192
+ read_value[0] = buffer[upper_bound];
193
+ read_value[1] = buffer[upper_bound - 1];
194
+ read_value[2] = buffer[lower_bound + 1];
195
+ read_value[3] = buffer[lower_bound];
196
+ }
197
+ }
198
+
199
+ static void read_aligned_64(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
200
+ if (endianness == HOST_ENDIANNESS)
201
+ {
202
+ read_value[7] = buffer[upper_bound];
203
+ read_value[6] = buffer[upper_bound - 1];
204
+ read_value[5] = buffer[upper_bound - 2];
205
+ read_value[4] = buffer[upper_bound - 3];
206
+ read_value[3] = buffer[lower_bound + 3];
207
+ read_value[2] = buffer[lower_bound + 2];
208
+ read_value[1] = buffer[lower_bound + 1];
209
+ read_value[0] = buffer[lower_bound];
210
+ }
211
+ else
212
+ {
213
+ read_value[0] = buffer[upper_bound];
214
+ read_value[1] = buffer[upper_bound - 1];
215
+ read_value[2] = buffer[upper_bound - 2];
216
+ read_value[3] = buffer[upper_bound - 3];
217
+ read_value[4] = buffer[lower_bound + 3];
218
+ read_value[5] = buffer[lower_bound + 2];
219
+ read_value[6] = buffer[lower_bound + 1];
220
+ read_value[7] = buffer[lower_bound];
221
+ }
222
+ }
223
+
224
+ static void read_bitfield(int lower_bound, int upper_bound, int bit_offset, int bit_size, int given_bit_offset, int given_bit_size, VALUE endianness, unsigned char* buffer, int buffer_length, unsigned char* read_value) {
225
+ /* Local variables */
226
+ int num_bytes = 0;
227
+ int total_bits = 0;
228
+ int start_bits = 0;
229
+ int end_bits = 0;
230
+ int temp_upper = 0;
231
+ unsigned char end_mask = 0;
232
+
233
+ /* Copy Data For Bitfield into read_value */
234
+ if (endianness == symbol_LITTLE_ENDIAN)
235
+ {
236
+ /* Bitoffset always refers to the most significant bit of a bitfield */
237
+ num_bytes = (((bit_offset % 8) + bit_size - 1) / 8) + 1;
238
+ upper_bound = bit_offset / 8;
239
+ lower_bound = upper_bound - num_bytes + 1;
240
+
241
+ if (lower_bound < 0) {
242
+ rb_raise(rb_eArgError, "LITTLE_ENDIAN bitfield with bit_offset %d and bit_size %d is invalid", given_bit_offset, given_bit_size);
243
+ }
244
+
245
+ memcpy(read_value, &buffer[lower_bound], num_bytes);
246
+ reverse_bytes(read_value, num_bytes);
247
+ }
248
+ else
249
+ {
250
+ num_bytes = upper_bound - lower_bound + 1;
251
+ memcpy(read_value, &buffer[lower_bound], num_bytes);
252
+ }
253
+
254
+ /* Determine temp upper bound */
255
+ temp_upper = upper_bound - lower_bound;
256
+
257
+ /* Handle Bitfield */
258
+ total_bits = (temp_upper + 1) * 8;
259
+ start_bits = bit_offset % 8;
260
+ end_bits = total_bits - start_bits - bit_size;
261
+ end_mask = 0xFF << end_bits;
262
+
263
+ /* Mask off unwanted bits at end */
264
+ read_value[temp_upper] &= end_mask;
265
+
266
+ /* Shift off unwanted bits at beginning */
267
+ unsigned_shift_byte_array(read_value, num_bytes, -start_bits);
268
+ }
269
+
270
+ /*
271
+ * Reads binary data of any data type from a buffer
272
+ *
273
+ * @param bit_offset [Integer] Bit offset to the start of the item. A
274
+ * negative number means to offset from the end of the buffer.
275
+ * @param bit_size [Integer] Size of the item in bits
276
+ * @param data_type [Symbol] {DATA_TYPES}
277
+ * @param buffer [String] Binary string buffer to read from
278
+ * @param endianness [Symbol] {ENDIANNESS}
279
+ * @return [Integer] value read from the buffer
280
+ */
281
+ static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE param_bit_size, VALUE param_data_type, VALUE param_buffer, VALUE param_endianness)
282
+ {
283
+ /* Convert Parameters to C Data Types */
284
+ int bit_offset = FIX2INT(param_bit_offset);
285
+ int bit_size = FIX2INT(param_bit_size);
286
+
287
+ /* Local Variables */
288
+ int given_bit_offset = bit_offset;
289
+ int given_bit_size = bit_size;
290
+ signed char signed_char_value = 0;
291
+ unsigned char unsigned_char_value = 0;
292
+ signed short signed_short_value = 0;
293
+ unsigned short unsigned_short_value = 0;
294
+ signed int signed_int_value = 0;
295
+ signed long signed_long_value = 0;
296
+ unsigned int unsigned_int_value = 0;
297
+ signed long long signed_long_long_value = 0;
298
+ unsigned long long unsigned_long_long_value = 0;
299
+ unsigned char* unsigned_char_array = NULL;
300
+ int array_length = 0;
301
+ char* string = NULL;
302
+ int string_length = 0;
303
+ float float_value = 0.0;
304
+ double double_value = 0.0;
305
+ int shift_needed = 0;
306
+ int shift_count = 0;
307
+ int index = 0;
308
+ int num_bits = 0;
309
+ int num_bytes = 0;
310
+ int num_words = 0;
311
+ int upper_bound = 0;
312
+ int lower_bound = 0;
313
+ int byte_aligned = 0;
314
+ VALUE temp_value = Qnil;
315
+ VALUE return_value = Qnil;
316
+
317
+ unsigned char* buffer = NULL;
318
+ long buffer_length = 0;
319
+
320
+ Check_Type(param_buffer, T_STRING);
321
+ buffer = (unsigned char*) RSTRING_PTR(param_buffer);
322
+ buffer_length = RSTRING_LEN(param_buffer);
323
+
324
+ /* Handle negative bit offsets */
325
+ if (bit_offset < 0) {
326
+ if (given_bit_size <= 0) {
327
+ rb_raise(rb_eArgError, "negative or zero bit_sizes (%d) cannot be given with negative bit_offsets (%d)", given_bit_size, given_bit_offset);
328
+ } else {
329
+ bit_offset = (((int)buffer_length * 8) + bit_offset);
330
+ if (bit_offset < 0) {
331
+ rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
332
+ }
333
+ }
334
+ }
335
+
336
+ /* Handle negative and zero bit sizes */
337
+ if (bit_size <= 0) {
338
+ if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
339
+ bit_size = (((int)buffer_length * 8) - bit_offset + bit_size);
340
+ if (bit_size == 0) {
341
+ return rb_str_new2("");
342
+ } else if (bit_size < 0) {
343
+ rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
344
+ }
345
+ } else {
346
+ rb_raise(rb_eArgError, "bit_size %d must be positive for data types other than :STRING and :BLOCK", given_bit_size);
347
+ }
348
+ }
349
+
350
+ /* define bounds of string to access this item */
351
+ lower_bound = (bit_offset / 8);
352
+ upper_bound = ((bit_offset + bit_size - 1) / 8);
353
+
354
+ /* Check for byte alignment */
355
+ byte_aligned = ((bit_offset % 8) == 0);
356
+
357
+ /* Sanity check buffer size */
358
+ if (upper_bound >= buffer_length) {
359
+ /* Check special case of little endian bit field */
360
+ if ((param_endianness == symbol_LITTLE_ENDIAN) && ((param_data_type == symbol_INT) || (param_data_type == symbol_UINT)) && (!((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64)))) && (lower_bound < buffer_length)) {
361
+ /* Ok little endian bit field */
362
+ } else {
363
+ rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
364
+ }
365
+ }
366
+
367
+ if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
368
+
369
+ /*#######################################
370
+ *# Handle :STRING and :BLOCK data types
371
+ *#######################################*/
372
+
373
+ if (byte_aligned) {
374
+ string_length = upper_bound - lower_bound + 1;
375
+ string = malloc(string_length + 1);
376
+ memcpy(string, buffer + lower_bound, string_length);
377
+ string[string_length] = 0;
378
+ if (param_data_type == symbol_STRING) {
379
+ return_value = rb_str_new2(string);
380
+ } else /* param_data_type == symbol_BLOCK */ {
381
+ return_value = rb_str_new(string, string_length);
382
+ }
383
+ free(string);
384
+ } else {
385
+ rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
386
+ }
387
+
388
+ } else if (param_data_type == symbol_INT) {
389
+
390
+ /*###################################
391
+ *# Handle :INT data type
392
+ *###################################*/
393
+
394
+ if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
395
+ /*###########################################################
396
+ *# Handle byte-aligned 8, 16, 32, and 64 bit :INT
397
+ *###########################################################*/
398
+
399
+ if (bit_size == 8)
400
+ {
401
+ signed_char_value = *((signed char*) &buffer[lower_bound]);
402
+ return_value = INT2FIX(signed_char_value);
403
+ }
404
+ else if (bit_size == 16)
405
+ {
406
+ read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_short_value);
407
+ return_value = INT2FIX(signed_short_value);
408
+ }
409
+ else if (bit_size == 32)
410
+ {
411
+ read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_int_value);
412
+ return_value = INT2NUM(signed_int_value);
413
+ }
414
+ else /* bit_size == 64 */
415
+ {
416
+ read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_long_long_value);
417
+ return_value = LL2NUM(signed_long_long_value);
418
+ }
419
+ } else {
420
+ string_length = ((bit_size - 1)/ 8) + 1;
421
+ array_length = string_length + 4; /* Required number of bytes plus slack */
422
+ unsigned_char_array = (unsigned char*) malloc(array_length);
423
+ read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
424
+
425
+ num_words = ((string_length - 1) / 4) + 1;
426
+ num_bytes = num_words * 4;
427
+ num_bits = num_bytes * 8;
428
+ shift_needed = num_bits - bit_size;
429
+ shift_count = shift_needed / 8;
430
+ shift_needed = shift_needed % 8;
431
+
432
+ if (bit_size > 1) {
433
+ for (index = 0; index < shift_count; index++) {
434
+ signed_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
435
+ }
436
+
437
+ if (shift_needed > 0) {
438
+ signed_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
439
+ }
440
+ } else {
441
+ for (index = 0; index < shift_count; index++) {
442
+ unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
443
+ }
444
+
445
+ if (shift_needed > 0) {
446
+ unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
447
+ }
448
+ }
449
+
450
+ if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
451
+ for (index = 0; index < num_bytes; index += 4) {
452
+ reverse_bytes(&(unsigned_char_array[index]), 4);
453
+ }
454
+ }
455
+
456
+ if (bit_size <= 31) {
457
+ return_value = INT2FIX(*((int*) unsigned_char_array));
458
+ } else if (bit_size == 32) {
459
+ return_value = INT2NUM(*((int*) unsigned_char_array));
460
+ } else {
461
+ return_value = rb_int2big(*((int*) unsigned_char_array));
462
+ temp_value = INT2FIX(32);
463
+ for (index = 4; index < num_bytes; index += 4) {
464
+ return_value = rb_big_lshift(return_value, temp_value);
465
+ if (FIXNUM_P(return_value)) {
466
+ signed_long_value = FIX2LONG(return_value);
467
+ return_value = rb_int2big(signed_long_value);
468
+ }
469
+ return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
470
+ if (FIXNUM_P(return_value)) {
471
+ signed_long_value = FIX2LONG(return_value);
472
+ return_value = rb_int2big(signed_long_value);
473
+ }
474
+ }
475
+ return_value = rb_big_norm(return_value);
476
+ }
477
+
478
+ free(unsigned_char_array);
479
+ }
480
+
481
+ } else if (param_data_type == symbol_UINT) {
482
+
483
+ /*###################################
484
+ *# Handle :UINT data type
485
+ *###################################*/
486
+
487
+ if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
488
+ /*###########################################################
489
+ *# Handle byte-aligned 8, 16, 32, and 64 bit :UINT
490
+ *###########################################################*/
491
+
492
+ if (bit_size == 8)
493
+ {
494
+ unsigned_char_value = buffer[lower_bound];
495
+ return_value = INT2FIX(unsigned_char_value);
496
+ }
497
+ else if (bit_size == 16)
498
+ {
499
+ read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_short_value);
500
+ return_value = INT2FIX(unsigned_short_value);
501
+ }
502
+ else if (bit_size == 32)
503
+ {
504
+ read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_int_value);
505
+ return_value = UINT2NUM(unsigned_int_value);
506
+ }
507
+ else /* bit_size == 64 */
508
+ {
509
+ read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_long_long_value);
510
+ return_value = ULL2NUM(unsigned_long_long_value);
511
+ }
512
+ } else {
513
+ string_length = ((bit_size - 1)/ 8) + 1;
514
+ array_length = string_length + 4; /* Required number of bytes plus slack */
515
+ unsigned_char_array = (unsigned char*) malloc(array_length);
516
+ read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
517
+
518
+ num_words = ((string_length - 1) / 4) + 1;
519
+ num_bytes = num_words * 4;
520
+ num_bits = num_bytes * 8;
521
+ shift_needed = num_bits - bit_size;
522
+ shift_count = shift_needed / 8;
523
+ shift_needed = shift_needed % 8;
524
+
525
+ for (index = 0; index < shift_count; index++) {
526
+ unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
527
+ }
528
+
529
+ if (shift_needed > 0) {
530
+ unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
531
+ }
532
+
533
+ if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
534
+ for (index = 0; index < num_bytes; index += 4) {
535
+ reverse_bytes(&(unsigned_char_array[index]), 4);
536
+ }
537
+ }
538
+
539
+ if (bit_size <= 30) {
540
+ return_value = INT2FIX(*((int*) unsigned_char_array));
541
+ } else if (bit_size <= 32) {
542
+ return_value = UINT2NUM(*((unsigned int*) unsigned_char_array));
543
+ } else {
544
+ return_value = rb_uint2big(*((unsigned int*) unsigned_char_array));
545
+ temp_value = INT2FIX(32);
546
+ for (index = 4; index < num_bytes; index += 4) {
547
+ return_value = rb_big_lshift(return_value, temp_value);
548
+ if (FIXNUM_P(return_value)) {
549
+ signed_long_value = FIX2LONG(return_value);
550
+ return_value = rb_int2big(signed_long_value);
551
+ }
552
+ return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
553
+ if (FIXNUM_P(return_value)) {
554
+ signed_long_value = FIX2LONG(return_value);
555
+ return_value = rb_int2big(signed_long_value);
556
+ }
557
+ }
558
+ return_value = rb_big_norm(return_value);
559
+ }
560
+
561
+ free(unsigned_char_array);
562
+ }
563
+
564
+ } else if (param_data_type == symbol_FLOAT) {
565
+
566
+ /*##########################
567
+ *# Handle :FLOAT data type
568
+ *##########################*/
569
+
570
+ if (byte_aligned) {
571
+ switch (bit_size) {
572
+ case 32:
573
+ read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &float_value);
574
+ return_value = rb_float_new(float_value);
575
+ break;
576
+
577
+ case 64:
578
+ read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &double_value);
579
+ return_value = rb_float_new(double_value);
580
+ break;
581
+
582
+ default:
583
+ rb_raise(rb_eArgError, "bit_size is %d but must be 32 or 64 for data_type %s", given_bit_size, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
584
+ break;
585
+ };
586
+ } else {
587
+ rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
588
+ }
589
+
590
+ } else {
591
+
592
+ /*############################
593
+ *# Handle Unknown data types
594
+ *############################*/
595
+
596
+ rb_raise(rb_eArgError, "data_type %s is not recognized", RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
597
+ }
598
+
599
+ return return_value;
600
+ }
601
+
602
+ /*
603
+ * Returns the actual length as an integer.
604
+ *
605
+ * get_int_length(self) #=> 324
606
+ */
607
+ static int get_int_length(VALUE self)
608
+ {
609
+ VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
610
+ if (RTEST(buffer)) {
611
+ return (int)RSTRING_LEN(buffer);
612
+ } else {
613
+ return 0;
614
+ }
615
+ }
616
+
617
+ /*
618
+ * Returns the actual structure length.
619
+ *
620
+ * structure.length #=> 324
621
+ */
622
+ static VALUE structure_length(VALUE self) {
623
+ return INT2FIX(get_int_length(self));
624
+ }
625
+
626
+ static VALUE read_item_internal(VALUE self, VALUE item, VALUE buffer) {
627
+ VALUE bit_offset = Qnil;
628
+ VALUE bit_size = Qnil;
629
+ VALUE data_type = Qnil;
630
+ VALUE array_size = Qnil;
631
+ VALUE endianness = Qnil;
632
+
633
+ data_type = rb_ivar_get(item, id_ivar_data_type);
634
+ if (data_type == symbol_DERIVED) {
635
+ return Qnil;
636
+ }
637
+
638
+ if (RTEST(buffer)) {
639
+ bit_offset = rb_ivar_get(item, id_ivar_bit_offset);
640
+ bit_size = rb_ivar_get(item, id_ivar_bit_size);
641
+ array_size = rb_ivar_get(item, id_ivar_array_size);
642
+ endianness = rb_ivar_get(item, id_ivar_endianness);
643
+ if (RTEST(array_size)) {
644
+ return rb_funcall(cBinaryAccessor, id_method_read_array, 6, bit_offset, bit_size, data_type, array_size, buffer, endianness);
645
+ } else {
646
+ return binary_accessor_read(cBinaryAccessor, bit_offset, bit_size, data_type, buffer, endianness);
647
+ }
648
+ } else {
649
+ rb_raise(rb_eRuntimeError, "No buffer given to read_item");
650
+ }
651
+ }
652
+
653
+ /*
654
+ * Read an item in the structure
655
+ *
656
+ * @param item [StructureItem] Instance of StructureItem or one of its subclasses
657
+ * @param value_type [Symbol] Not used. Subclasses should overload this
658
+ * parameter to check whether to perform conversions on the item.
659
+ * @param buffer [String] The binary buffer to read the item from
660
+ * @return Value based on the item definition. This could be a string, integer,
661
+ * float, or array of values.
662
+ */
663
+ static VALUE read_item(int argc, VALUE* argv, VALUE self)
664
+ {
665
+ VALUE item = Qnil;
666
+ VALUE buffer = Qnil;
667
+
668
+ switch (argc)
669
+ {
670
+ case 1:
671
+ case 2:
672
+ item = argv[0];
673
+ buffer = rb_ivar_get(self, id_ivar_buffer);
674
+ break;
675
+ case 3:
676
+ item = argv[0];
677
+ buffer = argv[2];
678
+ break;
679
+ default:
680
+ /* Invalid number of arguments given */
681
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
682
+ break;
683
+ };
684
+
685
+ return read_item_internal(self, item, buffer);
686
+ }
687
+
688
+ /*
689
+ * Comparison Operator based on bit_offset. This means that StructureItems
690
+ * with different names or bit sizes are equal if they have the same bit
691
+ * offset.
692
+ */
693
+ static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
694
+ int bit_offset = FIX2INT(rb_ivar_get(self, id_ivar_bit_offset));
695
+ int other_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_offset));
696
+ int bit_size = 0;
697
+ int other_bit_size = 0;
698
+
699
+ /* Handle same bit offset case */
700
+ if ((bit_offset == 0) && (other_bit_offset == 0)) {
701
+ /* Both bit_offsets are 0 so sort by bit_size
702
+ * This allows derived items with bit_size of 0 to be listed first
703
+ * Compare based on bit size */
704
+ bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
705
+ other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
706
+ if (bit_size == other_bit_size) {
707
+ return INT2FIX(0);
708
+ } if (bit_size < other_bit_size) {
709
+ return INT2FIX(-1);
710
+ } else {
711
+ return INT2FIX(1);
712
+ }
713
+ }
714
+
715
+ /* Handle different bit offsets */
716
+ if (((bit_offset >= 0) && (other_bit_offset >= 0)) || ((bit_offset < 0) && (other_bit_offset < 0))) {
717
+ /* Both Have Same Sign */
718
+ if (bit_offset == other_bit_offset) {
719
+ return INT2FIX(0);
720
+ } else if (bit_offset < other_bit_offset) {
721
+ return INT2FIX(-1);
722
+ } else {
723
+ return INT2FIX(1);
724
+ }
725
+ } else {
726
+ /* Different Signs */
727
+ if (bit_offset == other_bit_offset) {
728
+ return INT2FIX(0);
729
+ } else if (bit_offset < other_bit_offset) {
730
+ return INT2FIX(1);
731
+ } else {
732
+ return INT2FIX(-1);
733
+ }
734
+ }
735
+ }
736
+
737
+ /* Structure constructor
738
+ *
739
+ * @param default_endianness [Symbol] Must be one of
740
+ * {BinaryAccessor::ENDIANNESS}. By default it uses
741
+ * BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
742
+ * @param buffer [String] Buffer used to store the structure
743
+ * @param item_class [Class] Class used to instantiate new structure items.
744
+ * Must be StructureItem or one of its subclasses.
745
+ */
746
+ static VALUE structure_initialize(int argc, VALUE* argv, VALUE self) {
747
+ VALUE default_endianness = Qnil;
748
+ VALUE buffer = Qnil;
749
+ VALUE item_class = Qnil;
750
+
751
+ switch (argc)
752
+ {
753
+ case 0:
754
+ default_endianness = HOST_ENDIANNESS;
755
+ buffer = rb_str_new2("");
756
+ item_class = cStructureItem;
757
+ break;
758
+ case 1:
759
+ default_endianness = argv[0];
760
+ buffer = rb_str_new2("");
761
+ item_class = cStructureItem;
762
+ break;
763
+ case 2:
764
+ default_endianness = argv[0];
765
+ buffer = argv[1];
766
+ item_class = cStructureItem;
767
+ break;
768
+ case 3:
769
+ default_endianness = argv[0];
770
+ buffer = argv[1];
771
+ item_class = argv[2];
772
+ break;
773
+ default:
774
+ /* Invalid number of arguments given */
775
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..3)", argc);
776
+ break;
777
+ };
778
+
779
+ if ((default_endianness == symbol_BIG_ENDIAN) || (default_endianness == symbol_LITTLE_ENDIAN)) {
780
+ rb_ivar_set(self, id_ivar_default_endianness, default_endianness);
781
+ if (RTEST(buffer)) {
782
+ Check_Type(buffer, T_STRING);
783
+ rb_funcall(buffer, id_method_force_encoding, 1, ASCII_8BIT_STRING);
784
+ rb_ivar_set(self, id_ivar_buffer, buffer);
785
+ } else {
786
+ rb_ivar_set(self, id_ivar_buffer, Qnil);
787
+ }
788
+ rb_ivar_set(self, id_ivar_item_class, item_class);
789
+ rb_ivar_set(self, id_ivar_items, rb_hash_new());
790
+ rb_ivar_set(self, id_ivar_sorted_items, rb_ary_new());
791
+ rb_ivar_set(self, id_ivar_defined_length, INT2FIX(0));
792
+ rb_ivar_set(self, id_ivar_defined_length_bits, INT2FIX(0));
793
+ rb_ivar_set(self, id_ivar_pos_bit_size, INT2FIX(0));
794
+ rb_ivar_set(self, id_ivar_neg_bit_size, INT2FIX(0));
795
+ rb_ivar_set(self, id_ivar_fixed_size, Qtrue);
796
+ rb_ivar_set(self, id_ivar_short_buffer_allowed, Qfalse);
797
+ rb_ivar_set(self, id_ivar_mutex, Qnil);
798
+ } else {
799
+ rb_raise(rb_eArgError, "Unrecognized endianness: %s - Must be :BIG_ENDIAN or :LITTLE_ENDIAN", RSTRING_PTR(rb_funcall(default_endianness, id_method_to_s, 0)));
800
+ }
801
+
802
+ return self;
803
+ }
804
+
805
+ /*
806
+ * Resize the buffer at least the defined length of the structure
807
+ */
808
+ static VALUE resize_buffer(VALUE self)
809
+ {
810
+ VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
811
+ if (RTEST(buffer)) {
812
+ VALUE value_defined_length = rb_ivar_get(self, id_ivar_defined_length);
813
+ long defined_length = FIX2INT(value_defined_length);
814
+ long current_length = RSTRING_LEN(buffer);
815
+
816
+ /* Extend data size */
817
+ if (current_length < defined_length)
818
+ {
819
+ rb_str_concat(buffer, rb_str_times(ZERO_STRING, INT2FIX(defined_length - current_length)));
820
+ }
821
+ }
822
+
823
+ return self;
824
+ }
825
+
826
+ /*
827
+ * Initialize all Packet methods
828
+ */
829
+ void Init_structure (void)
830
+ {
831
+ int zero = 0;
832
+
833
+ id_method_to_s = rb_intern("to_s");
834
+ id_method_raise_buffer_error = rb_intern("raise_buffer_error");
835
+ id_method_read_array = rb_intern("read_array");
836
+ id_method_force_encoding = rb_intern("force_encoding");
837
+ id_method_freeze = rb_intern("freeze");
838
+
839
+ ASCII_8BIT_STRING = rb_str_new2("ASCII-8BIT");
840
+ rb_funcall(ASCII_8BIT_STRING, id_method_freeze, 0);
841
+
842
+ ZERO_STRING = rb_str_new((char*) &zero, 1);
843
+ rb_funcall(ZERO_STRING, id_method_freeze, 0);
844
+ id_const_ZERO_STRING = rb_intern("ZERO_STRING");
845
+
846
+ id_ivar_buffer = rb_intern("@buffer");
847
+ id_ivar_bit_offset = rb_intern("@bit_offset");
848
+ id_ivar_bit_size = rb_intern("@bit_size");
849
+ id_ivar_array_size = rb_intern("@array_size");
850
+ id_ivar_endianness = rb_intern("@endianness");
851
+ id_ivar_data_type = rb_intern("@data_type");
852
+ id_ivar_default_endianness = rb_intern("@default_endianness");
853
+ id_ivar_item_class = rb_intern("@item_class");
854
+ id_ivar_items = rb_intern("@items");
855
+ id_ivar_sorted_items = rb_intern("@sorted_items");
856
+ id_ivar_defined_length = rb_intern("@defined_length");
857
+ id_ivar_defined_length_bits = rb_intern("@defined_length_bits");
858
+ id_ivar_pos_bit_size = rb_intern("@pos_bit_size");
859
+ id_ivar_neg_bit_size = rb_intern("@neg_bit_size");
860
+ id_ivar_fixed_size = rb_intern("@fixed_size");
861
+ id_ivar_short_buffer_allowed = rb_intern("@short_buffer_allowed");
862
+ id_ivar_mutex = rb_intern("@mutex");
863
+
864
+ symbol_LITTLE_ENDIAN = ID2SYM(rb_intern("LITTLE_ENDIAN"));
865
+ symbol_BIG_ENDIAN = ID2SYM(rb_intern("BIG_ENDIAN"));
866
+ symbol_INT = ID2SYM(rb_intern("INT"));
867
+ symbol_UINT = ID2SYM(rb_intern("UINT"));
868
+ symbol_FLOAT = ID2SYM(rb_intern("FLOAT"));
869
+ symbol_STRING = ID2SYM(rb_intern("STRING"));
870
+ symbol_BLOCK = ID2SYM(rb_intern("BLOCK"));
871
+ symbol_DERIVED = ID2SYM(rb_intern("DERIVED"));
872
+ symbol_read = ID2SYM(rb_intern("read"));
873
+
874
+ if ((*((char *) &endianness_check)) == 1) {
875
+ HOST_ENDIANNESS = symbol_LITTLE_ENDIAN;
876
+ } else {
877
+ HOST_ENDIANNESS = symbol_BIG_ENDIAN;
878
+ }
879
+
880
+ mCosmos = rb_define_module("Cosmos");
881
+
882
+ cBinaryAccessor = rb_define_class_under(mCosmos, "BinaryAccessor", rb_cObject);
883
+ rb_define_singleton_method(cBinaryAccessor, "read", binary_accessor_read, 5);
884
+
885
+ cStructure = rb_define_class_under(mCosmos, "Structure", rb_cObject);
886
+ rb_const_set(cStructure, id_const_ZERO_STRING, ZERO_STRING);
887
+ rb_define_method(cStructure, "initialize", structure_initialize, -1);
888
+ rb_define_method(cStructure, "length", structure_length, 0);
889
+ rb_define_method(cStructure, "read_item", read_item, -1);
890
+ rb_define_method(cStructure, "resize_buffer", resize_buffer, 0);
891
+
892
+ cStructureItem = rb_define_class_under(mCosmos, "StructureItem", rb_cObject);
893
+ rb_define_method(cStructureItem, "<=>", structure_item_spaceship, 1);
894
+ }