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
@@ -0,0 +1,119 @@
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 'spec_helper'
12
+ require 'cosmos/interfaces/protocols/fixed_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe FixedProtocol do
18
+ before(:each) do
19
+ @interface = StreamInterface.new
20
+ allow(@interface).to receive(:connected?) { true }
21
+ allow(@interface).to receive(:disconnect) { nil }
22
+ end
23
+
24
+ after(:each) do
25
+ clean_config()
26
+ end
27
+
28
+ describe "initialize" do
29
+ it "initializes attributes" do
30
+ @interface.add_protocol(FixedProtocol, [2, 1, '0xDEADBEEF', false, true], :READ_WRITE)
31
+ expect(@interface.read_protocols[0].instance_variable_get(:@data)).to eq ''
32
+ expect(@interface.read_protocols[0].instance_variable_get(:@min_id_size)).to eq 2
33
+ expect(@interface.read_protocols[0].instance_variable_get(:@discard_leading_bytes)).to eq 1
34
+ expect(@interface.read_protocols[0].instance_variable_get(:@sync_pattern)).to eq "\xDE\xAD\xBE\xEF"
35
+ expect(@interface.read_protocols[0].instance_variable_get(:@telemetry)).to be false
36
+ expect(@interface.read_protocols[0].instance_variable_get(:@fill_fields)).to be true
37
+ end
38
+ end
39
+
40
+ describe "read_data" do
41
+ class FixedStream < Stream
42
+ def connect; end
43
+ def connected?; true; end
44
+ def read; "\x01\x02"; end
45
+ end
46
+
47
+ it "returns unknown packets" do
48
+ @interface.add_protocol(FixedProtocol, [1], :READ)
49
+ @interface.instance_variable_set(:@stream, FixedStream.new)
50
+ packet = @interface.read
51
+ expect(packet.received_time.to_f).to eql 0.0
52
+ expect(packet.target_name).to eql nil
53
+ expect(packet.packet_name).to eql nil
54
+ expect(packet.buffer).to eql "\x01\x02"
55
+ end
56
+
57
+ it "raises an exception if unknown packet" do
58
+ @interface.add_protocol(FixedProtocol, [1, 0, nil, true, false, true], :READ)
59
+ @interface.instance_variable_set(:@stream, FixedStream.new)
60
+ expect { @interface.read }.to raise_error(/Unknown data/)
61
+ end
62
+
63
+ it "handles targets with no defined telemetry" do
64
+ @interface.add_protocol(FixedProtocol, [1], :READ)
65
+ @interface.instance_variable_set(:@stream, FixedStream.new)
66
+ @interface.target_names = ['BLAH']
67
+ packet = @interface.read
68
+ expect(packet.received_time.to_f).to eql 0.0
69
+ expect(packet.target_name).to eql nil
70
+ expect(packet.packet_name).to eql nil
71
+ expect(packet.buffer).to eql "\x01\x02"
72
+ end
73
+
74
+ it "reads telemetry data from the stream" do
75
+ @interface.add_protocol(FixedProtocol, [1], :READ_WRITE)
76
+ @interface.instance_variable_set(:@stream, FixedStream.new)
77
+ @interface.target_names = ['SYSTEM']
78
+ packet = @interface.read
79
+ expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
80
+ expect(packet.target_name).to eql 'SYSTEM'
81
+ expect(packet.packet_name).to eql 'META'
82
+ packet = @interface.read
83
+ expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
84
+ expect(packet.target_name).to eql 'SYSTEM'
85
+ expect(packet.packet_name).to eql 'LIMITS_CHANGE'
86
+ packet = @interface.read
87
+ expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
88
+ expect(packet.target_name).to eql 'SYSTEM'
89
+ expect(packet.packet_name).to eql 'META'
90
+ packet = @interface.read
91
+ expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
92
+ expect(packet.target_name).to eql 'SYSTEM'
93
+ expect(packet.packet_name).to eql 'LIMITS_CHANGE'
94
+ end
95
+
96
+ it "reads command data from the stream" do
97
+ $index = 0
98
+ class FixedStream < Stream
99
+ def read
100
+ case $index
101
+ when 0
102
+ $index += 1
103
+ "\x1A\xCF\xFC\x1D\x00\x00\x00\x02"
104
+ else
105
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
106
+ end
107
+ end
108
+ end
109
+ @interface.add_protocol(FixedProtocol, [8, 0, '0x1ACFFC1D', false], :READ_WRITE)
110
+ @interface.instance_variable_set(:@stream, FixedStream.new)
111
+ @interface.target_names = ['SYSTEM']
112
+ packet = @interface.read
113
+ expect(packet.received_time.to_f).to be_within(0.01).of(Time.now.to_f)
114
+ expect(packet.target_name).to eql 'SYSTEM'
115
+ expect(packet.packet_name).to eql 'STARTLOGGING'
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,499 @@
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 'spec_helper'
12
+ require 'cosmos/interfaces/protocols/length_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe LengthProtocol do
18
+ class LengthStream < Stream
19
+ def connect; end
20
+ def connected?; true; end
21
+ def disconnect; end
22
+ def read; $buffer; end
23
+ def write(data); $buffer = data; end
24
+ end
25
+
26
+ before(:each) do
27
+ @interface = StreamInterface.new
28
+ allow(@interface).to receive(:connected?) { true }
29
+ $buffer = ''
30
+ end
31
+
32
+ describe "initialize" do
33
+ it "initializes attributes" do
34
+ @interface.add_protocol(LengthProtocol, [16, 32, 16, 2, 'LITTLE_ENDIAN', 2, '0xDEADBEEF', 100, true], :READ_WRITE)
35
+ expect(@interface.read_protocols[0].instance_variable_get(:@data)).to eq ''
36
+ expect(@interface.read_protocols[0].instance_variable_get(:@length_bit_offset)).to eq 16
37
+ expect(@interface.read_protocols[0].instance_variable_get(:@length_bit_size)).to eq 32
38
+ expect(@interface.read_protocols[0].instance_variable_get(:@length_value_offset)).to eq 16
39
+ expect(@interface.read_protocols[0].instance_variable_get(:@length_bytes_per_count)).to eq 2
40
+ expect(@interface.read_protocols[0].instance_variable_get(:@length_endianness)).to eq :LITTLE_ENDIAN
41
+ expect(@interface.read_protocols[0].instance_variable_get(:@discard_leading_bytes)).to eq 2
42
+ expect(@interface.read_protocols[0].instance_variable_get(:@sync_pattern)).to eq "\xDE\xAD\xBE\xEF"
43
+ expect(@interface.read_protocols[0].instance_variable_get(:@max_length)).to be 100
44
+ expect(@interface.read_protocols[0].instance_variable_get(:@fill_fields)).to be true
45
+ end
46
+ end
47
+
48
+ describe "read" do
49
+ it "reads LITTLE_ENDIAN length fields from the stream" do
50
+ @interface.instance_variable_set(:@stream, LengthStream.new)
51
+ @interface.add_protocol(LengthProtocol, [
52
+ 16, # bit offset
53
+ 16, # bit size
54
+ 0, # length offset
55
+ 1, # bytes per count
56
+ 'LITTLE_ENDIAN'], :READ_WRITE)
57
+ $buffer = "\x00\x01\x06\x00\x03\x04"
58
+ packet = @interface.read
59
+ expect(packet.buffer.length).to eql 6
60
+ end
61
+
62
+ it "reads LITTLE_ENDIAN bit fields from the stream" do
63
+ @interface.instance_variable_set(:@stream, LengthStream.new)
64
+ @interface.add_protocol(LengthProtocol, [
65
+ 19, # bit offset
66
+ 5, # bit size
67
+ 0, # length offset
68
+ 1, # bytes per count
69
+ 'LITTLE_ENDIAN'], :READ_WRITE)
70
+ $buffer = "\x00\x01\x05\x03\x04"
71
+ packet = @interface.read
72
+ expect(packet.buffer.length).to eql 5
73
+ end
74
+
75
+ it "adjusts length by offset" do
76
+ @interface.instance_variable_set(:@stream, LengthStream.new)
77
+ @interface.add_protocol(LengthProtocol, [
78
+ 16, # bit offset
79
+ 16, # bit size
80
+ 1, # length offset
81
+ 1, # bytes per count
82
+ 'BIG_ENDIAN'], :READ_WRITE)
83
+ $buffer = "\x00\x01\x00\x05\x03\x04"
84
+ packet = @interface.read
85
+ expect(packet.buffer.length).to eql 6
86
+ end
87
+
88
+ it "adjusts length by bytes per count" do
89
+ @interface.instance_variable_set(:@stream, LengthStream.new)
90
+ @interface.add_protocol(LengthProtocol, [
91
+ 16, # bit offset
92
+ 16, # bit size
93
+ 1, # length offset
94
+ 2, # bytes per count
95
+ 'BIG_ENDIAN'], :READ_WRITE)
96
+ $buffer = "\x00\x01\x00\x05\x03\x04\x05\x06\x07\x08\x09"
97
+ packet = @interface.read
98
+ expect(packet.buffer.length).to eql 11
99
+ end
100
+
101
+ it "accesses length at odd offset and bit sizes" do
102
+ @interface.instance_variable_set(:@stream, LengthStream.new)
103
+ @interface.add_protocol(LengthProtocol, [
104
+ 19, # bit offset
105
+ 5, # bit size
106
+ 0, # length offset
107
+ 1, # bytes per count
108
+ 'BIG_ENDIAN'], :READ_WRITE)
109
+ $buffer = "\x00\x01\x05\x03\x04"
110
+ packet = @interface.read
111
+ expect(packet.buffer.length).to eql 5
112
+ end
113
+
114
+ it "validates length against the maximum length" do
115
+ @interface.instance_variable_set(:@stream, LengthStream.new)
116
+ @interface.add_protocol(LengthProtocol, [
117
+ 16, # bit offset
118
+ 16, # bit size
119
+ 0, # length offset
120
+ 1, # bytes per count
121
+ 'BIG_ENDIAN',
122
+ 0, # discard
123
+ nil, # sync
124
+ 50], :READ_WRITE) # max_length
125
+ $buffer = "\x00\x01\xFF\xFF\x03\x04"
126
+ expect { packet = @interface.read }.to raise_error(RuntimeError, "Length value received larger than max_length: 65535 > 50")
127
+ end
128
+
129
+ it "handles a sync value in the packet" do
130
+ @interface.instance_variable_set(:@stream, LengthStream.new)
131
+ @interface.add_protocol(LengthProtocol, [
132
+ 16, # bit offset
133
+ 16, # bit size
134
+ 0, # length offset
135
+ 1, # bytes per count
136
+ 'BIG_ENDIAN',
137
+ 0, # discard
138
+ "DEAD"], :READ_WRITE) # sync
139
+ $buffer = "\x00\xDE\xAD\x00\x08\x01\x02\x03\x04\x05\x06"
140
+ packet = @interface.read
141
+ expect(packet.buffer).to eql("\xDE\xAD\x00\x08\x01\x02\x03\x04")
142
+ end
143
+
144
+ it "handles a sync value that is discarded" do
145
+ @interface.instance_variable_set(:@stream, LengthStream.new)
146
+ @interface.add_protocol(LengthProtocol, [
147
+ 16, # bit offset (past the discard)
148
+ 16, # bit size
149
+ 0, # length offset
150
+ 1, # bytes per count
151
+ 'BIG_ENDIAN',
152
+ 2, # discard
153
+ "DEAD"], :READ_WRITE) # sync
154
+ $buffer = "\x00\xDE\xAD\x00\x08\x01\x02\x03\x04\x05\x06\x07\x08"
155
+ packet = @interface.read
156
+ expect(packet.buffer).to eql("\x00\x08\x01\x02\x03\x04")
157
+ end
158
+
159
+ it "handles a length value that is discarded" do
160
+ @interface.instance_variable_set(:@stream, LengthStream.new)
161
+ @interface.add_protocol(LengthProtocol, [
162
+ 8, # bit offset
163
+ 16, # bit size
164
+ 0, # length offset
165
+ 1, # bytes per count
166
+ 'BIG_ENDIAN',
167
+ 4, # discard
168
+ nil], :READ_WRITE) # sync
169
+ $buffer = "\x00\x00\x08\x00\x01\x02\x03\x04\x05\x06\x07\x08"
170
+ packet = @interface.read
171
+ expect(packet.buffer).to eql("\x01\x02\x03\x04")
172
+ end
173
+
174
+ it "handles a sync and length value that are discarded" do
175
+ @interface.instance_variable_set(:@stream, LengthStream.new)
176
+ @interface.add_protocol(LengthProtocol, [
177
+ 16, # bit offset
178
+ 8, # bit size
179
+ 0, # length offset
180
+ 1, # bytes per count
181
+ 'BIG_ENDIAN',
182
+ 4, # discard
183
+ 'DEAD'], :READ_WRITE) # sync
184
+ $buffer = "\x00\xDE\xAD\x0A\x00\x01\x02\x03\x04\x05\x06\x07\x08"
185
+ packet = @interface.read
186
+ expect(packet.buffer).to eql("\x01\x02\x03\x04\x05\x06")
187
+ end
188
+ end
189
+
190
+ describe "write" do
191
+ it "sends data directly to the stream if no fill" do
192
+ @interface.instance_variable_set(:@stream, LengthStream.new)
193
+ @interface.add_protocol(LengthProtocol, [
194
+ 32, # bit offset
195
+ 16, # bit size
196
+ 0, # length offset
197
+ 1, # bytes per count
198
+ 'BIG_ENDIAN',
199
+ 0, # discard no leading bytes
200
+ "DEAD", # sync
201
+ nil, # max length
202
+ false], :READ_WRITE) # fill fields
203
+ packet = Packet.new(nil, nil)
204
+ packet.buffer = "\x01\x02"
205
+ @interface.write(packet)
206
+ expect($buffer).to eql("\x01\x02")
207
+ end
208
+
209
+ it "complains if not enough data to write the sync and length fields" do
210
+ @interface.instance_variable_set(:@stream, LengthStream.new)
211
+ @interface.add_protocol(LengthProtocol, [
212
+ 32, # bit offset
213
+ 16, # bit size
214
+ 0, # length offset
215
+ 1, # bytes per count
216
+ 'BIG_ENDIAN',
217
+ 0, # discard no leading bytes
218
+ "DEAD", # sync
219
+ nil, # max length
220
+ true], :READ_WRITE) # fill fields
221
+ packet = Packet.new(nil, nil)
222
+ packet.buffer = "\x01\x02\x03\x04"
223
+ # 4 bytes are not enough since we expect the length field at offset 32
224
+ expect { @interface.write(packet) }.to raise_error(ArgumentError, /buffer insufficient/)
225
+ end
226
+
227
+ it "adjusts length by offset" do
228
+ @interface.instance_variable_set(:@stream, LengthStream.new)
229
+ @interface.add_protocol(LengthProtocol, [
230
+ 16, # bit offset
231
+ 16, # bit size
232
+ 2, # length offset
233
+ 1, # bytes per count
234
+ 'BIG_ENDIAN',
235
+ 0, # discard no leading bytes
236
+ nil, # sync
237
+ nil, # max length
238
+ true], :READ_WRITE) # fill fields
239
+ packet = Packet.new(nil, nil)
240
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
241
+ @interface.write(packet)
242
+ # Length is 4 instead of 6 due to length offset
243
+ expect(packet.buffer).to eql("\x01\x02\x00\x04\x05\x06")
244
+ expect($buffer).to eql("\x01\x02\x00\x04\x05\x06")
245
+ end
246
+
247
+ it "adjusts length by bytes per count" do
248
+ @interface.instance_variable_set(:@stream, LengthStream.new)
249
+ @interface.add_protocol(LengthProtocol, [
250
+ 0, # bit offset
251
+ 16, # bit size
252
+ 0, # length offset
253
+ 2, # bytes per count
254
+ 'BIG_ENDIAN',
255
+ 0, # discard no leading bytes
256
+ nil, # sync
257
+ nil, # max length
258
+ true], :READ_WRITE) # fill fields
259
+ packet = Packet.new(nil, nil)
260
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
261
+ @interface.write(packet)
262
+ # Length is 3 instead of 6 due to bytes per count
263
+ expect(packet.buffer).to eql("\x00\x03\x03\x04\x05\x06")
264
+ expect($buffer).to eql("\x00\x03\x03\x04\x05\x06")
265
+ end
266
+
267
+ it "writes length at odd offset and bit sizes" do
268
+ @interface.instance_variable_set(:@stream, LengthStream.new)
269
+ @interface.add_protocol(LengthProtocol, [
270
+ 19, # bit offset
271
+ 5, # bit size
272
+ 0, # length offset
273
+ 1, # bytes per count
274
+ 'BIG_ENDIAN',
275
+ 0, # discard no leading bytes
276
+ nil, # sync
277
+ nil, # max length
278
+ true], :READ_WRITE) # fill fields
279
+ packet = Packet.new(nil, nil)
280
+ packet.buffer = "\x55\xAA\x00\xAA\x55\xAA"
281
+ @interface.write(packet)
282
+ expect(packet.buffer).to eql("\x55\xAA\x06\xAA\x55\xAA")
283
+ expect($buffer).to eql("\x55\xAA\x06\xAA\x55\xAA")
284
+ end
285
+
286
+ it "validates length against the maximum length 1" do
287
+ # Length inside packet
288
+ @interface.instance_variable_set(:@stream, LengthStream.new)
289
+ @interface.add_protocol(LengthProtocol, [
290
+ 0, # bit offset
291
+ 16, # bit size
292
+ 0, # length offset
293
+ 1, # bytes per count
294
+ 'BIG_ENDIAN',
295
+ 0, # discard
296
+ nil, # sync
297
+ 4, # max_length
298
+ true], :READ_WRITE) # fill fields
299
+ packet = Packet.new(nil, nil)
300
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
301
+ expect { packet = @interface.write(packet)}.to raise_error(RuntimeError, "Calculated length 6 larger than max_length 4")
302
+ end
303
+
304
+ it "validates length against the maximum length 2" do
305
+ # Length outside packet (data stream)
306
+ @interface.instance_variable_set(:@stream, LengthStream.new)
307
+ @interface.add_protocol(LengthProtocol, [
308
+ 0, # bit offset
309
+ 16, # bit size
310
+ 0, # length offset
311
+ 1, # bytes per count
312
+ 'BIG_ENDIAN',
313
+ 2, # discard
314
+ nil, # sync
315
+ 4, # max_length
316
+ true], :READ_WRITE) # fill fields
317
+ packet = Packet.new(nil, nil)
318
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
319
+ expect { packet = @interface.write(packet)}.to raise_error(RuntimeError, "Calculated length 8 larger than max_length 4")
320
+ end
321
+
322
+ it "inserts the sync and length fields into the packet 1" do
323
+ @interface.instance_variable_set(:@stream, LengthStream.new)
324
+ @interface.add_protocol(LengthProtocol, [
325
+ 16, # bit offset
326
+ 16, # bit size
327
+ 0, # length offset
328
+ 1, # bytes per count
329
+ 'BIG_ENDIAN',
330
+ 0, # discard no leading bytes
331
+ "DEAD", # sync
332
+ nil, # max length
333
+ true], :READ_WRITE) # fill fields
334
+ packet = Packet.new(nil, nil)
335
+ packet.buffer = "\x01\x02\x03\x04\x05\x06\x07\x08"
336
+ @interface.write(packet)
337
+ expect(packet.buffer).to eql("\xDE\xAD\x00\x08\x05\x06\x07\x08")
338
+ expect($buffer).to eql("\xDE\xAD\x00\x08\x05\x06\x07\x08")
339
+ end
340
+
341
+ it "inserts the sync and length fields into the packet 2" do
342
+ @interface.instance_variable_set(:@stream, LengthStream.new)
343
+ @interface.add_protocol(LengthProtocol, [
344
+ 64, # bit offset
345
+ 32, # bit size
346
+ 12, # length offset
347
+ 1, # bytes per count
348
+ 'BIG_ENDIAN',
349
+ 0, # discard no leading bytes
350
+ "BA5EBA11CAFEBABE",
351
+ nil,
352
+ true], :READ_WRITE)
353
+ packet = Packet.new(nil, nil)
354
+ # The packet buffer contains the sync and length fields which are overwritten by the write call
355
+ packet.buffer = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04"
356
+ @interface.write(packet)
357
+ # Since we discarded 0 leading bytes, they are simply written over by the write call
358
+ expect(packet.buffer).to eql("\xBA\x5E\xBA\x11\xCA\xFE\xBA\xBE\x00\x00\x00\x04\x01\x02\x03\x04")
359
+ expect($buffer).to eql("\xBA\x5E\xBA\x11\xCA\xFE\xBA\xBE\x00\x00\x00\x04\x01\x02\x03\x04")
360
+ end
361
+
362
+ it "inserts the length field into the packet and sync into data stream 1" do
363
+ @interface.instance_variable_set(:@stream, LengthStream.new)
364
+ @interface.add_protocol(LengthProtocol, [
365
+ 16, # bit offset
366
+ 16, # bit size
367
+ 0, # length offset
368
+ 1, # bytes per count
369
+ 'BIG_ENDIAN',
370
+ 2, # discard sync
371
+ "DEAD", # sync
372
+ nil, # max length
373
+ true], :READ_WRITE) # fill fields
374
+ packet = Packet.new(nil, nil)
375
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
376
+ @interface.write(packet)
377
+ expect(packet.buffer).to eql("\x00\x08\x03\x04\x05\x06")
378
+ expect($buffer).to eql("\xDE\xAD\x00\x08\x03\x04\x05\x06")
379
+ end
380
+
381
+ it "inserts the length field into the packet and sync into data stream 2" do
382
+ @interface.instance_variable_set(:@stream, LengthStream.new)
383
+ @interface.add_protocol(LengthProtocol, [
384
+ 32, # bit offset
385
+ 16, # bit size
386
+ 0, # length offset
387
+ 1, # bytes per count
388
+ 'BIG_ENDIAN',
389
+ 4, # discard sync
390
+ "BA5EBA11", # sync
391
+ nil, # max length
392
+ true], :READ_WRITE) # fill fields
393
+ packet = Packet.new(nil, nil)
394
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
395
+ @interface.write(packet)
396
+ expect(packet.buffer).to eql("\x00\x0A\x03\x04\x05\x06")
397
+ expect($buffer).to eql("\xBA\x5E\xBA\x11\x00\x0A\x03\x04\x05\x06")
398
+ end
399
+
400
+ it "inserts the length field into the packet and sync into data stream 3" do
401
+ @interface.instance_variable_set(:@stream, LengthStream.new)
402
+ @interface.add_protocol(LengthProtocol, [
403
+ 64, # bit offset
404
+ 32, # bit size
405
+ 12, # length offset
406
+ 1, # bytes per count
407
+ 'BIG_ENDIAN',
408
+ 8, # discard 8 leading bytes (sync)
409
+ "BA5EBA11CAFEBABE",
410
+ nil,
411
+ true], :READ_WRITE)
412
+ packet = Packet.new(nil, nil)
413
+ # The packet buffer contains the length field which is overwritten by the write call
414
+ packet.buffer = "\x00\x00\x00\x00\x01\x02\x03\x04"
415
+ @interface.write(packet)
416
+ # Since we discarded 8 leading bytes, they are put back in the final stream data
417
+ expect(packet.buffer).to eql("\x00\x00\x00\x04\x01\x02\x03\x04")
418
+ expect($buffer).to eql("\xBA\x5E\xBA\x11\xCA\xFE\xBA\xBE\x00\x00\x00\x04\x01\x02\x03\x04")
419
+ end
420
+
421
+ it "inserts the length field into the data stream 1" do
422
+ @interface.instance_variable_set(:@stream, LengthStream.new)
423
+ @interface.add_protocol(LengthProtocol, [
424
+ 8, # bit offset
425
+ 16, # bit size
426
+ 0, # length offset
427
+ 1, # bytes per count
428
+ 'BIG_ENDIAN',
429
+ 4, # discard
430
+ nil, # sync
431
+ nil, # max length
432
+ true], :READ_WRITE) # fill fields
433
+ packet = Packet.new(nil, nil)
434
+ packet.buffer = "\x01\x02\x03\x04"
435
+ @interface.write(packet)
436
+ expect(packet.buffer).to eql("\x01\x02\x03\x04")
437
+ expect($buffer).to eql("\x00\x00\x08\x00\x01\x02\x03\x04")
438
+ end
439
+
440
+ it "inserts the length field into the data stream 2" do
441
+ @interface.instance_variable_set(:@stream, LengthStream.new)
442
+ @interface.add_protocol(LengthProtocol, [
443
+ 16, # bit offset
444
+ 8, # bit size
445
+ 0, # length offset
446
+ 1, # bytes per count
447
+ 'BIG_ENDIAN',
448
+ 4, # discard
449
+ nil, # sync
450
+ nil, # max length
451
+ true], :READ_WRITE) # fill fields
452
+ packet = Packet.new(nil, nil)
453
+ packet.buffer = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
454
+ @interface.write(packet)
455
+ expect(packet.buffer).to eql("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A")
456
+ expect($buffer).to eql("\x00\x00\x0E\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A")
457
+ end
458
+
459
+ it "inserts the sync and length fields into the data stream 1" do
460
+ @interface.instance_variable_set(:@stream, LengthStream.new)
461
+ @interface.add_protocol(LengthProtocol, [
462
+ 16, # bit offset
463
+ 8, # bit size
464
+ 0, # length offset
465
+ 1, # bytes per count
466
+ 'BIG_ENDIAN',
467
+ 4, # discard
468
+ "0xDEAD", # sync
469
+ nil, # max length
470
+ true], :READ_WRITE) # fill fields
471
+ packet = Packet.new(nil, nil)
472
+ packet.buffer = "\x01\x02\x03\x04\x05\x06"
473
+ @interface.write(packet)
474
+ expect(packet.buffer).to eql("\x01\x02\x03\x04\x05\x06")
475
+ expect($buffer).to eql("\xDE\xAD\x0A\x00\x01\x02\x03\x04\x05\x06")
476
+ end
477
+
478
+ it "inserts the sync and length fields into the data stream 2" do
479
+ $buffer = ''
480
+ @interface.instance_variable_set(:@stream, LengthStream.new)
481
+ @interface.add_protocol(LengthProtocol, [
482
+ 32, # bit offset
483
+ 8, # bit size
484
+ 0, # length offset
485
+ 1, # bytes per count
486
+ 'BIG_ENDIAN',
487
+ 5, # discard
488
+ "BA5EBA11", # sync
489
+ nil, # max length
490
+ true], :READ_WRITE) # fill fields
491
+ packet = Packet.new(nil, nil)
492
+ packet.buffer = "\x01\x02\x03\x04"
493
+ @interface.write(packet)
494
+ expect(packet.buffer).to eql("\x01\x02\x03\x04")
495
+ expect($buffer).to eql("\xBA\x5E\xBA\x11\x09\x01\x02\x03\x04")
496
+ end
497
+ end
498
+ end
499
+ end