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
@@ -12,8 +12,13 @@ require 'spec_helper'
12
12
  require 'cosmos/interfaces/linc_interface'
13
13
 
14
14
  module Cosmos
15
-
16
15
  describe LincInterface do
16
+ class TcpipClientStream < TcpipSocketStream
17
+ # Allow the connect_nonblock method to simply return
18
+ def connect_nonblock(socket, addr); end
19
+ def write(data); end
20
+ end
21
+
17
22
  before(:all) do
18
23
  clean_config()
19
24
  System.class_eval('@@instance = nil')
@@ -21,11 +26,6 @@ module Cosmos
21
26
 
22
27
  describe "connect" do
23
28
  it "passes a new TcpipClientStream to the stream protocol" do
24
- stream = double("stream")
25
- allow(stream).to receive(:connect)
26
- expect(TcpipClientStream).to receive(:new) { stream }
27
- expect(stream).to receive(:connected?) { true }
28
- expect(stream).to receive(:raw_logger_pair=) { nil }
29
29
  i = LincInterface.new('localhost','8888')
30
30
  i.target_names << "INST"
31
31
  expect(i.connected?).to be false
@@ -36,17 +36,9 @@ module Cosmos
36
36
 
37
37
  describe "write" do
38
38
  before(:each) do
39
- @stream = double("stream")
40
- allow(@stream).to receive(:connect)
41
- expect(TcpipClientStream).to receive(:new) { @stream }
42
- allow(@stream).to receive(:connected?) { true }
43
- allow(@stream).to receive(:write)
44
- expect(@stream).to receive(:raw_logger_pair=) { nil }
45
39
  @i = LincInterface.new('localhost','8888','true','2','nil','5','0','16','4','GSE_HDR_GUID','BIG_ENDIAN','GSE_HDR_LEN')
46
40
  @i.target_names << "INST"
47
- expect(@i.connected?).to be false
48
41
  @i.connect
49
- expect(@i.connected?).to be true
50
42
  end
51
43
 
52
44
  it "returns an exception if its not connected" do
@@ -122,13 +114,14 @@ module Cosmos
122
114
  @buffer << [3].pack("N")
123
115
  @buffer << "BAD"
124
116
  @handshake.write("DATA", @buffer)
125
-
126
- allow_any_instance_of(LengthStreamProtocol).to receive(:read).and_return(@handshake)
117
+ # LincInterface has a length offset of 4
118
+ @handshake.write("GSE_HDR_LEN", @handshake.buffer(false).length-4)
127
119
  end
128
120
 
129
121
  it "does not timeout if the handshake is received" do
122
+ allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
130
123
  t = Thread.new do
131
- sleep 1
124
+ sleep 0.1
132
125
  @i.read
133
126
  end
134
127
  @i.write(@cmd)
@@ -151,33 +144,30 @@ module Cosmos
151
144
  buffer << [3].pack("N")
152
145
  buffer << "BAD"
153
146
  handshake2.write("DATA", buffer)
147
+ handshake2.write("GSE_HDR_LEN", handshake2.buffer(false).length-4)
154
148
 
155
149
  read_cnt = 0
156
150
  write_cnt = 0
157
- allow_any_instance_of(LengthStreamProtocol).to receive(:read) do
151
+ allow_any_instance_of(TcpipClientStream).to receive(:read) do
158
152
  read_cnt += 1
159
153
  result = nil
160
- result = handshake2 if read_cnt == 1
161
- result = @handshake if read_cnt == 2
154
+ result = handshake2.buffer(false) if read_cnt == 1
155
+ result = @handshake.buffer(false) if read_cnt == 2
162
156
  result
163
157
  end
164
158
 
165
159
  # Create new thread for each write
166
160
  t1 = Thread.new do
167
- expect(@stream).to receive(:write) do
168
- write_cnt += 1
169
- end
161
+ write_cnt += 1
170
162
  @i.write(cmd2)
171
163
  end
172
164
  # Create new thread for each write
173
165
  t2 = Thread.new do
174
- expect(@stream).to receive(:write) do
175
- write_cnt += 1
176
- end
166
+ write_cnt += 1
177
167
  @i.write(@cmd)
178
168
  end
179
169
 
180
- sleep 0.5
170
+ sleep 0.2
181
171
  # Expect both write threads have written
182
172
  expect(write_cnt).to eql 2
183
173
  # But no handshakes have been received
@@ -192,11 +182,12 @@ module Cosmos
192
182
  end
193
183
 
194
184
  it "warns if an error code is set" do
185
+ allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
195
186
  expect(Logger).to receive(:warn) do |msg|
196
187
  expect(msg).to eql "Warning sending command (12345): BAD"
197
188
  end
198
189
  t = Thread.new do
199
- sleep 1
190
+ sleep 0.1
200
191
  @i.read
201
192
  end
202
193
  @i.write(@cmd)
@@ -204,9 +195,10 @@ module Cosmos
204
195
  end
205
196
 
206
197
  it "raises an exception if the status is 'ERROR'" do
198
+ allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
207
199
  @handshake.write("STATUS", "ERROR")
208
200
  t = Thread.new do
209
- sleep 1
201
+ sleep 0.1
210
202
  @i.read
211
203
  end
212
204
  expect { @i.write(@cmd) }.to raise_error("Error sending command (12345): BAD")
@@ -217,12 +209,6 @@ module Cosmos
217
209
 
218
210
  describe "read" do
219
211
  before(:each) do
220
- stream = double("stream")
221
- allow(stream).to receive(:connect)
222
- expect(TcpipClientStream).to receive(:new) { stream }
223
- allow(stream).to receive(:connected?) { true }
224
- allow(stream).to receive(:write)
225
- expect(stream).to receive(:raw_logger_pair=) { nil }
226
212
  @i = LincInterface.new('localhost','8888','true','2','nil','5','0','16','4','GSE_HDR_GUID','BIG_ENDIAN','GSE_HDR_LEN')
227
213
  @i.target_names << "INST"
228
214
  expect(@i.connected?).to be false
@@ -233,9 +219,23 @@ module Cosmos
233
219
  it "handles local commands" do
234
220
  @handshake = System.telemetry.packet("INST","HANDSHAKE")
235
221
  @handshake.write("GSE_HDR_ID", 1001)
222
+ @handshake.write("STATUS","OK")
223
+ @handshake.write("CODE", 12345)
236
224
  @handshake.write("ORIGIN", 1)
237
-
238
- allow_any_instance_of(LengthStreamProtocol).to receive(:read).and_return(@handshake)
225
+ buffer = ''
226
+ buffer << ["INST".length].pack("C")
227
+ buffer << "INST"
228
+ buffer << ["LINC_COMMAND".length].pack("C")
229
+ buffer << "LINC_COMMAND"
230
+ buffer << [@handshake.buffer.length].pack("N")
231
+ buffer << @handshake.buffer
232
+ buffer << [3].pack("N")
233
+ buffer << "BAD"
234
+ @handshake.write("DATA", buffer)
235
+ # LincInterface has a length offset of 4
236
+ @handshake.write("GSE_HDR_LEN", @handshake.buffer(false).length-4)
237
+
238
+ allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
239
239
 
240
240
  expect(Logger).to receive(:info) do |msg|
241
241
  expect(msg).to match(/External Command/)
@@ -244,7 +244,5 @@ module Cosmos
244
244
  @i.read
245
245
  end
246
246
  end
247
-
248
247
  end
249
248
  end
250
-
@@ -0,0 +1,300 @@
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/burst_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe BurstProtocol do
18
+ before(:each) do
19
+ @interface = StreamInterface.new
20
+ allow(@interface).to receive(:connected?) { true }
21
+ end
22
+
23
+ describe "configure_protocol" do
24
+ it "initializes attributes" do
25
+ @interface.add_protocol(BurstProtocol, [1, '0xDEADBEEF', true], :READ_WRITE)
26
+ expect(@interface.read_protocols[0].instance_variable_get(:@data)).to eq ''
27
+ expect(@interface.read_protocols[0].instance_variable_get(:@discard_leading_bytes)).to eq 1
28
+ expect(@interface.read_protocols[0].instance_variable_get(:@sync_pattern)).to eq "\xDE\xAD\xBE\xEF"
29
+ expect(@interface.read_protocols[0].instance_variable_get(:@fill_fields)).to be true
30
+ end
31
+ end
32
+
33
+ describe "connect" do
34
+ it "clears the data" do
35
+ @interface.add_protocol(BurstProtocol, [1, '0xDEADBEEF', true], :READ_WRITE)
36
+ @interface.read_protocols[0].instance_variable_set(:@data, '\x00\x01\x02\x03')
37
+ @interface.connect
38
+ expect(@interface.read_protocols[0].instance_variable_get(:@data)).to eql ''
39
+ end
40
+ end
41
+
42
+ describe "disconnect" do
43
+ it "clears the data" do
44
+ @interface.add_protocol(BurstProtocol, [1, '0xDEADBEEF', true], :READ_WRITE)
45
+ @interface.read_protocols[0].instance_variable_set(:@data, '\x00\x01\x02\x03')
46
+ @interface.connect
47
+ expect(@interface.read_protocols[0].instance_variable_get(:@data)).to eql ''
48
+ end
49
+ end
50
+
51
+ describe "read_data" do
52
+ it "reads data from the stream" do
53
+ class MyStream < Stream
54
+ def connect; end
55
+ def connected?; true; end
56
+ def disconnect; end
57
+ def read; "\x01\x02\x03\x04"; end
58
+ end
59
+ @interface.instance_variable_set(:@stream, MyStream.new)
60
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
61
+ pkt = @interface.read
62
+ expect(pkt.length).to eql 4
63
+ end
64
+
65
+ it "handles timeouts from the stream" do
66
+ class MyStream < Stream
67
+ def connect; end
68
+ def connected?; true; end
69
+ def disconnect; end
70
+ def read; raise Timeout::Error; end
71
+ end
72
+ @interface.instance_variable_set(:@stream, MyStream.new)
73
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
74
+ expect(@interface.read).to be_nil
75
+ end
76
+
77
+ it "discards leading bytes from the stream" do
78
+ class MyStream < Stream
79
+ def connect; end
80
+ def connected?; true; end
81
+ def disconnect; end
82
+ def read
83
+ "\x01\x02\x03\x04"
84
+ end
85
+ end
86
+ @interface.instance_variable_set(:@stream, MyStream.new)
87
+ @interface.add_protocol(BurstProtocol, [2], :READ_WRITE)
88
+ pkt = @interface.read
89
+ expect(pkt.length).to eql 2
90
+ expect(pkt.buffer.formatted).to match(/03 04/)
91
+ end
92
+
93
+ # The sync pattern is NOT part of the data
94
+ it "discards the entire sync pattern" do
95
+ class MyStream < Stream
96
+ def connect; end
97
+ def connected?; true; end
98
+ def disconnect; end
99
+ def read
100
+ "\x12\x34\x56\x78\x9A\xBC"
101
+ end
102
+ end
103
+ @interface.instance_variable_set(:@stream, MyStream.new)
104
+ @interface.add_protocol(BurstProtocol, [2, '0x1234'], :READ_WRITE)
105
+ pkt = @interface.read
106
+ expect(pkt.length).to eql 4
107
+ expect(pkt.buffer.formatted).to match(/56 78 9A BC/)
108
+ end
109
+
110
+ # The sync pattern is partially part of the data
111
+ it "discards part of the sync pattern" do
112
+ class MyStream < Stream
113
+ def connect; end
114
+ def connected?; true; end
115
+ def disconnect; end
116
+ def read
117
+ "\x12\x34\x56\x78\x9A\xBC"
118
+ end
119
+ end
120
+ @interface.instance_variable_set(:@stream, MyStream.new)
121
+ @interface.add_protocol(BurstProtocol, [1, '0x123456'], :READ_WRITE)
122
+ pkt = @interface.read
123
+ expect(pkt.length).to eql 5
124
+ expect(pkt.buffer.formatted).to match(/34 56 78 9A BC/)
125
+ end
126
+
127
+ # The sync pattern is completely part of the data
128
+ it "handles a sync pattern" do
129
+ $read_cnt = 0
130
+ class MyStream < Stream
131
+ def connect; end
132
+ def connected?; true; end
133
+ def disconnect; end
134
+ def read
135
+ $read_cnt += 1
136
+ case $read_cnt
137
+ when 1
138
+ "\x00\x00\x00\x00\x00\x00"
139
+ when 2
140
+ "\x00\x12\x34\x10\x20"
141
+ when 3
142
+ ""
143
+ end
144
+ end
145
+ end
146
+ @interface.instance_variable_set(:@stream, MyStream.new)
147
+ @interface.add_protocol(BurstProtocol, [0, '0x1234'], :READ_WRITE)
148
+ pkt = @interface.read
149
+ expect(pkt.length).to eql 4 # sync plus two bytes
150
+ expect(pkt.buffer.formatted).to match(/12 34 10 20/)
151
+ end
152
+
153
+ it "handles a sync pattern split across reads" do
154
+ $read_cnt = 0
155
+ class MyStream < Stream
156
+ def connect; end
157
+ def connected?; true; end
158
+ def disconnect; end
159
+ def read
160
+ $read_cnt += 1
161
+ case $read_cnt
162
+ when 1
163
+ "\x00\x00\x00\x00\x00\x00\x00\x12"
164
+ when 2
165
+ "\x34\x20"
166
+ when 3
167
+ ""
168
+ end
169
+ end
170
+ end
171
+ @interface.instance_variable_set(:@stream, MyStream.new)
172
+ @interface.add_protocol(BurstProtocol, [0, '0x1234'], :READ_WRITE)
173
+ pkt = @interface.read
174
+ expect(pkt.length).to eql 3 # sync plus one byte
175
+ end
176
+
177
+ it "handles a false positive sync pattern" do
178
+ $read_cnt = 0
179
+ class MyStream < Stream
180
+ def connect; end
181
+ def connected?; true; end
182
+ def disconnect; end
183
+ def read
184
+ $read_cnt += 1
185
+ case $read_cnt
186
+ when 1
187
+ "\x00\x00\x12\x00\x00\x12"
188
+ when 2
189
+ "\x34\x20"
190
+ when 3
191
+ ""
192
+ end
193
+ end
194
+ end
195
+ @interface.instance_variable_set(:@stream, MyStream.new)
196
+ @interface.add_protocol(BurstProtocol, [0, '0x1234'], :READ_WRITE)
197
+ pkt = @interface.read
198
+ expect(pkt.length).to eql 3 # sync plus one byte
199
+ end
200
+ end
201
+
202
+ describe "write" do
203
+ it "doesn't change the data if fill_fields is false" do
204
+ $buffer = ''
205
+ class MyStream < Stream
206
+ def connect; end
207
+ def connected?; true; end
208
+ def disconnect; end
209
+ def write(buffer) $buffer = buffer; end
210
+ end
211
+ data = Packet.new(nil, nil, :BIG_ENDIAN, nil, "\x00\x01\x02\x03")
212
+ @interface.instance_variable_set(:@stream, MyStream.new)
213
+ @interface.add_protocol(BurstProtocol, [0, '0x1234'], :READ_WRITE)
214
+ data = @interface.write(data)
215
+ expect($buffer).to eql "\x00\x01\x02\x03"
216
+ end
217
+
218
+ it "complains if the data isn't big enough to hold the sync pattern" do
219
+ $buffer = ''
220
+ class MyStream < Stream
221
+ def connect; end
222
+ def connected?; true; end
223
+ def write(buffer) $buffer = buffer; end
224
+ def disconnect; end
225
+ end
226
+ data = Packet.new(nil, nil, :BIG_ENDIAN, nil, "\x00\x00")
227
+ # Don't discard bytes, include and fill the sync pattern
228
+ @interface.instance_variable_set(:@stream, MyStream.new)
229
+ @interface.add_protocol(BurstProtocol, [0, '0x12345678', true], :READ_WRITE)
230
+ # 2 bytes are not enough to hold the 4 byte sync
231
+ expect { @interface.write(data) }.to raise_error(ArgumentError, /buffer insufficient/)
232
+ end
233
+
234
+ it "fills the sync pattern in the data" do
235
+ $buffer = ''
236
+ class MyStream < Stream
237
+ def connect; end
238
+ def connected?; true; end
239
+ def disconnect; end
240
+ def write(buffer) $buffer = buffer; end
241
+ end
242
+ data = Packet.new(nil, nil, :BIG_ENDIAN, nil, "\x00\x01\x02\x03")
243
+ # Don't discard bytes, include and fill the sync pattern
244
+ @interface.instance_variable_set(:@stream, MyStream.new)
245
+ @interface.add_protocol(BurstProtocol, [0, '0x1234', true], :READ_WRITE)
246
+ @interface.write(data)
247
+ expect($buffer).to eql "\x12\x34\x02\x03"
248
+ end
249
+
250
+ it "adds the sync pattern to the data stream" do
251
+ $buffer = ''
252
+ class MyStream < Stream
253
+ def connect; end
254
+ def connected?; true; end
255
+ def disconnect; end
256
+ def write(buffer) $buffer = buffer; end
257
+ end
258
+ data = Packet.new(nil, nil, :BIG_ENDIAN, nil, "\x00\x01\x02\x03")
259
+ # Discard first 2 bytes (the sync pattern), include and fill the sync pattern
260
+ @interface.instance_variable_set(:@stream, MyStream.new)
261
+ @interface.add_protocol(BurstProtocol, [2, '0x12345678', true], :READ_WRITE)
262
+ @interface.write(data)
263
+ expect($buffer).to eql "\x12\x34\x56\x78\x02\x03"
264
+ end
265
+
266
+ it "adds part of the sync pattern to the data stream" do
267
+ $buffer = ''
268
+ class MyStream < Stream
269
+ def connect; end
270
+ def connected?; true; end
271
+ def disconnect; end
272
+ def write(buffer) $buffer = buffer; end
273
+ end
274
+ data = Packet.new(nil, nil, :BIG_ENDIAN, nil, "\x00\x00\x02\x03")
275
+ # Discard first byte (part of the sync pattern), include and fill the sync pattern
276
+ @interface.instance_variable_set(:@stream, MyStream.new)
277
+ @interface.add_protocol(BurstProtocol, [1, '0x123456', true], :READ_WRITE)
278
+ @interface.write(data)
279
+ expect($buffer).to eql "\x12\x34\x56\x02\x03"
280
+ end
281
+ end
282
+
283
+ describe "write_raw" do
284
+ it "doesnt change the data" do
285
+ $buffer = ''
286
+ class MyStream < Stream
287
+ def connect; end
288
+ def connected?; true; end
289
+ def disconnect; end
290
+ def write(buffer) $buffer = buffer; end
291
+ end
292
+ # Discard first 2 bytes (the sync pattern), include and fill the sync pattern
293
+ @interface.instance_variable_set(:@stream, MyStream.new)
294
+ @interface.add_protocol(BurstProtocol, [2, '0x1234', true], :READ_WRITE)
295
+ @interface.write_raw("\x00\x01\x02\x03")
296
+ expect($buffer).to eql "\x00\x01\x02\x03"
297
+ end
298
+ end
299
+ end
300
+ end