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
@@ -9,29 +9,27 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/packets/binary_accessor'
12
- require 'cosmos/streams/stream_protocol'
12
+ require 'cosmos/interfaces/protocols/burst_protocol'
13
13
  require 'cosmos/config/config_parser'
14
14
 
15
15
  module Cosmos
16
-
17
- # This StreamProtocol delineates packets using a length field at a fixed
16
+ # Protocol which delineates packets using a length field at a fixed
18
17
  # location in each packet.
19
- class LengthStreamProtocol < StreamProtocol
20
-
18
+ class LengthProtocol < BurstProtocol
21
19
  # @param length_bit_offset [Integer] The bit offset of the length field
22
20
  # @param length_bit_size [Integer] The size in bits of the length field
23
21
  # @param length_value_offset [Integer] The offset to apply to the length
24
22
  # value once it has been read from the packet. The value in the length
25
- # field itself plus the length value offset MUST equal the total bytes in
26
- # the stream including any discarded bytes.
23
+ # field itself plus the length value offset MUST equal the total bytes
24
+ # including any discarded bytes.
27
25
  # For example: if your length field really means "length - 1" this value should be 1.
28
26
  # @param length_bytes_per_count [Integer] The number of bytes per each
29
27
  # length field 'count'. This is used if the units of the length field is
30
28
  # something other than bytes, for example words.
31
29
  # @param length_endianness [String] The endianness of the length field.
32
30
  # Must be either BIG_ENDIAN or LITTLE_ENDIAN.
33
- # @param discard_leading_bytes (see StreamProtocol#initialize)
34
- # @param sync_pattern (see StreamProtocol#initialize)
31
+ # @param discard_leading_bytes (see BurstProtocol#initialize)
32
+ # @param sync_pattern (see BurstProtocol#initialize)
35
33
  # @param max_length [Integer] The maximum allowed value of the length field
36
34
  # @param fill_length_and_sync_pattern [Boolean] Fill the length field and sync
37
35
  # pattern when writing packets
@@ -75,45 +73,57 @@ module Cosmos
75
73
  @max_length = Integer(@max_length) if @max_length
76
74
  end
77
75
 
78
- # See StreamProtocol#pre_write_packet
79
- def pre_write_packet(packet)
80
- data = super(packet)
81
- if @fill_sync_pattern # and length
82
- # Fill the length field
83
- length = (data.length - @length_value_offset) / @length_bytes_per_count
84
- BinaryAccessor.write(length,
85
- @length_bit_offset,
86
- @length_bit_size,
87
- :UINT,
88
- data,
89
- @length_endianness,
90
- :ERROR)
91
-
92
- # Also write the new length field into the packet that will be logged if it exists in the packet
93
- if @discard_leading_bytes > 0
94
- # The write above did not write into the original packet
95
- original_length_bit_offset = @length_bit_offset - (@discard_leading_bytes * 8)
96
- if original_length_bit_offset >= 0
97
- original_data = packet.buffer(false)
98
- BinaryAccessor.write(length,
99
- original_length_bit_offset,
100
- @length_bit_size,
101
- :UINT,
102
- original_data,
103
- @length_endianness,
104
- :ERROR)
105
- end
76
+ # Called to perform modifications on a command packet before it is send
77
+ #
78
+ # @param packet [Packet] Original packet
79
+ # @return [Packet] Potentially modified packet
80
+ def write_packet(packet)
81
+ if @fill_fields
82
+ # If the start of the length field is past what we discard, then the
83
+ # length field is inside the packet
84
+ if @length_bit_offset >= (@discard_leading_bytes * 8)
85
+ length = calculate_length(packet.buffer.length + @discard_leading_bytes)
86
+ # Subtract off the discarded bytes since they haven't been added yet
87
+ # Adding bytes happens in the write_data method
88
+ offset = @length_bit_offset - (@discard_leading_bytes * 8)
89
+ # Directly write the packet buffer and fill in the length
90
+ BinaryAccessor.write(length, offset, @length_bit_size, :UINT,
91
+ packet.buffer(false), @length_endianness, :ERROR)
92
+ end
93
+ end
94
+ return super(packet) # Allow burst_protocol to set the sync if needed
95
+ end
96
+
97
+ # Called to perform modifications on write data before making it into a packet
98
+ #
99
+ # @param data [String] Raw packet data
100
+ # @return [String] Potentially modified packet data
101
+ def write_data(data)
102
+ data = super(data)
103
+ if @fill_fields
104
+ # If the start of the length field is before what we discard, then the
105
+ # length field is outside the packet
106
+ if @length_bit_offset < (@discard_leading_bytes * 8)
107
+ BinaryAccessor.write(calculate_length(data.length), @length_bit_offset, @length_bit_size, :UINT,
108
+ data, @length_endianness, :ERROR)
106
109
  end
107
110
  end
108
- data
111
+ return data
109
112
  end
110
113
 
111
114
  protected
112
115
 
116
+ def calculate_length(buffer_length)
117
+ length = (buffer_length / @length_bytes_per_count) - @length_value_offset
118
+ if @max_length && length > @max_length
119
+ raise "Calculated length #{length} larger than max_length #{@max_length}"
120
+ end
121
+ length
122
+ end
123
+
113
124
  def reduce_to_single_packet
114
125
  # Make sure we have at least enough data to reach the length field
115
- read_minimum_size(@length_bytes_needed)
116
- return nil if @data.length <= 0
126
+ return :STOP if @data.length < @length_bytes_needed
117
127
 
118
128
  # Determine the packet's length
119
129
  length = BinaryAccessor.read(@length_bit_offset,
@@ -125,16 +135,13 @@ module Cosmos
125
135
  packet_length = (length * @length_bytes_per_count) + @length_value_offset
126
136
 
127
137
  # Make sure we have enough data for the packet
128
- read_minimum_size(packet_length)
129
- return nil if @data.length <= 0
138
+ return:STOP if @data.length < packet_length
130
139
 
131
140
  # Reduce to packet data and setup current_data for next packet
132
141
  packet_data = @data[0..(packet_length - 1)]
133
142
  @data.replace(@data[packet_length..-1])
134
143
 
135
- packet_data
144
+ return packet_data
136
145
  end
137
-
138
- end # class LengthStreamProtocol
139
-
140
- end # module Cosmos
146
+ end
147
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2017 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/interfaces/protocols/protocol'
12
+
13
+ module Cosmos
14
+ # Protocol which permanently overrides an item value such that reading the
15
+ # item returns the overriden value. Methods are prefixed with underscores
16
+ # so the API can include the original name which calls out to these
17
+ # methods. Clearing the override requires calling normalize_tlm.
18
+ class OverrideProtocol < Protocol
19
+
20
+ # @param allow_empty_data [true/false] Whether STOP should be returned on empty data
21
+ def initialize(allow_empty_data = false)
22
+ super(allow_empty_data)
23
+ end
24
+
25
+ # Called to perform modifications on a read packet before it is given to the user
26
+ #
27
+ # @param packet [Packet] Original packet
28
+ # @return [Packet] Potentially modified packet
29
+ def read_packet(packet)
30
+ if @interface.override_tlm && !@interface.override_tlm.empty?
31
+ # Need to make sure packet is identified and defined
32
+ target_names = nil
33
+ target_names = @interface.target_names if @interface
34
+ identified_packet = System.telemetry.identify_and_define_packet(packet, target_names)
35
+ if identified_packet
36
+ packet = identified_packet
37
+ packets = @interface.override_tlm[packet.target_name]
38
+ if packets
39
+ items = packets[packet.packet_name]
40
+ if items
41
+ items.each do |item_name, value|
42
+ # This should be safe because we check at the API level it exists
43
+ packet.write(item_name, value[0], value[1])
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ return packet
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,141 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2017 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/interfaces/protocols/burst_protocol'
12
+
13
+ module Cosmos
14
+ # Delineates packets using the COSMOS preidentification system
15
+ class PreidentifiedProtocol < BurstProtocol
16
+
17
+ # @param sync_pattern (see BurstProtocol#initialize)
18
+ # @param max_length [Integer] The maximum allowed value of the length field
19
+ def initialize(sync_pattern = nil, max_length = nil)
20
+ super(0, sync_pattern)
21
+ @max_length = ConfigParser.handle_nil(max_length)
22
+ @max_length = Integer(@max_length) if @max_length
23
+ end
24
+
25
+ def reset
26
+ super()
27
+ @reduction_state = :START
28
+ end
29
+
30
+ def read_packet(packet)
31
+ packet.received_time = @received_time
32
+ packet.target_name = @target_name
33
+ packet.packet_name = @packet_name
34
+ return packet
35
+ end
36
+
37
+ def write_packet(packet)
38
+ received_time = packet.received_time
39
+ received_time = Time.now unless received_time
40
+ @time_seconds = [received_time.tv_sec].pack('N') # UINT32
41
+ @time_microseconds = [received_time.tv_usec].pack('N') # UINT32
42
+ @target_name = packet.target_name
43
+ @target_name = 'UNKNOWN' unless @target_name
44
+ @packet_name = packet.packet_name
45
+ @packet_name = 'UNKNOWN' unless @packet_name
46
+ return packet
47
+ end
48
+
49
+ def write_data(data)
50
+ data_length = [data.length].pack('N') # UINT32
51
+ data_to_send = ''
52
+ data_to_send << @sync_pattern if @sync_pattern
53
+ data_to_send << @time_seconds
54
+ data_to_send << @time_microseconds
55
+ data_to_send << @target_name.length
56
+ data_to_send << @target_name
57
+ data_to_send << @packet_name.length
58
+ data_to_send << @packet_name
59
+ data_to_send << data_length
60
+ data_to_send << data
61
+ return data_to_send
62
+ end
63
+
64
+ protected
65
+
66
+ def read_length_field_followed_by_string(length_num_bytes)
67
+ # Read bytes for string length
68
+ return :STOP if @data.length < length_num_bytes
69
+ string_length = @data[0..(length_num_bytes - 1)]
70
+
71
+ case length_num_bytes
72
+ when 1
73
+ string_length = string_length.unpack('C')[0] # UINT8
74
+ when 2
75
+ string_length = string_length.unpack('n')[0] # UINT16
76
+ when 4
77
+ string_length = string_length.unpack('N')[0] # UINT32
78
+ raise "Length value received larger than max_length: #{string_length} > #{@max_length}" if @max_length and string_length > @max_length
79
+ else
80
+ raise "Unsupported length given to read_length_field_followed_by_string: #{length_num_bytes}"
81
+ end
82
+
83
+ # Read String
84
+ return :STOP if @data.length < (string_length + length_num_bytes)
85
+ next_index = string_length + length_num_bytes
86
+ string = @data[length_num_bytes..(next_index - 1)]
87
+
88
+ # Remove data from current_data
89
+ @data.replace(@data[next_index..-1])
90
+
91
+ return string
92
+ end
93
+
94
+ def reduce_to_single_packet
95
+ # Discard sync pattern if present
96
+ if @sync_pattern
97
+ if @reduction_state == :START
98
+ return :STOP if @data.length < @sync_pattern.length
99
+ @data.replace(@data[(@sync_pattern.length)..-1])
100
+ @reduction_state = :SYNC_REMOVED
101
+ end
102
+ elsif @reduction_state == :START
103
+ @reduction_state = :SYNC_REMOVED
104
+ end
105
+
106
+ # Read and remove packet received time
107
+ if @reduction_state == :SYNC_REMOVED
108
+ return :STOP if @data.length < 8
109
+ time_seconds = @data[0..3].unpack('N')[0] # UINT32
110
+ time_microseconds = @data[4..7].unpack('N')[0] # UINT32
111
+ @received_time = Time.at(time_seconds, time_microseconds).sys
112
+ @data.replace(@data[8..-1])
113
+ @reduction_state = :TIME_REMOVED
114
+ end
115
+
116
+ if @reduction_state == :TIME_REMOVED
117
+ # Read and remove the target name
118
+ @target_name = read_length_field_followed_by_string(1)
119
+ return :STOP if @target_name == :STOP
120
+ @reduction_state = :TARGET_NAME_REMOVED
121
+ end
122
+
123
+ if @reduction_state == :TARGET_NAME_REMOVED
124
+ # Read and remove the packet name
125
+ @packet_name = read_length_field_followed_by_string(1)
126
+ return :STOP if @packet_name == :STOP
127
+ @reduction_state = :PACKET_NAME_REMOVED
128
+ end
129
+
130
+ if @reduction_state == :PACKET_NAME_REMOVED
131
+ # Read packet data and return
132
+ packet_data = read_length_field_followed_by_string(4)
133
+ return :STOP if packet_data == :STOP
134
+ @reduction_state = :START
135
+ return packet_data
136
+ end
137
+
138
+ raise "Error should never reach end of method #{@reduction_state}"
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2017 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 'cosmos/interfaces/protocols/protocol'
13
+ require 'thread'
14
+
15
+ module Cosmos
16
+ class Protocol
17
+ attr_accessor :interface
18
+ attr_accessor :allow_empty_data
19
+
20
+ # @param allow_empty_data [true/false] Whether STOP should be returned on empty data
21
+ def initialize(allow_empty_data = false)
22
+ @interface = nil
23
+ @allow_empty_data = ConfigParser.handle_true_false(allow_empty_data)
24
+ reset()
25
+ end
26
+
27
+ def reset
28
+ end
29
+
30
+ def connect_reset
31
+ reset()
32
+ end
33
+
34
+ def disconnect_reset
35
+ reset()
36
+ end
37
+
38
+ # Ensure we have some data in case this is the only protocol
39
+ def read_data(data)
40
+ return :STOP if (data.length <= 0) && !@allow_empty_data
41
+ data
42
+ end
43
+
44
+ def read_packet(packet)
45
+ return packet
46
+ end
47
+
48
+ def write_packet(packet)
49
+ return packet
50
+ end
51
+
52
+ def write_data(data)
53
+ return data
54
+ end
55
+
56
+ def post_write_interface(packet, data)
57
+ return packet, data
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,209 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2017 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 'cosmos/interfaces/protocols/terminated_protocol'
13
+ require 'thread' # For Queue
14
+ require 'timeout' # For Timeout::Error
15
+
16
+ module Cosmos
17
+ # Protocol which delineates packets using delimiter characters. Designed for
18
+ # text based protocols which expect a command and send a response. The
19
+ # protocol handles sending the command and capturing the response.
20
+ class TemplateProtocol < TerminatedProtocol
21
+ # @param write_termination_characters (see TerminatedProtocol#initialize)
22
+ # @param read_termination_characters (see TerminatedProtocol#initialize)
23
+ # @param ignore_lines [Integer] Number of newline terminated reads to
24
+ # ignore when processing the response
25
+ # @param initial_read_delay [Integer] Initial delay when connecting before
26
+ # trying to read
27
+ # @param response_lines [Integer] Number of newline terminated lines which
28
+ # comprise the response
29
+ # @param strip_read_termination (see TerminatedProtocol#initialize)
30
+ # @param discard_leading_bytes (see TerminatedProtocol#initialize)
31
+ # @param sync_pattern (see TerminatedProtocol#initialize)
32
+ # @param fill_fields (see TerminatedProtocol#initialize)
33
+ def initialize(
34
+ write_termination_characters,
35
+ read_termination_characters,
36
+ ignore_lines = 0,
37
+ initial_read_delay = nil,
38
+ response_lines = 1,
39
+ strip_read_termination = true,
40
+ discard_leading_bytes = 0,
41
+ sync_pattern = nil,
42
+ fill_fields = false,
43
+ response_timeout = 5.0,
44
+ response_polling_period = 0.02
45
+ )
46
+ super(
47
+ write_termination_characters,
48
+ read_termination_characters,
49
+ strip_read_termination,
50
+ discard_leading_bytes,
51
+ sync_pattern,
52
+ fill_fields)
53
+ @response_template = nil
54
+ @response_packet = nil
55
+ @response_packets = []
56
+ @write_block_queue = Queue.new
57
+ @ignore_lines = ignore_lines.to_i
58
+ @response_lines = response_lines.to_i
59
+ @initial_read_delay = ConfigParser.handle_nil(initial_read_delay)
60
+ @initial_read_delay = @initial_read_delay.to_f if @initial_read_delay
61
+ @response_timeout = ConfigParser.handle_nil(response_timeout)
62
+ @response_timeout = @response_timeout.to_f if @response_timeout
63
+ @response_polling_period = response_polling_period.to_f
64
+ @connect_complete_time = nil
65
+ end
66
+
67
+ def reset
68
+ super()
69
+ @initial_read_delay_needed = true
70
+ end
71
+
72
+ def connect_reset
73
+ super()
74
+ begin
75
+ @write_block_queue.pop(true) while @write_block_queue.length > 0
76
+ rescue
77
+ end
78
+
79
+ @connect_complete_time = Time.now + @initial_read_delay if @initial_read_delay
80
+ end
81
+
82
+ def disconnect_reset
83
+ super()
84
+ @write_block_queue << nil # Unblock the write block queue
85
+ end
86
+
87
+ def read_data(data)
88
+ # Drop all data until the initial_read_delay is complete.
89
+ # This gets rid of unused welcome messages,
90
+ # prompts, and other junk on initial connections
91
+ if @initial_read_delay and @initial_read_delay_needed and @connect_complete_time
92
+ return :STOP if Time.now < @connect_complete_time
93
+ @initial_read_delay_needed = false
94
+ end
95
+ super(data)
96
+ end
97
+
98
+ def read_packet(packet)
99
+ if @response_template && @response_packet
100
+ # If lines make it this far they are part of a response
101
+ @response_packets << packet
102
+ return :STOP if @response_packets.length < (@ignore_lines + @response_lines)
103
+
104
+ @ignore_lines.times do
105
+ @response_packets.shift
106
+ end
107
+ response_string = ''
108
+ @response_lines.times do
109
+ response = @response_packets.shift
110
+ response_string << response.buffer
111
+ end
112
+
113
+ # Grab the response packet specified in the command
114
+ result_packet = System.telemetry.packet(@interface.target_names[0], @response_packet).clone
115
+ result_packet.received_time = nil
116
+
117
+ # Convert the response template into a Regexp
118
+ response_item_names = []
119
+ response_template = @response_template.clone
120
+ response_template_items = @response_template.scan(/<.*?>/)
121
+
122
+ response_template_items.each do |item|
123
+ response_item_names << item[1..-2]
124
+ response_template.gsub!(item, "(.*)")
125
+ end
126
+ response_regexp = Regexp.new(response_template)
127
+
128
+ # Scan the response for the variables in brackets <VARIABLE>
129
+ # Write the packet value with each of the values received
130
+ response_values = response_string.scan(response_regexp)[0]
131
+ raise "Unexpected response received: #{response_string}" if !response_values || (response_values.length != response_item_names.length)
132
+ response_values.each_with_index do |value, i|
133
+ result_packet.write(response_item_names[i], value)
134
+ end
135
+
136
+ @response_packets.clear
137
+
138
+ # Release the write
139
+ if @response_template && @response_packet
140
+ @write_block_queue << nil
141
+ end
142
+
143
+ return result_packet
144
+ else
145
+ return packet
146
+ end
147
+ end
148
+
149
+ def write_packet(packet)
150
+ # Make sure we are past the initial data dropping period
151
+ if @initial_read_delay and @initial_read_delay_needed and @connect_complete_time and Time.now < @connect_complete_time
152
+ delay_needed = @connect_complete_time - Time.now
153
+ sleep(delay_needed) if delay_needed > 0
154
+ end
155
+
156
+ # First grab the response template and response packet (if there is one)
157
+ begin
158
+ @response_template = packet.read("RSP_TEMPLATE").strip
159
+ @response_packet = packet.read("RSP_PACKET").strip
160
+ rescue
161
+ # If there is no response template we set to nil
162
+ @response_template = nil
163
+ @response_packet = nil
164
+ end
165
+
166
+ # Grab the command template because that is all we eventually send
167
+ @template = packet.read("CMD_TEMPLATE")
168
+ # Create a new packet to populate with the template
169
+ raw_packet = Packet.new(nil, nil)
170
+ raw_packet.buffer = @template
171
+ raw_packet = super(raw_packet)
172
+ return raw_packet if Symbol === raw_packet
173
+
174
+ data = raw_packet.buffer(false)
175
+ # Scan the template for variables in brackets <VARIABLE>
176
+ # Read these values from the packet and substitute them in the template
177
+ @template.scan(/<(.*?)>/).each do |variable|
178
+ data.gsub!("<#{variable[0]}>", packet.read(variable[0], :RAW).to_s)
179
+ end
180
+
181
+ return raw_packet
182
+ end
183
+
184
+ def post_write_interface(packet, data)
185
+ if @response_template && @response_packet
186
+ if @response_timeout
187
+ response_timeout_time = Time.now + @response_timeout
188
+ else
189
+ response_timeout_time = nil
190
+ end
191
+
192
+ # Block the write until the response is received
193
+ begin
194
+ result = @write_block_queue.pop(true)
195
+ rescue
196
+ sleep(@response_polling_period)
197
+ retry if !response_timeout_time
198
+ retry if response_timeout_time and Time.now < response_timeout_time
199
+ raise Timeout::Error, "Timeout waiting for response"
200
+ end
201
+
202
+ @response_template = nil
203
+ @response_packet = nil
204
+ @response_packets.clear
205
+ end
206
+ return super(packet, data)
207
+ end
208
+ end
209
+ end