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
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
3
+ # Copyright 2017 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -13,10 +13,8 @@ require 'cosmos/io/udp_sockets'
13
13
  require 'cosmos/config/config_parser'
14
14
 
15
15
  module Cosmos
16
-
17
16
  # Base class for interfaces that send and receive messages over UDP
18
17
  class UdpInterface < Interface
19
-
20
18
  # @param hostname [String] Machine to connect to
21
19
  # @param write_dest_port [Integer] Port to write commands to
22
20
  # @param read_port [Integer] Port to read telemetry from
@@ -29,21 +27,22 @@ module Cosmos
29
27
  # @param write_timeout [Integer] Seconds to wait before aborting writes
30
28
  # @param read_timeout [Integer] Seconds to wait before aborting reads
31
29
  # @param bind_address [String] Address to bind UDP ports to
32
- def initialize(hostname,
33
- write_dest_port,
34
- read_port,
35
- write_src_port = nil,
36
- interface_address = nil,
37
- ttl = 128, # default for Windows
38
- write_timeout = 10.0,
39
- read_timeout = nil,
40
- bind_address = "0.0.0.0")
41
- super()
30
+ def initialize(
31
+ hostname,
32
+ write_dest_port,
33
+ read_port,
34
+ write_src_port = nil,
35
+ interface_address = nil,
36
+ ttl = 128, # default for Windows
37
+ write_timeout = 10.0,
38
+ read_timeout = nil,
39
+ bind_address = '0.0.0.0')
42
40
 
41
+ super()
43
42
  @hostname = ConfigParser.handle_nil(hostname)
44
43
  if @hostname
45
44
  @hostname = @hostname.to_s
46
- @hostname = '127.0.0.1' if @hostname.upcase == 'LOCALHOST'
45
+ @hostname = '127.0.0.1' if @hostname.casecmp('LOCALHOST')
47
46
  end
48
47
  @write_dest_port = ConfigParser.handle_nil(write_dest_port)
49
48
  @write_dest_port = write_dest_port.to_i if @write_dest_port
@@ -52,7 +51,9 @@ module Cosmos
52
51
  @write_src_port = ConfigParser.handle_nil(write_src_port)
53
52
  @write_src_port = @write_src_port.to_i if @write_src_port
54
53
  @interface_address = ConfigParser.handle_nil(interface_address)
55
- @interface_address = '127.0.0.1' if @interface_address and @interface_address.upcase == 'LOCALHOST'
54
+ if @interface_address && @interface_address.casecmp('LOCALHOST')
55
+ @interface_address = '127.0.0.1'
56
+ end
56
57
  @ttl = ttl.to_i
57
58
  @ttl = 1 if @ttl < 1
58
59
  @write_timeout = ConfigParser.handle_nil(write_timeout)
@@ -60,7 +61,9 @@ module Cosmos
60
61
  @read_timeout = ConfigParser.handle_nil(read_timeout)
61
62
  @read_timeout = @read_timeout.to_f if @read_timeout
62
63
  @bind_address = ConfigParser.handle_nil(bind_address)
63
- @bind_address = '127.0.0.1' if @bind_address and @bind_address.upcase == 'LOCALHOST'
64
+ if @bind_address && @bind_address.casecmp('LOCALHOST')
65
+ @bind_address = '127.0.0.1'
66
+ end
64
67
  @write_socket = nil
65
68
  @read_socket = nil
66
69
  @read_allowed = false unless @read_port
@@ -72,13 +75,18 @@ module Cosmos
72
75
  # the constructor and a new {UdpReadSocket} if the read_port was given in
73
76
  # the constructor.
74
77
  def connect
75
- @write_socket = UdpWriteSocket.new(@hostname,
76
- @write_dest_port,
77
- @write_src_port,
78
- @interface_address,
79
- @ttl,
80
- @bind_address) if @write_dest_port
81
- @read_socket = UdpReadSocket.new(@read_port, @hostname, @interface_address, @bind_address) if @read_port
78
+ @write_socket = UdpWriteSocket.new(
79
+ @hostname,
80
+ @write_dest_port,
81
+ @write_src_port,
82
+ @interface_address,
83
+ @ttl,
84
+ @bind_address) if @write_dest_port
85
+ @read_socket = UdpReadSocket.new(
86
+ @read_port,
87
+ @hostname,
88
+ @interface_address,
89
+ @bind_address) if @read_port
82
90
  @thread_sleeper = nil
83
91
  end
84
92
 
@@ -105,69 +113,29 @@ module Cosmos
105
113
  @thread_sleeper = nil
106
114
  end
107
115
 
108
- # If the read port was given, the read_socket is read and the data returned
109
- # in a {Packet}. bytes_read and read_count are updated.
110
- #
111
- # @return [Packet]
112
116
  def read
113
- if @read_port
114
- begin
115
- data = @read_socket.read(@read_timeout)
116
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
117
- rescue IOError
118
- # Disconnected
119
- return nil
120
- end
121
-
122
- @bytes_read += data.length
123
- @read_count += 1
124
-
125
- return Packet.new(nil, nil, :BIG_ENDIAN, nil, data)
126
- else
127
- # Write only interface so stop the thread which calls read
128
- @thread_sleeper = Sleeper.new
129
- while connected?()
130
- @thread_sleeper.sleep(1000000)
131
- end
132
- return nil
133
- end
117
+ return super() if @read_port
118
+ # Write only interface so stop the thread which calls read
119
+ @thread_sleeper = Sleeper.new
120
+ @thread_sleeper.sleep(1_000_000_000) while connected?
121
+ return nil
134
122
  end
135
123
 
136
- # If the write_dest_port was given, the write_socket is written with the
137
- # packet data. bytes_written and write_count are updated.
138
- #
139
- # @param packet [Packet] Packet buffer to write
140
- def write(packet)
141
- if @write_dest_port
142
- if connected?()
143
- write_raw(packet.buffer)
144
- else
145
- raise "Interface not connected"
146
- end
147
- else
148
- raise "Attempt to write to read only interface"
149
- end
124
+ # Reads from the socket if the read_port is defined
125
+ def read_interface
126
+ data = @read_socket.read(@read_timeout)
127
+ read_interface_base(data)
128
+ return data
129
+ rescue IOError # Disconnected
130
+ return nil
150
131
  end
151
132
 
152
- # If the write_dest_port was given, the write_socket is written with the
153
- # data. bytes_written and write_count are updated.
154
- #
155
- # @param data [String] Raw binary data to write
156
- def write_raw(data)
157
- if @write_dest_port
158
- if connected?()
159
- @write_socket.write(data, @write_timeout)
160
- @bytes_written += data.length
161
- @write_count += 1
162
- @raw_logger_pair.write_logger.write(data) if @raw_logger_pair
163
- else
164
- raise "Interface not connected"
165
- end
166
- else
167
- raise "Attempt to write to read only interface"
168
- end
133
+ # Writes to the socket
134
+ # @param data [String] Raw packet data
135
+ def write_interface(data)
136
+ write_interface_base(data)
137
+ @write_socket.write(data, @write_timeout)
138
+ data
169
139
  end
170
-
171
- end # class UdpInterface
172
-
173
- end # module Cosmos
140
+ end
141
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
3
+ # Copyright 2017 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -8,4 +8,94 @@
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 'cosmos/ext/buffered_file'
11
+ if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
12
+ require 'cosmos/ext/buffered_file'
13
+ else
14
+ module Cosmos
15
+ class BufferedFile < File
16
+ BUFFER_SIZE = 16 * 1024
17
+
18
+ # Initialize the BufferedFile. Takes the same args as File
19
+ def initialize(*args)
20
+ super(*args)
21
+ @buffer = ''
22
+ @buffer_index = 0
23
+ end
24
+
25
+ # Read using an internal buffer to avoid system calls
26
+ def read(read_length)
27
+ if read_length <= (@buffer.length - @buffer_index)
28
+ # Return part of the buffer without having to go to the OS
29
+ result = @buffer[@buffer_index, read_length]
30
+ @buffer_index += read_length
31
+ return result
32
+ elsif read_length > BUFFER_SIZE
33
+ # Reading more than our buffer
34
+ if @buffer.length > 0
35
+ if @buffer_index > 0
36
+ @buffer.slice!(0..(@buffer_index - 1))
37
+ @buffer_index = 0
38
+ end
39
+ @buffer << super(read_length - @buffer.length).to_s
40
+ return @buffer.slice!(0..-1)
41
+ else
42
+ return super(read_length)
43
+ end
44
+ else
45
+ # Read into the buffer
46
+ if @buffer_index > 0
47
+ @buffer.slice!(0..(@buffer_index - 1))
48
+ @buffer_index = 0
49
+ end
50
+ @buffer << super(BUFFER_SIZE - @buffer.length).to_s
51
+ if @buffer.length <= 0
52
+ return nil
53
+ end
54
+
55
+ if read_length <= @buffer.length
56
+ result = @buffer[@buffer_index, read_length]
57
+ @buffer_index += read_length
58
+ return result
59
+ else
60
+ return @buffer.slice!(0..-1)
61
+ end
62
+ end
63
+ end
64
+
65
+ # Get the current file position
66
+ def pos
67
+ parent_pos = super()
68
+ return parent_pos - (@buffer.length - @buffer_index)
69
+ end
70
+
71
+ # Seek to a given file position
72
+ def seek(*args)
73
+ case args.length
74
+ when 1
75
+ amount = args[0]
76
+ whence = IO::SEEK_SET
77
+ when 2
78
+ amount = args[0]
79
+ whence = args[1]
80
+ else
81
+ # Invalid number of arguments given - let super handle
82
+ return super(*args)
83
+ end
84
+
85
+ if whence == IO::SEEK_CUR
86
+ buffer_index = @buffer_index + amount
87
+ if (buffer_index >= 0) && (buffer_index < @buffer.length)
88
+ @buffer_index = buffer_index
89
+ return 0
90
+ end
91
+ super(self.pos, IO::SEEK_SET)
92
+ end
93
+
94
+ @buffer.clear
95
+ @buffer_index = 0
96
+ return super(*args)
97
+ end
98
+
99
+ end
100
+ end
101
+ end
@@ -297,7 +297,7 @@ module Cosmos
297
297
  while true
298
298
  begin
299
299
  request_data = JsonDRb.receive_message(my_socket, data, pipe_reader)
300
- start_time = Time.now
300
+ start_time = Time.now.sys
301
301
  @request_count += 1
302
302
  rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::ENOTSOCK, IOError
303
303
  # Socket was closed
@@ -373,7 +373,7 @@ module Cosmos
373
373
  response_data = response.to_json(:allow_nan => true)
374
374
  STDOUT.puts response_data if JsonDRb.debug?
375
375
  JsonDRb.send_data(socket, response_data)
376
- end_time = Time.now
376
+ end_time = Time.now.sys
377
377
  request_time = end_time - start_time
378
378
  add_request_time(request_time)
379
379
  rescue
@@ -23,7 +23,8 @@ module Cosmos
23
23
  parity = :NONE,
24
24
  stop_bits = 1,
25
25
  write_timeout = 10.0,
26
- read_timeout = nil)
26
+ read_timeout = nil,
27
+ flow_control = :NONE)
27
28
 
28
29
  # Convert Baud Rate into Termios constant
29
30
  begin
@@ -57,6 +58,7 @@ module Cosmos
57
58
  cflags |= Termios::CSTOPB if stop_bits == 2
58
59
  cflags |= Termios::PARENB if parity
59
60
  cflags |= Termios::PADODD if parity == :ODD
61
+ cflags |= Termios::CRTSCTS if flow_control == :RTSCTS
60
62
  tio.iflag = iflags
61
63
  tio.oflag = 0
62
64
  tio.cflag = cflags
@@ -66,7 +66,7 @@ module Cosmos
66
66
  @mutex = Mutex.new
67
67
  @file = nil
68
68
  @filename = nil
69
- @start_time = Time.now
69
+ @start_time = Time.now.sys
70
70
  @logging_enabled = ConfigParser.handle_true_false(logging_enabled)
71
71
  end
72
72
 
@@ -107,7 +107,7 @@ module Cosmos
107
107
  # not created until data is written by {#write} so this does not
108
108
  # immediately create a log file on the filesystem.
109
109
  def start
110
- close_file() unless ((Time.now - @start_time) < 1.0) # Prevent close/open too fast
110
+ close_file() unless ((Time.now.sys - @start_time) < 1.0) # Prevent close/open too fast
111
111
  @mutex.synchronize { @logging_enabled = true }
112
112
  end
113
113
 
@@ -136,7 +136,7 @@ module Cosmos
136
136
  @filename = File.join(@log_directory, File.build_timestamped_filename([@log_name], '.bin'))
137
137
  @file = File.new(@filename, 'wb')
138
138
  end
139
- @start_time = Time.now
139
+ @start_time = Time.now.sys
140
140
  Logger.instance.info "Raw Log File Opened : #{@filename}"
141
141
  end
142
142
  rescue => err
@@ -8,9 +8,10 @@
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 'cosmos/core_ext/kernel'
11
12
  if Kernel.is_windows?
12
13
  require 'cosmos/io/win32_serial_driver'
13
- else
14
+ elsif RUBY_ENGINE == 'ruby'
14
15
  require 'cosmos/io/posix_serial_driver'
15
16
  end
16
17
 
@@ -31,12 +32,14 @@ module Cosmos
31
32
  # complete or nil to block
32
33
  # @param read_timeout [Float|nil] Number of seconds to wait for the read to
33
34
  # complete or nil to block
35
+ # @param flow_control [Symbol] Currently supported :NONE and :RTSCTS
34
36
  def initialize(port_name,
35
37
  baud_rate,
36
38
  parity = :NONE,
37
39
  stop_bits = 1,
38
40
  write_timeout = 10.0,
39
- read_timeout = nil)
41
+ read_timeout = nil,
42
+ flow_control = :NONE)
40
43
  raise(ArgumentError, "Invalid parity: #{parity}") unless VALID_PARITY.include? parity
41
44
  if Kernel.is_windows?
42
45
  @driver = Win32SerialDriver.new(port_name,
@@ -44,14 +47,20 @@ module Cosmos
44
47
  parity,
45
48
  stop_bits,
46
49
  write_timeout,
47
- read_timeout)
48
- else
50
+ read_timeout,
51
+ 0.01,
52
+ 1000,
53
+ flow_control)
54
+ elsif RUBY_ENGINE == 'ruby'
49
55
  @driver = PosixSerialDriver.new(port_name,
50
56
  baud_rate,
51
57
  parity,
52
58
  stop_bits,
53
59
  write_timeout,
54
- read_timeout)
60
+ read_timeout,
61
+ flow_control)
62
+ else
63
+ @driver = nil # JRuby Serial on Linux not currently supported
55
64
  end
56
65
  end
57
66
 
@@ -8,6 +8,7 @@
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 'cosmos/io/serial_driver'
11
12
  require 'cosmos/win32/win32'
12
13
  require 'timeout' # For Timeout::Error
13
14
 
@@ -24,7 +25,8 @@ module Cosmos
24
25
  write_timeout = 10.0,
25
26
  read_timeout = nil,
26
27
  read_polling_period = 0.01,
27
- read_max_length = 1000)
28
+ read_max_length = 1000,
29
+ flow_control = :NONE)
28
30
 
29
31
  # Verify Parameters
30
32
  port_name = '\\\\.\\' + port_name if port_name =~ /^COM[0-9]{2,3}$/
@@ -62,12 +64,22 @@ module Cosmos
62
64
  Win32::FILE_ATTRIBUTE_NORMAL)
63
65
  @mutex = Mutex.new
64
66
 
65
- # Configure the Comm Port
67
+ # Configure the Comm Port - See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363214(v=vs.85).aspx
66
68
  dcb = Win32.get_comm_state(@handle)
67
69
  dcb.write('BaudRate', baud_rate)
68
70
  dcb.write('ByteSize', 8)
69
71
  dcb.write('Parity', parity)
70
72
  dcb.write('StopBits', stop_bits)
73
+ if flow_control == :RTSCTS
74
+ # Monitor CTS
75
+ dcb.write('fOutxCtsFlow', 1)
76
+
77
+ # 0x00 - RTS_CONTROL_DISABLE - Disables the RTS line when the device is opened and leaves it disabled.
78
+ # 0x01 - RTS_CONTROL_ENABLE - Enables the RTS line when the device is opened and leaves it on.
79
+ # 0x02 - RTS_CONTROL_HANDSHAKE - Enables RTS handshaking. The driver raises the RTS line when the "type-ahead" (input) buffer is less than one-half full and lowers the RTS line when the buffer is more than three-quarters full. If handshaking is enabled, it is an error for the application to adjust the line by using the EscapeCommFunction function.
80
+ # 0x03 - RTS_CONTROL_TOGGLE - Specifies that the RTS line will be high if bytes are available for transmission. After all buffered bytes have been sent, the RTS line will be low.
81
+ dcb.write('fRtsControl', 0x03)
82
+ end
71
83
  Win32.set_comm_state(@handle, dcb)
72
84
 
73
85
  # Configure Timeouts
@@ -97,14 +109,14 @@ module Cosmos
97
109
  # (see SerialDriver#write)
98
110
  def write(data)
99
111
  # Write the data
100
- time = Time.now
112
+ time = Time.now.sys
101
113
  bytes_to_write = data.length
102
114
  while (bytes_to_write > 0)
103
115
  bytes_written = Win32.write_file(@handle, data, data.length)
104
116
  raise "Error writing to comm port" if bytes_written <= 0
105
117
  bytes_to_write -= bytes_written
106
118
  data = data[bytes_written..-1]
107
- raise Timeout::Error, "Write Timeout" if @write_timeout and (Time.now - time > @write_timeout) and bytes_to_write > 0
119
+ raise Timeout::Error, "Write Timeout" if @write_timeout and (Time.now.sys - time > @write_timeout) and bytes_to_write > 0
108
120
  end
109
121
  end
110
122