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,6 +10,7 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos/interfaces/udp_interface'
13
+ require 'cosmos/io/udp_sockets'
13
14
 
14
15
  module Cosmos
15
16
 
@@ -21,7 +22,7 @@ module Cosmos
21
22
 
22
23
  it "is not writeable if no write port given" do
23
24
  i = UdpInterface.new('localhost','nil','8889')
24
- expect(i.name).to eql "Cosmos::UdpInterface"
25
+ expect(i.name).to eql "UdpInterface"
25
26
  expect(i.write_allowed?).to be false
26
27
  expect(i.write_raw_allowed?).to be false
27
28
  expect(i.read_allowed?).to be true
@@ -29,7 +30,7 @@ module Cosmos
29
30
 
30
31
  it "is not readable if no read port given" do
31
32
  i = UdpInterface.new('localhost','8888','nil')
32
- expect(i.name).to eql "Cosmos::UdpInterface"
33
+ expect(i.name).to eql "UdpInterface"
33
34
  expect(i.write_allowed?).to be true
34
35
  expect(i.write_raw_allowed?).to be true
35
36
  expect(i.read_allowed?).to be false
@@ -38,73 +39,49 @@ module Cosmos
38
39
 
39
40
  describe "connect, connected?, disconnect" do
40
41
  it "creates a UdpWriteSocket and UdpReadSocket if both given" do
41
- write = double("write")
42
- expect(write).to receive(:closed?).and_return(false)
43
- expect(write).to receive(:close)
44
- read = double("read")
45
- expect(read).to receive(:closed?).and_return(false)
46
- expect(read).to receive(:close)
47
- expect(UdpWriteSocket).to receive(:new).and_return(write)
48
- expect(UdpReadSocket).to receive(:new).and_return(read)
49
42
  i = UdpInterface.new('localhost','8888','8889')
50
43
  expect(i.connected?).to be false
51
44
  i.connect
52
45
  expect(i.connected?).to be true
46
+ expect(i.instance_variable_get(:@write_socket)).to_not be_nil
47
+ expect(i.instance_variable_get(:@read_socket)).to_not be_nil
53
48
  i.disconnect
54
49
  expect(i.connected?).to be false
50
+ expect(i.instance_variable_get(:@write_socket)).to be_nil
51
+ expect(i.instance_variable_get(:@read_socket)).to be_nil
55
52
  end
56
53
 
57
54
  it "creates a UdpWriteSocket if write port given" do
58
- write = double("write")
59
- expect(write).to receive(:closed?).and_return(false)
60
- expect(write).to receive(:close)
61
- expect(UdpWriteSocket).to receive(:new).and_return(write)
62
- expect(UdpReadSocket).to_not receive(:new)
63
55
  i = UdpInterface.new('localhost','8888','nil')
64
56
  expect(i.connected?).to be false
65
57
  i.connect
66
58
  expect(i.connected?).to be true
59
+ expect(i.instance_variable_get(:@write_socket)).to_not be_nil
60
+ expect(i.instance_variable_get(:@read_socket)).to be_nil
67
61
  i.disconnect
68
62
  expect(i.connected?).to be false
63
+ expect(i.instance_variable_get(:@write_socket)).to be_nil
64
+ expect(i.instance_variable_get(:@read_socket)).to be_nil
69
65
  end
70
66
 
71
67
  it "creates a UdpReadSocket if read port given" do
72
- read = double("read")
73
- expect(read).to receive(:closed?).and_return(false)
74
- expect(read).to receive(:close)
75
- expect(UdpWriteSocket).to_not receive(:new)
76
- expect(UdpReadSocket).to receive(:new).and_return(read)
77
68
  i = UdpInterface.new('localhost','nil','8889')
78
69
  expect(i.connected?).to be false
79
70
  i.connect
80
71
  expect(i.connected?).to be true
72
+ expect(i.instance_variable_get(:@write_socket)).to be_nil
73
+ expect(i.instance_variable_get(:@read_socket)).to_not be_nil
81
74
  i.disconnect
82
75
  expect(i.connected?).to be false
83
- end
84
- end
85
-
86
- describe "disconnect" do
87
- it "rescues IOError from close" do
88
- write = double("write")
89
- expect(write).to receive(:closed?).and_return(false)
90
- expect(write).to receive(:close).and_raise(IOError)
91
- read = double("read")
92
- expect(read).to receive(:closed?).and_return(false)
93
- expect(read).to receive(:close).and_raise(IOError)
94
- expect(UdpWriteSocket).to receive(:new).and_return(write)
95
- expect(UdpReadSocket).to receive(:new).and_return(read)
96
- i = UdpInterface.new('localhost','8888','8889')
97
- expect(i.connected?).to be false
98
- i.connect
99
- expect(i.connected?).to be true
100
- i.disconnect
101
- expect(i.connected?).to be false
76
+ expect(i.instance_variable_get(:@write_socket)).to be_nil
77
+ expect(i.instance_variable_get(:@read_socket)).to be_nil
102
78
  end
103
79
  end
104
80
 
105
81
  describe "read" do
106
82
  it "stops the read thread if no read port given" do
107
83
  i = UdpInterface.new('localhost','8888','nil')
84
+ i.connect
108
85
  thread = Thread.new { i.read }
109
86
  sleep 0.1
110
87
  expect(thread.stop?).to be true
@@ -124,50 +101,138 @@ module Cosmos
124
101
  end
125
102
 
126
103
  it "counts the packets received" do
127
- read = double("read")
128
- allow(read).to receive(:read) { "\x00\x01\x02\x03" }
129
- expect(UdpReadSocket).to receive(:new).and_return(read)
104
+ write = UdpWriteSocket.new('localhost', 8889)
130
105
  i = UdpInterface.new('localhost','nil','8889')
131
106
  i.connect
132
107
  expect(i.read_count).to eql 0
133
108
  expect(i.bytes_read).to eql 0
134
- i.read
109
+ packet = nil
110
+ t = Thread.new { packet = i.read }
111
+ write.write("\x00\x01\x02\x03")
112
+ t.join
135
113
  expect(i.read_count).to eql 1
136
114
  expect(i.bytes_read).to eql 4
137
- i.read
115
+ expect(packet.buffer).to eql "\x00\x01\x02\x03"
116
+ t = Thread.new { packet = i.read }
117
+ write.write("\x04\x05\x06\x07")
118
+ t.join
138
119
  expect(i.read_count).to eql 2
139
120
  expect(i.bytes_read).to eql 8
121
+ expect(packet.buffer).to eql "\x04\x05\x06\x07"
122
+ i.disconnect
123
+ Cosmos.close_socket(write)
124
+ end
125
+
126
+ it "logs the raw data" do
127
+ write = UdpWriteSocket.new('localhost', 8889)
128
+ i = UdpInterface.new('localhost','nil','8889')
129
+ i.connect
130
+ expect(i.raw_logger_pair.read_logger.logging_enabled).to be false
131
+ i.start_raw_logging
132
+ expect(i.raw_logger_pair.read_logger.logging_enabled).to be true
133
+ packet = nil
134
+ t = Thread.new { packet = i.read }
135
+ write.write("\x00\x01\x02\x03")
136
+ t.join
137
+ filename = i.raw_logger_pair.read_logger.filename
138
+ i.stop_raw_logging
139
+ expect(i.raw_logger_pair.read_logger.logging_enabled).to be false
140
+ expect(File.read(filename)).to eq "\x00\x01\x02\x03"
141
+ i.disconnect
142
+ Cosmos.close_socket(write)
140
143
  end
141
144
  end
142
145
 
143
- describe "write, write_raw" do
146
+ describe "write" do
144
147
  it "complains if write_dest not given" do
145
148
  i = UdpInterface.new('localhost','nil','8889')
146
- expect { i.write(Packet.new('','')) }.to raise_error(/read only/)
147
- expect { i.write_raw('') }.to raise_error(/read only/)
149
+ expect { i.write(Packet.new('','')) }.to raise_error(/not connected for write/)
148
150
  end
149
151
 
150
152
  it "complains if the server is not connected" do
151
153
  i = UdpInterface.new('localhost','8888','nil')
152
154
  expect { i.write(Packet.new('','')) }.to raise_error(/Interface not connected/)
153
- expect { i.write_raw('') }.to raise_error(/Interface not connected/)
154
155
  end
155
156
 
156
- it "counts the packets written" do
157
- write = double("write")
158
- expect(UdpWriteSocket).to receive(:new).and_return(write)
159
- allow(write).to receive(:write)
157
+ it "counts the packets and bytes written" do
158
+ read = UdpReadSocket.new(8888, 'localhost')
160
159
  i = UdpInterface.new('localhost','8888','nil')
161
160
  i.connect
162
161
  expect(i.write_count).to eql 0
163
162
  pkt = Packet.new('tgt','pkt')
164
163
  pkt.buffer = "\x00\x01\x02\x03"
164
+ packet = nil
165
165
  i.write(pkt)
166
+ data = read.read
166
167
  expect(i.write_count).to eql 1
167
168
  expect(i.bytes_written).to eql 4
168
- i.write_raw(pkt.buffer)
169
- expect(i.write_count).to eql 2
170
- expect(i.bytes_written).to eql 8
169
+ expect(data).to eq "\x00\x01\x02\x03"
170
+ i.disconnect
171
+ Cosmos.close_socket(read)
172
+ end
173
+
174
+ it "logs the raw data" do
175
+ read = UdpReadSocket.new(8888, 'localhost')
176
+ i = UdpInterface.new('localhost','8888','nil')
177
+ i.connect
178
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be false
179
+ i.start_raw_logging
180
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be true
181
+ pkt = Packet.new('tgt','pkt')
182
+ pkt.buffer = "\x00\x01\x02\x03"
183
+ packet = nil
184
+ i.write(pkt)
185
+ data = read.read
186
+ filename = i.raw_logger_pair.write_logger.filename
187
+ i.stop_raw_logging
188
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be false
189
+ expect(File.read(filename)).to eq "\x00\x01\x02\x03"
190
+ i.disconnect
191
+ Cosmos.close_socket(read)
192
+ end
193
+ end
194
+
195
+ describe "write_raw" do
196
+ it "complains if write_dest not given" do
197
+ i = UdpInterface.new('localhost','nil','8889')
198
+ expect { i.write_raw('') }.to raise_error(/not connected for write/)
199
+ end
200
+
201
+ it "complains if the server is not connected" do
202
+ i = UdpInterface.new('localhost','8888','nil')
203
+ expect { i.write_raw('') }.to raise_error(/Interface not connected/)
204
+ end
205
+
206
+ it "counts the bytes written" do
207
+ read = UdpReadSocket.new(8888, 'localhost')
208
+ i = UdpInterface.new('localhost','8888','nil')
209
+ i.connect
210
+ expect(i.write_count).to eql 0
211
+ expect(i.bytes_written).to eql 0
212
+ i.write_raw("\x04\x05\x06\x07")
213
+ data = read.read
214
+ expect(i.write_count).to eql 0
215
+ expect(i.bytes_written).to eql 4
216
+ expect(data).to eq "\x04\x05\x06\x07"
217
+ i.disconnect
218
+ Cosmos.close_socket(read)
219
+ end
220
+
221
+ it "logs the raw data" do
222
+ read = UdpReadSocket.new(8888, 'localhost')
223
+ i = UdpInterface.new('localhost','8888','nil')
224
+ i.connect
225
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be false
226
+ i.start_raw_logging
227
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be true
228
+ i.write_raw("\x00\x01\x02\x03")
229
+ data = read.read
230
+ filename = i.raw_logger_pair.write_logger.filename
231
+ i.stop_raw_logging
232
+ expect(i.raw_logger_pair.write_logger.logging_enabled).to be false
233
+ expect(File.read(filename)).to eq "\x00\x01\x02\x03"
234
+ i.disconnect
235
+ Cosmos.close_socket(read)
171
236
  end
172
237
  end
173
238
  end
@@ -8,53 +8,55 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'spec_helper'
12
- require 'cosmos/io/serial_driver'
13
- require 'cosmos/io/win32_serial_driver'
11
+ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
14
12
 
15
- module Cosmos
13
+ require 'spec_helper'
14
+ require 'cosmos/io/serial_driver'
15
+ require 'cosmos/io/win32_serial_driver'
16
16
 
17
- describe SerialDriver do
17
+ module Cosmos
18
18
 
19
- describe "instance" do
20
- it "enforces the parity to a known value" do
21
- expect { SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
22
- end
23
- end
19
+ describe SerialDriver do
24
20
 
25
- describe "close, closed?, write, read" do
26
- it "defers to the windows serial driver on windows" do
27
- allow(Kernel).to receive(:is_windows?).and_return(true)
28
- driver = double("Win32SerialDriver")
29
- expect(driver).to receive(:close)
30
- expect(driver).to receive(:closed?)
31
- expect(driver).to receive(:write)
32
- expect(driver).to receive(:read)
33
- allow(Win32SerialDriver).to receive(:new).and_return(driver)
34
- driver = SerialDriver.new('COM1',9600)
35
- driver.close
36
- driver.closed?
37
- driver.write("hi")
38
- driver.read
21
+ describe "instance" do
22
+ it "enforces the parity to a known value" do
23
+ expect { SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
24
+ end
39
25
  end
40
26
 
41
- it "defers to the posix serial driver on nix" do
42
- class PosixSerialDriver
27
+ describe "close, closed?, write, read" do
28
+ it "defers to the windows serial driver on windows" do
29
+ allow(Kernel).to receive(:is_windows?).and_return(true)
30
+ driver = double("Win32SerialDriver")
31
+ expect(driver).to receive(:close)
32
+ expect(driver).to receive(:closed?)
33
+ expect(driver).to receive(:write)
34
+ expect(driver).to receive(:read)
35
+ allow(Win32SerialDriver).to receive(:new).and_return(driver)
36
+ driver = SerialDriver.new('COM1',9600)
37
+ driver.close
38
+ driver.closed?
39
+ driver.write("hi")
40
+ driver.read
41
+ end
42
+
43
+ it "defers to the posix serial driver on nix" do
44
+ class PosixSerialDriver
45
+ end
46
+ allow(Kernel).to receive(:is_windows?).and_return(false)
47
+ driver = double("PosixSerialDriver")
48
+ expect(driver).to receive(:close)
49
+ expect(driver).to receive(:closed?)
50
+ expect(driver).to receive(:write)
51
+ expect(driver).to receive(:read)
52
+ allow(PosixSerialDriver).to receive(:new).and_return(driver)
53
+ driver = SerialDriver.new('COM1',9600)
54
+ driver.close
55
+ driver.closed?
56
+ driver.write("hi")
57
+ driver.read
43
58
  end
44
- allow(Kernel).to receive(:is_windows?).and_return(false)
45
- driver = double("PosixSerialDriver")
46
- expect(driver).to receive(:close)
47
- expect(driver).to receive(:closed?)
48
- expect(driver).to receive(:write)
49
- expect(driver).to receive(:read)
50
- allow(PosixSerialDriver).to receive(:new).and_return(driver)
51
- driver = SerialDriver.new('COM1',9600)
52
- driver.close
53
- driver.closed?
54
- driver.write("hi")
55
- driver.read
56
59
  end
57
60
  end
58
61
  end
59
62
  end
60
-
@@ -21,11 +21,14 @@ module Cosmos
21
21
  expect(udp.peeraddr[2]).to eql '127.0.0.1'
22
22
  expect(udp.peeraddr[1]).to eql 8888
23
23
  udp.close
24
- udp = UdpWriteSocket.new('224.0.1.1', 8888, 7777, '127.0.0.1', 3)
25
- expect(udp.local_address.ip_port).to eql 7777
26
- expect(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL).int).to eql 3
27
- expect(IPAddr.new_ntoh(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_IF).data).to_s).to eql "127.0.0.1"
28
- udp.close
24
+ if RUBY_ENGINE == 'ruby' # UDP multicast does not work in Jruby
25
+ udp = UdpWriteSocket.new('224.0.1.1', 8888, 7777, '127.0.0.1', 3)
26
+ expect(udp.local_address.ip_port).to eql 7777
27
+ # Reading this back doesn't appear to work in JRUBY, not sure if it is actually taking
28
+ expect(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL).int).to eql 3
29
+ expect(IPAddr.new_ntoh(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_IF).data).to_s).to eql "127.0.0.1"
30
+ udp.close
31
+ end
29
32
  end
30
33
  end
31
34
 
@@ -65,9 +68,11 @@ module Cosmos
65
68
  expect(udp.local_address.ip_address).to eql '0.0.0.0'
66
69
  expect(udp.local_address.ip_port).to eql 8888
67
70
  udp.close
68
- udp = UdpReadSocket.new(8888, '224.0.1.1')
69
- expect(IPAddr.new_ntoh(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_IF).data).to_s).to eql "0.0.0.0"
70
- udp.close
71
+ if RUBY_ENGINE == 'ruby' # UDP multicast does not work in Jruby
72
+ udp = UdpReadSocket.new(8888, '224.0.1.1')
73
+ expect(IPAddr.new_ntoh(udp.getsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_IF).data).to_s).to eql "0.0.0.0"
74
+ udp.close
75
+ end
71
76
  end
72
77
  end
73
78
 
@@ -8,81 +8,84 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'spec_helper'
12
- require 'cosmos/io/win32_serial_driver'
11
+ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
13
12
 
14
- module Cosmos
13
+ require 'spec_helper'
14
+ require 'cosmos/io/win32_serial_driver'
15
15
 
16
- describe Win32SerialDriver do
17
- before(:each) do
18
- allow(Win32).to receive(:create_file).and_return(Object.new)
19
- state = double("comm_state")
20
- allow(state).to receive(:write)
21
- allow(Win32).to receive(:get_comm_state).and_return(state)
22
- allow(Win32).to receive(:set_comm_state)
23
- allow(Win32).to receive(:set_comm_timeouts)
24
- end
16
+ module Cosmos
25
17
 
26
- describe "instance" do
27
- it "enforces the baud rate to a known value" do
28
- expect { Win32SerialDriver.new('COM1',10,:NONE) }.to raise_error(ArgumentError, "Invalid baud rate: 10")
18
+ describe Win32SerialDriver do
19
+ before(:each) do
20
+ allow(Win32).to receive(:create_file).and_return(Object.new)
21
+ state = double("comm_state")
22
+ allow(state).to receive(:write)
23
+ allow(Win32).to receive(:get_comm_state).and_return(state)
24
+ allow(Win32).to receive(:set_comm_state)
25
+ allow(Win32).to receive(:set_comm_timeouts)
29
26
  end
30
27
 
31
- it "supports even, odd, or no parity" do
32
- expect { Win32SerialDriver.new('COM1',9600,:EVEN) }.to_not raise_error
33
- expect { Win32SerialDriver.new('COM1',9600,:ODD) }.to_not raise_error
34
- expect { Win32SerialDriver.new('COM1',9600,:NONE) }.to_not raise_error
35
- expect { Win32SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
36
- end
28
+ describe "instance" do
29
+ it "enforces the baud rate to a known value" do
30
+ expect { Win32SerialDriver.new('COM1',10,:NONE) }.to raise_error(ArgumentError, "Invalid baud rate: 10")
31
+ end
37
32
 
38
- it "supports 1 or 2 stop bits" do
39
- expect { Win32SerialDriver.new('COM1',9600,:NONE,1) }.to_not raise_error
40
- expect { Win32SerialDriver.new('COM1',9600,:NONE,2) }.to_not raise_error
41
- expect { Win32SerialDriver.new('COM1',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
42
- end
43
- end
33
+ it "supports even, odd, or no parity" do
34
+ expect { Win32SerialDriver.new('COM1',9600,:EVEN) }.to_not raise_error
35
+ expect { Win32SerialDriver.new('COM1',9600,:ODD) }.to_not raise_error
36
+ expect { Win32SerialDriver.new('COM1',9600,:NONE) }.to_not raise_error
37
+ expect { Win32SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
38
+ end
44
39
 
45
- describe "close, closed?" do
46
- it "closes the handle" do
47
- expect(Win32).to receive(:close_handle)
48
- driver = Win32SerialDriver.new('COM1',9600)
49
- expect(driver.closed?).to be false
50
- driver.close
51
- expect(driver.closed?).to be true
40
+ it "supports 1 or 2 stop bits" do
41
+ expect { Win32SerialDriver.new('COM1',9600,:NONE,1) }.to_not raise_error
42
+ expect { Win32SerialDriver.new('COM1',9600,:NONE,2) }.to_not raise_error
43
+ expect { Win32SerialDriver.new('COM1',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
44
+ end
52
45
  end
53
- end
54
46
 
55
- describe "write" do
56
- it "handles write errors" do
57
- expect(Win32).to receive(:write_file).and_return 0
58
- driver = Win32SerialDriver.new('COM1',9600)
59
- expect { driver.write('\x00') }.to raise_error("Error writing to comm port")
47
+ describe "close, closed?" do
48
+ it "closes the handle" do
49
+ expect(Win32).to receive(:close_handle)
50
+ driver = Win32SerialDriver.new('COM1',9600)
51
+ expect(driver.closed?).to be false
52
+ driver.close
53
+ expect(driver.closed?).to be true
54
+ end
60
55
  end
61
56
 
62
- it "uses the write timeout" do
63
- expect(Win32).to receive(:write_file) do
64
- sleep 2
65
- 1
57
+ describe "write" do
58
+ it "handles write errors" do
59
+ expect(Win32).to receive(:write_file).and_return 0
60
+ driver = Win32SerialDriver.new('COM1',9600)
61
+ expect { driver.write('\x00') }.to raise_error("Error writing to comm port")
66
62
  end
67
- driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1)
68
- expect { driver.write('\x00\x01') }.to raise_error(Timeout::Error)
69
- end
70
- end
71
63
 
72
- describe "read" do
73
- it "return the data read" do
74
- expect(Win32).to receive(:read_file) { '\x00' }
75
- driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1,nil,0.01,1)
76
- expect(driver.read).to eql '\x00'
64
+ it "uses the write timeout" do
65
+ expect(Win32).to receive(:write_file) do
66
+ sleep 2
67
+ 1
68
+ end
69
+ driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1)
70
+ expect { driver.write('\x00\x01') }.to raise_error(Timeout::Error)
71
+ end
77
72
  end
78
73
 
79
- it "uses the read timeout" do
80
- allow(Win32).to receive(:read_file) { '' }
81
- driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1,1.0,0.5,10)
82
- expect { driver.read }.to raise_error(Timeout::Error)
74
+ describe "read" do
75
+ it "return the data read" do
76
+ expect(Win32).to receive(:read_file) { '\x00' }
77
+ driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1,nil,0.01,1)
78
+ expect(driver.read).to eql '\x00'
79
+ end
80
+
81
+ it "uses the read timeout" do
82
+ allow(Win32).to receive(:read_file) { '' }
83
+ driver = Win32SerialDriver.new('COM1',9600,:NONE,1,1,1.0,0.5,10)
84
+ expect { driver.read }.to raise_error(Timeout::Error)
85
+ end
83
86
  end
84
- end
85
87
 
88
+ end
86
89
  end
87
- end
88
90
 
91
+ end