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,107 +0,0 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- # Usage Notes:
12
- # The metadata packet must exist with exactly the same fields as both a command and as a telemetry packet
13
- # The new_packet_log_conversion.rb WRITE_CONVERSION should be placed on at least one item in the meta packets
14
-
15
- require 'cosmos/packet_logs/packet_log_writer'
16
-
17
- module Cosmos
18
-
19
- # Writes a given packet at the beginning of each telemetry packet log file
20
- class MetaPacketLogWriter < PacketLogWriter
21
-
22
- # See PacketLogWriter#initialize
23
- # @param target_name [String] Target name of the metadata packet
24
- # @param packet_name [String] Packet name of the metadata packet
25
- # @param meta_default_filename [String] Filename containing key/value pairs for default meta packet values
26
- # @param log_meta_packet [Boolean] true to log the metadata packet if received during logging. false to only
27
- # log metadata packets at the beginning of the log.
28
- # @param use_tlm_packet [Boolean] true to put the data from the telemetry packet into
29
- # each log. false to put the data from the command packet.
30
- def initialize(
31
- log_type,
32
- target_name = nil,
33
- packet_name = nil,
34
- meta_default_filename = nil,
35
- log_meta_packet = false,
36
- use_tlm_packet = true,
37
- log_name = nil,
38
- logging_enabled = true,
39
- cycle_time = nil,
40
- cycle_size = 2000000000,
41
- log_directory = nil,
42
- asynchronous = false
43
- )
44
- @target_name = ConfigParser.handle_nil(target_name)
45
- @packet_name = ConfigParser.handle_nil(packet_name)
46
- @packet = nil
47
- @log_meta_packet = ConfigParser.handle_true_false(log_meta_packet)
48
- @meta_default_filename = ConfigParser.handle_nil(meta_default_filename)
49
- @use_tlm_packet = ConfigParser.handle_true_false(use_tlm_packet)
50
-
51
- # Make sure the packet exists in both commands and telemetry (if given)
52
- if @target_name and @packet_name
53
- packet = System.telemetry.packet(@target_name, @packet_name)
54
- @packet = packet if @use_tlm_packet
55
- packet = System.commands.packet(@target_name, @packet_name)
56
- @packet = packet if !@use_tlm_packet
57
- end
58
-
59
- # Initialize the meta packet (if given)
60
- if @meta_default_filename and @packet
61
- parser = ConfigParser.new
62
- Cosmos.set_working_dir do
63
- parser.parse_file(@meta_default_filename) do |keyword, params|
64
- begin
65
- item = @packet.get_item(keyword)
66
- if item.data_type == :STRING or item.data_type == :BLOCK
67
- value = params[0]
68
- else
69
- value = params[0].convert_to_value
70
- end
71
- @packet.write(keyword, value)
72
- rescue => err
73
- raise parser.error(err, "ITEM_NAME VALUE")
74
- end
75
- end
76
- end
77
- end
78
-
79
- super(log_type, log_name, logging_enabled, cycle_time, cycle_size, log_directory, asynchronous)
80
- end
81
-
82
- # Optionally doesn't write the meta packet
83
- def write(packet)
84
- if @log_meta_packet or !(packet.target_name == @target_name and packet.packet_name == @packet_name)
85
- super(packet)
86
- end
87
- end
88
-
89
- protected
90
-
91
- # Adds the meta packet at the beginning of telemetry packet logs
92
- # Mutex is held during this hook
93
- def start_new_file_hook
94
- if @target_name and @packet_name
95
- if @use_tlm_packet
96
- packet = System.telemetry.packet(@target_name, @packet_name)
97
- else
98
- packet = System.commands.packet(@target_name, @packet_name)
99
- end
100
- # Don't take the mutex because it is already held
101
- write_packet(packet, false)
102
- end
103
- end
104
-
105
- end # class MetaPacketLogWriter
106
-
107
- end # module Cosmos
@@ -1,25 +0,0 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/streams/stream_protocol'
12
-
13
- module Cosmos
14
-
15
- # Reads all data available in the stream and creates a packet
16
- # with that data.
17
- class BurstStreamProtocol < StreamProtocol
18
- # This class is currently empty because StreamProtocol performs all
19
- # the necessary functionality. It exists because of the way
20
- # {StreamInterface} creates the stream protocol by appending
21
- # 'StreamProtocol' to the name of the protocol. Thus we need a
22
- # BurstStreamProtocol so 'burst' can be used by the {StreamInterface}.
23
- end
24
-
25
- end # module Cosmos
@@ -1,118 +0,0 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/streams/stream_protocol'
12
-
13
- module Cosmos
14
-
15
- # This StreamProtocol delineates packets using the COSMOS
16
- # preidentification system
17
- class PreidentifiedStreamProtocol < StreamProtocol
18
-
19
- # @param sync_pattern (see StreamProtocol#initialize)
20
- # @param max_length [Integer] The maximum allowed value of the length field
21
- def initialize(sync_pattern = nil, max_length = nil)
22
- super(0, sync_pattern)
23
- @max_length = ConfigParser.handle_nil(max_length)
24
- @max_length = Integer(@max_length) if @max_length
25
- end
26
-
27
- # See StreamProtocol#post_read_packet
28
- def post_read_packet(packet)
29
- packet.received_time = @received_time
30
- packet.target_name = @target_name
31
- packet.packet_name = @packet_name
32
- packet
33
- end
34
-
35
- # See StreamProtocol#pre_write_packet
36
- def pre_write_packet(packet)
37
- received_time = packet.received_time
38
- received_time = Time.now unless received_time
39
- time_seconds = [received_time.tv_sec].pack('N') # UINT32
40
- time_microseconds = [received_time.tv_usec].pack('N') # UINT32
41
- target_name = packet.target_name
42
- target_name = 'UNKNOWN' unless target_name
43
- packet_name = packet.packet_name
44
- packet_name = 'UNKNOWN' unless packet_name
45
- data = packet.buffer
46
- data_length = [data.length].pack('N') # UINT32
47
- data_to_send = ''
48
- data_to_send << @sync_pattern if @sync_pattern
49
- data_to_send << time_seconds
50
- data_to_send << time_microseconds
51
- data_to_send << target_name.length
52
- data_to_send << target_name
53
- data_to_send << packet_name.length
54
- data_to_send << packet_name
55
- data_to_send << data_length
56
- data_to_send << data
57
- data_to_send
58
- end
59
-
60
- protected
61
-
62
- def read_length_field_followed_by_string(length_num_bytes)
63
- # Read bytes for string length
64
- read_minimum_size(length_num_bytes)
65
- return nil if @data.length <= 0
66
- string_length = @data[0..(length_num_bytes - 1)]
67
-
68
- case length_num_bytes
69
- when 1
70
- string_length = string_length.unpack('C')[0] # UINT8
71
- when 2
72
- string_length = string_length.unpack('n')[0] # UINT16
73
- when 4
74
- string_length = string_length.unpack('N')[0] # UINT32
75
- raise "Length value received larger than max_length: #{string_length} > #{@max_length}" if @max_length and string_length > @max_length
76
- else
77
- return nil
78
- end
79
-
80
- # Read String
81
- read_minimum_size(string_length + length_num_bytes)
82
- return nil if @data.length <= 0
83
- next_index = string_length + length_num_bytes
84
- string = @data[length_num_bytes..(next_index - 1)]
85
-
86
- # Remove data from current_data
87
- @data.replace(@data[next_index..-1])
88
-
89
- string
90
- end
91
-
92
- def reduce_to_single_packet
93
- # Discard sync pattern if present
94
- @data.replace(@data[(@sync_pattern.length)..-1]) if @sync_pattern
95
-
96
- # Read and remove packet received time
97
- read_minimum_size(8)
98
- return nil if @data.length <= 0
99
- time_seconds = @data[0..3].unpack('N')[0] # UINT32
100
- time_microseconds = @data[4..7].unpack('N')[0] # UINT32
101
- @received_time = Time.at(time_seconds, time_microseconds)
102
- @data.replace(@data[8..-1])
103
-
104
- # Read and remove the target name
105
- @target_name = read_length_field_followed_by_string(1)
106
- return nil unless @target_name
107
-
108
- # Read and remove the packet name
109
- @packet_name = read_length_field_followed_by_string(1)
110
- return nil unless @packet_name
111
-
112
- # Read packet data and return
113
- read_length_field_followed_by_string(4)
114
- end
115
-
116
- end # class PreidentifiedStreamProtocol
117
-
118
- end # module Cosmos
@@ -1,373 +0,0 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/config/config_parser'
12
- require 'thread'
13
-
14
- module Cosmos
15
-
16
- # Processes a {Stream} on behalf of an {Interface}. A {Stream} is a
17
- # primative interface that simply reads and writes raw binary data. The
18
- # StreamProtocol adds higher level processing including the ability to
19
- # discard a certain number of bytes from the stream and to sync the stream
20
- # on a given synchronization pattern. The StreamProtocol operates at the
21
- # {Packet} abstraction level while the {Stream} operates on raw bytes.
22
- class StreamProtocol
23
-
24
- # @return [Integer] The number of bytes read from the stream
25
- attr_accessor :bytes_read
26
- # @return [Integer] The number of bytes written to the stream
27
- attr_accessor :bytes_written
28
- # @return [Interface] The interface associated with this
29
- # StreamProtocol. The interface is a higher level abstraction and is
30
- # passed down to the StreamProtocol to allow it to call the callbacks in
31
- # the interface when processing the {Stream}. otherwise subclass wins
32
- # when calling
33
- attr_reader :interface
34
- # @return [Stream] The stream this StreamProtocol is processing data from
35
- attr_reader :stream
36
-
37
- # @return [Proc] The name of a method in the {Interface} that #read calls
38
- # after reading data from the {Stream}. It should take a String binary data
39
- # buffer and return a String binary data buffer.
40
- attr_accessor :post_read_data_callback
41
- # @return [Proc] The name of a method in the {Interface} that #read calls
42
- # after converting the read data buffer into a {Packet}. It should take a
43
- # {Packet} and return a {Packet}.
44
- attr_accessor :post_read_packet_callback
45
- # @return [Proc] The name of a method in the {Interface} that #write
46
- # calls before writing the data to the stream.
47
- # It should take a {Packet} and return a binary String buffer.
48
- attr_accessor :pre_write_packet_callback
49
- # @return [Proc] The name of a method in the {Interface} that #write
50
- # calls after writing the data to the stream. It should take a {Packet} and a String
51
- # and return nothing.
52
- attr_accessor :post_write_data_callback
53
-
54
- # @param discard_leading_bytes [Integer] The number of bytes to discard
55
- # from the binary data after reading from the {Stream}. Note that this is often
56
- # used to remove a sync pattern from the final packet data.
57
- # @param sync_pattern [String] String representing a hex number ("0x1234")
58
- # that will be searched for in the raw {Stream}. Bytes encountered before
59
- # this pattern is found are discarded.
60
- # @param fill_sync_pattern [Boolean] Fill the sync pattern when writing packets
61
- def initialize(discard_leading_bytes = 0, sync_pattern = nil, fill_sync_pattern = false)
62
- @discard_leading_bytes = discard_leading_bytes.to_i
63
- @sync_pattern = ConfigParser.handle_nil(sync_pattern)
64
- @sync_pattern = @sync_pattern.hex_to_byte_string if @sync_pattern
65
- @fill_sync_pattern = ConfigParser.handle_true_false(fill_sync_pattern)
66
-
67
- @stream = nil
68
- @data = ''
69
- @bytes_read = 0
70
- @bytes_written = 0
71
-
72
- @interface = nil
73
- @post_read_data_callback = nil
74
- @post_read_packet_callback = nil
75
- @pre_write_packet_callback = nil
76
- @post_write_data_callback = nil
77
- @write_mutex = Mutex.new
78
- end
79
-
80
- # @param interface [Interface] Sets the higher level interface which is
81
- # using this StreamProtocol. If the interface defines post_read_data,
82
- # post_read_packet, or pre_write_packet, then these methods will be
83
- # called over any subclass implementations.
84
- def interface=(interface)
85
- @interface = interface
86
- if @interface.respond_to? :post_read_data
87
- @post_read_data_callback = @interface.method(:post_read_data)
88
- end
89
- if @interface.respond_to? :post_read_packet
90
- @post_read_packet_callback = @interface.method(:post_read_packet)
91
- end
92
- if @interface.respond_to? :pre_write_packet
93
- @pre_write_packet_callback = @interface.method(:pre_write_packet)
94
- end
95
- if @interface.respond_to? :post_write_data
96
- @post_write_data_callback = @interface.method(:post_write_data)
97
- end
98
- end
99
-
100
- # @param stream [Stream] The stream this stream protocol should read and
101
- # write to
102
- def connect(stream)
103
- @data = ''
104
- @data.force_encoding('ASCII-8BIT')
105
- @stream = stream
106
- @stream.connect
107
- end
108
-
109
- # @return [Boolean] Whether the stream attribute has been set and is
110
- # connected
111
- def connected?
112
- if @stream
113
- @stream.connected?
114
- else
115
- false
116
- end
117
- end
118
-
119
- # Disconnects from the underlying {Stream} by calling {Stream#disconnect}.
120
- # Clears the data attribute.
121
- def disconnect
122
- @stream.disconnect if @stream
123
- @data = ''
124
- end
125
-
126
- # Reads from the stream. It can look for a sync pattern before
127
- # creating a Packet. It can discard a set number of bytes at the beginning
128
- # of the stream before creating the Packet.
129
- #
130
- # If the post_read_data_callback is defined (post_read_data is
131
- # implemented by the interface) then it is called to translate the
132
- # raw data. Otherwise post_read_data is called which does nothing
133
- # unless it is implemented by a subclass.
134
- #
135
- # @return [Packet|nil] A Packet of consisting of the bytes read from the
136
- # stream.
137
- def read
138
- # Loop until we have a packet to give
139
- loop do
140
- result = handle_sync_pattern()
141
- return nil unless result
142
-
143
- # Reduce the data to a single packet
144
- packet_data = reduce_to_single_packet()
145
- return nil unless packet_data
146
-
147
- # Discard leading bytes if necessary
148
- packet_data.replace(packet_data[@discard_leading_bytes..-1]) if @discard_leading_bytes > 0
149
-
150
- # Return data based on final_receive_processing
151
- if @post_read_data_callback
152
- packet_data = @post_read_data_callback.call(packet_data)
153
- else
154
- packet_data = post_read_data(packet_data)
155
- end
156
- if packet_data
157
- if packet_data.length > 0
158
- # Valid packet
159
- packet = Packet.new(nil, nil, :BIG_ENDIAN, nil, packet_data)
160
- if @post_read_packet_callback
161
- packet = @post_read_packet_callback.call(packet)
162
- else
163
- packet = post_read_packet(packet)
164
- end
165
- return packet
166
- else
167
- # Packet should be ignored
168
- next
169
- end
170
- else
171
- # Connection lost
172
- return nil
173
- end
174
- end # loop do
175
- end
176
-
177
- # Writes the packet data to the stream.
178
- #
179
- # If the pre_write_packet_callback is defined (pre_write_packet is
180
- # implemented by the interface) then that is called to translate the
181
- # packet into data. Otherwise pre_write_packet is called which
182
- # returns the packet buffer unless it is implemented by a subclass.
183
- #
184
- # @param packet [Packet] Packet data to write to the stream
185
- def write(packet)
186
- @write_mutex.synchronize do
187
- if @pre_write_packet_callback
188
- data = @pre_write_packet_callback.call(packet)
189
- else
190
- data = pre_write_packet(packet)
191
- end
192
- if data
193
- write_raw(data, false)
194
- if @post_write_data_callback
195
- @post_write_data_callback.call(packet, data)
196
- else
197
- post_write_data(packet, data)
198
- end
199
- else
200
- # write aborted - don't write data
201
- end
202
- end
203
- end
204
-
205
- # Writes the raw binary string to the stream.
206
- #
207
- # @param data [String] Raw binary string
208
- # @param take_mutex [Boolean] Whether or not to take the write_mutex
209
- def write_raw(data, take_mutex = true)
210
- @write_mutex.lock if take_mutex
211
- begin
212
- if connected?()
213
- @stream.write(data)
214
- @bytes_written += data.length
215
- else
216
- raise "Stream not connected for write_raw"
217
- end
218
- ensure
219
- @write_mutex.unlock if take_mutex
220
- end
221
- end
222
-
223
- # Called to perform modifications on read data before making it into a packet
224
- #
225
- # @param packet_data [String] Raw packet data
226
- # @return [String] Potentially modified packet data
227
- def post_read_data(packet_data)
228
- packet_data
229
- end
230
-
231
- # Called to perform modifications on a read packet before it is given to the user
232
- #
233
- # @param packet [Packet] Original packet
234
- # @return [Packet] Potentially modified packet
235
- def post_read_packet(packet)
236
- packet
237
- end
238
-
239
- # Called to perform modifications on write data before writing it out the stream
240
- #
241
- # @param packet [Packet] packet to write out
242
- # @return [String] Potentially modified packet data
243
- def pre_write_packet(packet)
244
- data = packet.buffer(false)
245
- if @fill_sync_pattern
246
- # Put leading bytes back on
247
- data = ("\x00" * @discard_leading_bytes) << data if @discard_leading_bytes > 0
248
-
249
- # Fill the sync pattern
250
- if @sync_pattern
251
- BinaryAccessor.write(@sync_pattern,
252
- 0,
253
- @sync_pattern.length * 8,
254
- :BLOCK,
255
- data,
256
- :BIG_ENDIAN,
257
- :ERROR)
258
- end
259
- end
260
- data
261
- end
262
-
263
- # Called to perform actions after writing data to the stream
264
- #
265
- # @param packet [Packet] packet that was written out
266
- # @param data [String] binary data that was written out
267
- def post_write_data(packet, data)
268
- # Default do nothing
269
- end
270
-
271
- protected
272
-
273
- # @return [Boolean] Whether we successfully found a sync pattern
274
- def handle_sync_pattern
275
- if @sync_pattern
276
- loop do
277
- # Make sure we have some data to look for a sync word in
278
- read_minimum_size(@sync_pattern.length)
279
- return false if @data.length <= 0
280
-
281
- # Find the beginning of the sync pattern
282
- sync_index = @data.index(@sync_pattern.getbyte(0).chr)
283
- if sync_index
284
- # Make sure we have enough data for the whole sync pattern past this index
285
- read_minimum_size(sync_index + @sync_pattern.length)
286
- return false if @data.length <= 0
287
-
288
- # Check for the rest of the sync pattern
289
- found = true
290
- index = sync_index
291
- @sync_pattern.each_byte do |byte|
292
- if @data.getbyte(index) != byte
293
- found = false
294
- break
295
- end
296
- index += 1
297
- end
298
-
299
- if found
300
- if sync_index != 0
301
- discard_length = @data[0..(sync_index - 1)].length
302
- log_discard(discard_length, true)
303
- # Delete Data Before Sync Pattern
304
- @data.replace(@data[sync_index..-1])
305
- end
306
- return true
307
-
308
- else # not found
309
- log_discard(@data[0..sync_index].length, false)
310
- # Delete Data Before and including first character of suspected sync Pattern
311
- @data.replace(@data[(sync_index + 1)..-1])
312
- next
313
- end # if found
314
-
315
- else # sync_index = nil
316
- log_discard(@data.length, false)
317
- @data.replace('')
318
- next
319
- end # unless sync_index.nil?
320
- end # end loop
321
- end # if @sync_pattern
322
-
323
- true
324
- end
325
-
326
- def log_discard(length, found)
327
- Logger.error("Sync #{'not ' unless found}found. Discarding #{length} bytes of data.")
328
- if @data.length >= 6
329
- Logger.error(sprintf("Starting: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
330
- @data.getbyte(0), @data.getbyte(1), @data.getbyte(2), @data.getbyte(3), @data.getbyte(4), @data.getbyte(5)))
331
- end
332
- end
333
-
334
- def reduce_to_single_packet
335
- if @data.length <= 0
336
- # Need to get some data
337
- read_and_handle_timeout()
338
- return nil if @data.length <= 0
339
- end
340
-
341
- # Reduce to packet data and clear data for next packet
342
- packet_data = @data.clone
343
- @data.replace('')
344
-
345
- packet_data
346
- end
347
-
348
- def read_and_handle_timeout
349
- begin
350
- data = @stream.read
351
- @bytes_read += data.length
352
- rescue Timeout::Error
353
- Logger.instance.error "Timeout waiting for data to be read"
354
- data = ''
355
- end
356
- # data.length == 0 means that the stream was closed. Need to clear out @data and be done.
357
- if data.length == 0
358
- @data.replace('')
359
- return
360
- end
361
- @data << data
362
- end
363
-
364
- def read_minimum_size(required_num_bytes)
365
- while (@data.length < required_num_bytes)
366
- read_and_handle_timeout()
367
- return if @data.length <= 0
368
- end
369
- end
370
-
371
- end # class StreamProtocol
372
-
373
- end # module Cosmos