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
@@ -12,7 +12,6 @@ require 'cosmos/interfaces/tcpip_client_interface'
12
12
  require 'uuidtools'
13
13
 
14
14
  module Cosmos
15
-
16
15
  # Interface for connecting to Ball Aerospace LINC Labview targets
17
16
  class LincInterface < TcpipClientInterface
18
17
  # The maximum number of asynchronous commands we can wait for at a time.
@@ -450,12 +449,11 @@ module Cosmos
450
449
  # make packet - store on object as a defined packet of type command that this handshakes
451
450
  @identified_command = System.commands.packet(interface_target_name, packet_name).clone
452
451
  @identified_command.buffer = packet_data
453
- @identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS'))
452
+ @identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS')).sys
454
453
  end
455
454
 
456
455
  def get_cmd_guid(fieldname_guid)
457
456
  return @identified_command.read(fieldname_guid)
458
457
  end
459
- end # class LincHandshake
460
-
461
- end # module Cosmos
458
+ end
459
+ end
@@ -0,0 +1,173 @@
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
+ # Reads all data available on the interface and creates a packet
17
+ # with that data.
18
+ class BurstProtocol < Protocol
19
+ # @param discard_leading_bytes [Integer] The number of bytes to discard
20
+ # from the binary data after reading. Note that this is often
21
+ # used to remove a sync pattern from the final packet data.
22
+ # @param sync_pattern [String] String representing a hex number ("0x1234")
23
+ # that will be searched for in the raw data. Bytes encountered before
24
+ # this pattern is found are discarded.
25
+ # @param fill_fields [Boolean] Fill any required fields when writing packets
26
+ def initialize(discard_leading_bytes = 0, sync_pattern = nil, fill_fields = false, allow_empty_data = false)
27
+ super(allow_empty_data)
28
+ @discard_leading_bytes = discard_leading_bytes.to_i
29
+ @sync_pattern = ConfigParser.handle_nil(sync_pattern)
30
+ @sync_pattern = @sync_pattern.hex_to_byte_string if @sync_pattern
31
+ @fill_fields = ConfigParser.handle_true_false(fill_fields)
32
+ end
33
+
34
+ def reset
35
+ super()
36
+ @data = ''
37
+ @data.force_encoding('ASCII-8BIT')
38
+ @sync_state = :SEARCHING
39
+ end
40
+
41
+ # Reads from the interface. It can look for a sync pattern before
42
+ # creating a Packet. It can discard a set number of bytes at the beginning
43
+ # before creating the Packet.
44
+ #
45
+ # @return [String|nil] Data for a packet consisting of the bytes read
46
+ def read_data(data)
47
+ @data << data
48
+
49
+ control = handle_sync_pattern()
50
+ return control if control
51
+
52
+ # Reduce the data to a single packet
53
+ packet_data = reduce_to_single_packet()
54
+ return packet_data if Symbol === packet_data
55
+ @sync_state = :SEARCHING
56
+
57
+ # Discard leading bytes if necessary
58
+ packet_data.replace(packet_data[@discard_leading_bytes..-1]) if @discard_leading_bytes > 0
59
+ packet_data
60
+ end
61
+
62
+ # Called to perform modifications on a command packet before it is sent
63
+ #
64
+ # @param packet [Packet] Original packet
65
+ # @return [Packet] Potentially modified packet
66
+ def write_packet(packet)
67
+ # If we're filling the sync pattern and the sync pattern is part of the
68
+ # packet (since we're not discarding any leading bytes) then we have to
69
+ # fill the sync pattern in the actual packet so do it here.
70
+ if @fill_fields && @sync_pattern && @discard_leading_bytes == 0
71
+ # Directly write the packet buffer and fill in the sync pattern
72
+ BinaryAccessor.write(@sync_pattern, 0, @sync_pattern.length * 8, :BLOCK,
73
+ packet.buffer(false), :BIG_ENDIAN, :ERROR)
74
+ end
75
+ packet
76
+ end
77
+
78
+ # Called to perform modifications on write data before sending it to the interface
79
+ #
80
+ # @param data [String] Raw packet data
81
+ # @return [String] Potentially modified packet data
82
+ def write_data(data)
83
+ # If we're filling the sync pattern and discarding the leading bytes
84
+ # during a read then we need to put them back during a write.
85
+ # If we're discarding the bytes then by definition they can't be part
86
+ # of the packet so we just modify the data.
87
+ if @fill_fields && @discard_leading_bytes > 0
88
+ data = ("\x00" * @discard_leading_bytes) << data
89
+ if @sync_pattern
90
+ BinaryAccessor.write(@sync_pattern, 0, @sync_pattern.length * 8, :BLOCK,
91
+ data, :BIG_ENDIAN, :ERROR)
92
+ end
93
+ end
94
+ super(data)
95
+ end
96
+
97
+ # @return [Boolean] control code (nil, :STOP)
98
+ def handle_sync_pattern
99
+ if @sync_pattern and @sync_state == :SEARCHING
100
+ loop do
101
+ # Make sure we have some data to look for a sync word in
102
+ return :STOP if @data.length < @sync_pattern.length
103
+
104
+ # Find the beginning of the sync pattern
105
+ sync_index = @data.index(@sync_pattern.getbyte(0).chr)
106
+ if sync_index
107
+ # Make sure we have enough data for the whole sync pattern past this index
108
+ return :STOP if @data.length < (sync_index + @sync_pattern.length)
109
+
110
+ # Check for the rest of the sync pattern
111
+ found = true
112
+ index = sync_index
113
+ @sync_pattern.each_byte do |byte|
114
+ if @data.getbyte(index) != byte
115
+ found = false
116
+ break
117
+ end
118
+ index += 1
119
+ end
120
+
121
+ if found
122
+ if sync_index != 0
123
+ discard_length = @data[0..(sync_index - 1)].length
124
+ log_discard(discard_length, true)
125
+ # Delete Data Before Sync Pattern
126
+ @data.replace(@data[sync_index..-1])
127
+ end
128
+ @sync_state = :FOUND
129
+ return nil
130
+
131
+ else # not found
132
+ log_discard(@data[0..sync_index].length, false)
133
+ # Delete Data Before and including first character of suspected sync Pattern
134
+ @data.replace(@data[(sync_index + 1)..-1])
135
+ next
136
+ end # if found
137
+
138
+ else # sync_index = nil
139
+ log_discard(@data.length, false)
140
+ @data.replace('')
141
+ return :STOP
142
+ end # unless sync_index.nil?
143
+ end # end loop
144
+ end # if @sync_pattern
145
+ nil
146
+ end
147
+
148
+ def log_discard(length, found)
149
+ Logger.error("Sync #{'not ' unless found}found. Discarding #{length} bytes of data.")
150
+ if @data.length >= 0
151
+ Logger.error(sprintf("Starting: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
152
+ @data.length >= 1 ? @data.getbyte(0) : 0,
153
+ @data.length >= 2 ? @data.getbyte(1) : 0,
154
+ @data.length >= 3 ? @data.getbyte(2) : 0,
155
+ @data.length >= 4 ? @data.getbyte(3) : 0,
156
+ @data.length >= 5 ? @data.getbyte(4) : 0,
157
+ @data.length >= 6 ? @data.getbyte(5) : 0))
158
+ end
159
+ end
160
+
161
+ def reduce_to_single_packet
162
+ if @data.length <= 0
163
+ # Need some data
164
+ return :STOP
165
+ end
166
+
167
+ # Reduce to packet data and clear data for next packet
168
+ packet_data = @data.clone
169
+ @data.replace('')
170
+ packet_data
171
+ end
172
+ end
173
+ 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/config/config_parser'
12
+ require 'cosmos/interfaces/protocols/protocol'
13
+ require 'cosmos/utilities/crc'
14
+ require 'thread'
15
+
16
+ module Cosmos
17
+ # Creates a CRC on write and verifies a CRC on read
18
+ class CrcProtocol < Protocol
19
+ ERROR = "ERROR" # on CRC mismatch
20
+ DISCONNECT = "DISCONNECT" # on CRC mismatch
21
+
22
+ def initialize(write_item_name, strip_crc, bad_strategy, bit_offset,
23
+ bit_size = 32, endianness = 'BIG_ENDIAN',
24
+ poly = nil, seed = nil, xor = nil, reflect = nil)
25
+ @write_item_name = ConfigParser.handle_nil(write_item_name)
26
+ @strip_crc = ConfigParser.handle_true_false(strip_crc)
27
+ raise "Invalid strip CRC of '#{strip_crc}'. Must be TRUE or FALSE." unless !!@strip_crc == @strip_crc
28
+
29
+ case bad_strategy
30
+ when ERROR, DISCONNECT
31
+ @bad_strategy = bad_strategy
32
+ else
33
+ raise "Invalid bad CRC strategy of #{bad_strategy}. Must be ERROR or DISCONNECT."
34
+ end
35
+
36
+ case endianness.to_s.upcase
37
+ when 'BIG_ENDIAN'
38
+ @endianness = :BIG_ENDIAN # Convert to symbol for use in BinaryAccessor.write
39
+ when 'LITTLE_ENDIAN'
40
+ @endianness = :LITTLE_ENDIAN # Convert to symbol for use in BinaryAccessor.write
41
+ else
42
+ raise "Invalid endianness '#{endianness}'. Must be BIG_ENDIAN or LITTLE_ENDIAN."
43
+ end
44
+
45
+ @bit_offset = Integer(bit_offset)
46
+ raise "Invalid bit offset of #{bit_offset}. Must be divisible by 8." if bit_offset % 8 != 0
47
+ @bit_size = Integer(bit_size)
48
+ poly = Integer(poly) if poly
49
+ seed = Integer(seed) if seed
50
+ xor = ConfigParser.handle_true_false(xor) if xor
51
+ raise "Invalid XOR value of '#{xor}'. Must be TRUE or FALSE." if xor && !!xor != xor
52
+ reflect = ConfigParser.handle_true_false(reflect) if reflect
53
+ raise "Invalid reflect value of '#{reflect}'. Must be TRUE or FALSE." if reflect && !!reflect != reflect
54
+ # Built the CRC arguments array. All subsequent arguments are dependent
55
+ # on the previous ones so we build it up incrementally.
56
+ args = []
57
+ if poly
58
+ args << poly
59
+ if seed
60
+ args << seed
61
+ unless xor.nil? # Can't check raw variable because it could be false
62
+ args << xor
63
+ unless reflect.nil? # Can't check raw variable because it could be false
64
+ args << reflect
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ case bit_size
71
+ when 16
72
+ @pack = (@endianness == :BIG_ENDIAN) ? 'n' : 'v'
73
+ if args.empty?
74
+ @crc = Crc16.new
75
+ else
76
+ @crc = Crc16.new(*args)
77
+ end
78
+ when 32
79
+ @pack = (@endianness == :BIG_ENDIAN) ? 'N' : 'V'
80
+ if args.empty?
81
+ @crc = Crc32.new
82
+ else
83
+ @crc = Crc32.new(*args)
84
+ end
85
+ when 64
86
+ @pack = (@endianness == :BIG_ENDIAN) ? 'N' : 'V'
87
+ if args.empty?
88
+ @crc = Crc64.new
89
+ else
90
+ @crc = Crc64.new(*args)
91
+ end
92
+ else
93
+ raise "Invalid bit size of #{bit_size}. Must be 16, 32, or 64."
94
+ end
95
+ end
96
+
97
+ def read_data(data)
98
+ crc = BinaryAccessor.read(@bit_offset, @bit_size, :UINT, data, @endianness)
99
+ calculated_crc = @crc.calc(data[0...(@bit_offset / 8)])
100
+ if calculated_crc != crc
101
+ Logger.error "Invalid CRC detected! Calculated 0x#{calculated_crc.to_s(16).upcase} vs found 0x#{crc.to_s(16).upcase}."
102
+ if @bad_strategy == DISCONNECT
103
+ return :DISCONNECT
104
+ end
105
+ end
106
+ if @strip_crc
107
+ new_data = data.dup
108
+ new_data = new_data[0...(@bit_offset / 8)]
109
+ end_range = (@bit_offset + @bit_size) / 8
110
+ new_data << data[end_range..-1] if end_range != 0
111
+ return new_data
112
+ end
113
+ return data
114
+ end
115
+
116
+ def write_packet(packet)
117
+ if @write_item_name
118
+ end_range = packet.get_item(@write_item_name).bit_offset / 8
119
+ crc = @crc.calc(packet.buffer(false)[0...end_range])
120
+ packet.write(@write_item_name, crc)
121
+ end
122
+ packet
123
+ end
124
+
125
+ def write_data(data)
126
+ unless @write_item_name
127
+ if @bit_size == 64
128
+ crc = @crc.calc(data)
129
+ data << ("\x00" * 8)
130
+ BinaryAccessor.write((crc >> 32), -64, 32, :UINT, data, @endianness, :ERROR)
131
+ BinaryAccessor.write((crc & 0xFFFFFFFF), -32, 32, :UINT, data, @endianness, :ERROR)
132
+ else
133
+ crc = @crc.calc(data)
134
+ data << ("\x00" * (@bit_size / 8))
135
+ BinaryAccessor.write(crc, -@bit_size, @bit_size, :UINT, data, @endianness, :ERROR)
136
+ end
137
+ end
138
+ data
139
+ end
140
+ end
141
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
3
+ # Copyright 2017 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -9,41 +9,44 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/config/config_parser'
12
- require 'cosmos/streams/stream_protocol'
12
+ require 'cosmos/interfaces/protocols/burst_protocol'
13
13
 
14
14
  module Cosmos
15
15
 
16
- # This StreamProtocol delineates packets by identifying them and then
16
+ # Delineates packets by identifying them and then
17
17
  # reading out their entire fixed length. Packets lengths can vary but
18
18
  # they must all be fixed.
19
- class FixedStreamProtocol < StreamProtocol
20
-
19
+ class FixedProtocol < BurstProtocol
21
20
  # @param min_id_size [Integer] The minimum amount of data needed to
22
21
  # identify a packet.
23
- # @param discard_leading_bytes (see StreamProtocol#initialize)
24
- # @param sync_pattern (see StreamProtocol#initialize)
25
- # @param telemetry_stream [Boolean] Whether the stream is returning
22
+ # @param discard_leading_bytes (see BurstProtocol#initialize)
23
+ # @param sync_pattern (see BurstProtocol#initialize)
24
+ # @param telemetry [Boolean] Whether the interface is returning
26
25
  # telemetry (true) or commands (false)
27
- # @param fill_sync_pattern (see StreamProtocol#initialize)
28
- def initialize(min_id_size,
29
- discard_leading_bytes = 0,
30
- sync_pattern = nil,
31
- telemetry_stream = true,
32
- fill_sync_pattern = false)
33
- super(discard_leading_bytes, sync_pattern, fill_sync_pattern)
26
+ # @param fill_fields (see BurstProtocol#initialize)
27
+ # @param unknown_raise Whether to raise an exception on an unknown packet
28
+ def initialize(
29
+ min_id_size,
30
+ discard_leading_bytes = 0,
31
+ sync_pattern = nil,
32
+ telemetry = true,
33
+ fill_fields = false,
34
+ unknown_raise = false
35
+ )
36
+ super(discard_leading_bytes, sync_pattern, fill_fields)
34
37
  @min_id_size = Integer(min_id_size)
35
- @telemetry_stream = telemetry_stream
38
+ @telemetry = telemetry
39
+ @unknown_raise = ConfigParser::handle_true_false(unknown_raise)
36
40
  end
37
41
 
38
42
  # Set the received_time, target_name and packet_name which we recorded when
39
43
  # we identified this packet. The server will also do this but since we know
40
44
  # the information here, we perform this optimization.
41
- # See StreamProtocol#post_read_packet
42
- def post_read_packet(packet)
45
+ def read_packet(packet)
43
46
  packet.received_time = @received_time
44
47
  packet.target_name = @target_name
45
48
  packet.packet_name = @packet_name
46
- packet
49
+ return packet
47
50
  end
48
51
 
49
52
  protected
@@ -52,16 +55,16 @@ module Cosmos
52
55
  # returned but the packet that matched is recorded so it can be set in the
53
56
  # post_read_packet callback.
54
57
  #
55
- # @return [String|nil] The identified packet data or nil if the stream was
56
- # closed
58
+ # @return [String|Symbol] The identified packet data or :STOP if more data
59
+ # is required to build a packet
57
60
  def identify_and_finish_packet
58
61
  packet_data = nil
62
+ identified_packet = nil
59
63
 
60
- raise "Interface required for FixedStreamProtocol" unless @interface
61
64
  @interface.target_names.each do |target_name|
62
65
  target_packets = nil
63
66
  begin
64
- if @telemetry_stream
67
+ if @telemetry
65
68
  target_packets = System.telemetry.packets(target_name)
66
69
  else
67
70
  target_packets = System.commands.packets(target_name)
@@ -71,18 +74,16 @@ module Cosmos
71
74
  next
72
75
  end
73
76
 
74
- identified_packet = nil
75
77
  target_packets.each do |packet_name, packet|
76
78
  if (packet.identify?(@data))
77
79
  identified_packet = packet
78
80
  if identified_packet.defined_length > @data.length
79
- # Need more data to finish packet
80
- read_minimum_size(identified_packet.defined_length)
81
- return nil if @data.length <= 0
81
+ # Check if need more data to finish packet
82
+ return :STOP if @data.length < identified_packet.defined_length
82
83
  end
83
84
  # Set some variables so we can update the packet in
84
85
  # post_read_packet
85
- @received_time = Time.now
86
+ @received_time = Time.now.sys
86
87
  @target_name = identified_packet.target_name
87
88
  @packet_name = identified_packet.packet_name
88
89
 
@@ -92,20 +93,22 @@ module Cosmos
92
93
  break
93
94
  end
94
95
  end
95
-
96
96
  break if identified_packet
97
97
  end
98
98
 
99
- packet_data
99
+ unless identified_packet
100
+ raise "Unknown data received by FixedProtocol" if @unknown_raise
101
+ # Unknown packet? Just return all the current data
102
+ packet_data = @data.clone
103
+ @data.replace('')
104
+ end
105
+
106
+ return packet_data
100
107
  end
101
108
 
102
109
  def reduce_to_single_packet
103
- read_minimum_size(@min_id_size)
104
- return nil if @data.length <= 0
105
-
110
+ return :STOP if @data.length < @min_id_size
106
111
  identify_and_finish_packet()
107
112
  end
108
-
109
- end # class FixedStreamProtocol
110
-
111
- end # module Cosmos
113
+ end
114
+ end