cosmos 3.9.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +1 -1
  6. data/Manifest.txt +137 -52
  7. data/Rakefile +50 -44
  8. data/autohotkey/config/system/system.txt +0 -5
  9. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
  10. data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
  11. data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
  12. data/autohotkey/config/targets/META/screens/data.txt +12 -0
  13. data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  14. data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  15. data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  16. data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
  17. data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
  18. data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
  19. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  20. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  21. data/autohotkey/tools/CmdSequence +14 -0
  22. data/autohotkey/tools/CmdSequenceAHK +23 -0
  23. data/autohotkey/tools/CmdSequenceAHK2 +16 -0
  24. data/autohotkey/tools/cmd_extractor.ahk +2 -2
  25. data/autohotkey/tools/cmd_sender.ahk +4 -6
  26. data/autohotkey/tools/cmd_sequence.ahk +215 -0
  27. data/autohotkey/tools/cmd_sequence2.ahk +23 -0
  28. data/autohotkey/tools/data_viewer.ahk +2 -3
  29. data/autohotkey/tools/limits_monitor.ahk +9 -11
  30. data/autohotkey/tools/open_gl_builder.ahk +1 -2
  31. data/autohotkey/tools/packet_viewer.ahk +51 -35
  32. data/autohotkey/tools/replay.ahk +1 -2
  33. data/autohotkey/tools/script_runner.ahk +1 -2
  34. data/autohotkey/tools/script_runner2.ahk +1 -2
  35. data/autohotkey/tools/test_runner2.ahk +1 -5
  36. data/autohotkey/tools/test_runner3.ahk +1 -3
  37. data/autohotkey/tools/tlm_grapher.ahk +1 -3
  38. data/autohotkey/tools/tlm_grapher3.ahk +1 -2
  39. data/autohotkey/tools/tlm_viewer.ahk +8 -3
  40. data/autohotkey/tools/tlm_viewer2.ahk +2 -3
  41. data/autohotkey/tools/tlm_viewer5.ahk +1 -2
  42. data/cosmos.gemspec +26 -20
  43. data/data/cmd_sequence.png +0 -0
  44. data/data/config/_array_params.yaml +23 -0
  45. data/data/config/_id_items.yaml +24 -0
  46. data/data/config/_id_params.yaml +58 -0
  47. data/data/config/_interfaces.yaml +206 -0
  48. data/data/config/_items.yaml +20 -0
  49. data/data/config/_params.yaml +58 -0
  50. data/data/config/cmd_tlm_server.yaml +110 -0
  51. data/data/config/command.yaml +38 -0
  52. data/data/config/command_modifiers.yaml +127 -0
  53. data/data/config/command_telemetry.yaml +3 -0
  54. data/data/config/data_viewer.yaml +43 -0
  55. data/data/config/handbook_creator.yaml +23 -0
  56. data/data/config/housekeeping_params.yaml +71 -0
  57. data/data/config/interface_modifiers.yaml +44 -0
  58. data/data/config/item_modifiers.yaml +172 -0
  59. data/data/config/launcher.yaml +117 -0
  60. data/data/config/limits_monitor.yaml +53 -0
  61. data/data/config/linegraph_params.yaml +30 -0
  62. data/data/config/linegraph_plot.yaml +106 -0
  63. data/data/config/page_modifiers.yaml +128 -0
  64. data/data/config/param_item_modifiers.yaml +41 -0
  65. data/data/config/parameter_modifiers.yaml +144 -0
  66. data/data/config/protocols.yaml +257 -0
  67. data/data/config/screen.yaml +151 -0
  68. data/data/config/script_runner.yaml +15 -0
  69. data/data/config/system.yaml +153 -0
  70. data/data/config/table_manager.yaml +76 -0
  71. data/data/config/table_parameter_modifiers.yaml +9 -0
  72. data/data/config/target.yaml +71 -0
  73. data/data/config/telemetry.yaml +73 -0
  74. data/data/config/telemetry_modifiers.yaml +129 -0
  75. data/data/config/test_runner.yaml +118 -0
  76. data/data/config/tlm_extractor.yaml +109 -0
  77. data/data/config/tlm_grapher.yaml +78 -0
  78. data/data/config/tlm_viewer.yaml +107 -0
  79. data/data/config/unknown.yaml +3 -0
  80. data/data/config/widgets.yaml +1339 -0
  81. data/data/config/xy_params.yaml +50 -0
  82. data/data/config/xy_plot.yaml +12 -0
  83. data/data/config_editor.png +0 -0
  84. data/data/crc.txt +172 -161
  85. data/data/delete.png +0 -0
  86. data/demo/config/data/crc.txt +56 -36
  87. data/demo/config/data/meta_init.txt +1 -4
  88. data/demo/config/system/system.txt +15 -3
  89. data/demo/config/system/system2.txt +13 -3
  90. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
  91. data/demo/config/targets/EXAMPLE/target.txt +3 -1
  92. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
  93. data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
  94. data/demo/config/targets/INST/screens/adcs.txt +39 -15
  95. data/demo/config/targets/INST/screens/commanding.txt +26 -19
  96. data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
  97. data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
  98. data/demo/config/targets/INST/screens/tabs.txt +0 -2
  99. data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
  100. data/demo/config/targets/INST/tables/EventAction.csv +9 -0
  101. data/demo/config/targets/INST/tables/EventAction.dat +0 -0
  102. data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
  103. data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
  104. data/demo/config/targets/INST/target.txt +4 -0
  105. data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
  106. data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
  107. data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
  108. data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
  109. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
  110. data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  111. data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  112. data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  113. data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  114. data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
  115. data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
  116. data/demo/config/targets/SYSTEM/target.txt +12 -0
  117. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
  118. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
  119. data/demo/config/targets/TEMPLATED/target.txt +2 -0
  120. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
  121. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
  122. data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
  123. data/demo/config/tools/launcher/launcher.txt +9 -6
  124. data/demo/config/tools/launcher/launcher2.txt +16 -13
  125. data/demo/config/tools/launcher/launcher_mini.txt +45 -0
  126. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
  127. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
  128. data/demo/config/tools/test_runner/test_runner.txt +1 -1
  129. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  130. data/demo/lib/example_background_task.rb +9 -5
  131. data/demo/lib/example_target.rb +5 -15
  132. data/demo/lib/scpi_target.rb +4 -10
  133. data/demo/procedures/cosmos_api_test.rb +17 -0
  134. data/demo/tools/CmdSequence +16 -0
  135. data/demo/tools/CmdSequence.bat +9 -0
  136. data/demo/tools/ConfigEditor +16 -0
  137. data/demo/tools/ConfigEditor.bat +9 -0
  138. data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  139. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  140. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  141. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  142. data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  143. data/ext/cosmos/ext/packet/packet.c +5 -5
  144. data/install/config/data/crc.txt +12 -8
  145. data/install/config/system/system.txt +13 -3
  146. data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
  147. data/install/config/targets/SYSTEM/target.txt +12 -0
  148. data/install/tools/CmdSequence +16 -0
  149. data/install/tools/CmdSequence.bat +9 -0
  150. data/install/tools/ConfigEditor +16 -0
  151. data/install/tools/ConfigEditor.bat +9 -0
  152. data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  153. data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  154. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  155. data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  156. data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  157. data/lib/cosmos.rb +1 -1
  158. data/lib/cosmos/config/config_parser.rb +147 -59
  159. data/lib/cosmos/config/meta_config_parser.rb +57 -0
  160. data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
  161. data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
  162. data/lib/cosmos/core_ext/array.rb +45 -5
  163. data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
  164. data/lib/cosmos/core_ext/file.rb +2 -2
  165. data/lib/cosmos/core_ext/kernel.rb +1 -6
  166. data/lib/cosmos/core_ext/objectspace.rb +0 -2
  167. data/lib/cosmos/core_ext/string.rb +27 -4
  168. data/lib/cosmos/core_ext/time.rb +39 -10
  169. data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
  170. data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
  171. data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
  172. data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
  173. data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
  174. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
  175. data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
  176. data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
  177. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
  178. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
  179. data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
  180. data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
  181. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
  182. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
  183. data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
  184. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
  185. data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
  186. data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
  187. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
  188. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
  189. data/lib/cosmos/gui/dialogs/splash.rb +1 -1
  190. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  191. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
  192. data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
  193. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
  194. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
  195. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
  196. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
  197. data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
  198. data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
  199. data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
  200. data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
  201. data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
  202. data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
  203. data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
  204. data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
  205. data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
  206. data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
  207. data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
  208. data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
  209. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
  210. data/lib/cosmos/gui/qt.rb +1 -1
  211. data/lib/cosmos/gui/qt_tool.rb +21 -10
  212. data/lib/cosmos/gui/text/completion.rb +23 -2
  213. data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
  214. data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
  215. data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
  216. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
  217. data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
  218. data/lib/cosmos/interfaces.rb +10 -0
  219. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
  220. data/lib/cosmos/interfaces/interface.rb +240 -22
  221. data/lib/cosmos/interfaces/linc_interface.rb +3 -5
  222. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
  223. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
  224. data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
  225. data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
  226. data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
  227. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
  228. data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
  229. data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
  230. data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
  231. data/lib/cosmos/interfaces/serial_interface.rb +28 -23
  232. data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
  233. data/lib/cosmos/interfaces/stream_interface.rb +36 -108
  234. data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
  235. data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
  236. data/lib/cosmos/interfaces/udp_interface.rb +51 -83
  237. data/lib/cosmos/io/buffered_file.rb +92 -2
  238. data/lib/cosmos/io/json_drb.rb +2 -2
  239. data/lib/cosmos/io/posix_serial_driver.rb +3 -1
  240. data/lib/cosmos/io/raw_logger.rb +3 -3
  241. data/lib/cosmos/io/serial_driver.rb +14 -5
  242. data/lib/cosmos/io/win32_serial_driver.rb +16 -4
  243. data/lib/cosmos/packet_logs.rb +0 -1
  244. data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
  245. data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
  246. data/lib/cosmos/packets/binary_accessor.rb +599 -32
  247. data/lib/cosmos/packets/commands.rb +48 -24
  248. data/lib/cosmos/packets/packet.rb +140 -54
  249. data/lib/cosmos/packets/packet_config.rb +0 -2
  250. data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
  251. data/lib/cosmos/packets/structure.rb +81 -33
  252. data/lib/cosmos/packets/structure_item.rb +45 -5
  253. data/lib/cosmos/packets/telemetry.rb +149 -55
  254. data/lib/cosmos/script/api_shared.rb +1000 -0
  255. data/lib/cosmos/script/commands.rb +2 -2
  256. data/lib/cosmos/script/extract.rb +19 -4
  257. data/lib/cosmos/script/limits.rb +2 -0
  258. data/lib/cosmos/script/script.rb +1 -1
  259. data/lib/cosmos/script/scripting.rb +4 -784
  260. data/lib/cosmos/script/telemetry.rb +44 -23
  261. data/lib/cosmos/script/tools.rb +15 -69
  262. data/lib/cosmos/streams/serial_stream.rb +12 -19
  263. data/lib/cosmos/streams/stream.rb +2 -11
  264. data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
  265. data/lib/cosmos/system/system.rb +187 -31
  266. data/lib/cosmos/system/target.rb +11 -2
  267. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
  268. data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
  269. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
  270. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
  271. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
  272. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
  273. data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
  274. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
  275. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
  276. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
  277. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
  278. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
  279. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
  280. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
  281. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
  282. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
  283. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
  284. data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
  285. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
  286. data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
  287. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
  288. data/lib/cosmos/tools/launcher/launcher.rb +29 -12
  289. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  290. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
  291. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
  292. data/lib/cosmos/tools/replay/replay.rb +36 -20
  293. data/lib/cosmos/tools/replay/replay_server.rb +1 -1
  294. data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
  295. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
  296. data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
  297. data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
  298. data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
  299. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
  300. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
  301. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
  302. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  303. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
  304. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
  305. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
  306. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
  307. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
  308. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
  309. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  310. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
  311. data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
  312. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
  313. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
  314. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  315. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
  316. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
  317. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
  318. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
  320. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
  321. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
  322. data/lib/cosmos/top_level.rb +34 -24
  323. data/lib/cosmos/utilities/crc.rb +108 -6
  324. data/lib/cosmos/utilities/csv.rb +68 -14
  325. data/lib/cosmos/utilities/logger.rb +2 -2
  326. data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
  327. data/lib/cosmos/version.rb +6 -6
  328. data/lib/cosmos/win32/win32_main.rb +50 -46
  329. data/run_gui_tests.bat +3 -1
  330. data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
  331. data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
  332. data/spec/core_ext/file_spec.rb +1 -1
  333. data/spec/core_ext/objectspace_spec.rb +12 -9
  334. data/spec/core_ext/string_spec.rb +6 -0
  335. data/spec/core_ext/time_spec.rb +10 -0
  336. data/spec/gui/line_graph/line_clip_spec.rb +226 -224
  337. data/spec/gui/qt_spec.rb +81 -79
  338. data/spec/install/config/system/system.txt +0 -6
  339. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
  340. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
  341. data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  342. data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  343. data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  344. data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  345. data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
  346. data/spec/install/config/targets/SYSTEM/target.txt +12 -0
  347. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
  348. data/spec/interfaces/interface_spec.rb +402 -18
  349. data/spec/interfaces/linc_interface_spec.rb +37 -39
  350. data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
  351. data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
  352. data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
  353. data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
  354. data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
  355. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
  356. data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
  357. data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
  358. data/spec/interfaces/serial_interface_spec.rb +35 -34
  359. data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
  360. data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
  361. data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
  362. data/spec/interfaces/udp_interface_spec.rb +120 -55
  363. data/spec/io/serial_driver_spec.rb +41 -39
  364. data/spec/io/udp_sockets_spec.rb +13 -8
  365. data/spec/io/win32_serial_driver_spec.rb +62 -59
  366. data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
  367. data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
  368. data/spec/packets/commands_spec.rb +5 -5
  369. data/spec/packets/packet_spec.rb +2 -14
  370. data/spec/script/extract_spec.rb +21 -7
  371. data/spec/script/scripting_spec.rb +261 -6
  372. data/spec/script/telemetry_spec.rb +17 -9
  373. data/spec/spec_helper.rb +26 -10
  374. data/spec/streams/serial_stream_spec.rb +87 -82
  375. data/spec/streams/tcpip_client_stream_spec.rb +12 -4
  376. data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
  377. data/spec/system/system_spec.rb +66 -50
  378. data/spec/system/target_spec.rb +33 -11
  379. data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
  380. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
  381. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
  382. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
  383. data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
  384. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
  385. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
  386. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
  387. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
  388. data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
  389. data/spec/top_level/top_level_spec.rb +39 -11
  390. data/spec/utilities/csv_spec.rb +62 -20
  391. data/tasks/gemfile_stats.rake +6 -3
  392. data/test/performance/config/system/system_packets.txt +0 -1
  393. data/test/performance/config/system/system_threads.txt +0 -1
  394. metadata +177 -92
  395. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  396. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  397. data/autohotkey/config/targets/COSMOS/target.txt +0 -5
  398. data/autohotkey/userpath.txt +0 -1
  399. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  400. data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
  401. data/demo/config/targets/COSMOS/screens/version.txt +0 -19
  402. data/demo/config/targets/COSMOS/target.txt +0 -11
  403. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
  404. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
  405. data/demo/userpath.txt +0 -1
  406. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  407. data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  408. data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  409. data/install/config/targets/COSMOS/screens/version.txt +0 -19
  410. data/install/config/targets/COSMOS/target.txt +0 -9
  411. data/install/config/targets/SYSTEM/README.txt +0 -1
  412. data/install/userpath.txt +0 -1
  413. data/lib/cosmos/io/tcpip_server.rb +0 -571
  414. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
  415. data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
  416. data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
  417. data/lib/cosmos/streams/stream_protocol.rb +0 -373
  418. data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
  419. data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
  420. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
  421. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  422. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  423. data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
  424. data/spec/install/config/targets/COSMOS/target.txt +0 -5
  425. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
  426. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
  427. data/spec/install/userpath.txt +0 -1
  428. data/spec/interfaces/stream_interface_spec.rb +0 -157
  429. data/spec/io/tcpip_server_spec.rb +0 -338
  430. data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
  431. data/spec/streams/burst_stream_protocol_spec.rb +0 -32
  432. data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
  433. data/spec/streams/length_stream_protocol_spec.rb +0 -300
  434. data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
  435. data/spec/streams/stream_protocol_spec.rb +0 -346
  436. data/spec/streams/template_stream_protocol_spec.rb +0 -156
  437. data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
  438. data/test/performance/userpath.txt +0 -1
@@ -0,0 +1,194 @@
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'
12
+ require 'cosmos/tools/cmd_sequence/sequence_item'
13
+
14
+ module Cosmos
15
+ # Widget which displays a list of SequenceItems
16
+ class SequenceList < Qt::Widget
17
+ include Enumerable
18
+ # Emit modified whenever any of the underlying SequenceItems change
19
+ signals 'modified()'
20
+
21
+ # Create the SequenceList
22
+ def initialize
23
+ super()
24
+ @modified = false
25
+ layout = Qt::VBoxLayout.new()
26
+ layout.setContentsMargins(0, 0, 0, 0)
27
+ layout.setSpacing(0)
28
+ setLayout(layout)
29
+ setSizePolicy(1, 0)
30
+ layout.addWidget(create_header())
31
+ end
32
+
33
+ # Opens a sequence definition file and populates the sequence.
34
+ # Exceptions are re-raised with filename and line number information
35
+ # and must be handled by the higher level application.
36
+ #
37
+ # @param filename [String] File containing a sequence definition
38
+ def open(filename)
39
+ clear()
40
+
41
+ parser = ConfigParser.new("http://cosmosrb.com/docs/tools/#command-sequence-configuration")
42
+ parser.parse_file(filename) do |keyword, params|
43
+ case keyword
44
+ when 'COMMAND'
45
+ usage = "#{keyword} <Delay Time> <Command>"
46
+ parser.verify_num_parameters(2, 2, usage)
47
+ begin
48
+ item = SequenceItem.parse(params[0], params[1])
49
+ # Connect the SequenceItems modified signal to propagate it
50
+ # forward by emitting our own modified signal
51
+ item.connect(SIGNAL("modified()")) do
52
+ @modified = true
53
+ emit modified()
54
+ end
55
+ layout.addWidget(item)
56
+ rescue => error
57
+ Kernel.raise parser.error("#{usage} passed '#{params[0]} #{params[1]}'\n#{error.message}")
58
+ end
59
+ else
60
+ Kernel.raise parser.error("Unknown keyword '#{keyword}'.") if keyword
61
+ end
62
+ end
63
+ @modified = false # Initially we're not modified
64
+ end
65
+
66
+ # Add a new SequenceItem to the list.
67
+ # @param command [Packet] Command packet to base the SequenceItem on
68
+ # @return [SequenceItem] The item added
69
+ def add(command)
70
+ @modified = true
71
+ item = SequenceItem.new(command)
72
+ # Connect the SequenceItems modified signal to propagate it
73
+ # forward by emitting our own modified signal
74
+ item.connect(SIGNAL("modified()")) do
75
+ @modified = true
76
+ emit modified()
77
+ end
78
+ layout.addWidget(item)
79
+ emit modified()
80
+ item
81
+ end
82
+
83
+ # Clear the list by removing all SequenceItems and disposing them
84
+ def clear
85
+ @modified = false
86
+ (1...layout.count).each do |index|
87
+ item = layout.takeAt(1)
88
+ item.widget.dispose
89
+ end
90
+ emit modified()
91
+ end
92
+
93
+ # @return [Boolean] Whether the list is modified
94
+ def modified?
95
+ @modified
96
+ end
97
+
98
+ # Yield each SequenceItem to enable the included Enumerable module
99
+ def each
100
+ total_items = 1
101
+ Qt.execute_in_main_thread { total_items = layout.count }
102
+ (1...total_items).each do |index|
103
+ item = nil
104
+ Qt.execute_in_main_thread { item = layout.itemAt(index).widget }
105
+ yield item
106
+ end
107
+ end
108
+
109
+ # Calls save on all individual SequenceItems and writes out the result
110
+ # to the given filename. Exceptions must be handled by the higher level
111
+ # application.
112
+ # @param filename [String] Filename to open and write the sequence
113
+ def save(filename)
114
+ @modified = false
115
+ File.open(filename, "w") do |file|
116
+ # Each SequenceItem's save method returns the save string
117
+ file.write(collect {|item| item.save }.join("\n"))
118
+ file.write("\n") # final newline
119
+ end
120
+ end
121
+
122
+ protected
123
+
124
+ # Create a header item in the SequenceList to describe the SequenceItems
125
+ def create_header
126
+ header = Qt::Widget.new
127
+ header_layout = Qt::HBoxLayout.new
128
+ header_layout.setContentsMargins(5, 5, 5, 5)
129
+ header.setLayout(header_layout)
130
+ time = Qt::Label.new("Time (Delay or Absolute)")
131
+ time.setFixedWidth(130)
132
+ header_layout.addWidget(time)
133
+ command = Qt::Label.new("Command")
134
+ header_layout.addWidget(command)
135
+ header_layout.addStretch()
136
+ header
137
+ end
138
+
139
+ # TODO: The following are various methods that could be used in future
140
+ # drag and drop support.
141
+ #
142
+ # def swap(index1, index2)
143
+ # STDOUT.puts "swap:#{index1}, #{index2} count:#{layout.count}"
144
+ # widget1 = layout.takeAt(index1).widget
145
+ # index1 = widget1.index
146
+ # widget2 = layout.takeAt(index2).widget
147
+ # index2 = widget2.index
148
+ # widget2.index = index1
149
+ # widget1.index = index2
150
+ # layout.insertWidget(index1, widget2)
151
+ # layout.insertWidget(index2, widget1)
152
+ # end
153
+ #
154
+ # def mousePressEvent(event)
155
+ # super(event)
156
+ # if event.button == Qt::LeftButton
157
+ # @dragStartPosition = event.pos
158
+ # end
159
+ # @expanded = !@expanded
160
+ # if @expanded
161
+ # @parameters.show
162
+ # else
163
+ # @parameters.hide
164
+ # end
165
+ # end
166
+ #
167
+ # def mouseMoveEvent(event)
168
+ # super(event)
169
+ # return unless (event.buttons & Qt::LeftButton)
170
+ # return if (event.pos - @dragStartPosition).manhattanLength() < Qt::Application::startDragDistance()
171
+ #
172
+ # mime = Qt::MimeData.new()
173
+ # mime.setText(@index.to_s)
174
+ # drag = Qt::Drag.new(self)
175
+ # drag.setMimeData(mime)
176
+ # drop = drag.exec(Qt::MoveAction)
177
+ # end
178
+ #
179
+ # def dragEnterEvent(event)
180
+ # if event.mimeData.text != @text.to_s
181
+ # event.acceptProposedAction
182
+ # setStyleSheet("background-color:grey")
183
+ # end
184
+ # end
185
+ #
186
+ # def dragLeaveEvent(event)
187
+ # setStyleSheet("background-color:")
188
+ # end
189
+ #
190
+ # def dropEvent(event)
191
+ # setStyleSheet("background-color:white")
192
+ # end
193
+ end
194
+ end
@@ -9,11 +9,13 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/script/extract'
12
+ require 'cosmos/script/api_shared'
12
13
 
13
14
  module Cosmos
14
15
 
15
16
  module Api
16
17
  include Extract
18
+ include ApiShared
17
19
 
18
20
  # Sets api_requests to 0 and initializes the whitelist of allowable API
19
21
  # method calls
@@ -41,6 +43,10 @@ module Cosmos
41
43
  'tlm_variable',
42
44
  'set_tlm',
43
45
  'set_tlm_raw',
46
+ 'inject_tlm',
47
+ 'override_tlm',
48
+ 'override_tlm_raw',
49
+ 'normalize_tlm',
44
50
  'get_tlm_buffer',
45
51
  'get_tlm_packet',
46
52
  'get_tlm_values',
@@ -470,7 +476,15 @@ module Cosmos
470
476
  # description).
471
477
  def set_tlm(*args)
472
478
  target_name, packet_name, item_name, value = set_tlm_process_args(args, 'set_tlm')
479
+ if target_name == 'SYSTEM'.freeze and packet_name == 'META'.freeze
480
+ raise "set_tlm not allowed on #{target_name} #{packet_name} #{item_name}" if ['PKTID', 'CONFIG'].include?(item_name)
481
+ end
473
482
  System.telemetry.set_value(target_name, packet_name, item_name, value, :CONVERTED)
483
+ if target_name == 'SYSTEM'.freeze and packet_name == 'META'.freeze
484
+ tlm_packet = System.telemetry.packet('SYSTEM', 'META')
485
+ cmd_packet = System.commands.packet('SYSTEM', 'META')
486
+ cmd_packet.buffer = tlm_packet.buffer
487
+ end
474
488
  System.telemetry.packet(target_name, packet_name).check_limits(System.limits_set, true)
475
489
  nil
476
490
  end
@@ -499,6 +513,164 @@ module Cosmos
499
513
  nil
500
514
  end
501
515
 
516
+ # Injects a packet into the system as if it was received from an interface
517
+ #
518
+ # @param target_name[String] Target name of the packet
519
+ # @param packet_name[String] Packet name of the packet
520
+ # @param item_hash[Hash] Hash of item_name and value for each item you want to change from the current value table
521
+ # @param value_type[Symbol/String] Type of the values in the item_hash (RAW or CONVERTED)
522
+ # @param send_routers[Boolean] Whether or not to send to routers for the target's interface
523
+ # @param send_packet_log_writers[Boolean] Whether or not to send to the packet log writers for the target's interface
524
+ # @param create_new_logs[Boolean] Whether or not to create new log files before writing this packet to logs
525
+ def inject_tlm(target_name, packet_name, item_hash = nil, value_type = :CONVERTED, send_routers = true, send_packet_log_writers = true, create_new_logs = false)
526
+ received_time = Time.now
527
+ target = System.targets[target_name.upcase]
528
+ raise "Unknown target: #{target_name}" unless target
529
+
530
+ # Find and clone the telemetry packet
531
+ cvt_packet = System.telemetry.packet(target_name, packet_name)
532
+ packet = cvt_packet.clone
533
+ packet.received_time = received_time
534
+
535
+ # Update the packet with item_hash
536
+ value_type = value_type.to_s.intern
537
+ item_hash.each do |item_name, item_value|
538
+ packet.write(item_name, item_value, value_type)
539
+ end
540
+
541
+ # Update current value table
542
+ cvt_packet.buffer = packet.buffer(false)
543
+ cvt_packet.received_time = received_time
544
+
545
+ # The interface does the following line, but I don't think inject_tlm should because it could confuse the interface
546
+ target.tlm_cnt += 1
547
+ packet.received_count += 1
548
+ cvt_packet.received_count += 1
549
+ CmdTlmServer.instance.identified_packet_callback(packet)
550
+
551
+ # Find the interface for this target
552
+ interface = target.interface
553
+
554
+ if interface
555
+ # Write to routers
556
+ if send_routers
557
+ interface.routers.each do |router|
558
+ begin
559
+ router.write(packet) if router.write_allowed? and router.connected?
560
+ rescue => err
561
+ Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
562
+ end
563
+ end
564
+ end
565
+
566
+ # Write to packet log writers
567
+ if create_new_logs or send_packet_log_writers
568
+ interface.packet_log_writer_pairs.each do |packet_log_writer_pair|
569
+ # Optionally create new log files
570
+ packet_log_writer_pair.tlm_log_writer.start if create_new_logs
571
+
572
+ # Optionally write to packet logs - Write errors are handled by the log writer
573
+ packet_log_writer_pair.tlm_log_writer.write(packet) if send_packet_log_writers
574
+ end
575
+ end
576
+ else
577
+ # Some packets don't have an interface - Can still write to standard routers and packet logs
578
+
579
+ # Write to routers
580
+ if send_routers
581
+ router = CmdTlmServer.instance.routers.all['PREIDENTIFIED_ROUTER']
582
+ begin
583
+ router.write(packet) if router.write_allowed? and router.connected?
584
+ rescue => err
585
+ Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
586
+ end
587
+ end
588
+
589
+ if create_new_logs or send_packet_log_writers
590
+ # Handle packet logging
591
+ packet_log_writer_pair = CmdTlmServer.instance.packet_logging.all['DEFAULT']
592
+
593
+ # Optionally create new logs
594
+ packet_log_writer_pair.tlm_log_writer.start if create_new_logs
595
+
596
+ # Optionally write to packet logs - Write errors are handled by the log writer
597
+ packet_log_writer_pair.tlm_log_writer.write(packet) if send_packet_log_writers
598
+ end
599
+ end
600
+
601
+ nil
602
+ end
603
+
604
+ # Override a telemetry item in a packet to a particular value such that it
605
+ # is always returned even when new telemetry packets are received from the
606
+ # target.
607
+ #
608
+ # Accepts two different calling styles:
609
+ # override_tlm("TGT PKT ITEM = 1.0")
610
+ # override_tlm('TGT','PKT','ITEM', 10.0)
611
+ #
612
+ # Favor the first syntax where possible as it is more succinct.
613
+ #
614
+ # @param args The args must either be a string followed by a value or
615
+ # three strings followed by a value (see the calling style in the
616
+ # description).
617
+ def override_tlm(*args)
618
+ _override(__method__, set_tlm_process_args(args, __method__))
619
+ end
620
+
621
+ # Override a telemetry item in a packet to a particular value such that it
622
+ # is always returned even when new telemetry packets are received from the
623
+ # target. This only accepts RAW data items and any conversions are applied
624
+ # to the raw data when the packet is read.
625
+ #
626
+ # Accepts two different calling styles:
627
+ # override_tlm_raw("TGT PKT ITEM = 1.0")
628
+ # override_tlm_raw('TGT','PKT','ITEM', 10.0)
629
+ #
630
+ # Favor the first syntax where possible as it is more succinct.
631
+ #
632
+ # @param args The args must either be a string followed by a value or
633
+ # three strings followed by a value (see the calling style in the
634
+ # description).
635
+ def override_tlm_raw(*args)
636
+ _override(__method__, set_tlm_process_args(args, __method__))
637
+ end
638
+
639
+ # Normalize a telemetry item in a packet to its default behavior. Called
640
+ # after override_tlm and override_tlm_raw to restore standard processing.
641
+ #
642
+ # Accepts two different calling styles:
643
+ # normalize_tlm("TGT PKT ITEM")
644
+ # normalize_tlm('TGT','PKT','ITEM')
645
+ #
646
+ # Favor the first syntax where possible as it is more succinct.
647
+ #
648
+ # @param args The args must either be a string or three strings
649
+ # (see the calling style in the description).
650
+ def normalize_tlm(*args)
651
+ _override(__method__, tlm_process_args(args, __method__))
652
+ end
653
+
654
+ private
655
+
656
+ def _override(method, tgt_pkt_item)
657
+ interface = System.targets[tgt_pkt_item[0]].interface
658
+ found = false
659
+ interface.read_protocols.each do |protocol|
660
+ found = true if protocol.kind_of? OverrideProtocol
661
+ end
662
+ if found
663
+ # Test to see if this telemetry item exists
664
+ System.telemetry.value(tgt_pkt_item[0], tgt_pkt_item[1], tgt_pkt_item[2], :RAW)
665
+ interface.public_send("_#{method}", *tgt_pkt_item)
666
+ else
667
+ raise "Interface #{interface.name} does not have override ability. Is 'PROTOCOL OverrideProtocol' under the interface definition?"
668
+ end
669
+ nil
670
+ end
671
+
672
+ public
673
+
502
674
  # Returns the raw buffer for a telemetry packet.
503
675
  #
504
676
  # @param target_name [String] Name of the target
@@ -696,12 +868,14 @@ module Cosmos
696
868
 
697
869
  # (see Cosmos::Limits#enable_group)
698
870
  def enable_limits_group(group_name)
871
+ Logger.info("Enabling Limits Group: #{group_name.upcase}")
699
872
  System.limits.enable_group(group_name)
700
873
  nil
701
874
  end
702
875
 
703
876
  # (see Cosmos::Limits#disable_group)
704
877
  def disable_limits_group(group_name)
878
+ Logger.info("Disabling Limits Group: #{group_name.upcase}")
705
879
  System.limits.disable_group(group_name)
706
880
  nil
707
881
  end
@@ -866,8 +1040,8 @@ module Cosmos
866
1040
  # Get information about an interface
867
1041
  #
868
1042
  # @param interface_name [String] Interface name
869
- # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
870
- # Numeric, Numeric>] Array containing \[state, num clients,
1043
+ # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
1044
+ # Numeric, Numeric>] Array containing \[state, num clients,
871
1045
  # TX queue size, RX queue size, TX bytes, RX bytes, Command count,
872
1046
  # Telemetry count] for the interface
873
1047
  def get_interface_info(interface_name)
@@ -877,8 +1051,8 @@ module Cosmos
877
1051
  # Get information about a router
878
1052
  #
879
1053
  # @param router_name [String] Router name
880
- # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
881
- # Numeric, Numeric>] Array containing \[state, num clients,
1054
+ # @return [Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
1055
+ # Numeric, Numeric>] Array containing \[state, num clients,
882
1056
  # TX queue size, RX queue size, TX bytes, RX bytes, Pkts received,
883
1057
  # Pkts sent] for the router
884
1058
  def get_router_info(router_name)
@@ -910,7 +1084,7 @@ module Cosmos
910
1084
  # @param packet_logger_name [String] Name of the packet logger
911
1085
  # @return [Array<<Array<String>, Boolean, Numeric, String, Numeric,
912
1086
  # Boolean, Numeric, String, Numeric>] Array containing \[interfaces,
913
- # cmd logging enabled, cmd queue size, cmd filename, cmd file size,
1087
+ # cmd logging enabled, cmd queue size, cmd filename, cmd file size,
914
1088
  # tlm logging enabled, tlm queue size, tlm filename, tlm file size]
915
1089
  # for the packet logger
916
1090
  def get_packet_logger_info(packet_logger_name = 'DEFAULT')
@@ -1,3 +1,4 @@
1
+
1
2
  # encoding: ascii-8bit
2
3
 
3
4
  # Copyright 2014 Ball Aerospace & Technologies Corp.
@@ -70,8 +71,6 @@ module Cosmos
70
71
  # packet_data_queues hash to access the queue.
71
72
  attr_accessor :next_packet_data_queue_id
72
73
 
73
- # The default host
74
- DEFAULT_HOST = 'localhost'
75
74
  # The default configuration file name
76
75
  DEFAULT_CONFIG_FILE = File.join(Cosmos::USERPATH, 'config', 'tools', 'cmd_tlm_server', 'cmd_tlm_server.txt')
77
76
  # The maximum number of limits events that are queued. Used when
@@ -156,7 +155,7 @@ module Cosmos
156
155
  System.telemetry # Make sure definitions are loaded by starting anything
157
156
  return unless @json_drb.nil?
158
157
 
159
- @@meta_callback.call(@config.meta_target_name, @config.meta_packet_name) if @@meta_callback if @config.meta_target_name and @config.meta_packet_name
158
+ @@meta_callback.call() if @@meta_callback if @config.metadata
160
159
 
161
160
  # Start DRb with access control
162
161
  @json_drb = JsonDRb.new
@@ -178,7 +177,7 @@ module Cosmos
178
177
  end
179
178
  @json_drb.method_whitelist = @api_whitelist
180
179
  begin
181
- @json_drb.start_service("localhost", System.ports['CTS_API'], self)
180
+ @json_drb.start_service(System.listen_hosts['CTS_API'], System.ports['CTS_API'], self)
182
181
  rescue Exception
183
182
  # Call packet_logging shutdown here to explicitly kill the logging
184
183
  # threads since this CTS is not going to launch
@@ -197,11 +196,31 @@ module Cosmos
197
196
  @sleeper = Sleeper.new
198
197
  @staleness_monitor_thread = Thread.new do
199
198
  begin
199
+ stale = []
200
+ prev_stale = []
200
201
  while true
201
- stale = System.telemetry.check_stale
202
- stale.each do |packet|
203
- post_limits_event(:STALE_PACKET, [packet.target_name, packet.packet_name])
202
+ # The check_stale method drives System.telemetry to iterate through
203
+ # the packets and mark them stale as necessary.
204
+ System.telemetry.check_stale
205
+
206
+ # Get all stale packets that include limits items.
207
+ stale_pkts = System.telemetry.stale(true)
208
+
209
+ # Send :STALE_PACKET events for all newly stale packets.
210
+ stale = []
211
+ stale_pkts.each do |packet|
212
+ pkt_name = [packet.target_name, packet.packet_name]
213
+ stale << pkt_name
214
+ post_limits_event(:STALE_PACKET, pkt_name) unless prev_stale.include?(pkt_name)
215
+ end
216
+
217
+ # Send :STALE_PACKET_RCVD events for all packets that were stale
218
+ # but are no longer stale.
219
+ prev_stale.each do |pkt_name|
220
+ post_limits_event(:STALE_PACKET_RCVD, pkt_name) unless stale.include?(pkt_name)
204
221
  end
222
+ prev_stale = stale.dup
223
+
205
224
  broken = @sleeper.sleep(10)
206
225
  break if broken
207
226
  end
@@ -288,6 +307,8 @@ module Cosmos
288
307
  # :LIMITS_CHANGE which means an individual item has changed limits state,
289
308
  # :LIMITS_SETTINGS which means an individual item has new settings, or
290
309
  # :STALE_PACKET which means a packet with limits has gone stale
310
+ # :STALE_PACKET_RCVD which means a packet with limits that had previously
311
+ # been stale is no longer stale.
291
312
  # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
292
313
  # Returns the current limits set name for event_type == :LIMITS_SET.
293
314
  # Returns an array containing the target name, packet name, item name,
@@ -396,7 +417,7 @@ module Cosmos
396
417
  packets.each do |target_name, packet_name|
397
418
  if packet.target_name == target_name and packet.packet_name == packet_name
398
419
  received_time = packet.received_time
399
- received_time ||= Time.now
420
+ received_time ||= Time.now.sys
400
421
  queue << [packet.buffer, target_name, packet_name,
401
422
  received_time.tv_sec, received_time.tv_usec, packet.received_count]
402
423
  if queue.length > queue_size
@@ -503,8 +524,6 @@ module Cosmos
503
524
  self.instance.json_drb.request_count = 0
504
525
  end
505
526
 
506
- protected
507
-
508
527
  # Method called by all interfaces when a packet has been identified. It
509
528
  # checks the limits of the packet and then posts the packet to any
510
529
  # registered subscribers.
@@ -514,7 +533,5 @@ module Cosmos
514
533
  packet.check_limits(System.limits_set)
515
534
  post_packet(packet)
516
535
  end
517
-
518
- end # class CmdTlmServer
519
-
520
- end # module Cosmos
536
+ end
537
+ end