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
@@ -37,25 +37,25 @@ module Cosmos
37
37
  config = CmdTlmServerConfig.new(tf.path)
38
38
  cmd = Commanding.new(config)
39
39
  interfaces = Interfaces.new(config)
40
- interfaces.map_target("COSMOS","MY_INT")
40
+ interfaces.map_target("SYSTEM","MY_INT")
41
41
  expect(interfaces.all["MY_INT"]).to receive(:write)
42
42
  expect(interfaces.all["MY_INT"].packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
43
43
 
44
44
  # Grab an existing packet
45
- pkt = System.commands.packet('COSMOS','STARTLOGGING')
45
+ pkt = System.commands.packet('SYSTEM','STARTLOGGING')
46
46
  # Restore defaults so it can be identified
47
47
  pkt.restore_defaults
48
48
  # Set the target_name to nil to make it "unidentified"
49
49
  pkt.target_name = nil
50
50
 
51
- count = System.targets['COSMOS'].cmd_cnt
52
- cmd.send_command_to_target('COSMOS', pkt)
53
- # Verify the COSMOS STARTLOGGING packet has been updated
54
- expect(System.commands.packet("COSMOS","STARTLOGGING").buffer).to eql pkt.buffer
51
+ count = System.targets['SYSTEM'].cmd_cnt
52
+ cmd.send_command_to_target('SYSTEM', pkt)
53
+ # Verify the SYSTEM STARTLOGGING packet has been updated
54
+ expect(System.commands.packet("SYSTEM","STARTLOGGING").buffer).to eql pkt.buffer
55
55
  # Verify the target count didn't get updated
56
- expect(System.targets['COSMOS'].cmd_cnt).to eq count
56
+ expect(System.targets['SYSTEM'].cmd_cnt).to eq count
57
57
  # Restore target name
58
- pkt.target_name = 'COSMOS'
58
+ pkt.target_name = 'SYSTEM'
59
59
  tf.unlink
60
60
  end
61
61
 
@@ -66,18 +66,18 @@ module Cosmos
66
66
  config = CmdTlmServerConfig.new(tf.path)
67
67
  cmd = Commanding.new(config)
68
68
  interfaces = Interfaces.new(config)
69
- interfaces.map_target("COSMOS","MY_INT")
69
+ interfaces.map_target("SYSTEM","MY_INT")
70
70
  expect(interfaces.all["MY_INT"]).to receive(:write)
71
71
  expect(interfaces.all["MY_INT"].packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
72
72
 
73
73
  # Grab an existing packet
74
- pkt = System.commands.packet('COSMOS','STARTLOGGING')
74
+ pkt = System.commands.packet('SYSTEM','STARTLOGGING')
75
75
 
76
- count = System.targets['COSMOS'].cmd_cnt
77
- cmd.send_command_to_target('COSMOS', pkt)
78
- # Verify the COSMOS STARTLOGGING packet has been updated
79
- expect(System.commands.packet("COSMOS","STARTLOGGING").buffer).to eql pkt.buffer
80
- expect(System.targets['COSMOS'].cmd_cnt).to eq count + 1
76
+ count = System.targets['SYSTEM'].cmd_cnt
77
+ cmd.send_command_to_target('SYSTEM', pkt)
78
+ # Verify the SYSTEM STARTLOGGING packet has been updated
79
+ expect(System.commands.packet("SYSTEM","STARTLOGGING").buffer).to eql pkt.buffer
80
+ expect(System.targets['SYSTEM'].cmd_cnt).to eq count + 1
81
81
  tf.unlink
82
82
  end
83
83
 
@@ -93,18 +93,18 @@ module Cosmos
93
93
  config = CmdTlmServerConfig.new(tf.path)
94
94
  cmd = Commanding.new(config)
95
95
  interfaces = Interfaces.new(config)
96
- interfaces.map_target("COSMOS","MY_INT")
96
+ interfaces.map_target("SYSTEM","MY_INT")
97
97
  expect(interfaces.all["MY_INT"]).to receive(:write)
98
98
  expect(interfaces.all["MY_INT"].packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
99
99
 
100
100
  # Grab an existing packet
101
- pkt = System.commands.packet('COSMOS','STARTLOGGING')
101
+ pkt = System.commands.packet('SYSTEM','STARTLOGGING')
102
102
  # Mess up the opcode so it won't be identifyable
103
103
  pkt.write('OPCODE',100)
104
104
  # Set the target_name to nil to make it "unidentified"
105
105
  pkt.target_name = nil
106
106
 
107
- cmd.send_command_to_target('COSMOS', pkt)
107
+ cmd.send_command_to_target('SYSTEM', pkt)
108
108
  # Verify the unknown packet has been updated
109
109
  expect(System.commands.packet("UNKNOWN","UNKNOWN").buffer).to eql pkt.buffer
110
110
  tf.unlink
@@ -59,10 +59,18 @@ module Cosmos
59
59
  thread = InterfaceThread.new(@interface)
60
60
  thread.start
61
61
  sleep 0.1
62
- expect(Thread.list.length).to eql(2)
62
+ if RUBY_ENGINE == 'ruby'
63
+ expect(Thread.list.length).to eql(2)
64
+ else
65
+ expect(Thread.list.length).to eql(3)
66
+ end
63
67
  thread.stop
64
68
  sleep 0.2
65
- expect(Thread.list.length).to eql(1)
69
+ if RUBY_ENGINE == 'ruby'
70
+ expect(Thread.list.length).to eql(1)
71
+ else
72
+ expect(Thread.list.length).to eql(2)
73
+ end
66
74
 
67
75
  expect(stdout.string).to match "Connection Failed: RuntimeError : ConnectError"
68
76
  end
@@ -74,8 +82,8 @@ module Cosmos
74
82
  allow(@interface).to receive(:connect) { raise "ConnectError" }
75
83
  # Make the reconnect_delay be slightly longer than half of 0.1 which is
76
84
  # how long the test is waiting after calling start. This allows us to
77
- # create see the error twice.
78
- @interface.reconnect_delay = 0.06
85
+ # see the error twice.
86
+ @interface.reconnect_delay = 0.15
79
87
  thread = InterfaceThread.new(@interface)
80
88
  error_count = 0
81
89
  thread.connection_failed_callback = Proc.new do |error|
@@ -83,11 +91,19 @@ module Cosmos
83
91
  error_count += 1
84
92
  end
85
93
  thread.start
86
- sleep 0.1
87
- expect(Thread.list.length).to eql(2)
94
+ sleep 0.2
95
+ if RUBY_ENGINE == 'ruby'
96
+ expect(Thread.list.length).to eql(2)
97
+ else
98
+ expect(Thread.list.length).to eql(3)
99
+ end
88
100
  thread.stop
89
101
  sleep 0.2
90
- expect(Thread.list.length).to eql(1)
102
+ if RUBY_ENGINE == 'ruby'
103
+ expect(Thread.list.length).to eql(1)
104
+ else
105
+ expect(Thread.list.length).to eql(2)
106
+ end
91
107
  expect(error_count).to eql 2
92
108
 
93
109
  expect(stdout.string).not_to match "Connection Failed: ConnectError"
@@ -99,10 +115,18 @@ module Cosmos
99
115
  thread = InterfaceThread.new(@interface)
100
116
  thread.start
101
117
  sleep 0.1
102
- expect(Thread.list.length).to eql(2)
118
+ if RUBY_ENGINE == 'ruby'
119
+ expect(Thread.list.length).to eql(2)
120
+ else
121
+ expect(Thread.list.length).to eql(3)
122
+ end
103
123
  thread.stop
104
124
  sleep 0.2
105
- expect(Thread.list.length).to eql(1)
125
+ if RUBY_ENGINE == 'ruby'
126
+ expect(Thread.list.length).to eql(1)
127
+ else
128
+ expect(Thread.list.length).to eql(2)
129
+ end
106
130
 
107
131
  expect(stdout.string).to match "Connection Success"
108
132
  end
@@ -117,10 +141,18 @@ module Cosmos
117
141
  end
118
142
  thread.start
119
143
  sleep 0.1
120
- expect(Thread.list.length).to eql(2)
144
+ if RUBY_ENGINE == 'ruby'
145
+ expect(Thread.list.length).to eql(2)
146
+ else
147
+ expect(Thread.list.length).to eql(3)
148
+ end
121
149
  thread.stop
122
150
  sleep 0.2
123
- expect(Thread.list.length).to eql(1)
151
+ if RUBY_ENGINE == 'ruby'
152
+ expect(Thread.list.length).to eql(1)
153
+ else
154
+ expect(Thread.list.length).to eql(2)
155
+ end
124
156
  expect(callback_called).to be true
125
157
 
126
158
  expect(stdout.string).not_to match "Connection Success"
@@ -137,10 +169,18 @@ module Cosmos
137
169
  thread = InterfaceThread.new(@interface)
138
170
  thread.start
139
171
  sleep 0.1
140
- expect(Thread.list.length).to eql(2)
172
+ if RUBY_ENGINE == 'ruby'
173
+ expect(Thread.list.length).to eql(2)
174
+ else
175
+ expect(Thread.list.length).to eql(3)
176
+ end
141
177
  thread.stop
142
178
  sleep 0.2
143
- expect(Thread.list.length).to eql(1)
179
+ if RUBY_ENGINE == 'ruby'
180
+ expect(Thread.list.length).to eql(1)
181
+ else
182
+ expect(Thread.list.length).to eql(2)
183
+ end
144
184
 
145
185
  expect(stdout.string).to match "Connection Lost"
146
186
  end
@@ -159,10 +199,18 @@ module Cosmos
159
199
  sleep 1
160
200
  # Since we set auto_reconnect to false we shouldn't see the interface
161
201
  # thread because it will be killed
162
- expect(Thread.list.length).to eql(1)
202
+ if RUBY_ENGINE == 'ruby'
203
+ expect(Thread.list.length).to eql(1)
204
+ else
205
+ expect(Thread.list.length).to eql(2)
206
+ end
163
207
  thread.stop
164
208
  sleep 0.2
165
- expect(Thread.list.length).to eql(1)
209
+ if RUBY_ENGINE == 'ruby'
210
+ expect(Thread.list.length).to eql(1)
211
+ else
212
+ expect(Thread.list.length).to eql(2)
213
+ end
166
214
  expect(callback_called).to be true
167
215
 
168
216
  expect(stdout.string).not_to match "Connection Lost"
@@ -175,11 +223,18 @@ module Cosmos
175
223
  thread = InterfaceThread.new(@interface)
176
224
  thread.start
177
225
  sleep 0.1
178
- expect(Thread.list.length).to eql(2)
226
+ if RUBY_ENGINE == 'ruby'
227
+ expect(Thread.list.length).to eql(2)
228
+ else
229
+ expect(Thread.list.length).to eql(3)
230
+ end
179
231
  thread.stop
180
232
  sleep 0.2
181
- expect(Thread.list.length).to eql(1)
182
-
233
+ if RUBY_ENGINE == 'ruby'
234
+ expect(Thread.list.length).to eql(1)
235
+ else
236
+ expect(Thread.list.length).to eql(2)
237
+ end
183
238
  expect(stdout.string).to match "ReadError"
184
239
  end
185
240
  end
@@ -194,10 +249,18 @@ module Cosmos
194
249
  thread = InterfaceThread.new(@interface)
195
250
  thread.start
196
251
  sleep 0.1
197
- expect(Thread.list.length).to eql(2)
252
+ if RUBY_ENGINE == 'ruby'
253
+ expect(Thread.list.length).to eql(2)
254
+ else
255
+ expect(Thread.list.length).to eql(3)
256
+ end
198
257
  thread.stop
199
258
  sleep 0.2
200
- expect(Thread.list.length).to eql(1)
259
+ if RUBY_ENGINE == 'ruby'
260
+ expect(Thread.list.length).to eql(1)
261
+ else
262
+ expect(Thread.list.length).to eql(2)
263
+ end
201
264
 
202
265
  expect(stdout.string).to match "ECONNRESET"
203
266
  end
@@ -241,10 +304,18 @@ module Cosmos
241
304
  thread = InterfaceThread.new(@interface)
242
305
  thread.start
243
306
  sleep 0.1
244
- expect(Thread.list.length).to eql(2)
307
+ if RUBY_ENGINE == 'ruby'
308
+ expect(Thread.list.length).to eql(2)
309
+ else
310
+ expect(Thread.list.length).to eql(3)
311
+ end
245
312
  thread.stop
246
313
  sleep 0.2
247
- expect(Thread.list.length).to eql(1)
314
+ if RUBY_ENGINE == 'ruby'
315
+ expect(Thread.list.length).to eql(1)
316
+ else
317
+ expect(Thread.list.length).to eql(2)
318
+ end
248
319
 
249
320
  expect(stdout.string).to match "Unknown 2 byte packet"
250
321
  end
@@ -258,10 +329,19 @@ module Cosmos
258
329
  thread = InterfaceThread.new(@interface)
259
330
  thread.start
260
331
  sleep 0.1
261
- expect(Thread.list.length).to eql(2)
332
+
333
+ if RUBY_ENGINE == 'ruby'
334
+ expect(Thread.list.length).to eql(2)
335
+ else
336
+ expect(Thread.list.length).to eql(3)
337
+ end
262
338
  thread.stop
263
339
  sleep 0.2
264
- expect(Thread.list.length).to eql(1)
340
+ if RUBY_ENGINE == 'ruby'
341
+ expect(Thread.list.length).to eql(1)
342
+ else
343
+ expect(Thread.list.length).to eql(2)
344
+ end
265
345
  expect(stdout.string).to match "Received unknown identified telemetry: BOB SMITH"
266
346
  end
267
347
  end
@@ -277,10 +357,18 @@ module Cosmos
277
357
  thread = InterfaceThread.new(@interface)
278
358
  thread.start
279
359
  sleep 0.1
280
- expect(Thread.list.length).to eql(2)
360
+ if RUBY_ENGINE == 'ruby'
361
+ expect(Thread.list.length).to eql(2)
362
+ else
363
+ expect(Thread.list.length).to eql(3)
364
+ end
281
365
  thread.stop
282
366
  sleep 0.2
283
- expect(Thread.list.length).to eql(1)
367
+ if RUBY_ENGINE == 'ruby'
368
+ expect(Thread.list.length).to eql(1)
369
+ else
370
+ expect(Thread.list.length).to eql(2)
371
+ end
284
372
 
285
373
  expect(stdout.string).to match "Problem writing to router"
286
374
  end
@@ -294,13 +382,20 @@ module Cosmos
294
382
  threads = Thread.list.length
295
383
  thread.start
296
384
  sleep 0.1
297
- expect(Thread.list.length).to eql(2)
385
+ if RUBY_ENGINE == 'ruby'
386
+ expect(Thread.list.length).to eql(2)
387
+ else
388
+ expect(Thread.list.length).to eql(3)
389
+ end
298
390
  thread.stop
299
391
  sleep 0.2
300
- expect(Thread.list.length).to eql(1)
392
+ if RUBY_ENGINE == 'ruby'
393
+ expect(Thread.list.length).to eql(1)
394
+ else
395
+ expect(Thread.list.length).to eql(2)
396
+ end
301
397
  end
302
398
 
303
399
  end
304
400
  end
305
401
  end
306
-
@@ -77,8 +77,8 @@ module Cosmos
77
77
  tf.puts 'INTERFACE MY_INT interface.rb'
78
78
  tf.close
79
79
  interfaces = Interfaces.new(CmdTlmServerConfig.new(tf.path))
80
- interfaces.map_target("COSMOS","MY_INT")
81
- expect(System.targets["COSMOS"].interface.name).to eql "MY_INT"
80
+ interfaces.map_target("SYSTEM","MY_INT")
81
+ expect(System.targets["SYSTEM"].interface.name).to eql "MY_INT"
82
82
  tf.unlink
83
83
  end
84
84
  end
@@ -0,0 +1,145 @@
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'
13
+ require 'cosmos/tools/cmd_tlm_server/limits_groups_background_task'
14
+
15
+ module Cosmos
16
+ describe LimitsGroupsBackgroundTask do
17
+ before(:each) do
18
+ (1..4).each do |i|
19
+ System.telemetry.packet("INST","HEALTH_STATUS").get_item("TEMP#{i}").limits.enabled = true
20
+ end
21
+ end
22
+
23
+ describe "initialize" do
24
+ it "initializes local variables" do
25
+ b1 = LimitsGroupsBackgroundTask.new
26
+ expect(b1.name).to eq "Limits Groups"
27
+ expect(b1.thread).to be_nil
28
+ expect(b1.status).to eq ''
29
+ expect(b1.stopped).to eq false
30
+ expect(b1.groups).to eq %w(FIRST SECOND)
31
+ end
32
+ end
33
+
34
+ describe "call" do
35
+ it "raises an error if the group is not defined" do
36
+ class MyLimitsGroups1 < LimitsGroupsBackgroundTask
37
+ def check_blah
38
+ end
39
+ end
40
+ expect { MyLimitsGroups1.new.call }.to raise_error(/check_blah doesn't match a group name/)
41
+ end
42
+
43
+ it "requires a floating point delay parameter" do
44
+ class MyLimitsGroups1 < LimitsGroupsBackgroundTask
45
+ end
46
+ expect { MyLimitsGroups1.new("HI") }.to raise_error(/invalid value for Float/)
47
+ end
48
+
49
+ it "delays before processing the groups" do
50
+ class MyLimitsGroups2 < LimitsGroupsBackgroundTask
51
+ attr_accessor :called
52
+ def check_first
53
+ @called = Time.now
54
+ end
55
+ end
56
+ my = MyLimitsGroups2.new(2.1)
57
+ thread = Thread.new do
58
+ my.call
59
+ end
60
+ sleep 2.2
61
+ expect(Time.now - my.called).to be < 0.15
62
+ Cosmos.kill_thread(self, thread)
63
+ end
64
+
65
+ it "processes the check methods at 1Hz" do
66
+ class MyLimitsGroups3 < LimitsGroupsBackgroundTask
67
+ attr_accessor :first_count, :second_count, :on_logic, :off_logic
68
+ def initialize
69
+ super()
70
+ @first_count = 0
71
+ @second_count = 0
72
+ @on_logic = false
73
+ @off_logic = false
74
+ @on = Proc.new { @on_logic = true }
75
+ @off = Proc.new { @off_logic = true }
76
+ end
77
+ def check_first
78
+ @first_count += 1
79
+ process_group(2, @on, @off) do
80
+ @first_count <= 4 ? true : false
81
+ end
82
+ end
83
+ def check_second
84
+ @second_count += 1
85
+ process_group { false } # Never enable
86
+ end
87
+ end
88
+ my = MyLimitsGroups3.new
89
+ thread = Thread.new do
90
+ my.call
91
+ end
92
+ sleep 0.1
93
+ p = System.telemetry.packet("INST","HEALTH_STATUS")
94
+ # First group is enabled
95
+ expect(p.get_item("TEMP1").limits.enabled).to be true
96
+ expect(p.get_item("TEMP3").limits.enabled).to be true
97
+ # Second group is disabled
98
+ expect(p.get_item("TEMP2").limits.enabled).to be false
99
+ expect(p.get_item("TEMP4").limits.enabled).to be false
100
+ expect(my.on_logic).to be false
101
+ expect(my.off_logic).to be false
102
+ # Things not in a group are enabled
103
+ expect(p.get_item("GROUND1STATUS").limits.enabled).to be true
104
+ expect(p.get_item("GROUND2STATUS").limits.enabled).to be true
105
+
106
+ sleep 3.1 # Allow the logic to enable
107
+ expect(p.get_item("TEMP1").limits.enabled).to be true
108
+ expect(p.get_item("TEMP3").limits.enabled).to be true
109
+ expect(p.get_item("TEMP2").limits.enabled).to be false
110
+ expect(p.get_item("TEMP4").limits.enabled).to be false
111
+ expect(my.on_logic).to be true # on logic was called
112
+ expect(my.off_logic).to be false # off logic not yet called
113
+
114
+ sleep 2.1 # Allow the logic to disable
115
+ expect(p.get_item("TEMP1").limits.enabled).to be false
116
+ expect(p.get_item("TEMP3").limits.enabled).to be false
117
+ expect(p.get_item("TEMP2").limits.enabled).to be false
118
+ expect(p.get_item("TEMP4").limits.enabled).to be false
119
+ expect(my.on_logic).to be true
120
+ expect(my.off_logic).to be true # off logic called
121
+
122
+ Cosmos.kill_thread(self, thread)
123
+ expect(my.first_count).to be >= 5
124
+ expect(my.second_count).to be >= 5
125
+ end
126
+
127
+ it "reports how long it took to process" do
128
+ class MyLimitsGroups4 < LimitsGroupsBackgroundTask
129
+ def check_first
130
+ sleep 0.2
131
+ end
132
+ end
133
+
134
+ Thread.abort_on_exception = true
135
+ my = MyLimitsGroups4.new
136
+ thread = Thread.new do
137
+ my.call
138
+ end
139
+ sleep 0.3
140
+ expect(my.status).to match /Checking groups took 0.\d+/
141
+ Cosmos.kill_thread(self, thread)
142
+ end
143
+ end
144
+ end
145
+ end