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
@@ -0,0 +1,709 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos/interfaces/protocols/crc_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe CrcProtocol do
18
+ let(:crc16) { Crc16.new() }
19
+ let(:crc32) { Crc32.new() }
20
+ let(:crc64) { Crc64.new() }
21
+
22
+ class CrcStream < Stream
23
+ def connect; end
24
+ def connected?; true; end
25
+ def disconnect; end
26
+ def read; $buffer; end
27
+ def write(data); $buffer = data; end
28
+ end
29
+
30
+ before(:each) do
31
+ @interface = StreamInterface.new
32
+ allow(@interface).to receive(:connected?) { true }
33
+ $buffer = ''
34
+ end
35
+
36
+ describe "initialize" do
37
+ it "complains if strip crc is not boolean" do
38
+ expect { @interface.add_protocol(CrcProtocol, [
39
+ nil, # item name
40
+ '', # strip crc
41
+ 'ERROR', # bad strategy
42
+ -16, # bit offset
43
+ 16], # bit size
44
+ :READ_WRITE) }.to raise_error(/Invalid strip CRC/)
45
+ end
46
+
47
+ it "complains if bad strategy is not ERROR or DISCONNECT" do
48
+ expect { @interface.add_protocol(CrcProtocol, [
49
+ nil, # item name
50
+ 'TRUE', # strip crc
51
+ '', # bad strategy
52
+ -16, # bit offset
53
+ 16], # bit size
54
+ :READ_WRITE) }.to raise_error(/Invalid bad CRC strategy/)
55
+ end
56
+
57
+ it "complains if bit size is not 16, 32, or 64" do
58
+ expect { @interface.add_protocol(CrcProtocol, [
59
+ nil, # item name
60
+ 'TRUE', # strip crc
61
+ 'ERROR', # bad strategy
62
+ 128, # bit offset
63
+ 8], # bit size
64
+ :READ_WRITE) }.to raise_error( /Invalid bit size/)
65
+ end
66
+
67
+ it "complains if bit offset is not byte divisible" do
68
+ expect { @interface.add_protocol(CrcProtocol, [
69
+ nil, # item name
70
+ 'TRUE', # strip crc
71
+ 'ERROR', # bad strategy
72
+ 100, # bit offset
73
+ 16], # bit size
74
+ :READ_WRITE) }.to raise_error(/Invalid bit offset/)
75
+ end
76
+
77
+ it "complains if the endianness is not a BIG_ENDIAN or LITTLE_ENDIAN" do
78
+ expect { @interface.add_protocol(CrcProtocol, [
79
+ nil, # item name
80
+ 'FALSE', # strip crc
81
+ 'ERROR', # bad strategy
82
+ -16, # bit offset
83
+ 16, # bit size
84
+ 'TRUE', # endianness
85
+ 0xDEAD, # poly
86
+ 0x0, # seed
87
+ 'TRUE', # xor
88
+ 'TRUE', # reflect
89
+ ],
90
+ :READ_WRITE) }.to raise_error(/Invalid endianness/)
91
+ end
92
+
93
+ it "complains if the poly is not a number" do
94
+ expect { @interface.add_protocol(CrcProtocol, [
95
+ nil, # item name
96
+ 'FALSE', # strip crc
97
+ 'ERROR', # bad strategy
98
+ -16, # bit offset
99
+ 16, # bit size
100
+ 'BIG_ENDIAN', # endianness
101
+ 'TRUE', # poly
102
+ 0x0, # seed
103
+ 'TRUE', # xor
104
+ 'TRUE', # reflect
105
+ ],
106
+ :READ_WRITE) }.to raise_error(/invalid value/)
107
+ end
108
+
109
+ it "complains if the seed is not a number" do
110
+ expect { @interface.add_protocol(CrcProtocol, [
111
+ nil, # item name
112
+ 'FALSE', # strip crc
113
+ 'ERROR', # bad strategy
114
+ -16, # bit offset
115
+ 16, # bit size
116
+ 'LITTLE_ENDIAN', # endianness
117
+ 0xABCD, # poly
118
+ 'TRUE', # seed
119
+ 'TRUE', # xor
120
+ 'TRUE', # reflect
121
+ ],
122
+ :READ_WRITE) }.to raise_error(/invalid value/)
123
+ end
124
+
125
+ it "complains if the xor is not boolean" do
126
+ expect { @interface.add_protocol(CrcProtocol, [
127
+ nil, # item name
128
+ 'FALSE', # strip crc
129
+ 'ERROR', # bad strategy
130
+ -16, # bit offset
131
+ 16, # bit size
132
+ 'BIG_ENDIAN', # endianness
133
+ 0xABCD, # poly
134
+ 0, # seed
135
+ 0, # xor
136
+ 'TRUE', # reflect
137
+ ],
138
+ :READ_WRITE) }.to raise_error(/Invalid XOR value/)
139
+ end
140
+
141
+ it "complains if the reflect is not boolean" do
142
+ expect { @interface.add_protocol(CrcProtocol, [
143
+ nil, # item name
144
+ 'FALSE', # strip crc
145
+ 'ERROR', # bad strategy
146
+ -16, # bit offset
147
+ 16, # bit size
148
+ 'BIG_ENDIAN', # endianness
149
+ 0xABCD, # poly
150
+ 0, # seed
151
+ 'TRUE', # xor
152
+ 0, # reflect
153
+ ],
154
+ :READ_WRITE) }.to raise_error(/Invalid reflect value/)
155
+ end
156
+ end
157
+
158
+ describe "read" do
159
+ it "does nothing if protocol added as :WRITE" do
160
+ @interface.instance_variable_set(:@stream, CrcStream.new)
161
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
162
+ @interface.add_protocol(CrcProtocol, [
163
+ nil, # item name
164
+ 'FALSE', # strip crc
165
+ 'ERROR', # bad strategy
166
+ -32, # bit offset
167
+ 32], # bit size
168
+ :WRITE)
169
+ @interface.target_names = ['TGT']
170
+ packet = Packet.new('TGT', 'PKT')
171
+ packet.append_item("DATA", 32, :UINT)
172
+ packet.append_item("CRC", 32, :UINT)
173
+ $buffer = "\x00\x01\x02\x03\x04\x05\x06\x07"
174
+
175
+ expect(Logger).to_not receive(:error)
176
+ packet = @interface.read
177
+ expect(packet.buffer.length).to eql 8
178
+ expect(packet.buffer).to eql $buffer
179
+ end
180
+
181
+ it "reads the 16 bit CRC field and compares to the CRC" do
182
+ @interface.instance_variable_set(:@stream, CrcStream.new)
183
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
184
+ @interface.add_protocol(CrcProtocol, [
185
+ 'CRC', # item name
186
+ 'FALSE', # strip crc
187
+ 'ERROR', # bad strategy
188
+ -16, # bit offset
189
+ 16], # bit size
190
+ :READ_WRITE)
191
+ @interface.target_names = ['TGT']
192
+ packet = Packet.new('TGT', 'PKT')
193
+ packet.append_item("DATA", 32, :UINT)
194
+ packet.append_item("CRC", 16, :UINT)
195
+
196
+ $buffer = "\x00\x01\x02\x03"
197
+ crc = crc16.calc($buffer)
198
+ $buffer << [crc].pack("n")
199
+
200
+ expect(Logger).to_not receive(:error)
201
+ packet = @interface.read
202
+ expect(packet.buffer.length).to eql 6
203
+ expect(packet.buffer).to eql $buffer
204
+ end
205
+
206
+ it "reads the 32 bit CRC field and compares to the CRC" do
207
+ @interface.instance_variable_set(:@stream, CrcStream.new)
208
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
209
+ @interface.add_protocol(CrcProtocol, [
210
+ 'CRC', # item name
211
+ 'FALSE', # strip crc
212
+ 'ERROR', # bad strategy
213
+ -32, # bit offset
214
+ 32], # bit size
215
+ :READ_WRITE)
216
+ @interface.target_names = ['TGT']
217
+ packet = Packet.new('TGT', 'PKT')
218
+ packet.append_item("DATA", 32, :UINT)
219
+ packet.append_item("CRC", 32, :UINT)
220
+
221
+ $buffer = "\x00\x01\x02\x03"
222
+ crc = crc32.calc($buffer)
223
+ $buffer << [crc].pack("N")
224
+
225
+ expect(Logger).to_not receive(:error)
226
+ packet = @interface.read
227
+ expect(packet.buffer.length).to eql 8
228
+ expect(packet.buffer).to eql $buffer
229
+ end
230
+
231
+ it "reads the 64 bit CRC field and compares to the CRC" do
232
+ @interface.instance_variable_set(:@stream, CrcStream.new)
233
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
234
+ @interface.add_protocol(CrcProtocol, [
235
+ 'CRC', # item name
236
+ 'FALSE', # strip crc
237
+ 'ERROR', # bad strategy
238
+ -64, # bit offset
239
+ 64], # bit size
240
+ :READ_WRITE)
241
+ @interface.target_names = ['TGT']
242
+ packet = Packet.new('TGT', 'PKT')
243
+ packet.append_item("DATA", 32, :UINT)
244
+ packet.append_item("CRC", 64, :UINT)
245
+
246
+ $buffer = "\x00\x01\x02\x03"
247
+ crc = crc64.calc($buffer)
248
+ top_crc = crc >> 32
249
+ bottom_crc = crc & 0xFFFFFFFF
250
+ $buffer << [top_crc].pack("N")
251
+ $buffer << [bottom_crc].pack("N")
252
+
253
+ expect(Logger).to_not receive(:error)
254
+ packet = @interface.read
255
+ expect(packet.buffer.length).to eql 12
256
+ expect(packet.buffer).to eql $buffer
257
+ end
258
+
259
+ context "with a specified CRC poly, seed, xor, and reflect" do
260
+ it "reads the 16 bit CRC field and compares to the CRC" do
261
+ @interface.instance_variable_set(:@stream, CrcStream.new)
262
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
263
+ @interface.add_protocol(CrcProtocol, [
264
+ 'CRC', # item name
265
+ 'FALSE', # strip crc
266
+ 'ERROR', # bad strategy
267
+ -16, # bit offset
268
+ 16, # bit size
269
+ :BIG_ENDIAN, # endianness
270
+ 0x8005, # poly
271
+ 0x0, # seed
272
+ 'TRUE', # xor
273
+ 'TRUE', # reflect
274
+ ],
275
+ :READ_WRITE)
276
+ @interface.target_names = ['TGT']
277
+ packet = Packet.new('TGT', 'PKT')
278
+ packet.append_item("DATA", 32, :UINT)
279
+ packet.append_item("CRC", 16, :UINT)
280
+
281
+ $buffer = "\x00\x01\x02\x03"
282
+ crc16 = Crc16.new(0x8005, 0, true, true)
283
+ crc = crc16.calc($buffer)
284
+ $buffer << [crc].pack("n")
285
+
286
+ expect(Logger).to_not receive(:error)
287
+ packet = @interface.read
288
+ expect(packet.buffer.length).to eql 6
289
+ expect(packet.buffer).to eql $buffer
290
+ end
291
+
292
+ it "reads the 32 bit CRC field and compares to the CRC" do
293
+ @interface.instance_variable_set(:@stream, CrcStream.new)
294
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
295
+ @interface.add_protocol(CrcProtocol, [
296
+ 'CRC', # item name
297
+ 'FALSE', # strip crc
298
+ 'ERROR', # bad strategy
299
+ -32, # bit offset
300
+ 32, # bit size
301
+ :BIG_ENDIAN, # endianness
302
+ 0x1EDC6F41, # poly
303
+ 0x0, # seed
304
+ 'FALSE', # xor
305
+ 'FALSE', # reflect
306
+ ],
307
+ :READ_WRITE)
308
+ @interface.target_names = ['TGT']
309
+ packet = Packet.new('TGT', 'PKT')
310
+ packet.append_item("DATA", 32, :UINT)
311
+ packet.append_item("CRC", 32, :UINT)
312
+
313
+ $buffer = "\x00\x01\x02\x03"
314
+ crc32 = Crc32.new(0x1EDC6F41, 0, false, false)
315
+ crc = crc32.calc($buffer)
316
+ $buffer << [crc].pack("N")
317
+
318
+ expect(Logger).to_not receive(:error)
319
+ packet = @interface.read
320
+ expect(packet.buffer.length).to eql 8
321
+ expect(packet.buffer).to eql $buffer
322
+ end
323
+
324
+ it "reads the 64 bit CRC field and compares to the CRC" do
325
+ @interface.instance_variable_set(:@stream, CrcStream.new)
326
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
327
+ @interface.add_protocol(CrcProtocol, [
328
+ 'CRC', # item name
329
+ 'FALSE', # strip crc
330
+ 'ERROR', # bad strategy
331
+ -64, # bit offset
332
+ 64, # bit size
333
+ :BIG_ENDIAN, # endianness
334
+ 0x000000000000001B, # poly
335
+ 0x0, # seed
336
+ 'FALSE', # xor
337
+ 'FALSE', # reflect
338
+ ],
339
+ :READ_WRITE)
340
+ @interface.target_names = ['TGT']
341
+ packet = Packet.new('TGT', 'PKT')
342
+ packet.append_item("DATA", 32, :UINT)
343
+ packet.append_item("CRC", 64, :UINT)
344
+
345
+ $buffer = "\x00\x01\x02\x03"
346
+ crc64 = Crc64.new(0x000000000000001B, 0, false, false)
347
+ crc = crc64.calc($buffer)
348
+ top_crc = crc >> 32
349
+ bottom_crc = crc & 0xFFFFFFFF
350
+ $buffer << [top_crc].pack("N")
351
+ $buffer << [bottom_crc].pack("N")
352
+
353
+ expect(Logger).to_not receive(:error)
354
+ packet = @interface.read
355
+ expect(packet.buffer.length).to eql 12
356
+ expect(packet.buffer).to eql $buffer
357
+ end
358
+ end
359
+
360
+ it "logs an error if the CRC does not match" do
361
+ @interface.instance_variable_set(:@stream, CrcStream.new)
362
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
363
+ @interface.add_protocol(CrcProtocol, [
364
+ 'CRC', # item name
365
+ 'FALSE', # strip crc
366
+ 'ERROR', # bad strategy
367
+ -32, # bit offset
368
+ 32], # bit size
369
+ :READ_WRITE)
370
+ @interface.target_names = ['TGT']
371
+ packet = Packet.new('TGT', 'PKT')
372
+ packet.append_item("DATA", 32, :UINT)
373
+ packet.append_item("CRC", 32, :UINT)
374
+
375
+ $buffer = "\x00\x01\x02\x03"
376
+ crc = crc32.calc($buffer)
377
+ $buffer << [crc].pack("N")
378
+ $buffer[0] = "\x01"
379
+
380
+ expect(Logger).to receive(:error) do |msg|
381
+ expect(msg).to match "Invalid CRC detected!"
382
+ end
383
+ packet = @interface.read
384
+ expect(packet.buffer.length).to eql 8
385
+ expect(packet.buffer).to eql $buffer
386
+ end
387
+
388
+ it "disconnects if the CRC does not match" do
389
+ @interface.instance_variable_set(:@stream, CrcStream.new)
390
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
391
+ @interface.add_protocol(CrcProtocol, [
392
+ 'CRC', # item name
393
+ 'FALSE', # strip crc
394
+ 'DISCONNECT', # bad strategy
395
+ -32, # bit offset
396
+ 32], # bit size
397
+ :READ_WRITE)
398
+ @interface.target_names = ['TGT']
399
+ packet = Packet.new('TGT', 'PKT')
400
+ packet.append_item("DATA", 32, :UINT)
401
+ packet.append_item("CRC", 32, :UINT)
402
+
403
+ $buffer = "\x00\x01\x02\x03"
404
+ crc = crc32.calc($buffer)
405
+ $buffer << [crc].pack("N")
406
+ $buffer[0] = "\x01"
407
+
408
+ expect(Logger).to receive(:error) do |msg|
409
+ expect(msg).to match "Invalid CRC detected!"
410
+ end
411
+ packet = @interface.read
412
+ expect(packet).to be_nil # thread disconnects when packet is nil
413
+ end
414
+
415
+ it "can strip the 16 bit CRC at the end" do
416
+ @interface.instance_variable_set(:@stream, CrcStream.new)
417
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
418
+ @interface.add_protocol(CrcProtocol, [
419
+ 'CRC', # item name
420
+ 'TRUE', # strip crc
421
+ 'ERROR', # bad strategy
422
+ -16, # bit offset
423
+ 16], # bit size
424
+ :READ_WRITE)
425
+ @interface.target_names = ['TGT']
426
+ packet = Packet.new('TGT', 'PKT')
427
+ packet.append_item("DATA", 32, :UINT)
428
+ packet.append_item("CRC", 16, :UINT)
429
+
430
+ $buffer = "\x00\x01\x02\x03"
431
+ crc = crc16.calc($buffer)
432
+ $buffer << [crc].pack("n")
433
+
434
+ expect(Logger).to_not receive(:error)
435
+ packet = @interface.read
436
+ expect(packet.buffer.length).to eql 4
437
+ expect(packet.buffer).to eql $buffer[0..3]
438
+ end
439
+
440
+ it "can strip the 32 bit CRC at the end" do
441
+ @interface.instance_variable_set(:@stream, CrcStream.new)
442
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
443
+ @interface.add_protocol(CrcProtocol, [
444
+ 'CRC', # item name
445
+ 'TRUE', # strip crc
446
+ 'ERROR', # bad strategy
447
+ -32, # bit offset
448
+ 32], # bit size
449
+ :READ_WRITE)
450
+ @interface.target_names = ['TGT']
451
+ packet = Packet.new('TGT', 'PKT')
452
+ packet.append_item("DATA", 32, :UINT)
453
+ packet.append_item("CRC", 32, :UINT)
454
+
455
+ $buffer = "\x00\x01\x02\x03"
456
+ crc = crc32.calc($buffer)
457
+ $buffer << [crc].pack("N")
458
+
459
+ expect(Logger).to_not receive(:error)
460
+ packet = @interface.read
461
+ expect(packet.buffer.length).to eql 4
462
+ expect(packet.buffer).to eql $buffer[0..3]
463
+ end
464
+
465
+ it "can strip the 64 bit CRC at the end" do
466
+ @interface.instance_variable_set(:@stream, CrcStream.new)
467
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
468
+ @interface.add_protocol(CrcProtocol, [
469
+ 'CRC', # item name
470
+ 'TRUE', # strip crc
471
+ 'ERROR', # bad strategy
472
+ -64, # bit offset
473
+ 64], # bit size
474
+ :READ_WRITE)
475
+ @interface.target_names = ['TGT']
476
+ packet = Packet.new('TGT', 'PKT')
477
+ packet.append_item("DATA", 32, :UINT)
478
+ packet.append_item("CRC", 64, :UINT)
479
+
480
+ $buffer = "\x00\x01\x02\x03"
481
+ crc = crc64.calc($buffer)
482
+ top_crc = crc >> 32
483
+ bottom_crc = crc & 0xFFFFFFFF
484
+ $buffer << [top_crc].pack("N")
485
+ $buffer << [bottom_crc].pack("N")
486
+
487
+ expect(Logger).to_not receive(:error)
488
+ packet = @interface.read
489
+ expect(packet.buffer.length).to eql 4
490
+ expect(packet.buffer).to eql $buffer[0..3]
491
+ end
492
+
493
+ it "can strip the 32 bit CRC in the middle" do
494
+ @interface.instance_variable_set(:@stream, CrcStream.new)
495
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
496
+ @interface.add_protocol(CrcProtocol, [
497
+ 'CRC', # item name
498
+ 'TRUE', # strip crc
499
+ 'ERROR', # bad strategy
500
+ 32, # bit offset
501
+ 16], # bit size
502
+ :READ_WRITE)
503
+ @interface.target_names = ['TGT']
504
+ packet = Packet.new('TGT', 'PKT')
505
+ packet.append_item("DATA", 32, :UINT)
506
+ packet.append_item("CRC", 16, :UINT)
507
+ packet.append_item("TRAILER", 16, :UINT)
508
+
509
+ $buffer = "\x00\x01\x02\x03"
510
+ crc = crc16.calc($buffer)
511
+ $buffer << [crc].pack("n")
512
+ $buffer << "\x04\x05"
513
+
514
+ expect(Logger).to_not receive(:error)
515
+ packet = @interface.read
516
+ expect(packet.buffer.length).to eql 6
517
+ expect(packet.buffer).to eql "\x00\x01\x02\x03\x04\x05"
518
+ end
519
+ end
520
+
521
+ describe "write" do
522
+ it "does nothing if protocol added as :READ" do
523
+ @interface.instance_variable_set(:@stream, CrcStream.new)
524
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
525
+ @interface.add_protocol(CrcProtocol, [
526
+ nil, # item name
527
+ 'FALSE', # strip crc
528
+ 'ERROR', # bad strategy
529
+ -32, # bit offset
530
+ 32], # bit size
531
+ :READ)
532
+ @interface.target_names = ['TGT']
533
+ packet = Packet.new('TGT', 'PKT')
534
+ packet.append_item("DATA", 32, :UINT)
535
+ packet.append_item("CRC", 32, :UINT)
536
+ packet.append_item("TRAILER", 32, :UINT)
537
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
538
+ @interface.write(packet)
539
+ expect($buffer.length).to eql 12
540
+ expect($buffer).to eql packet.buffer
541
+ end
542
+
543
+ it "complains if the item does not exist" do
544
+ @interface.instance_variable_set(:@stream, CrcStream.new)
545
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
546
+ @interface.add_protocol(CrcProtocol, [
547
+ 'MYCRC', # item name
548
+ 'FALSE', # strip crc
549
+ 'ERROR', # bad strategy
550
+ -32, # bit offset
551
+ 32], # bit size
552
+ :READ_WRITE)
553
+ @interface.target_names = ['TGT']
554
+ packet = Packet.new('TGT', 'PKT')
555
+ packet.append_item("DATA", 32, :UINT)
556
+ packet.append_item("CRC", 32, :UINT)
557
+ packet.append_item("TRAILER", 32, :UINT)
558
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
559
+ expect { @interface.write(packet) }.to raise_error(/Packet item 'TGT PKT MYCRC' does not exist/)
560
+ end
561
+
562
+ it "calculates and writes the 16 bit CRC item" do
563
+ @interface.instance_variable_set(:@stream, CrcStream.new)
564
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
565
+ @interface.add_protocol(CrcProtocol, [
566
+ 'CRC', # item name
567
+ 'FALSE', # strip crc
568
+ 'ERROR', # bad strategy
569
+ -48, # bit offset
570
+ 16], # bit size
571
+ :READ_WRITE)
572
+ @interface.target_names = ['TGT']
573
+ packet = Packet.new('TGT', 'PKT')
574
+ packet.append_item("DATA", 32, :UINT)
575
+ packet.append_item("CRC", 16, :UINT)
576
+ packet.append_item("TRAILER", 32, :UINT)
577
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x04\x05\x06\x07"
578
+ @interface.write(packet)
579
+ buffer = "\x00\x01\x02\x03"
580
+ buffer << [crc16.calc("\x00\x01\x02\x03")].pack("n")
581
+ buffer << "\x04\x05\x06\x07"
582
+ expect($buffer).to eql buffer
583
+ end
584
+
585
+ it "calculates and writes the 32 bit CRC item" do
586
+ @interface.instance_variable_set(:@stream, CrcStream.new)
587
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
588
+ @interface.add_protocol(CrcProtocol, [
589
+ 'CRC', # item name
590
+ 'FALSE', # strip crc
591
+ 'ERROR', # bad strategy
592
+ -32, # bit offset
593
+ 32], # bit size
594
+ :READ_WRITE)
595
+ @interface.target_names = ['TGT']
596
+ packet = Packet.new('TGT', 'PKT')
597
+ packet.append_item("DATA", 32, :UINT)
598
+ packet.append_item("CRC", 32, :UINT)
599
+ packet.append_item("TRAILER", 32, :UINT)
600
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
601
+ @interface.write(packet)
602
+ buffer = "\x00\x01\x02\x03"
603
+ buffer << [crc32.calc("\x00\x01\x02\x03")].pack("N")
604
+ buffer << "\x04\x05\x06\x07"
605
+ expect($buffer).to eql buffer
606
+ end
607
+
608
+ it "calculates and writes the 64 bit CRC item" do
609
+ @interface.instance_variable_set(:@stream, CrcStream.new)
610
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
611
+ @interface.add_protocol(CrcProtocol, [
612
+ 'CRC', # item name
613
+ 'FALSE', # strip crc
614
+ 'ERROR', # bad strategy
615
+ -64, # bit offset
616
+ 64], # bit size
617
+ :READ_WRITE)
618
+ @interface.target_names = ['TGT']
619
+ packet = Packet.new('TGT', 'PKT')
620
+ packet.append_item("DATA", 32, :UINT)
621
+ packet.append_item("CRC", 64, :UINT)
622
+ packet.append_item("TRAILER", 32, :UINT)
623
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x06\x07"
624
+ @interface.write(packet)
625
+ buffer = "\x00\x01\x02\x03"
626
+ crc = crc64.calc(buffer)
627
+ top_crc = crc >> 32
628
+ bottom_crc = crc & 0xFFFFFFFF
629
+ buffer << [top_crc].pack("N")
630
+ buffer << [bottom_crc].pack("N")
631
+ buffer << "\x04\x05\x06\x07"
632
+ expect($buffer).to eql buffer
633
+ end
634
+
635
+ it "appends the 16 bit CRC to the end" do
636
+ @interface.instance_variable_set(:@stream, CrcStream.new)
637
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
638
+ @interface.add_protocol(CrcProtocol, [
639
+ nil, # item name nil means append
640
+ 'FALSE', # strip crc
641
+ 'ERROR', # bad strategy
642
+ -16, # bit offset
643
+ 16], # bit size
644
+ :READ_WRITE)
645
+ @interface.target_names = ['TGT']
646
+ packet = Packet.new('TGT', 'PKT')
647
+ packet.append_item("DATA", 32, :UINT)
648
+ packet.append_item("CRC", 32, :UINT)
649
+ packet.append_item("TRAILER", 32, :UINT)
650
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
651
+ buffer = packet.buffer
652
+ buffer << [crc16.calc(packet.buffer)].pack("n")
653
+ @interface.write(packet)
654
+ expect($buffer.length).to eql 14
655
+ expect($buffer).to eql buffer
656
+ end
657
+
658
+ it "appends the 32 bit CRC to the end" do
659
+ @interface.instance_variable_set(:@stream, CrcStream.new)
660
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
661
+ @interface.add_protocol(CrcProtocol, [
662
+ nil, # item name nil means append
663
+ 'FALSE', # strip crc
664
+ 'ERROR', # bad strategy
665
+ -32, # bit offset
666
+ 32], # bit size
667
+ :READ_WRITE)
668
+ @interface.target_names = ['TGT']
669
+ packet = Packet.new('TGT', 'PKT')
670
+ packet.append_item("DATA", 32, :UINT)
671
+ packet.append_item("CRC", 32, :UINT)
672
+ packet.append_item("TRAILER", 32, :UINT)
673
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
674
+ buffer = packet.buffer
675
+ buffer << [crc32.calc(packet.buffer)].pack("N")
676
+ @interface.write(packet)
677
+ expect($buffer.length).to eql 16
678
+ expect($buffer).to eql buffer
679
+ end
680
+
681
+ it "appends the 64 bit CRC to the end" do
682
+ @interface.instance_variable_set(:@stream, CrcStream.new)
683
+ @interface.add_protocol(BurstProtocol, [], :READ_WRITE)
684
+ @interface.add_protocol(CrcProtocol, [
685
+ nil, # item name nil means append
686
+ 'FALSE', # strip crc
687
+ 'ERROR', # bad strategy
688
+ -64, # bit offset
689
+ 64], # bit size
690
+ :READ_WRITE)
691
+ @interface.target_names = ['TGT']
692
+ packet = Packet.new('TGT', 'PKT')
693
+ packet.append_item("DATA", 32, :UINT)
694
+ packet.append_item("CRC", 32, :UINT)
695
+ packet.append_item("TRAILER", 32, :UINT)
696
+ packet.buffer = "\x00\x01\x02\x03\x00\x00\x00\x00\x04\x05\x06\x07"
697
+ buffer = packet.buffer
698
+ crc = crc64.calc(buffer)
699
+ top_crc = crc >> 32
700
+ bottom_crc = crc & 0xFFFFFFFF
701
+ buffer << [top_crc].pack("N")
702
+ buffer << [bottom_crc].pack("N")
703
+ @interface.write(packet)
704
+ expect($buffer.length).to eql 20
705
+ expect($buffer).to eql buffer
706
+ end
707
+ end
708
+ end
709
+ end