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
@@ -59,7 +59,7 @@ module Cosmos
59
59
  @proc_text = ''
60
60
  @building_generic_conversion = false
61
61
 
62
- parser = ConfigParser.new("http://cosmosrb.com/docs/tools/#table-manager-configuration")
62
+ parser = ConfigParser.new("http://cosmosrb.com/docs/tools/#table-manager-configuration-cosmos--39")
63
63
  parser.parse_file(filename) do |keyword, params|
64
64
  if @building_generic_conversion
65
65
  case keyword
@@ -106,14 +106,20 @@ module Cosmos
106
106
  #######################################################################
107
107
  # All the following keywords must have a current packet defined
108
108
  #######################################################################
109
- when 'SELECT_PARAMETER', 'PARAMETER', 'ID_PARAMETER', 'ARRAY_PARAMETER', 'APPEND_PARAMETER', 'APPEND_ID_PARAMETER', 'APPEND_ARRAY_PARAMETER', 'ALLOW_SHORT', 'HAZARDOUS', 'PROCESSOR', 'META', 'DISABLE_MESSAGES', 'DISABLED'
109
+ when 'SELECT_PARAMETER', 'PARAMETER', 'ID_PARAMETER', 'ARRAY_PARAMETER',
110
+ 'APPEND_PARAMETER', 'APPEND_ID_PARAMETER', 'APPEND_ARRAY_PARAMETER',
111
+ 'ALLOW_SHORT', 'HAZARDOUS', 'PROCESSOR', 'META', 'DISABLE_MESSAGES', 'DISABLED'
110
112
  raise parser.error("No current packet for #{keyword}") unless @current_packet
111
113
  process_current_packet(parser, keyword, params)
112
114
 
113
115
  #######################################################################
114
116
  # All the following keywords must have a current item defined
115
117
  #######################################################################
116
- when 'STATE', 'READ_CONVERSION', 'WRITE_CONVERSION', 'POLY_READ_CONVERSION', 'POLY_WRITE_CONVERSION', 'SEG_POLY_READ_CONVERSION', 'SEG_POLY_WRITE_CONVERSION', 'GENERIC_READ_CONVERSION_START', 'GENERIC_WRITE_CONVERSION_START', 'REQUIRED', 'LIMITS', 'LIMITS_RESPONSE', 'UNITS', 'FORMAT_STRING', 'DESCRIPTION', 'MINIMUM_VALUE', 'MAXIMUM_VALUE', 'DEFAULT_VALUE', 'OVERFLOW', 'UNEDITABLE', 'HIDDEN'
118
+ when 'STATE', 'READ_CONVERSION', 'WRITE_CONVERSION', 'POLY_READ_CONVERSION',
119
+ 'POLY_WRITE_CONVERSION', 'SEG_POLY_READ_CONVERSION', 'SEG_POLY_WRITE_CONVERSION',
120
+ 'GENERIC_READ_CONVERSION_START', 'GENERIC_WRITE_CONVERSION_START', 'REQUIRED',
121
+ 'LIMITS', 'LIMITS_RESPONSE', 'UNITS', 'FORMAT_STRING', 'DESCRIPTION', 'HIDDEN',
122
+ 'MINIMUM_VALUE', 'MAXIMUM_VALUE', 'DEFAULT_VALUE', 'OVERFLOW', 'UNEDITABLE'
117
123
  raise parser.error("No current item for #{keyword}") unless @current_item
118
124
  process_current_item(parser, keyword, params)
119
125
 
@@ -738,13 +738,27 @@ module Cosmos
738
738
  else
739
739
  table.write(item.name, value)
740
740
  end
741
- raise "out of range" if item.range && !item.range.include?(table.read(item.name, :RAW))
741
+ if item.range && !item.range.include?(table.read(item.name, :RAW))
742
+ if gui_table.item(r, c).text.upcase.start_with?("0X") # display as hex
743
+ min = "0x#{item.range.min.to_s(16).upcase}"
744
+ max = "0x#{item.range.max.to_s(16).upcase}"
745
+ else
746
+ min = item.range.min
747
+ max = item.range.max
748
+ end
749
+ raise "out of range. Minimum is #{min}. Maximum is #{max}"
750
+ end
742
751
 
743
752
  # if we have a problem casting the value it probably means the user put in garbage
744
753
  # in this case force the range check to fail
745
754
  rescue => error
746
755
  text = gui_table.item(r, c).text
747
- result << "Error saving #{item.name} value of '#{text}' due to #{error.message}.\nDefault value is '#{item.default}'\n"
756
+ if text.upcase.start_with?("0X") # display as hex
757
+ default = "0x#{item.default.to_s(16).upcase}"
758
+ else
759
+ default = item.default
760
+ end
761
+ result << "Error saving #{item.name} value of #{text} due to #{error.message}. Default value is #{default}.\n\n"
748
762
  end
749
763
  end # end each table column
750
764
  end # end each table row
@@ -939,6 +953,8 @@ module Cosmos
939
953
  # Updates the table by setting the value in the table to the properly formatted value.
940
954
  def update_gui_item(table_name, table, gui_table, item, row, column)
941
955
  value = table.read(item.name, :FORMATTED)
956
+ # Handle binary strings
957
+ value = "0x" + value.simple_formatted unless value.is_printable?
942
958
 
943
959
  if item.states && item.states.keys.sort == %w(CHECKED UNCHECKED)
944
960
  table_item = create_checkable_table_item(item, value)
@@ -961,12 +977,16 @@ module Cosmos
961
977
  value = gui_item.text # convert_to_value?
962
978
  end
963
979
  else
964
- text = gui_item.text
965
- quotes_removed = text.remove_quotes
966
- if text == quotes_removed
967
- value = text.convert_to_value
980
+ if (item.data_type == :STRING || item.data_type == :BLOCK) && gui_item.text.upcase.start_with?("0X")
981
+ value = gui_item.text.hex_to_byte_string
968
982
  else
969
- value = quotes_removed
983
+ text = gui_item.text
984
+ quotes_removed = text.remove_quotes
985
+ if text == quotes_removed
986
+ value = text.convert_to_value
987
+ else
988
+ value = quotes_removed
989
+ end
970
990
  end
971
991
  end
972
992
  value
@@ -40,7 +40,7 @@ module Cosmos
40
40
 
41
41
  def start(test_type, test_suite_class, test_class = nil, test_case = nil, settings = nil)
42
42
  @results = []
43
- @start_time = Time.now
43
+ @start_time = Time.now.sys
44
44
  @filename = File.join(@path, File.build_timestamped_filename(['testrunner', 'results']))
45
45
  @data_package_filename = @filename[0..-5] + '.zip'
46
46
  Cosmos.set_working_dir do
@@ -111,7 +111,7 @@ module Cosmos
111
111
  end
112
112
 
113
113
  def complete
114
- @stop_time = Time.now
114
+ @stop_time = Time.now.sys
115
115
  cycle_logs() if @auto_cycle_logs
116
116
  footer()
117
117
  ensure
@@ -126,7 +126,7 @@ module Cosmos
126
126
  @file.puts "Detailed Test Output Logged to: #{get_scriptrunner_message_log_filename()}"
127
127
  if @metadata
128
128
  begin
129
- items = get_tlm_packet(@metadata[0], @metadata[1])
129
+ items = get_tlm_packet('SYSTEM', 'META')
130
130
  @file.puts ''
131
131
  @file.puts "Metadata:"
132
132
  items.each do |item_name, item_value, _|
@@ -243,12 +243,12 @@ module Cosmos
243
243
  end
244
244
 
245
245
  def write(string)
246
- @file.write(Time.now.formatted + ': ' + string)
246
+ @file.write(Time.now.sys.formatted + ': ' + string)
247
247
  @file.flush
248
248
  end
249
249
 
250
250
  def puts(string)
251
- @file.puts(Time.now.formatted + ': ' + string)
251
+ @file.puts(Time.now.sys.formatted + ': ' + string)
252
252
  @file.flush
253
253
  end
254
254
 
@@ -257,7 +257,7 @@ module Cosmos
257
257
  if @metadata
258
258
  Qt.execute_in_main_thread(true) do
259
259
  begin
260
- success = SetTlmDialog.execute(parent, 'Enter Test Metadata', 'Start Test', 'Cancel Test', @metadata[0], @metadata[1])
260
+ success = SetTlmDialog.execute(parent, 'Enter Test Metadata', 'Start Test', 'Cancel Test', 'SYSTEM', 'META')
261
261
  rescue DRb::DRbConnError
262
262
  success = false
263
263
  Qt::MessageBox.critical(parent, 'Error', 'Error Connecting to Command and Telemetry Server')
@@ -977,7 +977,7 @@ module Cosmos
977
977
 
978
978
  # Ensure the file exists
979
979
  raise "Configuration File: #{filename} does not exist" unless test(?f, filename)
980
- parser = ConfigParser.new
980
+ parser = ConfigParser.new("http://cosmosrb.com/docs/tools/#test-runner-configuration")
981
981
  parser.parse_file(filename) do |keyword, params|
982
982
  case keyword
983
983
  when 'REQUIRE_UTILITY'
@@ -1077,11 +1077,9 @@ module Cosmos
1077
1077
  parser.verify_num_parameters(0, 0, keyword)
1078
1078
  @@results_writer.auto_cycle_logs = true
1079
1079
 
1080
- # TODO: Deprecate COLLECT_META_DATA
1081
- when 'COLLECT_METADATA', 'COLLECT_META_DATA'
1082
- parser.verify_num_parameters(2, 2, "#{keyword} <Metadata Target Name> <Metadata Packet Name>")
1083
- System.telemetry.packet(params[0], params[1])
1084
- @@results_writer.metadata = [params[0], params[1]]
1080
+ when 'COLLECT_METADATA'
1081
+ parser.verify_num_parameters(0, 0, "#{keyword}")
1082
+ @@results_writer.metadata = true
1085
1083
 
1086
1084
  else
1087
1085
  raise "Unhandled keyword: #{keyword}" if keyword
@@ -278,7 +278,6 @@ module Cosmos
278
278
  # Telemetry Search
279
279
  @search_layout = Qt::HBoxLayout.new
280
280
  @search_box = FullTextSearchLineEdit.new(self)
281
- @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
282
281
  @search_add_item_button = Qt::PushButton.new('Add Item')
283
282
  @search_add_item_button.connect(SIGNAL('clicked()')) do
284
283
  split_tlm = @search_box.text.to_s.split(" ")
@@ -397,7 +396,7 @@ module Cosmos
397
396
  @top_layout.addWidget(@file_box)
398
397
 
399
398
  # Packet Log Frame
400
- @packet_log_frame = PacketLogFrame.new(self, @log_dir, System.default_packet_log_reader.new, @input_filenames, nil, true, true, true, Cosmos::TLM_FILE_PATTERN, Cosmos::TXT_FILE_PATTERN)
399
+ @packet_log_frame = PacketLogFrame.new(self, @log_dir, System.default_packet_log_reader.new(*System.default_packet_log_reader_params), @input_filenames, nil, true, true, true, Cosmos::TLM_FILE_PATTERN, Cosmos::TXT_FILE_PATTERN)
401
400
  @packet_log_frame.change_callback = method(:change_callback)
402
401
  @file_box_layout.addWidget(@packet_log_frame)
403
402
 
@@ -599,7 +598,7 @@ module Cosmos
599
598
  # Configure Tlm Extractor Config
600
599
  sync_gui_to_config()
601
600
 
602
- start_time = Time.now
601
+ start_time = Time.now.sys
603
602
  ProgressDialog.execute(self, 'Log File Progress', 600, 300) do |progress_dialog|
604
603
  progress_dialog.cancel_callback = method(:cancel_callback)
605
604
  progress_dialog.enable_cancel_button
@@ -657,7 +656,7 @@ module Cosmos
657
656
  ensure
658
657
  progress_dialog.set_step_progress(1.0) if !@cancel
659
658
  progress_dialog.set_overall_progress(1.0) if !@cancel
660
- progress_dialog.append_text("Runtime: #{Time.now - start_time} s")
659
+ progress_dialog.append_text("Runtime: #{Time.now.sys - start_time} s")
661
660
  progress_dialog.complete
662
661
  if @batch_filenames.empty?
663
662
  Qt.execute_in_main_thread(true) do
@@ -964,7 +963,7 @@ module Cosmos
964
963
  connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
965
964
  button_layout.addWidget(ok)
966
965
  layout.addLayout(button_layout)
967
-
966
+
968
967
  dialog.setLayout(layout)
969
968
  if dialog.exec == Qt::Dialog::Accepted
970
969
  @shared_columns = []
@@ -147,7 +147,7 @@ module Cosmos
147
147
  reset_settings()
148
148
  clear_items()
149
149
 
150
- parser = ConfigParser.new
150
+ parser = ConfigParser.new("http://cosmosrb.com/docs/tools/#telemetry-extractor-configuration")
151
151
  parser.parse_file(filename) do |keyword, params|
152
152
  case keyword
153
153
  when 'DELIMITER'
@@ -18,7 +18,7 @@ module Cosmos
18
18
  attr_accessor :packet_log_reader
19
19
 
20
20
  def initialize
21
- @packet_log_reader = System.default_packet_log_reader.new
21
+ @packet_log_reader = System.default_packet_log_reader.new(*System.default_packet_log_reader_params)
22
22
  end
23
23
 
24
24
  def process_batch(batch_name, input_filenames, output_dir, output_extension, config_filenames, time_start = nil, time_end = nil, &block)
@@ -35,17 +35,33 @@ module Cosmos
35
35
  @search_layout = Qt::HBoxLayout.new
36
36
  @search_label = Qt::Label.new("Add Housekeeping Data Object: ", self)
37
37
  @search_box = FullTextSearchLineEdit.new(self)
38
- @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
39
38
  @search_box.completion_list = System.telemetry.all_item_strings(false, nil)
40
39
  @search_box.callback = lambda do |tlm|
40
+ tlm.upcase!
41
41
  split_tlm = tlm.split(" ")
42
42
  if split_tlm.length == 3
43
- target_name = split_tlm[0].upcase
43
+ target_name = split_tlm[0]
44
44
  packet_name = split_tlm[1]
45
- item_name = split_tlm[2]
45
+ # Check to see if the item name is followed by an array index,
46
+ # notated by square brackets around an integer; i.e. ARRAY_ITEM[1]
47
+ if (split_tlm[2] =~ /\[\d+\]$/)
48
+ # We found an array index.
49
+ # The $` special variable is the string before the regex match, i.e. ARRAY_ITEM
50
+ item_name = $`
51
+ # The $& special variable is the string matched by the regex, i.e. [1].
52
+ # Strip off the brackets and then convert the array index to an integer.
53
+ item_array_index = $&.gsub(/[\[\]]/, "").to_i
54
+ else
55
+ item_name = split_tlm[2]
56
+ item_array_index = nil
57
+ end
46
58
  begin
47
- System.telemetry.packet_and_item(target_name, packet_name, item_name)
48
- add_data_object(target_name, packet_name, item_name)
59
+ packet, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
60
+ # Default array index to zero if it wasn't specified.
61
+ item_array_index = 0 if item.array_size and !item_array_index
62
+ # Ignore array indicies for non-array items.
63
+ item_array_index = nil if !item.array_size
64
+ add_data_object(target_name, packet_name, item_name, item_array_index)
49
65
  rescue
50
66
  # Does not exist
51
67
  end
@@ -64,9 +80,10 @@ module Cosmos
64
80
  end
65
81
 
66
82
  # Adds a data object when the add button is pressed
67
- def add_data_object(target_name, packet_name, item_name)
83
+ def add_data_object(target_name, packet_name, item_name, item_array_index)
68
84
  data_object = HousekeepingDataObject.new
69
85
  data_object.set_item(target_name, packet_name, item_name)
86
+ data_object.item_array_index = item_array_index
70
87
  @add_data_object_callback.call(data_object) if @add_data_object_callback
71
88
  end
72
89
 
@@ -38,6 +38,10 @@ module Cosmos
38
38
  data_object.set_item(packet.target_name, packet.packet_name, item_name)
39
39
  end
40
40
 
41
+ packet, item = System.telemetry.packet_and_item(data_object.target_name,
42
+ data_object.packet_name,
43
+ data_object.item_name)
44
+
41
45
  local_layout = Qt::VBoxLayout.new
42
46
  local_layout.setContentsMargins(0,0,0,0)
43
47
 
@@ -53,6 +57,18 @@ module Cosmos
53
57
  @telemetry_chooser.item_label.text = '*Item:'
54
58
  local_layout.addWidget(@telemetry_chooser)
55
59
 
60
+ # Integer Field for array index
61
+ @item_array_index = IntegerChooser.new(self, '*Item Array Index:', 0, 0)
62
+ @item_array_index.value = data_object.item_array_index if data_object.item_array_index
63
+ if item.array_size
64
+ @array_item = true
65
+ @item_array_index.show
66
+ else
67
+ @array_item = false
68
+ @item_array_index.hide
69
+ end
70
+ local_layout.addWidget(@item_array_index)
71
+
56
72
  # Chooser for time item
57
73
  time_item_names = @telemetry_chooser.item_names
58
74
  @time_item_name = ComboboxChooser.new(self, '*Time Item:', time_item_names)
@@ -90,9 +106,6 @@ module Cosmos
90
106
  local_layout.addWidget(@analysis_samples)
91
107
  @layout.addLayout(local_layout)
92
108
 
93
- packet, item = System.telemetry.packet_and_item(data_object.target_name,
94
- data_object.packet_name,
95
- data_object.item_name)
96
109
  if item.limits.values
97
110
  choices = ['TRUE', 'FALSE']
98
111
  @show_limits_lines = ComboboxChooser.new(self, 'Show Limits Lines:', choices)
@@ -122,6 +135,11 @@ module Cosmos
122
135
  data_object.set_item(@telemetry_chooser.target_name,
123
136
  @telemetry_chooser.packet_name,
124
137
  @telemetry_chooser.item_name)
138
+ if @array_item
139
+ data_object.item_array_index = @item_array_index.value
140
+ else
141
+ data_object.item_array_index = nil
142
+ end
125
143
  data_object.time_item_name = @time_item_name.string
126
144
  formatted_time_item_name = @formatted_time_item_name.string
127
145
  if formatted_time_item_name.strip.empty?
@@ -164,6 +182,18 @@ module Cosmos
164
182
  value_types.delete(data_object.value_type.to_s)
165
183
  value_types.unshift(data_object.value_type.to_s)
166
184
  @value_type.update_items(value_types, false)
185
+
186
+ packet, item = System.telemetry.packet_and_item(data_object.target_name,
187
+ data_object.packet_name,
188
+ data_object.item_name)
189
+ if item.array_size
190
+ @array_item = true
191
+ @item_array_index.show
192
+ else
193
+ @array_item = false
194
+ @item_array_index.hide
195
+ end
196
+
167
197
  end
168
198
 
169
199
  # Handle the item name changing
@@ -174,6 +204,17 @@ module Cosmos
174
204
  value_types.delete(data_object.value_type.to_s)
175
205
  value_types.unshift(data_object.value_type.to_s)
176
206
  @value_type.update_items(value_types, false)
207
+
208
+ packet, item = System.telemetry.packet_and_item(data_object.target_name,
209
+ data_object.packet_name,
210
+ data_object.item_name)
211
+ if item.array_size
212
+ @array_item = true
213
+ @item_array_index.show
214
+ else
215
+ @array_item = false
216
+ @item_array_index.hide
217
+ end
177
218
  end
178
219
 
179
220
  end # class HousekeepingDataObjectEditor
@@ -31,6 +31,9 @@ module Cosmos
31
31
  # The housekeeping telemetry item's item name (string)
32
32
  attr_reader :item_name
33
33
 
34
+ # The housekeeping telemetry item's item array index, if applicable (integer)
35
+ attr_accessor :item_array_index
36
+
34
37
  # The housekeeping telemetry item's time item name (string)
35
38
  attr_accessor :time_item_name
36
39
 
@@ -58,6 +61,7 @@ module Cosmos
58
61
  @target_name = nil
59
62
  @packet_name = nil
60
63
  @item_name = nil
64
+ @item_array_index = nil
61
65
  @time_item_name = nil
62
66
  @formatted_time_item_name = nil
63
67
  @value_type = :CONVERTED
@@ -76,6 +80,7 @@ module Cosmos
76
80
  def configuration_string
77
81
  string = super()
78
82
  string << " ITEM #{@target_name} #{@packet_name} #{@item_name}\n" if @target_name and @packet_name and @item_name
83
+ string << " ITEM_ARRAY_INDEX #{@item_array_index}\n" if @item_array_index
79
84
  string << " TIME_ITEM #{@time_item_name}\n" if @time_item_name
80
85
  string << " FORMATTED_TIME_ITEM #{@formatted_time_item_name}\n" if @formatted_time_item_name
81
86
  string << " VALUE_TYPE #{@value_type}\n"
@@ -93,6 +98,11 @@ module Cosmos
93
98
  parser.verify_num_parameters(3, 3, "ITEM <Target Name> <Packet Name> <Item Name>")
94
99
  set_item(parameters[0], parameters[1], parameters[2], true)
95
100
 
101
+ when 'ITEM_ARRAY_INDEX'
102
+ # Expect 1 parameter
103
+ parser.verify_num_parameters(1, 1, "ITEM_ARRAY_INDEX <Index>")
104
+ @item_array_index = parameters[0].to_i
105
+
96
106
  when 'TIME_ITEM'
97
107
  # Expect 1 parameter
98
108
  parser.verify_num_parameters(1, 1, "TIME_ITEM <Time Item Name>")
@@ -160,6 +170,9 @@ module Cosmos
160
170
  else
161
171
  y_value = packet.read(@item_name)
162
172
  end
173
+ if y_value.is_a?(Array) and @item_array_index and @item_array_index < y_value.size
174
+ y_value = y_value[@item_array_index]
175
+ end
163
176
  # Bail on the values if they are NaN or nil as we can't graph them
164
177
  return if x_value.nil? || y_value.nil? ||
165
178
  (x_value.respond_to?(:nan?) && x_value.nan?) ||
@@ -261,15 +274,13 @@ module Cosmos
261
274
 
262
275
  # Returns the name of this data object
263
276
  def name
277
+ str = ""
264
278
  if @target_name and @packet_name and @item_name
265
- if @analysis != :NONE
266
- "#{@target_name} #{@packet_name} #{@item_name} (#{@analysis})"
267
- else
268
- "#{@target_name} #{@packet_name} #{@item_name}"
269
- end
270
- else
271
- ''
279
+ str << "#{@target_name} #{@packet_name} #{@item_name}"
280
+ str << "[#{@item_array_index}]" if @item_array_index
281
+ str << " (#{@analysis})" if @analysis != :NONE
272
282
  end
283
+ str
273
284
  end
274
285
 
275
286
  # Resets the data object
@@ -286,6 +297,7 @@ module Cosmos
286
297
  if @target_name and @packet_name and @item_name
287
298
  data_object.set_item(@target_name.clone, @packet_name.clone, @item_name.clone)
288
299
  end
300
+ data_object.item_array_index = @item_array_index if @item_array_index
289
301
  data_object.time_item_name = @time_item_name.clone if @time_item_name
290
302
  data_object.formatted_time_item_name = @formatted_time_item_name.clone if @formatted_time_item_name
291
303
  data_object.value_type = @value_type
@@ -316,6 +328,7 @@ module Cosmos
316
328
  if @target_name != edited_data_object.target_name or
317
329
  @packet_name != edited_data_object.packet_name or
318
330
  @item_name != edited_data_object.item_name or
331
+ @item_array_index != edited_data_object.item_array_index or
319
332
  @time_item_name != edited_data_object.time_item_name or
320
333
  @formatted_time_item_name != edited_data_object.formatted_time_item_name or
321
334
  @value_type != edited_data_object.value_type or