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
@@ -10,11 +10,58 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos/interfaces/interface'
13
+ require 'cosmos/interfaces/protocols/protocol'
13
14
 
14
15
  module Cosmos
16
+ class InterfaceTestProtocol < Protocol
15
17
 
16
- describe Interface do
18
+ def initialize(added_data, stop_count = 0, packet_added_data = nil, packet_stop_count = 0)
19
+ @added_data = added_data
20
+ @packet_added_data = packet_added_data
21
+ @stop_count = stop_count.to_i
22
+ @packet_stop_count = packet_stop_count.to_i
23
+ end
24
+
25
+ def read_data(data)
26
+ return :STOP if data == ''
27
+ if @stop_count > 0
28
+ @stop_count -= 1
29
+ return :STOP
30
+ end
31
+ if @added_data
32
+ return :DISCONNECT if @added_data == :DISCONNECT
33
+ return data if @added_data == :STOP
34
+ data << @added_data
35
+ return data
36
+ else
37
+ return data
38
+ end
39
+ end
40
+ alias write_data read_data
41
+
42
+ def read_packet(packet)
43
+ if @packet_stop_count > 0
44
+ @packet_stop_count -= 1
45
+ return :STOP
46
+ end
47
+ if @packet_added_data
48
+ return :DISCONNECT if @packet_added_data == :DISCONNECT
49
+ return packet if @packet_added_data == :STOP
50
+ packet.buffer(false) << @packet_added_data
51
+ return packet
52
+ else
53
+ return packet
54
+ end
55
+ end
56
+ alias write_packet read_packet
17
57
 
58
+ def post_write_interface(packet, data)
59
+ $packet = packet
60
+ $data = data
61
+ end
62
+ end
63
+
64
+ describe Interface do
18
65
  describe "include API" do
19
66
  it "includes API" do
20
67
  expect(Interface.new.methods).to include :cmd
@@ -24,7 +71,7 @@ module Cosmos
24
71
  describe "initialize" do
25
72
  it "initializes the instance variables" do
26
73
  i = Interface.new
27
- expect(i.name).to eql "Cosmos::Interface"
74
+ expect(i.name).to eql "Interface"
28
75
  expect(i.target_names).to eql []
29
76
  expect(i.thread).to be_nil
30
77
  expect(i.connect_on_startup).to be true
@@ -41,18 +88,16 @@ module Cosmos
41
88
  expect(i.read_queue_size).to eql 0
42
89
  expect(i.write_queue_size).to eql 0
43
90
  expect(i.interfaces).to eql []
91
+ expect(i.options).to be_empty
92
+ expect(i.read_protocols).to be_empty
93
+ expect(i.write_protocols).to be_empty
94
+ expect(i.protocol_info).to be_empty
44
95
  end
45
96
  end
46
97
 
47
- describe "virtual methods" do
48
- it "raises an error" do
49
- i = Interface.new
50
- expect { i.connect }.to raise_error(/connect method not implemented/)
51
- expect { i.connected? }.to raise_error(/connected\? method not implemented/)
52
- expect { i.disconnect}.to raise_error(/disconnect method not implemented/)
53
- expect { i.read}.to raise_error(/read method not implemented/)
54
- expect { i.write(nil) }.to raise_error(/write method not implemented/)
55
- expect { i.write_raw(nil) }.to raise_error(/write_raw method not implemented/)
98
+ describe "connected?" do
99
+ it "raises an exception" do
100
+ expect { Interface.new.connected? }.to raise_error(/connected\? not defined by Interface/)
56
101
  end
57
102
  end
58
103
 
@@ -74,6 +119,346 @@ module Cosmos
74
119
  end
75
120
  end
76
121
 
122
+ describe "read" do
123
+ let(:interface) { Interface.new }
124
+
125
+ it "raises unless connected" do
126
+ class <<interface
127
+ def connected?; false; end
128
+ end
129
+ expect { interface.read }.to raise_error(/Interface not connected/)
130
+ end
131
+
132
+ it "optionally logs raw data received from read_interface" do
133
+ class <<interface
134
+ def connected?; true; end
135
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
136
+ end
137
+ interface.start_raw_logging
138
+ packet = interface.read
139
+ expect(packet.buffer).to eql "\x01\x02\x03\x04"
140
+ expect(interface.read_count).to eq 1
141
+ expect(interface.bytes_read).to eq 4
142
+ filename = interface.raw_logger_pair.read_logger.filename
143
+ interface.stop_raw_logging
144
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04"
145
+ end
146
+
147
+ it "aborts and doesn't log if no data is returned from read_interface" do
148
+ class <<interface
149
+ def connected?; true; end
150
+ def read_interface; nil end
151
+ end
152
+ interface.start_raw_logging
153
+ expect(interface.read).to be_nil
154
+ # Filenames don't get assigned until logging starts
155
+ expect(interface.raw_logger_pair.read_logger.filename).to be_nil
156
+ expect(interface.bytes_read).to eq 0
157
+ end
158
+
159
+ it "counts raw bytes read" do
160
+ $i = 0
161
+ class <<interface
162
+ def connected?; true; end
163
+ def read_interface
164
+ case $i
165
+ when 0
166
+ $i += 1
167
+ data = "\x01\x02\x03\x04"
168
+ when 1
169
+ $i += 1
170
+ data = "\x01\x02"
171
+ when 2
172
+ $i += 1
173
+ data = "\x01\x02\x03\x04\x01\x02"
174
+ end
175
+ read_interface_base(data)
176
+ data
177
+ end
178
+ end
179
+ interface.read
180
+ expect(interface.bytes_read).to eq 4
181
+ interface.read
182
+ expect(interface.bytes_read).to eq 6
183
+ interface.read
184
+ expect(interface.bytes_read).to eq 12
185
+ end
186
+
187
+ it "allows protocol read_data to manipulate data" do
188
+ class <<interface
189
+ def connected?; true; end
190
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
191
+ end
192
+ interface.add_protocol(InterfaceTestProtocol, ["\x05"], :READ)
193
+ interface.add_protocol(InterfaceTestProtocol, ["\x06"], :READ)
194
+ interface.start_raw_logging
195
+ packet = interface.read
196
+ expect(packet.buffer).to eq "\x01\x02\x03\x04\x05\x06"
197
+ expect(interface.read_count).to eq 1
198
+ expect(interface.bytes_read).to eq 4
199
+ filename = interface.raw_logger_pair.read_logger.filename
200
+ interface.stop_raw_logging
201
+ # Raw logging is still the original read_data return
202
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04"
203
+ end
204
+
205
+ it "aborts if protocol read_data returns :DISCONNECT" do
206
+ class <<interface
207
+ def connected?; true; end
208
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
209
+ end
210
+ interface.add_protocol(InterfaceTestProtocol, [:DISCONNECT], :READ)
211
+ interface.start_raw_logging
212
+ packet = interface.read
213
+ expect(packet).to be_nil
214
+ expect(interface.read_count).to eq 0
215
+ expect(interface.bytes_read).to eq 4
216
+ filename = interface.raw_logger_pair.read_logger.filename
217
+ interface.stop_raw_logging
218
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04"
219
+ end
220
+
221
+ it "gets more data if a protocol read_data returns :STOP" do
222
+ class <<interface
223
+ def connected?; true; end
224
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
225
+ end
226
+ interface.add_protocol(InterfaceTestProtocol, [nil, 1], :READ)
227
+ interface.start_raw_logging
228
+ packet = interface.read
229
+ expect(packet.buffer).to eq "\x01\x02\x03\x04"
230
+ expect(interface.read_count).to eq 1
231
+ expect(interface.bytes_read).to eq 8
232
+ filename = interface.raw_logger_pair.read_logger.filename
233
+ interface.stop_raw_logging
234
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04\x01\x02\x03\x04"
235
+ end
236
+
237
+ it "allows protocol read_packet to manipulate packet" do
238
+ class <<interface
239
+ def connected?; true; end
240
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
241
+ end
242
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, "\x08"], :READ)
243
+ packet = interface.read
244
+ expect(packet.buffer).to eq "\x01\x02\x03\x04\x08"
245
+ expect(interface.read_count).to eq 1
246
+ expect(interface.bytes_read).to eq 4
247
+ end
248
+
249
+ it "aborts if protocol read_packet returns :DISCONNECT" do
250
+ class <<interface
251
+ def connected?; true; end
252
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
253
+ def post_read_packet(packet); nil; end
254
+ end
255
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, :DISCONNECT], :READ)
256
+ packet = interface.read
257
+ expect(packet).to be_nil
258
+ expect(interface.read_count).to eq 0
259
+ expect(interface.bytes_read).to eq 4
260
+ end
261
+
262
+ it "gets more data if protocol read_packet returns :STOP" do
263
+ class <<interface
264
+ def connected?; true; end
265
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
266
+ end
267
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, nil, 1], :READ)
268
+ packet = interface.read
269
+ expect(packet.buffer).to eq "\x01\x02\x03\x04"
270
+ expect(interface.read_count).to eq 1
271
+ expect(interface.bytes_read).to eq 8
272
+ end
273
+
274
+ it "returns an unidentified packet" do
275
+ class <<interface
276
+ def connected?; true; end
277
+ def read_interface; data = "\x01\x02\x03\x04"; read_interface_base(data); data; end
278
+ end
279
+ packet = interface.read
280
+ expect(packet.target_name).to be_nil
281
+ expect(packet.packet_name).to be_nil
282
+ end
283
+ end
284
+
285
+ describe "write" do
286
+ let(:interface) { Interface.new }
287
+ let(:packet) { Packet.new('TGT', 'PKT', :BIG_ENDIAN, 'Packet', "\x01\x02\x03\x04") }
288
+
289
+ it "raises unless connected" do
290
+ class <<interface
291
+ def connected?; false; end
292
+ end
293
+ expect { interface.write(packet)}.to raise_error(/Interface not connected/)
294
+ end
295
+
296
+ it "is single threaded" do
297
+ class <<interface
298
+ def connected?; true; end
299
+ def write_interface(data); write_interface_base(data); sleep 0.1; end
300
+ end
301
+ start_time = Time.now
302
+ threads = []
303
+ 10.times do
304
+ threads << Thread.new do
305
+ interface.write(packet)
306
+ end
307
+ end
308
+ threads.collect {|t| t.join }
309
+ expect(Time.now - start_time).to be > 1
310
+ expect(interface.write_count).to eq 10
311
+ expect(interface.bytes_written).to eq 40
312
+ end
313
+
314
+ it "raises an error if not connected" do
315
+ class <<interface
316
+ def connected?; false; end
317
+ end
318
+ expect { interface.write(packet)}.to raise_error(/Interface not connected/)
319
+ expect(interface.write_count).to be 0
320
+ expect(interface.bytes_written).to be 0
321
+ end
322
+
323
+ it "disconnects if write_interface raises an exception" do
324
+ class <<interface
325
+ attr_accessor :disconnect_called
326
+ def disconnect; @disconnect_called = true; end
327
+ def connected?; true; end
328
+ def write_interface(data); raise "Doom"; end
329
+ end
330
+ expect { interface.write(packet)}.to raise_error(/Doom/)
331
+ expect(interface.disconnect_called).to be true
332
+ expect(interface.write_count).to be 1
333
+ expect(interface.bytes_written).to be 0
334
+ end
335
+
336
+ it "allows protocols write_packet to modify the packet" do
337
+ class <<interface
338
+ def connected?; true; end
339
+ def write_interface(data); write_interface_base(data); end
340
+ end
341
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, "\x06", 0], :WRITE)
342
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, "\x05", 0], :WRITE)
343
+ interface.start_raw_logging
344
+ interface.write(packet)
345
+ expect(interface.write_count).to eq 1
346
+ expect(interface.bytes_written).to eq 6
347
+ filename = interface.raw_logger_pair.write_logger.filename
348
+ interface.stop_raw_logging
349
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04\x05\x06"
350
+ end
351
+
352
+ it "aborts if write_packet returns :DISCONNECT" do
353
+ class <<interface
354
+ def connected?; true; end
355
+ def write_interface(data); write_interface_base(data); end
356
+ end
357
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, :DISCONNECT, 0], :WRITE)
358
+ interface.write(packet)
359
+ expect(interface.write_count).to be 1
360
+ expect(interface.bytes_written).to be 0
361
+ end
362
+
363
+ it "stops if write_packet returns :STOP" do
364
+ class <<interface
365
+ def connected?; true; end
366
+ def write_interface(data); write_interface_base(data); end
367
+ end
368
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, :STOP, 1], :WRITE)
369
+ interface.write(packet)
370
+ interface.write(packet)
371
+ expect(interface.write_count).to be 2
372
+ expect(interface.bytes_written).to be 4
373
+ end
374
+
375
+ it "allows protocol write_data to modify the data" do
376
+ class <<interface
377
+ def connected?; true; end
378
+ def write_interface(data); write_interface_base(data); end
379
+ end
380
+ interface.add_protocol(InterfaceTestProtocol, ["\x07", 0, nil, 0], :WRITE)
381
+ interface.add_protocol(InterfaceTestProtocol, ["\x08", 0, nil, 0], :WRITE)
382
+ interface.start_raw_logging
383
+ interface.write(packet)
384
+ expect(interface.write_count).to be 1
385
+ expect(interface.bytes_written).to be 6
386
+ filename = interface.raw_logger_pair.write_logger.filename
387
+ interface.stop_raw_logging
388
+ expect(File.read(filename)).to eq "\x01\x02\x03\x04\x08\x07"
389
+ end
390
+
391
+ it "aborts if write_data returns :DISCONNECT" do
392
+ class <<interface
393
+ def connected?; true; end
394
+ def write_interface(data); write_interface_base(data); end
395
+ end
396
+ interface.add_protocol(InterfaceTestProtocol, [:DISCONNECT, 0, nil, 0], :WRITE)
397
+ interface.write(packet)
398
+ expect(interface.write_count).to be 1
399
+ expect(interface.bytes_written).to be 0
400
+ end
401
+
402
+ it "stops if write_data returns :STOP" do
403
+ class <<interface
404
+ def connected?; true; end
405
+ def write_interface(data); write_interface_base(data); end
406
+ end
407
+ interface.add_protocol(InterfaceTestProtocol, [:STOP, 1, nil, 0], :WRITE)
408
+ interface.write(packet)
409
+ interface.write(packet)
410
+ expect(interface.write_count).to be 2
411
+ expect(interface.bytes_written).to be 4
412
+ end
413
+
414
+ it "calls post_write_interface with the packet and data" do
415
+ $packet = nil
416
+ $data = nil
417
+ class <<interface
418
+ def connected?; true; end
419
+ def write_interface(data); write_interface_base(data); end
420
+ end
421
+ interface.add_protocol(InterfaceTestProtocol, [nil, 0, nil, 0], :WRITE)
422
+ expect($packet).to be_nil
423
+ expect($data).to be_nil
424
+ interface.write(packet)
425
+ expect(interface.write_count).to be 1
426
+ expect(interface.bytes_written).to be 4
427
+ expect($packet).to eq packet
428
+ expect($data).to eq packet.buffer
429
+ end
430
+ end
431
+
432
+ describe "write_raw" do
433
+ let(:interface) { Interface.new }
434
+ let(:data) { "\x01\x02\x03\x04" }
435
+
436
+ it "raises unless connected" do
437
+ class <<interface
438
+ def connected?; false; end
439
+ end
440
+ expect { interface.write_raw(data)}.to raise_error(/Interface not connected/)
441
+ end
442
+
443
+ it "is single threaded" do
444
+ class <<interface
445
+ def connected?; true; end
446
+ def write_interface(data); write_interface_base(data); sleep 0.1; end
447
+ end
448
+ start_time = Time.now
449
+ threads = []
450
+ 10.times do
451
+ threads << Thread.new do
452
+ interface.write_raw(data)
453
+ end
454
+ end
455
+ threads.collect {|t| t.join }
456
+ expect(Time.now - start_time).to be > 1
457
+ expect(interface.write_count).to eq 0
458
+ expect(interface.bytes_written).to eq 40
459
+ end
460
+ end
461
+
77
462
  describe "copy_to" do
78
463
  it "copies the interface" do
79
464
  i = Interface.new
@@ -94,6 +479,9 @@ module Cosmos
94
479
  i.read_queue_size = 6
95
480
  i.write_queue_size = 7
96
481
  i.interfaces = [5,6]
482
+ i.read_protocols = [1, 2]
483
+ i.write_protocols = [3, 4]
484
+ i.protocol_info = [[Protocol, [], :READ_WRITE]]
97
485
 
98
486
  i2 = Interface.new
99
487
  i.copy_to(i2)
@@ -114,17 +502,13 @@ module Cosmos
114
502
  expect(i2.read_queue_size).to eql 0 # does not get copied
115
503
  expect(i2.write_queue_size).to eql 0 # does not get copied
116
504
  expect(i2.interfaces).to eql [5,6]
117
-
505
+ expect(i2.read_protocols).to_not be_empty
506
+ expect(i2.write_protocols).to_not be_empty
507
+ expect(i2.protocol_info).to eql [[Protocol, [], :READ_WRITE]]
118
508
  Cosmos.kill_thread(nil, i.thread)
119
509
  end
120
510
  end
121
511
 
122
- describe "post_identify_packet" do
123
- it "does nothing" do
124
- expect { Interface.new.post_identify_packet(nil) }.to_not raise_error
125
- end
126
- end
127
-
128
512
  end
129
513
  end
130
514