cosmos 3.9.2 → 4.0.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 (438) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +1 -1
  6. data/Manifest.txt +137 -52
  7. data/Rakefile +50 -44
  8. data/autohotkey/config/system/system.txt +0 -5
  9. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
  10. data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
  11. data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
  12. data/autohotkey/config/targets/META/screens/data.txt +12 -0
  13. data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  14. data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  15. data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  16. data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
  17. data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
  18. data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
  19. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  20. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  21. data/autohotkey/tools/CmdSequence +14 -0
  22. data/autohotkey/tools/CmdSequenceAHK +23 -0
  23. data/autohotkey/tools/CmdSequenceAHK2 +16 -0
  24. data/autohotkey/tools/cmd_extractor.ahk +2 -2
  25. data/autohotkey/tools/cmd_sender.ahk +4 -6
  26. data/autohotkey/tools/cmd_sequence.ahk +215 -0
  27. data/autohotkey/tools/cmd_sequence2.ahk +23 -0
  28. data/autohotkey/tools/data_viewer.ahk +2 -3
  29. data/autohotkey/tools/limits_monitor.ahk +9 -11
  30. data/autohotkey/tools/open_gl_builder.ahk +1 -2
  31. data/autohotkey/tools/packet_viewer.ahk +51 -35
  32. data/autohotkey/tools/replay.ahk +1 -2
  33. data/autohotkey/tools/script_runner.ahk +1 -2
  34. data/autohotkey/tools/script_runner2.ahk +1 -2
  35. data/autohotkey/tools/test_runner2.ahk +1 -5
  36. data/autohotkey/tools/test_runner3.ahk +1 -3
  37. data/autohotkey/tools/tlm_grapher.ahk +1 -3
  38. data/autohotkey/tools/tlm_grapher3.ahk +1 -2
  39. data/autohotkey/tools/tlm_viewer.ahk +8 -3
  40. data/autohotkey/tools/tlm_viewer2.ahk +2 -3
  41. data/autohotkey/tools/tlm_viewer5.ahk +1 -2
  42. data/cosmos.gemspec +26 -20
  43. data/data/cmd_sequence.png +0 -0
  44. data/data/config/_array_params.yaml +23 -0
  45. data/data/config/_id_items.yaml +24 -0
  46. data/data/config/_id_params.yaml +58 -0
  47. data/data/config/_interfaces.yaml +206 -0
  48. data/data/config/_items.yaml +20 -0
  49. data/data/config/_params.yaml +58 -0
  50. data/data/config/cmd_tlm_server.yaml +110 -0
  51. data/data/config/command.yaml +38 -0
  52. data/data/config/command_modifiers.yaml +127 -0
  53. data/data/config/command_telemetry.yaml +3 -0
  54. data/data/config/data_viewer.yaml +43 -0
  55. data/data/config/handbook_creator.yaml +23 -0
  56. data/data/config/housekeeping_params.yaml +71 -0
  57. data/data/config/interface_modifiers.yaml +44 -0
  58. data/data/config/item_modifiers.yaml +172 -0
  59. data/data/config/launcher.yaml +117 -0
  60. data/data/config/limits_monitor.yaml +53 -0
  61. data/data/config/linegraph_params.yaml +30 -0
  62. data/data/config/linegraph_plot.yaml +106 -0
  63. data/data/config/page_modifiers.yaml +128 -0
  64. data/data/config/param_item_modifiers.yaml +41 -0
  65. data/data/config/parameter_modifiers.yaml +144 -0
  66. data/data/config/protocols.yaml +257 -0
  67. data/data/config/screen.yaml +151 -0
  68. data/data/config/script_runner.yaml +15 -0
  69. data/data/config/system.yaml +153 -0
  70. data/data/config/table_manager.yaml +76 -0
  71. data/data/config/table_parameter_modifiers.yaml +9 -0
  72. data/data/config/target.yaml +71 -0
  73. data/data/config/telemetry.yaml +73 -0
  74. data/data/config/telemetry_modifiers.yaml +129 -0
  75. data/data/config/test_runner.yaml +118 -0
  76. data/data/config/tlm_extractor.yaml +109 -0
  77. data/data/config/tlm_grapher.yaml +78 -0
  78. data/data/config/tlm_viewer.yaml +107 -0
  79. data/data/config/unknown.yaml +3 -0
  80. data/data/config/widgets.yaml +1339 -0
  81. data/data/config/xy_params.yaml +50 -0
  82. data/data/config/xy_plot.yaml +12 -0
  83. data/data/config_editor.png +0 -0
  84. data/data/crc.txt +172 -161
  85. data/data/delete.png +0 -0
  86. data/demo/config/data/crc.txt +56 -36
  87. data/demo/config/data/meta_init.txt +1 -4
  88. data/demo/config/system/system.txt +15 -3
  89. data/demo/config/system/system2.txt +13 -3
  90. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
  91. data/demo/config/targets/EXAMPLE/target.txt +3 -1
  92. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
  93. data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
  94. data/demo/config/targets/INST/screens/adcs.txt +39 -15
  95. data/demo/config/targets/INST/screens/commanding.txt +26 -19
  96. data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
  97. data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
  98. data/demo/config/targets/INST/screens/tabs.txt +0 -2
  99. data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
  100. data/demo/config/targets/INST/tables/EventAction.csv +9 -0
  101. data/demo/config/targets/INST/tables/EventAction.dat +0 -0
  102. data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
  103. data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
  104. data/demo/config/targets/INST/target.txt +4 -0
  105. data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
  106. data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
  107. data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
  108. data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
  109. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
  110. data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  111. data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  112. data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  113. data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  114. data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
  115. data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
  116. data/demo/config/targets/SYSTEM/target.txt +12 -0
  117. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
  118. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
  119. data/demo/config/targets/TEMPLATED/target.txt +2 -0
  120. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
  121. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
  122. data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
  123. data/demo/config/tools/launcher/launcher.txt +9 -6
  124. data/demo/config/tools/launcher/launcher2.txt +16 -13
  125. data/demo/config/tools/launcher/launcher_mini.txt +45 -0
  126. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
  127. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
  128. data/demo/config/tools/test_runner/test_runner.txt +1 -1
  129. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  130. data/demo/lib/example_background_task.rb +9 -5
  131. data/demo/lib/example_target.rb +5 -15
  132. data/demo/lib/scpi_target.rb +4 -10
  133. data/demo/procedures/cosmos_api_test.rb +17 -0
  134. data/demo/tools/CmdSequence +16 -0
  135. data/demo/tools/CmdSequence.bat +9 -0
  136. data/demo/tools/ConfigEditor +16 -0
  137. data/demo/tools/ConfigEditor.bat +9 -0
  138. data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  139. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  140. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  141. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  142. data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  143. data/ext/cosmos/ext/packet/packet.c +5 -5
  144. data/install/config/data/crc.txt +12 -8
  145. data/install/config/system/system.txt +13 -3
  146. data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
  147. data/install/config/targets/SYSTEM/target.txt +12 -0
  148. data/install/tools/CmdSequence +16 -0
  149. data/install/tools/CmdSequence.bat +9 -0
  150. data/install/tools/ConfigEditor +16 -0
  151. data/install/tools/ConfigEditor.bat +9 -0
  152. data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  153. data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  154. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  155. data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  156. data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  157. data/lib/cosmos.rb +1 -1
  158. data/lib/cosmos/config/config_parser.rb +147 -59
  159. data/lib/cosmos/config/meta_config_parser.rb +57 -0
  160. data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
  161. data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
  162. data/lib/cosmos/core_ext/array.rb +45 -5
  163. data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
  164. data/lib/cosmos/core_ext/file.rb +2 -2
  165. data/lib/cosmos/core_ext/kernel.rb +1 -6
  166. data/lib/cosmos/core_ext/objectspace.rb +0 -2
  167. data/lib/cosmos/core_ext/string.rb +27 -4
  168. data/lib/cosmos/core_ext/time.rb +39 -10
  169. data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
  170. data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
  171. data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
  172. data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
  173. data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
  174. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
  175. data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
  176. data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
  177. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
  178. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
  179. data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
  180. data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
  181. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
  182. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
  183. data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
  184. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
  185. data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
  186. data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
  187. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
  188. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
  189. data/lib/cosmos/gui/dialogs/splash.rb +1 -1
  190. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  191. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
  192. data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
  193. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
  194. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
  195. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
  196. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
  197. data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
  198. data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
  199. data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
  200. data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
  201. data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
  202. data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
  203. data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
  204. data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
  205. data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
  206. data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
  207. data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
  208. data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
  209. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
  210. data/lib/cosmos/gui/qt.rb +1 -1
  211. data/lib/cosmos/gui/qt_tool.rb +21 -10
  212. data/lib/cosmos/gui/text/completion.rb +23 -2
  213. data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
  214. data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
  215. data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
  216. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
  217. data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
  218. data/lib/cosmos/interfaces.rb +10 -0
  219. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
  220. data/lib/cosmos/interfaces/interface.rb +240 -22
  221. data/lib/cosmos/interfaces/linc_interface.rb +3 -5
  222. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
  223. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
  224. data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
  225. data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
  226. data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
  227. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
  228. data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
  229. data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
  230. data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
  231. data/lib/cosmos/interfaces/serial_interface.rb +28 -23
  232. data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
  233. data/lib/cosmos/interfaces/stream_interface.rb +36 -108
  234. data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
  235. data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
  236. data/lib/cosmos/interfaces/udp_interface.rb +51 -83
  237. data/lib/cosmos/io/buffered_file.rb +92 -2
  238. data/lib/cosmos/io/json_drb.rb +2 -2
  239. data/lib/cosmos/io/posix_serial_driver.rb +3 -1
  240. data/lib/cosmos/io/raw_logger.rb +3 -3
  241. data/lib/cosmos/io/serial_driver.rb +14 -5
  242. data/lib/cosmos/io/win32_serial_driver.rb +16 -4
  243. data/lib/cosmos/packet_logs.rb +0 -1
  244. data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
  245. data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
  246. data/lib/cosmos/packets/binary_accessor.rb +599 -32
  247. data/lib/cosmos/packets/commands.rb +48 -24
  248. data/lib/cosmos/packets/packet.rb +140 -54
  249. data/lib/cosmos/packets/packet_config.rb +0 -2
  250. data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
  251. data/lib/cosmos/packets/structure.rb +81 -33
  252. data/lib/cosmos/packets/structure_item.rb +45 -5
  253. data/lib/cosmos/packets/telemetry.rb +149 -55
  254. data/lib/cosmos/script/api_shared.rb +1000 -0
  255. data/lib/cosmos/script/commands.rb +2 -2
  256. data/lib/cosmos/script/extract.rb +19 -4
  257. data/lib/cosmos/script/limits.rb +2 -0
  258. data/lib/cosmos/script/script.rb +1 -1
  259. data/lib/cosmos/script/scripting.rb +4 -784
  260. data/lib/cosmos/script/telemetry.rb +44 -23
  261. data/lib/cosmos/script/tools.rb +15 -69
  262. data/lib/cosmos/streams/serial_stream.rb +12 -19
  263. data/lib/cosmos/streams/stream.rb +2 -11
  264. data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
  265. data/lib/cosmos/system/system.rb +187 -31
  266. data/lib/cosmos/system/target.rb +11 -2
  267. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
  268. data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
  269. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
  270. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
  271. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
  272. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
  273. data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
  274. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
  275. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
  276. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
  277. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
  278. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
  279. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
  280. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
  281. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
  282. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
  283. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
  284. data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
  285. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
  286. data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
  287. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
  288. data/lib/cosmos/tools/launcher/launcher.rb +29 -12
  289. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  290. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
  291. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
  292. data/lib/cosmos/tools/replay/replay.rb +36 -20
  293. data/lib/cosmos/tools/replay/replay_server.rb +1 -1
  294. data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
  295. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
  296. data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
  297. data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
  298. data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
  299. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
  300. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
  301. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
  302. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  303. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
  304. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
  305. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
  306. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
  307. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
  308. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
  309. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  310. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
  311. data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
  312. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
  313. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
  314. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  315. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
  316. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
  317. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
  318. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
  320. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
  321. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
  322. data/lib/cosmos/top_level.rb +34 -24
  323. data/lib/cosmos/utilities/crc.rb +108 -6
  324. data/lib/cosmos/utilities/csv.rb +68 -14
  325. data/lib/cosmos/utilities/logger.rb +2 -2
  326. data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
  327. data/lib/cosmos/version.rb +6 -6
  328. data/lib/cosmos/win32/win32_main.rb +50 -46
  329. data/run_gui_tests.bat +3 -1
  330. data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
  331. data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
  332. data/spec/core_ext/file_spec.rb +1 -1
  333. data/spec/core_ext/objectspace_spec.rb +12 -9
  334. data/spec/core_ext/string_spec.rb +6 -0
  335. data/spec/core_ext/time_spec.rb +10 -0
  336. data/spec/gui/line_graph/line_clip_spec.rb +226 -224
  337. data/spec/gui/qt_spec.rb +81 -79
  338. data/spec/install/config/system/system.txt +0 -6
  339. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
  340. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
  341. data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  342. data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  343. data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  344. data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  345. data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
  346. data/spec/install/config/targets/SYSTEM/target.txt +12 -0
  347. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
  348. data/spec/interfaces/interface_spec.rb +402 -18
  349. data/spec/interfaces/linc_interface_spec.rb +37 -39
  350. data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
  351. data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
  352. data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
  353. data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
  354. data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
  355. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
  356. data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
  357. data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
  358. data/spec/interfaces/serial_interface_spec.rb +35 -34
  359. data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
  360. data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
  361. data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
  362. data/spec/interfaces/udp_interface_spec.rb +120 -55
  363. data/spec/io/serial_driver_spec.rb +41 -39
  364. data/spec/io/udp_sockets_spec.rb +13 -8
  365. data/spec/io/win32_serial_driver_spec.rb +62 -59
  366. data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
  367. data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
  368. data/spec/packets/commands_spec.rb +5 -5
  369. data/spec/packets/packet_spec.rb +2 -14
  370. data/spec/script/extract_spec.rb +21 -7
  371. data/spec/script/scripting_spec.rb +261 -6
  372. data/spec/script/telemetry_spec.rb +17 -9
  373. data/spec/spec_helper.rb +26 -10
  374. data/spec/streams/serial_stream_spec.rb +87 -82
  375. data/spec/streams/tcpip_client_stream_spec.rb +12 -4
  376. data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
  377. data/spec/system/system_spec.rb +66 -50
  378. data/spec/system/target_spec.rb +33 -11
  379. data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
  380. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
  381. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
  382. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
  383. data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
  384. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
  385. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
  386. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
  387. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
  388. data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
  389. data/spec/top_level/top_level_spec.rb +39 -11
  390. data/spec/utilities/csv_spec.rb +62 -20
  391. data/tasks/gemfile_stats.rake +6 -3
  392. data/test/performance/config/system/system_packets.txt +0 -1
  393. data/test/performance/config/system/system_threads.txt +0 -1
  394. metadata +177 -92
  395. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  396. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  397. data/autohotkey/config/targets/COSMOS/target.txt +0 -5
  398. data/autohotkey/userpath.txt +0 -1
  399. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  400. data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
  401. data/demo/config/targets/COSMOS/screens/version.txt +0 -19
  402. data/demo/config/targets/COSMOS/target.txt +0 -11
  403. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
  404. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
  405. data/demo/userpath.txt +0 -1
  406. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  407. data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  408. data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  409. data/install/config/targets/COSMOS/screens/version.txt +0 -19
  410. data/install/config/targets/COSMOS/target.txt +0 -9
  411. data/install/config/targets/SYSTEM/README.txt +0 -1
  412. data/install/userpath.txt +0 -1
  413. data/lib/cosmos/io/tcpip_server.rb +0 -571
  414. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
  415. data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
  416. data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
  417. data/lib/cosmos/streams/stream_protocol.rb +0 -373
  418. data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
  419. data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
  420. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
  421. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  422. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  423. data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
  424. data/spec/install/config/targets/COSMOS/target.txt +0 -5
  425. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
  426. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
  427. data/spec/install/userpath.txt +0 -1
  428. data/spec/interfaces/stream_interface_spec.rb +0 -157
  429. data/spec/io/tcpip_server_spec.rb +0 -338
  430. data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
  431. data/spec/streams/burst_stream_protocol_spec.rb +0 -32
  432. data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
  433. data/spec/streams/length_stream_protocol_spec.rb +0 -300
  434. data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
  435. data/spec/streams/stream_protocol_spec.rb +0 -346
  436. data/spec/streams/template_stream_protocol_spec.rb +0 -156
  437. data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
  438. data/test/performance/userpath.txt +0 -1
@@ -135,7 +135,7 @@ module Cosmos
135
135
  command = packet(target_upcase, packet_upcase).clone
136
136
 
137
137
  # Set time, parameters, and restore defaults
138
- command.received_time = Time.now
138
+ command.received_time = Time.now.sys
139
139
  command.given_values = params
140
140
  command.restore_defaults(command.buffer(false), params.keys)
141
141
  command.raw = raw
@@ -148,41 +148,65 @@ module Cosmos
148
148
 
149
149
  # Formatted version of a command
150
150
  def format(packet, ignored_parameters = [])
151
- first = true
152
151
  if packet.raw
153
152
  items = packet.read_all(:RAW)
154
- string = "cmd_raw('#{packet.target_name} #{packet.packet_name}"
153
+ raw = true
155
154
  else
156
155
  items = packet.read_all(:FORMATTED)
157
- string = "cmd('#{packet.target_name} #{packet.packet_name}"
156
+ raw = false
158
157
  end
159
- items.each do |item_name, item_value|
160
- unless ignored_parameters.include?(item_name)
161
- if first
162
- string << ' with '.freeze
163
- first = false
164
- else
165
- string << ', '.freeze
158
+ items.delete_if {|item_name, item_value| ignored_parameters.include?(item_name)}
159
+ return build_cmd_output_string(packet.target_name, packet.packet_name, items, raw)
160
+ end
161
+
162
+ def build_cmd_output_string(target_name, cmd_name, cmd_params, raw = false)
163
+ if raw
164
+ output_string = 'cmd_raw("'
165
+ else
166
+ output_string = 'cmd("'
167
+ end
168
+ output_string << target_name + ' ' + cmd_name
169
+ if cmd_params.nil? or cmd_params.empty?
170
+ output_string << '")'
171
+ else
172
+ begin
173
+ command_items = packet(target_name, cmd_name).items
174
+ rescue
175
+ end
176
+
177
+ params = []
178
+ cmd_params.each do |key, value|
179
+
180
+ begin
181
+ item_type = command_items[key].data_type
182
+ rescue
183
+ item_type = nil
166
184
  end
167
185
 
168
- item = packet.get_item(item_name)
169
- if item.data_type ==:STRING or item.data_type == :BLOCK
170
- item_value = item_value.inspect
171
- if item_value.length > 256
172
- item_value = item_value[0..255] + '..."'.freeze
173
- end
174
- string << "#{item_name} #{item_value}"
175
- else
176
- if (Array === item_value) && (!packet.raw)
177
- string << "#{item_name} [#{item_value.join(", ")}]"
186
+ if value.is_a?(String)
187
+ value = value.dup
188
+ if item_type == :BLOCK or item_type == :STRING
189
+ if !value.is_printable?
190
+ value = "0x" + value.simple_formatted
191
+ else
192
+ value = value.inspect
193
+ end
178
194
  else
179
- string << "#{item_name} #{item_value}"
195
+ value = value.convert_to_value.to_s
196
+ end
197
+ if value.length > 256
198
+ value = value[0..255] + "...'"
180
199
  end
200
+ value.tr!('"',"'")
201
+ elsif value.is_a?(Array)
202
+ value = "[#{value.join(", ")}]"
181
203
  end
204
+ params << "#{key} #{value}"
182
205
  end
206
+ params = params.join(", ")
207
+ output_string << ' with ' + params + '")'
183
208
  end
184
- string << "')".freeze
185
- string
209
+ return output_string
186
210
  end
187
211
 
188
212
  # Returns whether the given command is hazardous. Commands are hazardous
@@ -10,7 +10,7 @@
10
10
 
11
11
  require 'cosmos/packets/structure'
12
12
  require 'cosmos/packets/packet_item'
13
- require 'cosmos/ext/packet'
13
+ require 'cosmos/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
14
14
 
15
15
  module Cosmos
16
16
 
@@ -43,7 +43,7 @@ module Cosmos
43
43
  # @return [String] Description of why the packet is hazardous
44
44
  attr_reader :hazardous_description
45
45
 
46
- # Containst the values given by the user for a command (distinguished from defaults)
46
+ # Contains the values given by the user for a command (distinguished from defaults)
47
47
  # These values should be used within command conversions if present because the order
48
48
  # that values are written into the actual packet can vary
49
49
  # @return [Hash<Item Name, Value>] Given values when constructing the packet
@@ -70,16 +70,144 @@ module Cosmos
70
70
  # Valid format types
71
71
  VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
72
72
 
73
- # Creates a new packet by initalizing the attributes.
74
- #
75
- # @param target_name [String] Name of the target this packet is associated with
76
- # @param packet_name [String] Name of the packet
77
- # @param default_endianness [Symbol] One of {BinaryAccessor::ENDIANNESS}
78
- # @param description [String] Description of the packet
79
- # @param buffer [String] String buffer to hold the packet data
80
- # @param item_class [Class] Class used to instantiate items (Must be a
81
- # subclass of PacketItem)
82
- # def initialize(target_name, packet_name, default_endianness = :BIG_ENDIAN, description = nil, buffer = '', item_class = PacketItem)
73
+ if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
74
+ # Creates a new packet by initalizing the attributes.
75
+ #
76
+ # @param target_name [String] Name of the target this packet is associated with
77
+ # @param packet_name [String] Name of the packet
78
+ # @param default_endianness [Symbol] One of {BinaryAccessor::ENDIANNESS}
79
+ # @param description [String] Description of the packet
80
+ # @param buffer [String] String buffer to hold the packet data
81
+ # @param item_class [Class] Class used to instantiate items (Must be a
82
+ # subclass of PacketItem)
83
+ def initialize(target_name, packet_name, default_endianness = :BIG_ENDIAN, description = nil, buffer = '', item_class = PacketItem)
84
+ super(default_endianness, buffer, item_class)
85
+ self.target_name = target_name
86
+ self.packet_name = packet_name
87
+ self.description = description
88
+ @received_time = nil
89
+ @received_count = 0
90
+ @id_items = nil
91
+ @hazardous = false
92
+ @hazardous_description = nil
93
+ @given_values = nil
94
+ @limits_items = nil
95
+ @processors = nil
96
+ @stale = true
97
+ @limits_change_callback = nil
98
+ @read_conversion_cache = nil
99
+ @raw = nil
100
+ @messages_disabled = false
101
+ @meta = nil
102
+ @hidden = false
103
+ @disabled = false
104
+ end
105
+
106
+ # Sets the target name this packet is associated with. Unidentified packets
107
+ # will have target name set to nil.
108
+ #
109
+ # @param target_name [String] Name of the target this packet is associated with
110
+ def target_name=(target_name)
111
+ if target_name
112
+ if !(String === target_name)
113
+ raise(ArgumentError, "target_name must be a String but is a #{target_name.class}")
114
+ end
115
+ @target_name = target_name.upcase.freeze
116
+ else
117
+ @target_name = nil
118
+ end
119
+ @target_name
120
+ end
121
+
122
+ # Sets the packet name. Unidentified packets will have packet name set to
123
+ # nil.
124
+ #
125
+ # @param packet_name [String] Name of the packet
126
+ def packet_name=(packet_name)
127
+ if packet_name
128
+ if !(String === packet_name)
129
+ raise(ArgumentError, "packet_name must be a String but is a #{packet_name.class}")
130
+ end
131
+ @packet_name = packet_name.upcase.freeze
132
+ else
133
+ @packet_name = nil
134
+ end
135
+ @packet_name
136
+ end
137
+
138
+ # Sets the description of the packet
139
+ #
140
+ # @param description [String] Description of the packet
141
+ def description=(description)
142
+ if description
143
+ if !(String === description)
144
+ raise(ArgumentError, "description must be a String but is a #{description.class}")
145
+ end
146
+ @description = description.clone.freeze
147
+ else
148
+ @description = nil
149
+ end
150
+ @description
151
+ end
152
+
153
+ # Sets the received time of the packet
154
+ #
155
+ # @param received_time [Time] Time this packet was received
156
+ def received_time=(received_time)
157
+ if received_time
158
+ if !(Time === received_time)
159
+ raise(ArgumentError, "received_time must be a Time but is a #{received_time.class}")
160
+ end
161
+ @received_time = received_time.clone.freeze
162
+ else
163
+ @received_time = nil
164
+ end
165
+ @read_conversion_cache.clear if @read_conversion_cache
166
+ @received_time
167
+ end
168
+
169
+ # Sets the received count of the packet
170
+ #
171
+ # @param received_count [Integer] Number of times this packet has been
172
+ # received
173
+ def received_count=(received_count)
174
+ if !(Integer === received_count)
175
+ raise(ArgumentError, "received_count must be an Integer but is a #{received_count.class}")
176
+ end
177
+ @received_count = received_count
178
+ @read_conversion_cache.clear if @read_conversion_cache
179
+ @received_count
180
+ end
181
+
182
+ # Tries to identify if a buffer represents the currently defined packet. It
183
+ # does this by iterating over all the packet items that were created with
184
+ # an ID value and checking whether that ID value is present at the correct
185
+ # location in the buffer.
186
+ #
187
+ # Incorrectly sized buffers will still positively identify if there is
188
+ # enough data to match the ID values. This is to allow incorrectly sized
189
+ # packets to still be processed as well as possible given the incorrectly
190
+ # sized data.
191
+ #
192
+ # @param buffer [String] Raw buffer of binary data
193
+ # @return [Boolean] Whether or not the buffer of data is this packet
194
+ def identify?(buffer)
195
+ return false unless buffer
196
+ return true unless @id_items
197
+
198
+ @id_items.each do |item|
199
+ begin
200
+ value = read_item(item, :RAW, buffer)
201
+ rescue Exception
202
+ value = nil
203
+ end
204
+ return false if item.id_value != value
205
+ end
206
+
207
+ true
208
+ end
209
+
210
+ end
83
211
 
84
212
  # (see Structure#buffer=)
85
213
  def buffer=(buffer)
@@ -94,28 +222,6 @@ module Cosmos
94
222
  end
95
223
  end
96
224
 
97
- # Sets the target name this packet is associated with. Unidentified packets
98
- # will have target name set to nil.
99
- #
100
- # @param target_name [String] Name of the target this packet is associated with
101
- # def target_name=(target_name)
102
-
103
- # Sets the packet name. Unidentified packets will have packet name set to
104
- # nil.
105
- #
106
- # @param packet_name [String] Name of the packet
107
- # def packet_name=(packet_name)
108
-
109
- # Sets the description of the packet
110
- #
111
- # @param description [String] Description of the packet
112
- # def description=(description)
113
-
114
- # Sets the received time of the packet
115
- #
116
- # @param received_time [Time] Time this packet was received
117
- # def received_time=(received_time)
118
-
119
225
  # Sets the received time of the packet (without cloning)
120
226
  #
121
227
  # @param received_time [Time] Time this packet was received
@@ -129,12 +235,6 @@ module Cosmos
129
235
  end
130
236
  end
131
237
 
132
- # Sets the received count of the packet
133
- #
134
- # @param received_count [Integer] Number of times this packet has been
135
- # received
136
- # def received_count=(received_count)
137
-
138
238
  # Sets the hazardous description of the packet
139
239
  #
140
240
  # @param hazardous_description [String] Hazardous description of the packet
@@ -539,20 +639,6 @@ module Cosmos
539
639
  return super(value_type, indent, buffer)
540
640
  end
541
641
 
542
- # Tries to identify if a buffer represents the currently defined packet. It
543
- # does this by iterating over all the packet items that were created with
544
- # an ID value and checking whether that ID value is present at the correct
545
- # location in the buffer.
546
- #
547
- # Incorrectly sized buffers will still positively identify if there is
548
- # enough data to match the ID values. This is to allow incorrectly sized
549
- # packets to still be processed as well as possible given the incorrectly
550
- # sized data.
551
- #
552
- # @param buffer [String] Raw buffer of binary data
553
- # @return [Boolean] Whether or not the buffer of data is this packet
554
- # def identify?(buffer)
555
-
556
642
  # Restore all items in the packet to their default value
557
643
  #
558
644
  # @param buffer [String] Raw buffer of binary data
@@ -73,10 +73,8 @@ module Cosmos
73
73
  @warnings = []
74
74
 
75
75
  # Create unknown packets
76
- @commands['UNKNOWN']
77
76
  @commands['UNKNOWN'] = {}
78
77
  @commands['UNKNOWN']['UNKNOWN'] = Packet.new('UNKNOWN', 'UNKNOWN', :BIG_ENDIAN)
79
- @telemetry['UNKNOWN']
80
78
  @telemetry['UNKNOWN'] = {}
81
79
  @telemetry['UNKNOWN']['UNKNOWN'] = Packet.new('UNKNOWN', 'UNKNOWN', :BIG_ENDIAN)
82
80
 
@@ -131,8 +131,16 @@ module Cosmos
131
131
 
132
132
  index = append? ? 3 : 4
133
133
  data_type = get_data_type()
134
- if data_type == :STRING or data_type == :BLOCK
135
- return @parser.parameters[index]
134
+ if data_type == :STRING or data_type == :BLOCK
135
+ # If the default value is 0x<data> (no quotes), it is treated as
136
+ # binary data. Otherwise, the default value is considered to be a string.
137
+ if (@parser.parameters[index].upcase.start_with?("0X") and
138
+ !@parser.line.include?("\"#{@parser.parameters[index]}\"") and
139
+ !@parser.line.include?("\'#{@parser.parameters[index]}\'"))
140
+ return @parser.parameters[index].hex_to_byte_string
141
+ else
142
+ return @parser.parameters[index]
143
+ end
136
144
  else
137
145
  return ConfigParser.handle_defined_constants(
138
146
  @parser.parameters[index+2].convert_to_value, get_data_type(), get_bit_size())
@@ -10,7 +10,7 @@
10
10
 
11
11
  require 'cosmos/packets/binary_accessor'
12
12
  require 'cosmos/packets/structure_item'
13
- require 'cosmos/ext/packet'
13
+ require 'cosmos/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
14
14
 
15
15
  module Cosmos
16
16
 
@@ -44,21 +44,87 @@ module Cosmos
44
44
  # required data size is allowed.
45
45
  attr_accessor :short_buffer_allowed
46
46
 
47
- # String providing a single 0 byte
48
- # ZERO_STRING = "\000"
49
- # ZERO_STRING.freeze
47
+ if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
48
+ # Used to force encoding
49
+ ASCII_8BIT_STRING = "ASCII-8BIT".freeze
50
+
51
+ # String providing a single 0 byte
52
+ ZERO_STRING = "\000".freeze
53
+
54
+ # Structure constructor
55
+ #
56
+ # @param default_endianness [Symbol] Must be one of
57
+ # {BinaryAccessor::ENDIANNESS}. By default it uses
58
+ # BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
59
+ # @param buffer [String] Buffer used to store the structure
60
+ # @param item_class [Class] Class used to instantiate new structure items.
61
+ # Must be StructureItem or one of its subclasses.
62
+ def initialize(default_endianness = BinaryAccessor::HOST_ENDIANNESS, buffer = '', item_class = StructureItem)
63
+ if (default_endianness == :BIG_ENDIAN) || (default_endianness == :LITTLE_ENDIAN)
64
+ @default_endianness = default_endianness
65
+ if buffer
66
+ raise TypeError, "wrong argument type #{buffer.class} (expected String)" unless String === buffer
67
+ @buffer = buffer.force_encoding(ASCII_8BIT_STRING)
68
+ else
69
+ @buffer = nil
70
+ end
71
+ @item_class = item_class
72
+ @items = {}
73
+ @sorted_items = []
74
+ @defined_length = 0
75
+ @defined_length_bits = 0
76
+ @pos_bit_size = 0
77
+ @neg_bit_size = 0
78
+ @fixed_size = true
79
+ @short_buffer_allowed = false
80
+ @mutex = nil
81
+ else
82
+ raise(ArgumentError, "Unrecognized endianness: #{default_endianness} - Must be :BIG_ENDIAN or :LITTLE_ENDIAN")
83
+ end
84
+ end
50
85
 
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)
86
+ # Read an item in the structure
87
+ #
88
+ # @param item [StructureItem] Instance of StructureItem or one of its subclasses
89
+ # @param value_type [Symbol] Not used. Subclasses should overload this
90
+ # parameter to check whether to perform conversions on the item.
91
+ # @param buffer [String] The binary buffer to read the item from
92
+ # @return Value based on the item definition. This could be a string, integer,
93
+ # float, or array of values.
94
+ def read_item(item, value_type = :RAW, buffer = @buffer)
95
+ return nil if item.data_type == :DERIVED
96
+
97
+ if buffer
98
+ if item.array_size
99
+ return BinaryAccessor.read_array(item.bit_offset, item.bit_size, item.data_type, item.array_size, buffer, item.endianness)
100
+ else
101
+ return BinaryAccessor.read(item.bit_offset, item.bit_size, item.data_type, buffer, item.endianness)
102
+ end
103
+ else
104
+ raise "No buffer given to read_item"
105
+ end
106
+ end
107
+
108
+ # Get the length of the buffer used by the structure
109
+ #
110
+ # @return [Integer] Size of the buffer in bytes
111
+ def length
112
+ return @buffer.length if @buffer
113
+ return 0
114
+ end
115
+
116
+ # Resize the buffer at least the defined length of the structure
117
+ def resize_buffer
118
+ if @buffer
119
+ # Extend data size
120
+ if @buffer.length < @defined_length
121
+ @buffer << (ZERO_STRING * (@defined_length - @buffer.length))
122
+ end
123
+ end
124
+
125
+ return self
126
+ end
127
+ end
62
128
 
63
129
  # Indicates if any items have been defined for this structure
64
130
  # @return [TrueClass or FalseClass]
@@ -229,16 +295,6 @@ module Cosmos
229
295
  end
230
296
  end
231
297
 
232
- # Read an item in the structure
233
- #
234
- # @param item [StructureItem] Instance of StructureItem or one of its subclasses
235
- # @param value_type [Symbol] Not used. Subclasses should overload this
236
- # parameter to check whether to perform conversions on the item.
237
- # @param buffer [String] The binary buffer to read the item from
238
- # @return Value based on the item definition. This could be a string, integer,
239
- # float, or array of values.
240
- # def read_item(item, value_type = :RAW, buffer = @buffer)
241
-
242
298
  # Write a value to the buffer based on the item definition
243
299
  #
244
300
  # @param item [StructureItem] Instance of StructureItem or one of its subclasses
@@ -330,11 +386,6 @@ module Cosmos
330
386
  return string
331
387
  end
332
388
 
333
- # Get the length of the buffer used by the structure
334
- #
335
- # @return [Integer] Size of the buffer in bytes
336
- # def length
337
-
338
389
  # Get the buffer used by the structure. The current buffer is copied and
339
390
  # thus modifications to the returned buffer will have no effect on the
340
391
  # structure items.
@@ -438,9 +489,6 @@ module Cosmos
438
489
  end
439
490
  end
440
491
 
441
- # Resize the buffer at least the defined length of the structure
442
- # def resize_buffer
443
-
444
492
  def internal_buffer_equals(buffer)
445
493
  raise ArgumentError, "Buffer class is #{buffer.class} but must be String" unless String === buffer
446
494
  @buffer = buffer.dup