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
@@ -19,25 +19,39 @@ module Cosmos
19
19
  describe "add_cmd_parameter" do
20
20
  it "should remove quotes and preserve quoted strings" do
21
21
  cmd_params = {}
22
- add_cmd_parameter('TEST', '"3"', cmd_params)
22
+ add_cmd_parameter('TEST', '"3"', nil, cmd_params)
23
23
  expect(cmd_params['TEST']).to eql('3')
24
24
  end
25
25
 
26
26
  it "should convert unquoted strings to the correct value type" do
27
27
  cmd_params = {}
28
- add_cmd_parameter('TEST', '3', cmd_params)
28
+ add_cmd_parameter('TEST', '3', nil, cmd_params)
29
29
  expect(cmd_params['TEST']).to eql(3)
30
- add_cmd_parameter('TEST2', '3.0', cmd_params)
30
+ add_cmd_parameter('TEST2', '3.0', nil, cmd_params)
31
31
  expect(cmd_params['TEST2']).to eql(3.0)
32
- add_cmd_parameter('TEST3', '0xA', cmd_params)
32
+ add_cmd_parameter('TEST3', '0xA', nil, cmd_params)
33
33
  expect(cmd_params['TEST3']).to eql(0xA)
34
- add_cmd_parameter('TEST4', '3e3', cmd_params)
34
+ add_cmd_parameter('TEST4', '3e3', nil, cmd_params)
35
35
  expect(cmd_params['TEST4']).to eql(3e3)
36
- add_cmd_parameter('TEST5', 'Ryan', cmd_params)
36
+ add_cmd_parameter('TEST5', 'Ryan', nil, cmd_params)
37
37
  expect(cmd_params['TEST5']).to eql('Ryan')
38
- add_cmd_parameter('TEST6', '3 4', cmd_params)
38
+ add_cmd_parameter('TEST6', '3 4', nil, cmd_params)
39
39
  expect(cmd_params['TEST6']).to eql('3 4')
40
40
  end
41
+
42
+ it "should convert unquoted hex values into binary for blocks and strings" do
43
+ cmd_params = {}
44
+ packet = System.commands.packet("INST", "ASCIICMD").clone
45
+ add_cmd_parameter('STRING', '0xAABBCCDD', packet, cmd_params)
46
+ expect(cmd_params['STRING']).to eql("\xAA\xBB\xCC\xDD")
47
+ end
48
+
49
+ it "should preserve quoted hex values for blocks and strings" do
50
+ cmd_params = {}
51
+ packet = System.commands.packet("INST", "ASCIICMD").clone
52
+ add_cmd_parameter('STRING', "'0xAABBCCDD'", packet, cmd_params)
53
+ expect(cmd_params['STRING']).to eql("0xAABBCCDD")
54
+ end
41
55
  end
42
56
 
43
57
  describe "extract_fields_from_cmd_text" do
@@ -64,12 +64,14 @@ module Cosmos
64
64
  end
65
65
  end
66
66
 
67
- describe "status_bar" do
68
- it "sets the ScriptRunner status bar" do
69
- class ScriptRunner; end
70
- sc = ScriptRunner.new
71
- expect(sc).to receive(:script_set_status).with("HI")
72
- status_bar("HI")
67
+ if RUBY_ENGINE == 'ruby'
68
+ describe "status_bar" do
69
+ it "sets the ScriptRunner status bar" do
70
+ class ScriptRunner; end
71
+ sc = ScriptRunner.new
72
+ expect(sc).to receive(:script_set_status).with("HI")
73
+ status_bar("HI")
74
+ end
73
75
  end
74
76
  end
75
77
 
@@ -212,6 +214,88 @@ module Cosmos
212
214
  stdout.rewind
213
215
  end
214
216
  end
217
+
218
+ it "handles array items" do
219
+ capture_io do |stdout|
220
+ check_tolerance("INST HEALTH_STATUS ARY2", 0.0, 0.1)
221
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
222
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
223
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
224
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
225
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
226
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
227
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
228
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
229
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
230
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
231
+ stdout.rewind
232
+
233
+ check_tolerance("INST", "HEALTH_STATUS", "ARY2", 0.0, 0.1)
234
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
235
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
236
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
237
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
238
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
239
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
240
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
241
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
242
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
243
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
244
+ stdout.rewind
245
+
246
+ exp_array = Array.new(10, 0.0)
247
+ tol_array = Array.new(10, 0.1)
248
+ check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array)
249
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
250
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
251
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
252
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
253
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
254
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
255
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
256
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
257
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
258
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
259
+ stdout.rewind
260
+
261
+ exp_array = Array.new(10, 0.0)
262
+ tol_array = Array.new(10, 0.1)
263
+ check_tolerance_raw("INST HEALTH_STATUS ARY2", exp_array, tol_array)
264
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
265
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
266
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
267
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
268
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
269
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
270
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
271
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
272
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
273
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
274
+ stdout.rewind
275
+
276
+ exp_array[0] = 0.11
277
+ expect { check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS ARY2\[0\] failed to be within range/)
278
+ stdout.rewind
279
+
280
+ exp_array[0] = 0.0
281
+ exp_array[9] = 0.11
282
+ expect { check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS ARY2\[9\] failed to be within range/)
283
+ stdout.rewind
284
+
285
+ exp_array = Array.new(10, 1)
286
+ tol_array = Array.new(10, 1.1)
287
+ tol_array[1] = 0.9
288
+ expect { check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS ARY2\[1\] failed to be within range/)
289
+ stdout.rewind
290
+
291
+ end
292
+ end
293
+
294
+ it "checks size of array parameters" do
295
+ bad_array = Array.new(9, 0)
296
+ expect { check_tolerance("INST HEALTH_STATUS ARY2", bad_array, 0.1) }.to raise_error(/Invalid array size for expected_value/)
297
+ expect { check_tolerance("INST HEALTH_STATUS ARY2", 0.0, bad_array) }.to raise_error(/Invalid array size for tolerance/)
298
+ end
215
299
  end
216
300
 
217
301
  describe "check_expression" do
@@ -314,6 +398,90 @@ module Cosmos
314
398
  stdout.rewind
315
399
  end
316
400
  end
401
+
402
+ it "handles array items" do
403
+ capture_io do |stdout|
404
+ wait_tolerance("INST HEALTH_STATUS ARY2", 0.0, 0.1, 0.1)
405
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[0\] was within range/
406
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[1\] was within range/
407
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[2\] was within range/
408
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[3\] was within range/
409
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[4\] was within range/
410
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[5\] was within range/
411
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[6\] was within range/
412
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[7\] was within range/
413
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[8\] was within range/
414
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[9\] was within range/
415
+ stdout.rewind
416
+
417
+ wait_tolerance("INST", "HEALTH_STATUS", "ARY2", 0.0, 0.1, 0.1)
418
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[0\] was within range/
419
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[1\] was within range/
420
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[2\] was within range/
421
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[3\] was within range/
422
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[4\] was within range/
423
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[5\] was within range/
424
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[6\] was within range/
425
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[7\] was within range/
426
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[8\] was within range/
427
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[9\] was within range/
428
+ stdout.rewind
429
+
430
+ exp_array = Array.new(10, 0.0)
431
+ tol_array = Array.new(10, 0.1)
432
+ wait_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
433
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[0\] was within range/
434
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[1\] was within range/
435
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[2\] was within range/
436
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[3\] was within range/
437
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[4\] was within range/
438
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[5\] was within range/
439
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[6\] was within range/
440
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[7\] was within range/
441
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[8\] was within range/
442
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[9\] was within range/
443
+ stdout.rewind
444
+
445
+ exp_array = Array.new(10, 0.0)
446
+ tol_array = Array.new(10, 0.1)
447
+ wait_tolerance_raw("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
448
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[0\] was within range/
449
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[1\] was within range/
450
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[2\] was within range/
451
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[3\] was within range/
452
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[4\] was within range/
453
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[5\] was within range/
454
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[6\] was within range/
455
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[7\] was within range/
456
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[8\] was within range/
457
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[9\] was within range/
458
+ stdout.rewind
459
+
460
+ exp_array[0] = 0.11
461
+ wait_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
462
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[0\] failed to be within range/
463
+ stdout.rewind
464
+
465
+ exp_array[0] = 0.0
466
+ exp_array[9] = 0.11
467
+ wait_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
468
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[9\] failed to be within range/
469
+ stdout.rewind
470
+
471
+ exp_array = Array.new(10, 1)
472
+ tol_array = Array.new(10, 1.1)
473
+ tol_array[1] = 0.9
474
+ wait_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
475
+ expect(stdout.string).to match /WAIT: INST HEALTH_STATUS ARY2\[1\] failed to be within range/
476
+ stdout.rewind
477
+ end
478
+ end
479
+
480
+ it "checks size of array parameters" do
481
+ bad_array = Array.new(9, 0)
482
+ expect { wait_tolerance("INST HEALTH_STATUS ARY2", bad_array, 0.1, 0.1) }.to raise_error(/Invalid array size for expected_value/)
483
+ expect { wait_tolerance("INST HEALTH_STATUS ARY2", 0.0, bad_array, 0.1) }.to raise_error(/Invalid array size for tolerance/)
484
+ end
317
485
  end
318
486
 
319
487
  describe "wait_expression" do
@@ -393,6 +561,87 @@ module Cosmos
393
561
  expect { wait_check_tolerance_raw("INST HEALTH_STATUS TEMP1", 100, 1, 0.1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 failed to be within/)
394
562
 
395
563
  end
564
+
565
+ it "handles array items" do
566
+ capture_io do |stdout|
567
+ wait_check_tolerance("INST HEALTH_STATUS ARY2", 0.0, 0.1, 0.1)
568
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
569
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
570
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
571
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
572
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
573
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
574
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
575
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
576
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
577
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
578
+ stdout.rewind
579
+
580
+ wait_check_tolerance("INST", "HEALTH_STATUS", "ARY2", 0.0, 0.1, 0.1)
581
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
582
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
583
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
584
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
585
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
586
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
587
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
588
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
589
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
590
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
591
+ stdout.rewind
592
+
593
+ exp_array = Array.new(10, 0.0)
594
+ tol_array = Array.new(10, 0.1)
595
+ wait_check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
596
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
597
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
598
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
599
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
600
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
601
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
602
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
603
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
604
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
605
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
606
+ stdout.rewind
607
+
608
+ exp_array = Array.new(10, 0.0)
609
+ tol_array = Array.new(10, 0.1)
610
+ wait_check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1)
611
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[0\] was within range/
612
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[1\] was within range/
613
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[2\] was within range/
614
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[3\] was within range/
615
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[4\] was within range/
616
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[5\] was within range/
617
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[6\] was within range/
618
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[7\] was within range/
619
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[8\] was within range/
620
+ expect(stdout.string).to match /CHECK: INST HEALTH_STATUS ARY2\[9\] was within range/
621
+ stdout.rewind
622
+
623
+ exp_array[0] = 0.11
624
+ expect { wait_check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1) }.to raise_error(/CHECK: INST HEALTH_STATUS ARY2\[0\] failed to be within range/)
625
+ stdout.rewind
626
+
627
+ exp_array[0] = 0.0
628
+ exp_array[9] = 0.11
629
+ expect { wait_check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1) }.to raise_error(/CHECK: INST HEALTH_STATUS ARY2\[9\] failed to be within range/)
630
+ stdout.rewind
631
+
632
+ exp_array = Array.new(10, 1)
633
+ tol_array = Array.new(10, 1.1)
634
+ tol_array[1] = 0.9
635
+ expect {wait_check_tolerance("INST HEALTH_STATUS ARY2", exp_array, tol_array, 0.1) }.to raise_error(/CHECK: INST HEALTH_STATUS ARY2\[1\] failed to be within range/)
636
+ stdout.rewind
637
+ end
638
+ end
639
+
640
+ it "checks size of array parameters" do
641
+ bad_array = Array.new(9, 0)
642
+ expect { wait_check_tolerance("INST HEALTH_STATUS ARY2", bad_array, 0.1, 0.1) }.to raise_error(/Invalid array size for expected_value/)
643
+ expect { wait_check_tolerance("INST HEALTH_STATUS ARY2", 0.0, bad_array, 0.1) }.to raise_error(/Invalid array size for tolerance/)
644
+ end
396
645
  end
397
646
 
398
647
  describe "wait_check_expression" do
@@ -447,9 +696,12 @@ module Cosmos
447
696
  it "starts a script within ScriptRunnerFrame" do
448
697
  class ScriptRunnerFrame
449
698
  @@instrumented_cache = {}
699
+ @@file_cache = {}
450
700
  def self.instance; true; end
451
701
  def self.instrumented_cache; @@instrumented_cache; end
452
702
  def self.instrumented_cache=(value); @@instrumented_cache = value; end
703
+ def self.file_cache; @@file_cache; end
704
+ def self.file_cache=(value); @@file_cache = value; end
453
705
  def self.instrument_script(file_text, path, bool); "#"; end
454
706
  end
455
707
  start("cosmos.rb")
@@ -467,9 +719,12 @@ module Cosmos
467
719
  it "requires a script within ScriptRunnerFrame" do
468
720
  class ScriptRunnerFrame
469
721
  @@instrumented_cache = {}
722
+ @@file_cache = {}
470
723
  def self.instance; true; end
471
724
  def self.instrumented_cache; @@instrumented_cache; end
472
725
  def self.instrumented_cache=(value); @@instrumented_cache = value; end
726
+ def self.file_cache; @@file_cache; end
727
+ def self.file_cache=(value); @@file_cache = value; end
473
728
  def self.instrument_script(file_text, path, bool); "#"; end
474
729
  end
475
730
  allow(ScriptRunnerFrame).to receive_message_chain(:instance, :use_instrumentation)
@@ -14,18 +14,16 @@ require 'cosmos/script/script'
14
14
  require 'tempfile'
15
15
 
16
16
  module Cosmos
17
-
18
17
  describe Script do
19
-
20
18
  before(:all) do
21
- cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
- FileUtils.mkdir_p(File.dirname(cts))
23
- File.open(cts,'w') do |file|
19
+ @cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
20
+ FileUtils.mkdir_p(File.dirname(@cts))
21
+ File.open(@cts,'w') do |file|
24
22
  file.puts 'INTERFACE INST_INT interface.rb'
25
23
  file.puts 'TARGET INST'
24
+ file.puts 'PROTOCOL READ override_protocol.rb'
26
25
  end
27
26
  System.class_eval('@@instance = nil')
28
-
29
27
  require 'cosmos/script'
30
28
  end
31
29
 
@@ -65,7 +63,7 @@ module Cosmos
65
63
  end
66
64
  end
67
65
 
68
- describe "set_tlm, set_tlm_raw" do
66
+ describe "set_tlm, set_tlm_raw, override_tlm_raw" do
69
67
  it "passes through to the cmd_tlm_server" do
70
68
  expect {
71
69
  set_tlm("INST HEALTH_STATUS TEMP3 = 1")
@@ -91,6 +89,12 @@ module Cosmos
91
89
  expect(tlm_raw("INST HEALTH_STATUS ASCIICMD")).to eql 'Hello World'
92
90
  set_tlm_raw("INST HEALTH_STATUS ASCIICMD='Hello = World'")
93
91
  expect(tlm_raw("INST HEALTH_STATUS ASCIICMD")).to eql 'Hello = World'
92
+ override_tlm_raw("INST HEALTH_STATUS TEMP3 = 0")
93
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD = 'Hi'")
94
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD ='Hello'")
95
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD= 'Hello World'")
96
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD='Hello World'")
97
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD='Hello = World'")
94
98
  }.to_not raise_error
95
99
  end
96
100
 
@@ -99,6 +103,12 @@ module Cosmos
99
103
  expect { set_tlm("INST HEALTH_STATUS = 5") }.to raise_error(/#{error_msg}/)
100
104
  expect { set_tlm("INST HEALTH_STATUS TEMP3") }.to raise_error(/#{error_msg}/)
101
105
  expect { set_tlm("INST HEALTH_STATUS TEMP3 = ") }.to raise_error(/#{error_msg}/)
106
+ expect { set_tlm_raw("INST HEALTH_STATUS = 5") }.to raise_error(/#{error_msg}/)
107
+ expect { set_tlm_raw("INST HEALTH_STATUS TEMP3") }.to raise_error(/#{error_msg}/)
108
+ expect { set_tlm_raw("INST HEALTH_STATUS = 5") }.to raise_error(/#{error_msg}/)
109
+ expect { override_tlm_raw("INST HEALTH_STATUS TEMP3") }.to raise_error(/#{error_msg}/)
110
+ expect { override_tlm_raw("INST HEALTH_STATUS TEMP3 = ") }.to raise_error(/#{error_msg}/)
111
+ expect { override_tlm_raw("INST HEALTH_STATUS TEMP3 = ") }.to raise_error(/#{error_msg}/)
102
112
  end
103
113
  end
104
114
 
@@ -160,7 +170,5 @@ module Cosmos
160
170
  unsubscribe_packet_data(id)
161
171
  end
162
172
  end
163
-
164
173
  end
165
174
  end
166
-
@@ -11,14 +11,16 @@
11
11
  # Redefine Object.load so simplecov doesn't overwrite the results after
12
12
  # re-loading a file during test.
13
13
  def load(file, wrap = false)
14
- SimpleCov.start do
15
- command_name "#{command_name}1"
14
+ if defined? SimpleCov
15
+ SimpleCov.start do
16
+ command_name "#{command_name}1"
17
+ end
16
18
  end
17
19
  Kernel.load(file, wrap)
18
20
  end
19
21
 
20
22
  # NOTE: You MUST require simplecov before anything else!
21
- unless ENV['COSMOS_NO_SIMPLECOV']
23
+ if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_SIMPLECOV']
22
24
  require 'simplecov'
23
25
  require 'coveralls'
24
26
  Coveralls.wear!
@@ -45,7 +47,7 @@ unless ENV['COSMOS_NO_SIMPLECOV']
45
47
  end
46
48
  end
47
49
  require 'rspec'
48
- require 'ruby-prof'
50
+ require 'ruby-prof' if RUBY_ENGINE == 'ruby'
49
51
  require 'benchmark/ips'
50
52
 
51
53
  # Set the user path to our COSMOS configuration in the spec directory
@@ -85,18 +87,32 @@ RSpec.configure do |config|
85
87
  Cosmos.disable_warnings do
86
88
  Object.const_set(:STDOUT, $saved_stdout_const)
87
89
  end
88
- # Kill any leftover threads
89
- if Thread.list.length > 1
90
- Thread.list.each do |t|
91
- t.kill if t != Thread.current
90
+ if RUBY_ENGINE == 'ruby'
91
+ # Kill any leftover threads
92
+ if Thread.list.length > 1
93
+ Thread.list.each do |t|
94
+ t.kill if t != Thread.current
95
+ end
96
+ sleep(0.2)
97
+ end
98
+ else
99
+ # Kill any leftover threads
100
+ if Thread.list.length > 2
101
+ Thread.list[2..-1].each do |t|
102
+ t.kill if t != Thread.current
103
+ end
104
+ sleep(0.2)
92
105
  end
93
- sleep(0.2)
94
106
  end
95
107
  end
96
108
 
97
109
  config.after(:each) do
98
110
  # Make sure we didn't leave any lingering threads
99
- expect(Thread.list.length).to eql(1)
111
+ if RUBY_ENGINE == 'ruby'
112
+ expect(Thread.list.length).to eql(1), "At end of test expect 1 remaining thread but found #{Thread.list.length}.\nEnsure you kill all spawned threads before the test finishes."
113
+ else
114
+ expect(Thread.list.length).to be <= 2, "At end of test expect 2 remaining thread but found #{Thread.list.length}.\nEnsure you kill all spawned threads before the test finishes."
115
+ end
100
116
  end
101
117
  end
102
118