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,128 +1,128 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/packets/limits_response'
12
-
13
- module Cosmos
14
-
15
- # Maintains knowledge of limits for a PacketItem
16
- class PacketItemLimits
17
- # Array of all limit states
18
- LIMITS_STATES = [:RED, :RED_HIGH, :RED_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW, :GREEN, :GREEN_HIGH, :GREEN_LOW, :BLUE, :STALE, nil]
19
- # Array of all limit states which should be considered in error
20
- OUT_OF_LIMITS_STATES = [:RED, :RED_HIGH, :RED_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW]
21
-
22
- # Hash of arrays - Hash key is uppercase symbol designating limits set.
23
- # :DEFAULT limits set is required if item has limits. nil indicates the
24
- # item does not have limits. For defined limits, each array in the hash
25
- # contains [:RED_LOW, :YELLOW_LOW, :YELLOW_HIGH, :RED_HIGH,
26
- # :GREEN_LOW (optional), GREEN_HIGH (optional)].
27
- # @return [Hash{Symbol=>Array}] Hash of all the limits defined for this
28
- # item. Must include a hash key of :DEFAULT which returns the default
29
- # limits.
30
- attr_reader :values
31
-
32
- # Every item effectively always has "limits" enabled because it can go from
33
- # :STALE to nil as needed. This flag indicates whether an item with defined
34
- # limit values can transition from nil to the various other states.
35
- #
36
- # @return [Boolean] Whether limits are enabled on this item
37
- attr_accessor :enabled
38
-
39
- # Current limits state of the item. One of nil, :STALE, :BLUE, :GREEN,
40
- # :GREEN_HIGH, :GREEN_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW,
41
- # :RED, :RED_HIGH, :RED_LOW. Items initialize to :STALE and change states
42
- # as the item value changes. If the limits are disabled the state changes
43
- # to nil. If a packet becomes stale the items state changes to :STALE.
44
- # @return [Symbol, nil] Current limits state of the item
45
- attr_reader :state
46
-
47
- # @return [LimitsResponse] Response method to be called on limits changes
48
- attr_reader :response
49
-
50
- # @return [Integer] Number of out of limits samples at which the limits
51
- # state will change
52
- attr_reader :persistence_setting
53
-
54
- # Current persistent count. The count will be reset to zero if the limits
55
- # state hasn't changed (i.e. remained :GREEN).
56
- # @return [Integer] Current running persistence count
57
- attr_reader :persistence_count
58
-
59
- # Create a PacketItemLimits
60
- def initialize
61
- @values = nil
62
- @enabled = false
63
- @state = :STALE
64
- @response = nil
65
- @persistence_setting = 1
66
- @persistence_count = 0
67
- end
68
-
69
- def values=(values)
70
- if values
71
- raise ArgumentError, "values must be a Hash but is a #{values.class}" unless Hash === values
72
- raise ArgumentError, "values must be a Hash with a :DEFAULT key" unless values.keys.include?(:DEFAULT)
73
- @values = values.clone
74
- else
75
- @values = nil
76
- end
77
- end
78
-
79
- def state=(state)
80
- raise ArgumentError, "state must be one of #{LIMITS_STATES} but is #{state}" unless LIMITS_STATES.include?(state)
81
- @state = state
82
- end
83
-
84
- def response=(response)
85
- if response
86
- raise ArgumentError, "response must be a Cosmos::LimitsResponse but is a #{response.class}" unless Cosmos::LimitsResponse === response
87
- @response = response.clone
88
- else
89
- @response = nil
90
- end
91
- end
92
-
93
- def persistence_setting=(persistence_setting)
94
- raise ArgumentError, "persistence_setting must be a Fixnum but is a #{persistence_setting.class}" unless Fixnum === persistence_setting
95
- @persistence_setting = persistence_setting
96
- end
97
-
98
- def persistence_count=(persistence_count)
99
- raise ArgumentError, "persistence_count must be a Fixnum but is a #{persistence_count.class}" unless Fixnum === persistence_count
100
- @persistence_count = persistence_count
101
- end
102
-
103
- # Make a light weight clone of this limits
104
- def clone
105
- limits = super()
106
- limits.values = self.values.clone if self.values
107
- limits.response = self.response.clone if self.response
108
- limits
109
- end
110
- alias dup clone
111
-
112
- def to_hash
113
- hash = {}
114
- hash['values'] = self.values
115
- hash['enabled'] = self.enabled
116
- hash['state'] = self.state
117
- if self.response
118
- hash['response'] = self.response.to_s
119
- else
120
- hash['response'] = nil
121
- end
122
- hash['persistence_setting'] = self.persistence_setting
123
- hash['persistence_count'] = self.persistence_count
124
- hash
125
- end
126
-
127
- end
128
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/packets/limits_response'
12
+
13
+ module Cosmos
14
+
15
+ # Maintains knowledge of limits for a PacketItem
16
+ class PacketItemLimits
17
+ # Array of all limit states
18
+ LIMITS_STATES = [:RED, :RED_HIGH, :RED_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW, :GREEN, :GREEN_HIGH, :GREEN_LOW, :BLUE, :STALE, nil]
19
+ # Array of all limit states which should be considered in error
20
+ OUT_OF_LIMITS_STATES = [:RED, :RED_HIGH, :RED_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW]
21
+
22
+ # Hash of arrays - Hash key is uppercase symbol designating limits set.
23
+ # :DEFAULT limits set is required if item has limits. nil indicates the
24
+ # item does not have limits. For defined limits, each array in the hash
25
+ # contains [:RED_LOW, :YELLOW_LOW, :YELLOW_HIGH, :RED_HIGH,
26
+ # :GREEN_LOW (optional), GREEN_HIGH (optional)].
27
+ # @return [Hash{Symbol=>Array}] Hash of all the limits defined for this
28
+ # item. Must include a hash key of :DEFAULT which returns the default
29
+ # limits.
30
+ attr_reader :values
31
+
32
+ # Every item effectively always has "limits" enabled because it can go from
33
+ # :STALE to nil as needed. This flag indicates whether an item with defined
34
+ # limit values can transition from nil to the various other states.
35
+ #
36
+ # @return [Boolean] Whether limits are enabled on this item
37
+ attr_accessor :enabled
38
+
39
+ # Current limits state of the item. One of nil, :STALE, :BLUE, :GREEN,
40
+ # :GREEN_HIGH, :GREEN_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW,
41
+ # :RED, :RED_HIGH, :RED_LOW. Items initialize to :STALE and change states
42
+ # as the item value changes. If the limits are disabled the state changes
43
+ # to nil. If a packet becomes stale the items state changes to :STALE.
44
+ # @return [Symbol, nil] Current limits state of the item
45
+ attr_reader :state
46
+
47
+ # @return [LimitsResponse] Response method to be called on limits changes
48
+ attr_reader :response
49
+
50
+ # @return [Integer] Number of out of limits samples at which the limits
51
+ # state will change
52
+ attr_reader :persistence_setting
53
+
54
+ # Current persistent count. The count will be reset to zero if the limits
55
+ # state hasn't changed (i.e. remained :GREEN).
56
+ # @return [Integer] Current running persistence count
57
+ attr_reader :persistence_count
58
+
59
+ # Create a PacketItemLimits
60
+ def initialize
61
+ @values = nil
62
+ @enabled = false
63
+ @state = :STALE
64
+ @response = nil
65
+ @persistence_setting = 1
66
+ @persistence_count = 0
67
+ end
68
+
69
+ def values=(values)
70
+ if values
71
+ raise ArgumentError, "values must be a Hash but is a #{values.class}" unless Hash === values
72
+ raise ArgumentError, "values must be a Hash with a :DEFAULT key" unless values.keys.include?(:DEFAULT)
73
+ @values = values.clone
74
+ else
75
+ @values = nil
76
+ end
77
+ end
78
+
79
+ def state=(state)
80
+ raise ArgumentError, "state must be one of #{LIMITS_STATES} but is #{state}" unless LIMITS_STATES.include?(state)
81
+ @state = state
82
+ end
83
+
84
+ def response=(response)
85
+ if response
86
+ raise ArgumentError, "response must be a Cosmos::LimitsResponse but is a #{response.class}" unless Cosmos::LimitsResponse === response
87
+ @response = response.clone
88
+ else
89
+ @response = nil
90
+ end
91
+ end
92
+
93
+ def persistence_setting=(persistence_setting)
94
+ raise ArgumentError, "persistence_setting must be a Fixnum but is a #{persistence_setting.class}" unless Fixnum === persistence_setting
95
+ @persistence_setting = persistence_setting
96
+ end
97
+
98
+ def persistence_count=(persistence_count)
99
+ raise ArgumentError, "persistence_count must be a Fixnum but is a #{persistence_count.class}" unless Fixnum === persistence_count
100
+ @persistence_count = persistence_count
101
+ end
102
+
103
+ # Make a light weight clone of this limits
104
+ def clone
105
+ limits = super()
106
+ limits.values = self.values.clone if self.values
107
+ limits.response = self.response.clone if self.response
108
+ limits
109
+ end
110
+ alias dup clone
111
+
112
+ def to_hash
113
+ hash = {}
114
+ hash['values'] = self.values
115
+ hash['enabled'] = self.enabled
116
+ hash['state'] = self.state
117
+ if self.response
118
+ hash['response'] = self.response.to_s
119
+ else
120
+ hash['response'] = nil
121
+ end
122
+ hash['persistence_setting'] = self.persistence_setting
123
+ hash['persistence_count'] = self.persistence_count
124
+ hash
125
+ end
126
+
127
+ end
128
+ end # module Cosmos
@@ -1,386 +1,421 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU Lesser General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/packets/binary_accessor'
12
- require 'cosmos/packets/structure_item'
13
- require 'cosmos/ext/packet'
14
-
15
- module Cosmos
16
-
17
- # Maintains knowledge of a raw binary structure. Uses structure_item to
18
- # create individual structure items which are read and written by
19
- # binary_accessor.
20
- class Structure
21
-
22
- # @return [Symbol] Default endianness for items in the structure. One of
23
- # {BinaryAccessor::ENDIANNESS}
24
- attr_reader :default_endianness
25
-
26
- # @return [Hash] Items that make up the structure.
27
- # Hash key is the item's name in uppercase
28
- attr_reader :items
29
-
30
- # @return [Array] Items sorted by bit_offset.
31
- attr_reader :sorted_items
32
-
33
- # @return [Integer] Defined length in bytes (not bits) of the structure
34
- attr_reader :defined_length
35
-
36
- # @return [Integer] Defined length in bits of the structure
37
- attr_reader :defined_length_bits
38
-
39
- # @return [Boolean] Flag indicating if the structure contains any variably
40
- # sized items or not.
41
- attr_reader :fixed_size
42
-
43
- # @return [Boolean] Flag indicating if giving a buffer with less than
44
- # required data size is allowed.
45
- attr_accessor :short_buffer_allowed
46
-
47
- # String providing a single 0 byte
48
- # ZERO_STRING = "\000"
49
- # ZERO_STRING.freeze
50
-
51
- # Structure constructor
52
- #
53
- # @param default_endianness [Symbol] Must be one of
54
- # {BinaryAccessor::ENDIANNESS}. By default it uses
55
- # BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
56
- # @param buffer [String] Buffer used to store the structure
57
- # @param item_class [Class] Class used to instantiate new structure items.
58
- # Must be StructureItem or one of its subclasses.
59
- # def initialize(default_endianness = BinaryAccessor::HOST_ENDIANNESS,
60
- # buffer = '',
61
- # item_class = StructureItem)
62
-
63
- # Indicates if any items have been defined for this structure
64
- # @return [TrueClass or FalseClass]
65
- def defined?
66
- @sorted_items.length > 0
67
- end
68
-
69
- # Define an item in the structure. This creates a new instance of the
70
- # item_class as given in the constructor and adds it to the items hash. It
71
- # also resizes the buffer to accomodate the new item.
72
- #
73
- # @param name [String] Name of the item. Used by the items hash to retrieve
74
- # the item.
75
- # @param bit_offset [Integer] Bit offset of the item in the raw buffer
76
- # @param bit_size [Integer] Bit size of the item in the raw buffer
77
- # @param data_type [Symbol] Type of data contained by the item. This is
78
- # dependant on the item_class but by default see StructureItem.
79
- # @param array_size [Integer] Set to a non nil value if the item is to
80
- # represented as an array.
81
- # @param endianness [Symbol] Endianness of this item. By default the
82
- # endianness as set in the constructure is used.
83
- # @param overflow [Symbol] How to handle value overflows. This is
84
- # dependant on the item_class but by default see StructureItem.
85
- # @return [StrutureItem] The struture item defined
86
- def define_item(name, bit_offset, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR)
87
- # Handle case-insensitive naming
88
- name_upcase = name.upcase
89
-
90
- # Create the item
91
- item = @item_class.new(name_upcase, bit_offset, bit_size, data_type, endianness, array_size, overflow)
92
-
93
- # Handle Overwriting Existing Item
94
- if @items[name_upcase]
95
- item_index = nil
96
- @sorted_items.each_with_index do |sorted_item, index|
97
- if sorted_item.name == name_upcase
98
- item_index = index
99
- break
100
- end
101
- end
102
- @sorted_items.delete_at(item_index) if item_index < @sorted_items.length
103
- end
104
-
105
- # Add to Sorted Items
106
- unless @sorted_items.empty?
107
- last_item = @sorted_items[-1]
108
- @sorted_items << item
109
- # If the current item or last item have a negative offset then we have
110
- # to re-sort. We also re-sort if the current item is less than the less
111
- # item because we are inserting.
112
- if last_item.bit_offset <= 0 or item.bit_offset <= 0 or item.bit_offset < last_item.bit_offset
113
- @sorted_items = @sorted_items.sort {|item1, item2| item1 <=> item2}
114
- end
115
- else
116
- @sorted_items << item
117
- end
118
-
119
- # Add to the overall hash of defined items
120
- @items[name_upcase] = item
121
- # Update fixed size knowledge
122
- @fixed_size = false if ((data_type != :DERIVED and bit_size <= 0) or (array_size and array_size <= 0))
123
-
124
- # Recalculate the overall defined length of the structure
125
- update_needed = false
126
- if item.bit_offset >= 0
127
- if item.bit_size > 0
128
- if item.array_size
129
- if item.array_size >= 0
130
- item_defined_length_bits = item.bit_offset + item.array_size
131
- else
132
- item_defined_length_bits = item.bit_offset
133
- end
134
- else
135
- item_defined_length_bits = item.bit_offset + item.bit_size
136
- end
137
- if item_defined_length_bits > @pos_bit_size
138
- @pos_bit_size = item_defined_length_bits
139
- update_needed = true
140
- end
141
- else
142
- if item.bit_offset > @pos_bit_size
143
- @pos_bit_size = item.bit_offset
144
- update_needed = true
145
- end
146
- end
147
- else
148
- if item.bit_offset.abs > @neg_bit_size
149
- @neg_bit_size = item.bit_offset.abs
150
- update_needed = true
151
- end
152
- end
153
- if update_needed
154
- @defined_length_bits = @pos_bit_size + @neg_bit_size
155
- @defined_length = @defined_length_bits / 8
156
- @defined_length += 1 if @defined_length_bits % 8 != 0
157
- end
158
-
159
- # Resize the buffer if necessary
160
- resize_buffer() if @buffer
161
-
162
- return item
163
- end
164
-
165
- # Define an item at the end of the structure. This creates a new instance of the
166
- # item_class as given in the constructor and adds it to the items hash. It
167
- # also resizes the buffer to accomodate the new item.
168
- #
169
- # @param name (see #define_item)
170
- # @param bit_size (see #define_item)
171
- # @param data_type (see #define_item)
172
- # @param array_size (see #define_item)
173
- # @param endianness (see #define_item)
174
- # @param overflow (see #define_item)
175
- # @return (see #define_item)
176
- def append_item(name, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR)
177
- raise ArgumentError, "Can't append an item after a variably sized item" if !@fixed_size
178
- return define_item(name, @defined_length_bits, bit_size, data_type, array_size, endianness, overflow)
179
- end
180
-
181
- # @param name [String] Name of the item to look up in the items Hash
182
- # @return [StructureItem] StructureItem or one of its subclasses
183
- def get_item(name)
184
- item = @items[name.upcase]
185
- raise ArgumentError, "Unknown item: #{name}" unless item
186
- return item
187
- end
188
-
189
- # @param item [#name] Instance of StructureItem or one of its subclasses.
190
- # The name method will be used to look up the item and set it to the new instance.
191
- def set_item(item)
192
- if @items[item.name]
193
- @items[item.name] = item
194
- else
195
- raise ArgumentError, "Unknown item: #{item.name} - Ensure item name is uppercase"
196
- end
197
- end
198
-
199
- # Read an item in the structure
200
- #
201
- # @param item [StructureItem] Instance of StructureItem or one of its subclasses
202
- # @param value_type [Symbol] Not used. Subclasses should overload this
203
- # parameter to check whether to perform conversions on the item.
204
- # @param buffer [String] The binary buffer to read the item from
205
- # @return Value based on the item definition. This could be a string, integer,
206
- # float, or array of values.
207
- # def read_item(item, value_type = :RAW, buffer = @buffer)
208
-
209
- # Write a value to the buffer based on the item definition
210
- #
211
- # @param item [StructureItem] Instance of StructureItem or one of its subclasses
212
- # @param value [Object] Value based on the item definition. This could be
213
- # a string, integer, float, or array of values.
214
- # @param value_type [Symbol] Not used. Subclasses should overload this
215
- # parameter to check whether to perform conversions on the item.
216
- # @param buffer [String] The binary buffer to write the value to
217
- def write_item(item, value, value_type = :RAW, buffer = @buffer)
218
- if buffer
219
- if item.array_size
220
- BinaryAccessor.write_array(value, item.bit_offset, item.bit_size, item.data_type, item.array_size, buffer, item.endianness, item.overflow)
221
- else
222
- BinaryAccessor.write(value, item.bit_offset, item.bit_size, item.data_type, buffer, item.endianness, item.overflow)
223
- end
224
- else
225
- raise "No buffer given to write_item"
226
- end
227
- end
228
-
229
- # Read an item in the structure by name
230
- #
231
- # @param name [String] Name of an item to read
232
- # @param value_type [Symbol] Not used. Subclasses should overload this
233
- # parameter to check whether to perform conversions on the item.
234
- # @param buffer [String] The binary buffer to read the item from
235
- # @return Value based on the item definition. This could be an integer,
236
- # float, or array of values.
237
- def read(name, value_type = :RAW, buffer = @buffer)
238
- return read_item(get_item(name), value_type, buffer)
239
- end
240
-
241
- # Write an item in the structure by name
242
- #
243
- # @param name [Object] Name of the item to write
244
- # @param value [Object] Value based on the item definition. This could be
245
- # a string, integer, float, or array of values.
246
- # @param value_type [Symbol] Not used. Subclasses should overload this
247
- # parameter to check whether to perform conversions on the item.
248
- # @param buffer [String] The binary buffer to write the value to
249
- def write(name, value, value_type = :RAW, buffer = @buffer)
250
- write_item(get_item(name), value, value_type, buffer)
251
- end
252
-
253
- # Read all items in the structure into an array of arrays
254
- # [[item name, item value], ...]
255
- #
256
- # @param value_type [Symbol] Not used. Subclasses should overload this
257
- # parameter to check whether to perform conversions on the item.
258
- # @param buffer [String] The binary buffer to write the value to
259
- # @return [Array<Array>] Array of two element arrays containing the item
260
- # name as element 0 and item value as element 1.
261
- def read_all(value_type = :RAW, buffer = @buffer)
262
- item_array = []
263
- @sorted_items.each {|item| item_array << [item.name, read_item(item, value_type, buffer)]}
264
- return item_array
265
- end
266
-
267
- # Create a string that shows the name and value of each item in the structure
268
- #
269
- # @param value_type [Symbol] Not used. Subclasses should overload this
270
- # parameter to check whether to perform conversions on the item.
271
- # @param indent [Integer] Amount to indent before printing the item name
272
- # @param buffer [String] The binary buffer to write the value to
273
- # @return [String] String formatted with all the item names and values
274
- def formatted(value_type = :RAW, indent = 0, buffer = @buffer)
275
- indent_string = ' ' * indent
276
- string = ''
277
- @sorted_items.each do |item|
278
- if item.data_type != :BLOCK
279
- string << "#{indent_string}#{item.name}: #{read_item(item, value_type, buffer)}\n"
280
- else
281
- value = read_item(item, value_type, buffer)
282
- if String === value
283
- string << "#{indent_string}#{item.name}:\n"
284
- string << value.formatted(1, 16, ' ', indent + 2)
285
- else
286
- string << "#{indent_string}#{item.name}: #{value}\n"
287
- end
288
- end
289
- end
290
- return string
291
- end
292
-
293
- # Get the length of the buffer used by the structure
294
- #
295
- # @return [Integer] Size of the buffer in bytes
296
- # def length
297
-
298
- # Get the buffer used by the structure. The current buffer is copied and
299
- # thus modifications to the returned buffer will have no effect on the
300
- # structure items.
301
- #
302
- # @param copy [TrueClass/FalseClass] Whether to copy the buffer
303
- # @return [String] Data buffer backing the structure
304
- def buffer(copy = true)
305
- if @buffer
306
- if copy
307
- return @buffer.dup
308
- else
309
- return @buffer
310
- end
311
- else
312
- return nil
313
- end
314
- end
315
-
316
- # Set the buffer to be used by the structure. The buffer is copied and thus
317
- # further modifications to the buffer have no effect on the structure
318
- # items.
319
- #
320
- # @param buffer [String] Buffer of data to back the stucture items
321
- def buffer=(buffer)
322
- synchronize() do
323
- internal_buffer_equals(buffer)
324
- end
325
- end
326
-
327
- # Take the structure mutex to ensure the buffer does not change while you perform activities
328
- def synchronize
329
- @mutex ||= Mutex.new
330
- @mutex.synchronize {|| yield }
331
- end
332
-
333
- # Make a light weight clone of this structure. This only creates a new buffer
334
- # of data. The defined structure items are the same.
335
- #
336
- # @return [Structure] A copy of the current structure with a new underlying
337
- # buffer of data
338
- def clone
339
- structure = super()
340
- @buffer = @buffer.clone if @buffer # Deep Copy @buffer
341
- return structure
342
- end
343
- alias dup clone
344
-
345
- def enable_method_missing
346
- extend(MethodMissing)
347
- end
348
-
349
- protected
350
-
351
- module MethodMissing
352
- # Method missing provides reading/writing item values as if they were methods to the class
353
- def method_missing(name, value = nil)
354
- if @buffer
355
- if value
356
- # Strip off the equals sign before looking up the item
357
- return write(name.to_s[0..-2], value)
358
- else
359
- return read(name.to_s)
360
- end
361
- else
362
- raise "No buffer available for method_missing"
363
- end
364
- end
365
- end
366
-
367
- # Resize the buffer at least the defined length of the structure
368
- # def resize_buffer
369
-
370
- def internal_buffer_equals(buffer)
371
- raise ArgumentError, "Buffer class is #{buffer.class} but must be String" unless String === buffer
372
- @buffer = buffer.dup
373
- @buffer.force_encoding('ASCII-8BIT')
374
- if @buffer.length != @defined_length
375
- if @buffer.length < @defined_length
376
- resize_buffer()
377
- raise "Buffer length less than defined length" unless @short_buffer_allowed
378
- elsif @fixed_size and @defined_length != 0
379
- raise "Buffer length greater than defined length"
380
- end
381
- end
382
- end
383
-
384
- end # class Structure
385
-
386
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Lesser General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/packets/binary_accessor'
12
+ require 'cosmos/packets/structure_item'
13
+ require 'cosmos/ext/packet'
14
+
15
+ module Cosmos
16
+
17
+ # Maintains knowledge of a raw binary structure. Uses structure_item to
18
+ # create individual structure items which are read and written by
19
+ # binary_accessor.
20
+ class Structure
21
+
22
+ # @return [Symbol] Default endianness for items in the structure. One of
23
+ # {BinaryAccessor::ENDIANNESS}
24
+ attr_reader :default_endianness
25
+
26
+ # @return [Hash] Items that make up the structure.
27
+ # Hash key is the item's name in uppercase
28
+ attr_reader :items
29
+
30
+ # @return [Array] Items sorted by bit_offset.
31
+ attr_reader :sorted_items
32
+
33
+ # @return [Integer] Defined length in bytes (not bits) of the structure
34
+ attr_reader :defined_length
35
+
36
+ # @return [Integer] Defined length in bits of the structure
37
+ attr_reader :defined_length_bits
38
+
39
+ # @return [Boolean] Flag indicating if the structure contains any variably
40
+ # sized items or not.
41
+ attr_reader :fixed_size
42
+
43
+ # @return [Boolean] Flag indicating if giving a buffer with less than
44
+ # required data size is allowed.
45
+ attr_accessor :short_buffer_allowed
46
+
47
+ # String providing a single 0 byte
48
+ # ZERO_STRING = "\000"
49
+ # ZERO_STRING.freeze
50
+
51
+ # Structure constructor
52
+ #
53
+ # @param default_endianness [Symbol] Must be one of
54
+ # {BinaryAccessor::ENDIANNESS}. By default it uses
55
+ # BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
56
+ # @param buffer [String] Buffer used to store the structure
57
+ # @param item_class [Class] Class used to instantiate new structure items.
58
+ # Must be StructureItem or one of its subclasses.
59
+ # def initialize(default_endianness = BinaryAccessor::HOST_ENDIANNESS,
60
+ # buffer = '',
61
+ # item_class = StructureItem)
62
+
63
+ # Indicates if any items have been defined for this structure
64
+ # @return [TrueClass or FalseClass]
65
+ def defined?
66
+ @sorted_items.length > 0
67
+ end
68
+
69
+ # Define an item in the structure. This creates a new instance of the
70
+ # item_class as given in the constructor and adds it to the items hash. It
71
+ # also resizes the buffer to accomodate the new item.
72
+ #
73
+ # @param name [String] Name of the item. Used by the items hash to retrieve
74
+ # the item.
75
+ # @param bit_offset [Integer] Bit offset of the item in the raw buffer
76
+ # @param bit_size [Integer] Bit size of the item in the raw buffer
77
+ # @param data_type [Symbol] Type of data contained by the item. This is
78
+ # dependant on the item_class but by default see StructureItem.
79
+ # @param array_size [Integer] Set to a non nil value if the item is to
80
+ # represented as an array.
81
+ # @param endianness [Symbol] Endianness of this item. By default the
82
+ # endianness as set in the constructure is used.
83
+ # @param overflow [Symbol] How to handle value overflows. This is
84
+ # dependant on the item_class but by default see StructureItem.
85
+ # @return [StrutureItem] The struture item defined
86
+ def define_item(name, bit_offset, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR)
87
+ # Handle case-insensitive naming
88
+ name_upcase = name.upcase
89
+
90
+ # Create the item
91
+ item = @item_class.new(name_upcase, bit_offset, bit_size, data_type, endianness, array_size, overflow)
92
+
93
+ # Handle Overwriting Existing Item
94
+ if @items[name_upcase]
95
+ item_index = nil
96
+ @sorted_items.each_with_index do |sorted_item, index|
97
+ if sorted_item.name == name_upcase
98
+ item_index = index
99
+ break
100
+ end
101
+ end
102
+ @sorted_items.delete_at(item_index) if item_index < @sorted_items.length
103
+ end
104
+
105
+ # Add to Sorted Items
106
+ unless @sorted_items.empty?
107
+ last_item = @sorted_items[-1]
108
+ @sorted_items << item
109
+ # If the current item or last item have a negative offset then we have
110
+ # to re-sort. We also re-sort if the current item is less than the less
111
+ # item because we are inserting.
112
+ if last_item.bit_offset <= 0 or item.bit_offset <= 0 or item.bit_offset < last_item.bit_offset
113
+ @sorted_items = @sorted_items.sort {|item1, item2| item1 <=> item2}
114
+ end
115
+ else
116
+ @sorted_items << item
117
+ end
118
+
119
+ # Add to the overall hash of defined items
120
+ @items[name_upcase] = item
121
+ # Update fixed size knowledge
122
+ @fixed_size = false if ((data_type != :DERIVED and bit_size <= 0) or (array_size and array_size <= 0))
123
+
124
+ # Recalculate the overall defined length of the structure
125
+ update_needed = false
126
+ if item.bit_offset >= 0
127
+ if item.bit_size > 0
128
+ if item.array_size
129
+ if item.array_size >= 0
130
+ item_defined_length_bits = item.bit_offset + item.array_size
131
+ else
132
+ item_defined_length_bits = item.bit_offset
133
+ end
134
+ else
135
+ item_defined_length_bits = item.bit_offset + item.bit_size
136
+ end
137
+ if item_defined_length_bits > @pos_bit_size
138
+ @pos_bit_size = item_defined_length_bits
139
+ update_needed = true
140
+ end
141
+ else
142
+ if item.bit_offset > @pos_bit_size
143
+ @pos_bit_size = item.bit_offset
144
+ update_needed = true
145
+ end
146
+ end
147
+ else
148
+ if item.bit_offset.abs > @neg_bit_size
149
+ @neg_bit_size = item.bit_offset.abs
150
+ update_needed = true
151
+ end
152
+ end
153
+ if update_needed
154
+ @defined_length_bits = @pos_bit_size + @neg_bit_size
155
+ @defined_length = @defined_length_bits / 8
156
+ @defined_length += 1 if @defined_length_bits % 8 != 0
157
+ end
158
+
159
+ # Resize the buffer if necessary
160
+ resize_buffer() if @buffer
161
+
162
+ return item
163
+ end
164
+
165
+ # Define an item at the end of the structure. This creates a new instance of the
166
+ # item_class as given in the constructor and adds it to the items hash. It
167
+ # also resizes the buffer to accomodate the new item.
168
+ #
169
+ # @param name (see #define_item)
170
+ # @param bit_size (see #define_item)
171
+ # @param data_type (see #define_item)
172
+ # @param array_size (see #define_item)
173
+ # @param endianness (see #define_item)
174
+ # @param overflow (see #define_item)
175
+ # @return (see #define_item)
176
+ def append_item(name, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR)
177
+ raise ArgumentError, "Can't append an item after a variably sized item" if !@fixed_size
178
+ return define_item(name, @defined_length_bits, bit_size, data_type, array_size, endianness, overflow)
179
+ end
180
+
181
+ # @param name [String] Name of the item to look up in the items Hash
182
+ # @return [StructureItem] StructureItem or one of its subclasses
183
+ def get_item(name)
184
+ item = @items[name.upcase]
185
+ raise ArgumentError, "Unknown item: #{name}" unless item
186
+ return item
187
+ end
188
+
189
+ # @param item [#name] Instance of StructureItem or one of its subclasses.
190
+ # The name method will be used to look up the item and set it to the new instance.
191
+ def set_item(item)
192
+ if @items[item.name]
193
+ @items[item.name] = item
194
+ else
195
+ raise ArgumentError, "Unknown item: #{item.name} - Ensure item name is uppercase"
196
+ end
197
+ end
198
+
199
+ # Read an item in the structure
200
+ #
201
+ # @param item [StructureItem] Instance of StructureItem or one of its subclasses
202
+ # @param value_type [Symbol] Not used. Subclasses should overload this
203
+ # parameter to check whether to perform conversions on the item.
204
+ # @param buffer [String] The binary buffer to read the item from
205
+ # @return Value based on the item definition. This could be a string, integer,
206
+ # float, or array of values.
207
+ # def read_item(item, value_type = :RAW, buffer = @buffer)
208
+
209
+ # Write a value to the buffer based on the item definition
210
+ #
211
+ # @param item [StructureItem] Instance of StructureItem or one of its subclasses
212
+ # @param value [Object] Value based on the item definition. This could be
213
+ # a string, integer, float, or array of values.
214
+ # @param value_type [Symbol] Not used. Subclasses should overload this
215
+ # parameter to check whether to perform conversions on the item.
216
+ # @param buffer [String] The binary buffer to write the value to
217
+ def write_item(item, value, value_type = :RAW, buffer = @buffer)
218
+ if buffer
219
+ if item.array_size
220
+ BinaryAccessor.write_array(value, item.bit_offset, item.bit_size, item.data_type, item.array_size, buffer, item.endianness, item.overflow)
221
+ else
222
+ BinaryAccessor.write(value, item.bit_offset, item.bit_size, item.data_type, buffer, item.endianness, item.overflow)
223
+ end
224
+ else
225
+ raise "No buffer given to write_item"
226
+ end
227
+ end
228
+
229
+ # Read an item in the structure by name
230
+ #
231
+ # @param name [String] Name of an item to read
232
+ # @param value_type [Symbol] Not used. Subclasses should overload this
233
+ # parameter to check whether to perform conversions on the item.
234
+ # @param buffer [String] The binary buffer to read the item from
235
+ # @return Value based on the item definition. This could be an integer,
236
+ # float, or array of values.
237
+ def read(name, value_type = :RAW, buffer = @buffer)
238
+ return read_item(get_item(name), value_type, buffer)
239
+ end
240
+
241
+ # Write an item in the structure by name
242
+ #
243
+ # @param name [Object] Name of the item to write
244
+ # @param value [Object] Value based on the item definition. This could be
245
+ # a string, integer, float, or array of values.
246
+ # @param value_type [Symbol] Not used. Subclasses should overload this
247
+ # parameter to check whether to perform conversions on the item.
248
+ # @param buffer [String] The binary buffer to write the value to
249
+ def write(name, value, value_type = :RAW, buffer = @buffer)
250
+ write_item(get_item(name), value, value_type, buffer)
251
+ end
252
+
253
+ # Read all items in the structure into an array of arrays
254
+ # [[item name, item value], ...]
255
+ #
256
+ # @param value_type [Symbol] Not used. Subclasses should overload this
257
+ # parameter to check whether to perform conversions on the item.
258
+ # @param buffer [String] The binary buffer to write the value to
259
+ # @param top [Boolean] Indicates if this is a top level call for the mutex
260
+ # @return [Array<Array>] Array of two element arrays containing the item
261
+ # name as element 0 and item value as element 1.
262
+ def read_all(value_type = :RAW, buffer = @buffer, top = true)
263
+ item_array = []
264
+ synchronize_allow_reads(top) do
265
+ @sorted_items.each {|item| item_array << [item.name, read_item(item, value_type, buffer)]}
266
+ end
267
+ return item_array
268
+ end
269
+
270
+ # Create a string that shows the name and value of each item in the structure
271
+ #
272
+ # @param value_type [Symbol] Not used. Subclasses should overload this
273
+ # parameter to check whether to perform conversions on the item.
274
+ # @param indent [Integer] Amount to indent before printing the item name
275
+ # @param buffer [String] The binary buffer to write the value to
276
+ # @return [String] String formatted with all the item names and values
277
+ def formatted(value_type = :RAW, indent = 0, buffer = @buffer)
278
+ indent_string = ' ' * indent
279
+ string = ''
280
+ synchronize_allow_reads(true) do
281
+ @sorted_items.each do |item|
282
+ if item.data_type != :BLOCK
283
+ string << "#{indent_string}#{item.name}: #{read_item(item, value_type, buffer)}\n"
284
+ else
285
+ value = read_item(item, value_type, buffer)
286
+ if String === value
287
+ string << "#{indent_string}#{item.name}:\n"
288
+ string << value.formatted(1, 16, ' ', indent + 2)
289
+ else
290
+ string << "#{indent_string}#{item.name}: #{value}\n"
291
+ end
292
+ end
293
+ end
294
+ end
295
+ return string
296
+ end
297
+
298
+ # Get the length of the buffer used by the structure
299
+ #
300
+ # @return [Integer] Size of the buffer in bytes
301
+ # def length
302
+
303
+ # Get the buffer used by the structure. The current buffer is copied and
304
+ # thus modifications to the returned buffer will have no effect on the
305
+ # structure items.
306
+ #
307
+ # @param copy [TrueClass/FalseClass] Whether to copy the buffer
308
+ # @return [String] Data buffer backing the structure
309
+ def buffer(copy = true)
310
+ if @buffer
311
+ if copy
312
+ return @buffer.dup
313
+ else
314
+ return @buffer
315
+ end
316
+ else
317
+ return nil
318
+ end
319
+ end
320
+
321
+ # Set the buffer to be used by the structure. The buffer is copied and thus
322
+ # further modifications to the buffer have no effect on the structure
323
+ # items.
324
+ #
325
+ # @param buffer [String] Buffer of data to back the stucture items
326
+ def buffer=(buffer)
327
+ synchronize() do
328
+ internal_buffer_equals(buffer)
329
+ end
330
+ end
331
+
332
+ # Take the structure mutex to ensure the buffer does not change while you perform activities
333
+ def synchronize
334
+ @mutex ||= Mutex.new
335
+ @mutex.synchronize {|| yield}
336
+ end
337
+
338
+ # Take the structure mutex to ensure the buffer does not change while you perform activities
339
+ # This versions allows reads to happen if a top level function has already taken the mutex
340
+ # @param top [Boolean] If true this will take the mutex and set an allow reads flag to allow
341
+ # lower level calls to go forward without getting the mutex
342
+ def synchronize_allow_reads(top = false)
343
+ @mutex_allow_reads ||= false
344
+ @mutex ||= Mutex.new
345
+ if top
346
+ @mutex.synchronize do
347
+ @mutex_allow_reads = Thread.current
348
+ begin
349
+ yield
350
+ ensure
351
+ @mutex_allow_reads = false
352
+ end
353
+ end
354
+ else
355
+ got_mutex = @mutex.try_lock
356
+ if got_mutex
357
+ begin
358
+ yield
359
+ ensure
360
+ @mutex.unlock
361
+ end
362
+ elsif @mutex_allow_reads == Thread.current
363
+ yield
364
+ end
365
+ end
366
+ end
367
+
368
+ # Make a light weight clone of this structure. This only creates a new buffer
369
+ # of data. The defined structure items are the same.
370
+ #
371
+ # @return [Structure] A copy of the current structure with a new underlying
372
+ # buffer of data
373
+ def clone
374
+ structure = super()
375
+ @buffer = @buffer.clone if @buffer # Deep Copy @buffer
376
+ return structure
377
+ end
378
+ alias dup clone
379
+
380
+ def enable_method_missing
381
+ extend(MethodMissing)
382
+ end
383
+
384
+ protected
385
+
386
+ module MethodMissing
387
+ # Method missing provides reading/writing item values as if they were methods to the class
388
+ def method_missing(name, value = nil)
389
+ if @buffer
390
+ if value
391
+ # Strip off the equals sign before looking up the item
392
+ return write(name.to_s[0..-2], value)
393
+ else
394
+ return read(name.to_s)
395
+ end
396
+ else
397
+ raise "No buffer available for method_missing"
398
+ end
399
+ end
400
+ end
401
+
402
+ # Resize the buffer at least the defined length of the structure
403
+ # def resize_buffer
404
+
405
+ def internal_buffer_equals(buffer)
406
+ raise ArgumentError, "Buffer class is #{buffer.class} but must be String" unless String === buffer
407
+ @buffer = buffer.dup
408
+ @buffer.force_encoding('ASCII-8BIT')
409
+ if @buffer.length != @defined_length
410
+ if @buffer.length < @defined_length
411
+ resize_buffer()
412
+ raise "Buffer length less than defined length" unless @short_buffer_allowed
413
+ elsif @fixed_size and @defined_length != 0
414
+ raise "Buffer length greater than defined length"
415
+ end
416
+ end
417
+ end
418
+
419
+ end # class Structure
420
+
421
+ end # module Cosmos