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
@@ -29,10 +29,8 @@ module Cosmos
29
29
  attr_accessor :background_tasks
30
30
  # @return [String] Command and Telemetry Server title
31
31
  attr_accessor :title
32
- # @return [String or nil] Meta Target Name
33
- attr_accessor :meta_target_name
34
- # @return [String or nil] Meta Packet Name
35
- attr_accessor :meta_packet_name
32
+ # @return [Boolean] Flag indicating if meta data should be collected
33
+ attr_accessor :metadata
36
34
 
37
35
  # Create a default pair of packet log writers and parses the
38
36
  # configuration file.
@@ -42,13 +40,12 @@ module Cosmos
42
40
  @interfaces = {}
43
41
  @routers = {}
44
42
  @packet_log_writer_pairs = {}
45
- cmd_log_writer = System.default_packet_log_writer.new(:CMD)
46
- tlm_log_writer = System.default_packet_log_writer.new(:TLM)
43
+ cmd_log_writer = System.default_packet_log_writer.new(:CMD, *System.default_packet_log_writer_params)
44
+ tlm_log_writer = System.default_packet_log_writer.new(:TLM, *System.default_packet_log_writer_params)
47
45
  @packet_log_writer_pairs['DEFAULT'] = PacketLogWriterPair.new(cmd_log_writer, tlm_log_writer)
48
46
  @background_tasks = []
49
47
  @title = nil
50
- @meta_target_name = nil
51
- @meta_packet_name = nil
48
+ @metadata = false
52
49
  process_file(filename)
53
50
  end
54
51
 
@@ -67,7 +64,7 @@ module Cosmos
67
64
  Logger.info "Processing CmdTlmServer configuration in file: #{File.expand_path(filename)}"
68
65
 
69
66
  Cosmos.set_working_dir do
70
- parser = ConfigParser.new
67
+ parser = ConfigParser.new("http://cosmosrb.com/docs/system/#command-and-telemetry-server-configuration")
71
68
  parser.parse_file(filename) do |keyword, params|
72
69
  case keyword
73
70
  when 'TITLE'
@@ -145,7 +142,7 @@ module Cosmos
145
142
  current_interface_or_router.name = interface_name
146
143
  @interfaces[interface_name] = current_interface_or_router
147
144
 
148
- when 'LOG', 'DONT_LOG', 'TARGET'
145
+ when 'LOG', 'DONT_LOG', 'TARGET', 'PROTOCOL'
149
146
  raise parser.error("No current interface for #{keyword}") unless current_interface_or_router and current_type == :INTERFACE
150
147
 
151
148
  case keyword
@@ -173,6 +170,19 @@ module Cosmos
173
170
  raise parser.error("Unknown target #{target_name} mapped to interface #{current_interface_or_router.name}")
174
171
  end
175
172
 
173
+ when 'PROTOCOL'
174
+ usage = "#{keyword} <READ WRITE READ_WRITE> <protocol filename or classname> <Protocol specific parameters>"
175
+ parser.verify_num_parameters(2, nil, usage)
176
+ unless %w(READ WRITE READ_WRITE).include? params[0].upcase
177
+ raise parser.error("Invalid protocol type: #{params[0]}", usage)
178
+ end
179
+ begin
180
+ klass = Cosmos.require_class(params[1])
181
+ current_interface_or_router.add_protocol(klass, params[2..-1], params[0].upcase.intern)
182
+ rescue LoadError, StandardError => error
183
+ raise parser.error(error.message, usage)
184
+ end
185
+
176
186
  end # end case keyword for all keywords that require a current interface
177
187
 
178
188
  when 'DONT_CONNECT', 'DONT_RECONNECT', 'RECONNECT_DELAY', 'DISABLE_DISCONNECT', 'LOG_RAW', 'ROUTER_LOG_RAW', 'OPTION'
@@ -249,12 +259,9 @@ module Cosmos
249
259
  raise parser.error("No BACKGROUND_TASK defined") if @background_tasks.empty?
250
260
  @background_tasks[-1].stopped = true
251
261
 
252
- # TODO: Deprecate COLLECT_META_DATA
253
- when 'COLLECT_METADATA', 'COLLECT_META_DATA'
254
- parser.verify_num_parameters(2, 2, "#{keyword} <Metadata Target Name> <Metadata Packet Name>")
255
- System.telemetry.packet(params[0], params[1])
256
- @meta_target_name = params[0]
257
- @meta_packet_name = params[1]
262
+ when 'COLLECT_METADATA'
263
+ parser.verify_num_parameters(0, 0, "#{keyword}")
264
+ @metadata = true
258
265
 
259
266
  else
260
267
  # blank lines will have a nil keyword and should not raise an exception
@@ -10,15 +10,68 @@
10
10
 
11
11
  require 'cosmos'
12
12
  require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server'
13
- require 'cosmos/tools/cmd_tlm_server/gui/interfaces_tab'
14
- require 'cosmos/tools/cmd_tlm_server/gui/targets_tab'
15
- require 'cosmos/tools/cmd_tlm_server/gui/packets_tab'
16
- require 'cosmos/tools/cmd_tlm_server/gui/logging_tab'
17
- require 'cosmos/tools/cmd_tlm_server/gui/status_tab'
18
- require 'cosmos/gui/qt_tool'
19
- require 'cosmos/gui/dialogs/splash'
20
- require 'cosmos/gui/dialogs/exception_dialog'
21
- require 'cosmos/gui/dialogs/set_tlm_dialog'
13
+ if RUBY_ENGINE == 'ruby'
14
+ require 'cosmos/tools/cmd_tlm_server/gui/interfaces_tab'
15
+ require 'cosmos/tools/cmd_tlm_server/gui/targets_tab'
16
+ require 'cosmos/tools/cmd_tlm_server/gui/packets_tab'
17
+ require 'cosmos/tools/cmd_tlm_server/gui/logging_tab'
18
+ require 'cosmos/tools/cmd_tlm_server/gui/status_tab'
19
+ require 'cosmos/gui/qt_tool'
20
+ require 'cosmos/gui/dialogs/splash'
21
+ require 'cosmos/gui/dialogs/exception_dialog'
22
+ require 'cosmos/gui/dialogs/set_tlm_dialog'
23
+ else
24
+ # The following stubs allow the CmdTlmServer to run under JRuby with no gui
25
+ require 'ostruct'
26
+ require 'optparse'
27
+
28
+ class QtTool
29
+ def self.slots(*args)
30
+ # Do nothing
31
+ end
32
+
33
+ def self.create_default_options
34
+ options = OpenStruct.new
35
+ options.redirect_io = true
36
+ options.title = "COSMOS Tool"
37
+ parser = OptionParser.new do |option_parser|
38
+ option_parser.banner = "Usage: ruby #{option_parser.program_name} [options]"
39
+ option_parser.separator("")
40
+
41
+ # Create the help option
42
+ option_parser.on("-h", "--help", "Show this message") do
43
+ puts option_parser
44
+ exit
45
+ end
46
+
47
+ # Create the version option
48
+ option_parser.on("-v", "--version", "Show version") do
49
+ puts "COSMOS Version: #{COSMOS_VERSION}"
50
+ puts "User Version: #{USER_VERSION}" if defined? USER_VERSION
51
+ exit
52
+ end
53
+
54
+ # Create the system option
55
+ option_parser.on("--system FILE", "Use an alternative system.txt file") do |arg|
56
+ System.instance(File.join(USERPATH, 'config', 'system', arg))
57
+ end
58
+ option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
59
+ options.config_file = arg
60
+ end
61
+ end
62
+
63
+ return parser, options
64
+ end
65
+
66
+ def self.run(option_parser = nil, options = nil)
67
+ Cosmos.set_working_dir do
68
+ option_parser, options = create_default_options() unless option_parser and options
69
+ option_parser.parse!(ARGV)
70
+ post_options_parsed_hook(options)
71
+ end
72
+ end
73
+ end
74
+ end
22
75
 
23
76
  module Cosmos
24
77
 
@@ -34,18 +87,22 @@ module Cosmos
34
87
 
35
88
  TOOL_NAME = "Command and Telemetry Server"
36
89
 
37
- # For the CTS we display all the tables as full size
38
- # Thus we don't want the table to absorb the scroll wheel events but
39
- # instead pass them up to the container so the entire window will scroll.
40
- class Qt::TableWidget
41
- def wheelEvent(event)
42
- event.ignore()
90
+ attr_writer :no_prompt
91
+
92
+ if RUBY_ENGINE == 'ruby'
93
+ # For the CTS we display all the tables as full size
94
+ # Thus we don't want the table to absorb the scroll wheel events but
95
+ # instead pass them up to the container so the entire window will scroll.
96
+ class Qt::TableWidget
97
+ def wheelEvent(event)
98
+ event.ignore()
99
+ end
43
100
  end
44
101
  end
45
102
 
46
- def meta_callback(meta_target_name, meta_packet_name)
103
+ def meta_callback
47
104
  Qt.execute_in_main_thread(true) do
48
- result = SetTlmDialog.execute(self, 'Enter Metadata', 'Set Metadata', 'Cancel', meta_target_name, meta_packet_name)
105
+ result = SetTlmDialog.execute(self, 'Enter Metadata', 'Set Metadata', 'Cancel', 'SYSTEM', 'META')
49
106
  exit(1) unless result
50
107
  end
51
108
  end
@@ -59,7 +116,7 @@ module Cosmos
59
116
  @message_log = nil
60
117
  @output_sleeper = Sleeper.new
61
118
  @first_output = 0
62
- @interfaces_tab = InterfacesTab.new
119
+ @interfaces_tab = InterfacesTab.new(self)
63
120
  @targets_tab = TargetsTab.new
64
121
  @packets_tab = PacketsTab.new(self)
65
122
  @logging_tab = LoggingTab.new(@production)
@@ -223,9 +280,9 @@ module Cosmos
223
280
  @tab_thread = Thread.new do
224
281
  begin
225
282
  while true
226
- start_time = Time.now
283
+ start_time = Time.now.sys
227
284
  Qt.execute_in_main_thread(true) { @status_tab.update }
228
- total_time = Time.now - start_time
285
+ total_time = Time.now.sys - start_time
229
286
  if total_time > 0.0 and total_time < 1.0
230
287
  break if @tab_sleeper.sleep(1.0 - total_time)
231
288
  end
@@ -344,6 +401,8 @@ module Cosmos
344
401
 
345
402
  def self.post_options_parsed_hook(options)
346
403
  if options.no_gui
404
+ ["TERM", "INT"].each {|sig| Signal.trap(sig) {exit}}
405
+
347
406
  begin
348
407
  @output_sleeper = Sleeper.new
349
408
  @string_output = StringIO.new("", "r+")
@@ -367,6 +426,19 @@ module Cosmos
367
426
  end
368
427
  return false
369
428
  else
429
+ ["TERM", "INT"].each do |sig|
430
+ Signal.trap(sig) do
431
+ # No synchronization is allowed in trap context, so we have
432
+ # to spawn a thread here to send the close event.
433
+ Thread.new do
434
+ Qt.execute_in_main_thread(true) do
435
+ @@window.no_prompt = true
436
+ @@window.closeEvent(Qt::CloseEvent.new())
437
+ exit
438
+ end
439
+ end
440
+ end
441
+ end
370
442
  return true
371
443
  end
372
444
  end
@@ -45,7 +45,7 @@ module Cosmos
45
45
  # @param packet [Packet] Packet to send
46
46
  def send_command_to_interface(interface, packet)
47
47
  # Make sure packet received time is set
48
- packet.received_time ||= Time.now
48
+ packet.received_time ||= Time.now.sys
49
49
 
50
50
  unless packet.identified?
51
51
  identified_command = System.commands.identify(packet.buffer, interface.target_names)
@@ -10,6 +10,7 @@
10
10
 
11
11
  require 'cosmos'
12
12
  require 'cosmos/gui/qt'
13
+ require 'cosmos/gui/dialogs/interface_raw_dialog'
13
14
 
14
15
  module Cosmos
15
16
 
@@ -19,7 +20,8 @@ module Cosmos
19
20
  ROUTERS = 'Routers'
20
21
  ALIGN_CENTER = Qt::AlignCenter
21
22
 
22
- def initialize
23
+ def initialize(server_gui)
24
+ @server_gui = server_gui
23
25
  @interfaces_table = {}
24
26
  end
25
27
 
@@ -102,11 +104,11 @@ module Cosmos
102
104
  interfaces_table = Qt::TableWidget.new()
103
105
  interfaces_table.verticalHeader.hide()
104
106
  interfaces_table.setRowCount(interfaces.all.length)
105
- interfaces_table.setColumnCount(10)
107
+ interfaces_table.setColumnCount(11)
106
108
  if name == ROUTERS
107
- interfaces_table.setHorizontalHeaderLabels(["Router", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Pkts Rcvd ", " Pkts Sent "])
109
+ interfaces_table.setHorizontalHeaderLabels(["Router", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Pkts Rcvd ", " Pkts Sent ", "View Raw"])
108
110
  else
109
- interfaces_table.setHorizontalHeaderLabels(["Interface", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Cmd Pkts ", " Tlm Pkts "])
111
+ interfaces_table.setHorizontalHeaderLabels(["Interface", "Connect/Disconnect", "Connected?", "Clients", "Tx Q Size", "Rx Q Size", " Bytes Tx ", " Bytes Rx ", " Cmd Pkts ", " Tlm Pkts ", "View Raw"])
110
112
  end
111
113
 
112
114
  populate_interface_table(name, interfaces, interfaces_table)
@@ -137,6 +139,17 @@ module Cosmos
137
139
  interfaces_table.setItem(row, index, item)
138
140
  index += 1
139
141
  end
142
+ view_raw = Qt::PushButton.new("View Raw")
143
+ view_raw.connect(SIGNAL('clicked()')) do
144
+ @raw_dialogs ||= []
145
+ if name == ROUTERS
146
+ current_interface = CmdTlmServer.routers.all[interface_name]
147
+ else
148
+ current_interface = CmdTlmServer.interfaces.all[interface_name]
149
+ end
150
+ @raw_dialogs << InterfaceRawDialog.new(@server_gui, current_interface)
151
+ end
152
+ interfaces_table.setCellWidget(row, index, view_raw)
140
153
  row += 1
141
154
  end
142
155
  end
@@ -22,9 +22,6 @@ module Cosmos
22
22
  def populate(tab_widget)
23
23
  num_targets = System.targets.length
24
24
  if num_targets > 0
25
- return if num_targets == 1 and System.targets['SYSTEM']
26
- num_targets -= 1 if System.targets['SYSTEM']
27
-
28
25
  scroll = Qt::ScrollArea.new
29
26
  widget = Qt::Widget.new
30
27
  layout = Qt::VBoxLayout.new(widget)
@@ -51,7 +48,6 @@ module Cosmos
51
48
  def update
52
49
  row = 0
53
50
  System.targets.sort.each do |target_name, target|
54
- next if target_name == 'SYSTEM'
55
51
  @targets_table.item(row,2).setText(target.cmd_cnt.to_s)
56
52
  @targets_table.item(row,3).setText(target.tlm_cnt.to_s)
57
53
  row += 1
@@ -63,7 +59,6 @@ module Cosmos
63
59
  def populate_targets_table
64
60
  row = 0
65
61
  System.targets.sort.each do |target_name, target|
66
- next if target_name == 'SYSTEM'
67
62
  target_name_widget = Qt::TableWidgetItem.new(Qt::Object.tr(target_name))
68
63
  target_name_widget.setTextAlignment(Qt::AlignCenter)
69
64
  @targets_table.setItem(row, 0, target_name_widget)
@@ -93,7 +93,7 @@ module Cosmos
93
93
  next
94
94
  end
95
95
  end
96
- packet.received_time = Time.now unless packet.received_time
96
+ packet.received_time = Time.now.sys unless packet.received_time
97
97
  rescue Exception => err
98
98
  handle_connection_lost(err)
99
99
  if @cancel_thread
@@ -179,7 +179,6 @@ module Cosmos
179
179
  Logger.error string
180
180
  end
181
181
 
182
- @interface.post_identify_packet(packet)
183
182
  target = System.targets[packet.target_name]
184
183
  target.tlm_cnt += 1 if target
185
184
  packet.received_count += 1
@@ -114,15 +114,15 @@ module Cosmos
114
114
 
115
115
  # Get info about an interface by name
116
116
  #
117
- # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
118
- # Numeric, Numeric>] Array containing \[state, num_clients,
119
- # write_queue_size, read_queue_size, bytes_written, bytes_read,
117
+ # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
118
+ # Numeric, Numeric>] Array containing \[state, num_clients,
119
+ # write_queue_size, read_queue_size, bytes_written, bytes_read,
120
120
  # write_count, read_count] for the interface
121
121
  def get_info(interface_name)
122
122
  interface = @config.interfaces[interface_name.upcase]
123
123
  raise "Unknown interface: #{interface_name}" unless interface
124
124
 
125
- return [state(interface_name), interface.num_clients,
125
+ return [state(interface_name), interface.num_clients,
126
126
  interface.write_queue_size, interface.read_queue_size,
127
127
  interface.bytes_written, interface.bytes_read,
128
128
  interface.write_count, interface.read_count]
@@ -0,0 +1,121 @@
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 'cosmos/tools/cmd_tlm_server/background_task'
12
+
13
+ module Cosmos
14
+ # Monitors telemetry and enables and disables limits groups
15
+ class LimitsGroupsBackgroundTask < BackgroundTask
16
+ attr_reader :groups
17
+ # Time in the future that we will never hit to allow the logic to work
18
+ FUTURE_TIME = Time.new("3000")
19
+ PAST_TIME = Time.new("1900")
20
+
21
+ def initialize(initial_delay = 0)
22
+ super()
23
+ @initial_delay = Float(initial_delay)
24
+ @name = "Limits Groups"
25
+ @groups = get_limits_groups()
26
+ # Initialize all the group names as instance variables
27
+ @groups.each {|group| self.instance_variable_set("@#{group.downcase}", nil) }
28
+ end
29
+
30
+ # Enables and disables COSMOS limits groups. The group named after the
31
+ # passed group variable is automatically enabled and disabled when the
32
+ # yielded to block returns true and false respectively. In addition, any
33
+ # groups with the same name and a _PRI or _RED extension are also enabled
34
+ # or disabled with the base group.
35
+ #
36
+ # @param delay [Integer] The amount of time to wait after detecting the group
37
+ # power on condition before actually enabling the group. A delay
38
+ # allows time for telemetry to stability to avoid false positives.
39
+ # @param enable_code [Proc] Code to execute when the group is enabled
40
+ # @param disable_code [Proc] Code to execute when the group is disabled
41
+ def process_group(delay = 0, enable_code = nil, disable_code = nil)
42
+ group = calling_method.to_s[6..-1]
43
+
44
+ # Grab the instance variable based on the group name
45
+ var_name = "@#{group}"
46
+ var = self.instance_variable_get(var_name)
47
+ # Yield to the block to perform the telemetry check
48
+ if yield
49
+ # If the instance variable is not set or set in the past
50
+ # (by the disable logic) it means the group isn't enabled
51
+ # so store the current time to allow for an enable delay
52
+ if !var || var == PAST_TIME
53
+ self.instance_variable_set(var_name, Time.now)
54
+ # After setting the variable we need to get it again
55
+ var = self.instance_variable_get(var_name)
56
+ end
57
+ # After the requested delay after power on we enable the group
58
+ if Time.now > (var + delay)
59
+ # Reset the instance variable to a distance future time
60
+ # so it won't satisfy any of the other checks and enable the group
61
+ self.instance_variable_set(var_name, FUTURE_TIME)
62
+ enable_limits_group(group)
63
+ # Call any additional enable code passed to the method
64
+ enable_code.call if enable_code
65
+ end
66
+ else
67
+ # If the instance variable is not set or set in the future
68
+ # (by the enable logic) it means the group isn't disabled
69
+ # Reset the instance variable to a distance past time so it
70
+ # won't satisfy any of the other checks and disable the group
71
+ if !var || var == FUTURE_TIME
72
+ self.instance_variable_set(var_name, PAST_TIME)
73
+ disable_limits_group(group)
74
+ # Call any additional disable code passed to the method
75
+ disable_code.call if disable_code
76
+ end
77
+ end
78
+ end
79
+
80
+ def call
81
+ @status = "Starting the LimitsGroupsBackgroundTask"
82
+ check_methods = find_check_methods()
83
+ sleep @initial_delay
84
+ @sleeper = Sleeper.new
85
+ loop do
86
+ start = Time.now
87
+ check_methods.each {|method| self.send(method.intern) }
88
+ now = Time.now
89
+ @status = "#{now.formatted}: Checking groups took #{now - start}s"
90
+ sleep_time = 1 - (now - start)
91
+ sleep_time = 0 if sleep_time < 0
92
+ broken = @sleeper.sleep(sleep_time) # Run the checks at 1Hz
93
+ break if broken
94
+ end
95
+ end
96
+
97
+ def stop
98
+ @sleeper.cancel
99
+ end
100
+
101
+ protected
102
+
103
+ def find_check_methods
104
+ # Find all the check methods (begins with 'check_')
105
+ check_methods = []
106
+ self.class.instance_methods.each do |method_name|
107
+ if method_name.to_s =~ /^check_/
108
+ # The second part of the method must correspond to a group name
109
+ if @groups.include?(method_name.to_s[6..-1].upcase)
110
+ check_methods << method_name.to_s
111
+ else
112
+ raise "Method #{method_name} doesn't match a group name.\n"\
113
+ "Methods must begin with 'check_' and end with a valid group name.\n"\
114
+ "Groups are #{@groups.join(', ')}."
115
+ end
116
+ end
117
+ end
118
+ check_methods.sort # Sort by name
119
+ end
120
+ end
121
+ end