cosmos 3.2.1 → 3.3.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 (364) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +195 -0
  3. data/README.md +3 -3
  4. data/data/crc.txt +52 -52
  5. data/lib/cosmos.rb +1 -1
  6. data/lib/cosmos/core_ext/time.rb +11 -9
  7. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +0 -2
  8. data/lib/cosmos/gui/dialogs/about_dialog.rb +2 -2
  9. data/lib/cosmos/gui/dialogs/exception_dialog.rb +2 -2
  10. data/lib/cosmos/gui/dialogs/progress_dialog.rb +11 -5
  11. data/lib/cosmos/gui/dialogs/splash.rb +32 -10
  12. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  13. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +2 -2
  14. data/lib/cosmos/gui/qt.rb +22 -22
  15. data/lib/cosmos/io/json_drb.rb +4 -4
  16. data/lib/cosmos/io/json_rpc.rb +21 -21
  17. data/lib/cosmos/packet_logs/packet_log_writer.rb +18 -20
  18. data/lib/cosmos/packets/commands.rb +8 -6
  19. data/lib/cosmos/packets/limits.rb +3 -2
  20. data/lib/cosmos/packets/packet.rb +14 -11
  21. data/lib/cosmos/packets/parsers/limits_parser.rb +1 -1
  22. data/lib/cosmos/packets/parsers/macro_parser.rb +4 -4
  23. data/lib/cosmos/packets/parsers/state_parser.rb +1 -1
  24. data/lib/cosmos/packets/structure.rb +2 -2
  25. data/lib/cosmos/packets/telemetry.rb +5 -4
  26. data/lib/cosmos/script/script.rb +6 -6
  27. data/lib/cosmos/streams/tcpip_socket_stream.rb +2 -1
  28. data/lib/cosmos/streams/template_stream_protocol.rb +1 -1
  29. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +1 -1
  30. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +5 -8
  31. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +4 -3
  32. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +9 -3
  33. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +15 -11
  34. data/lib/cosmos/tools/data_viewer/data_viewer.rb +1 -1
  35. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +2 -2
  36. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +2 -2
  37. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +0 -2
  38. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +1 -1
  39. data/lib/cosmos/tools/replay/replay.rb +2 -2
  40. data/lib/cosmos/tools/script_runner/script_audit.rb +1 -1
  41. data/lib/cosmos/tools/script_runner/script_runner.rb +1 -1
  42. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +3 -7
  43. data/lib/cosmos/tools/table_manager/table_config.rb +1 -1
  44. data/lib/cosmos/tools/test_runner/results_writer.rb +1 -1
  45. data/lib/cosmos/tools/test_runner/test_runner.rb +2 -2
  46. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +2 -1
  47. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  48. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +1 -0
  49. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +1 -0
  50. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +1 -0
  51. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +3 -3
  52. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +1 -3
  53. data/lib/cosmos/top_level.rb +2 -6
  54. data/lib/cosmos/utilities/ruby_lex_utils.rb +1 -1
  55. data/lib/cosmos/version.rb +5 -5
  56. data/lib/cosmos/win32/win32_main.rb +11 -7
  57. data/spec/ccsds/ccsds_packet_spec.rb +28 -28
  58. data/spec/ccsds/ccsds_parser_spec.rb +27 -27
  59. data/spec/config/config_parser_spec.rb +88 -88
  60. data/spec/conversions/conversion_spec.rb +3 -3
  61. data/spec/conversions/generic_conversion_spec.rb +9 -9
  62. data/spec/conversions/new_packet_log_conversion_spec.rb +4 -4
  63. data/spec/conversions/polynomial_conversion_spec.rb +7 -7
  64. data/spec/conversions/processor_conversion_spec.rb +9 -9
  65. data/spec/conversions/received_count_conversion_spec.rb +7 -7
  66. data/spec/conversions/received_time_formatted_conversion_spec.rb +9 -9
  67. data/spec/conversions/received_time_seconds_conversion_spec.rb +9 -9
  68. data/spec/conversions/segmented_polynomial_conversion_spec.rb +11 -11
  69. data/spec/conversions/unix_time_formatted_conversion_spec.rb +13 -13
  70. data/spec/conversions/unix_time_seconds_conversion_spec.rb +13 -13
  71. data/spec/core_ext/array_spec.rb +76 -76
  72. data/spec/core_ext/class_spec.rb +3 -3
  73. data/spec/core_ext/cosmos_io_spec.rb +16 -16
  74. data/spec/core_ext/exception_spec.rb +19 -19
  75. data/spec/core_ext/file_spec.rb +16 -16
  76. data/spec/core_ext/hash_spec.rb +3 -3
  77. data/spec/core_ext/io_spec.rb +2 -2
  78. data/spec/core_ext/kernel_spec.rb +2 -2
  79. data/spec/core_ext/math_spec.rb +43 -43
  80. data/spec/core_ext/matrix_spec.rb +22 -22
  81. data/spec/core_ext/objectspace_spec.rb +6 -6
  82. data/spec/core_ext/range_spec.rb +2 -2
  83. data/spec/core_ext/socket_spec.rb +4 -4
  84. data/spec/core_ext/string_spec.rb +67 -67
  85. data/spec/core_ext/stringio_spec.rb +2 -2
  86. data/spec/core_ext/time_spec.rb +82 -82
  87. data/spec/gui/line_graph/line_clip_spec.rb +34 -34
  88. data/spec/interfaces/interface_spec.rb +46 -46
  89. data/spec/interfaces/linc_interface_spec.rb +26 -26
  90. data/spec/interfaces/serial_interface_spec.rb +16 -16
  91. data/spec/interfaces/simulated_target_interface_spec.rb +21 -21
  92. data/spec/interfaces/stream_interface_spec.rb +22 -22
  93. data/spec/interfaces/tcpip_client_interface_spec.rb +14 -14
  94. data/spec/interfaces/tcpip_server_interface_spec.rb +41 -41
  95. data/spec/interfaces/udp_interface_spec.rb +46 -46
  96. data/spec/io/buffered_file_spec.rb +50 -50
  97. data/spec/io/io_multiplexer_spec.rb +9 -9
  98. data/spec/io/json_drb_object_spec.rb +7 -7
  99. data/spec/io/json_drb_spec.rb +55 -55
  100. data/spec/io/json_rpc_spec.rb +68 -68
  101. data/spec/io/raw_logger_pair_spec.rb +28 -28
  102. data/spec/io/raw_logger_spec.rb +22 -22
  103. data/spec/io/serial_driver_spec.rb +3 -3
  104. data/spec/io/stderr_spec.rb +2 -2
  105. data/spec/io/stdout_spec.rb +2 -2
  106. data/spec/io/tcpip_server_spec.rb +62 -62
  107. data/spec/io/udp_sockets_spec.rb +19 -19
  108. data/spec/io/win32_serial_driver_spec.rb +10 -10
  109. data/spec/packet_logs/meta_packet_log_writer_spec.rb +32 -32
  110. data/spec/packet_logs/packet_log_reader_spec.rb +138 -138
  111. data/spec/packet_logs/packet_log_writer_pair_spec.rb +3 -3
  112. data/spec/packet_logs/packet_log_writer_spec.rb +26 -26
  113. data/spec/packets/binary_accessor_spec.rb +672 -672
  114. data/spec/packets/commands_spec.rb +123 -123
  115. data/spec/packets/limits_response_spec.rb +1 -1
  116. data/spec/packets/limits_spec.rb +69 -69
  117. data/spec/packets/packet_config_spec.rb +93 -93
  118. data/spec/packets/packet_item_limits_spec.rb +46 -46
  119. data/spec/packets/packet_item_spec.rb +108 -108
  120. data/spec/packets/packet_spec.rb +364 -348
  121. data/spec/packets/parsers/format_string_parser_spec.rb +13 -13
  122. data/spec/packets/parsers/limits_parser_spec.rb +8 -8
  123. data/spec/packets/parsers/limits_response_parser_spec.rb +9 -9
  124. data/spec/packets/parsers/macro_parser_spec.rb +34 -6
  125. data/spec/packets/parsers/packet_parser_spec.rb +6 -6
  126. data/spec/packets/parsers/processor_parser_spec.rb +7 -7
  127. data/spec/packets/parsers/state_parser_spec.rb +23 -23
  128. data/spec/packets/structure_item_spec.rb +62 -62
  129. data/spec/packets/structure_spec.rb +183 -183
  130. data/spec/packets/telemetry_spec.rb +174 -174
  131. data/spec/processors/new_packet_log_processor_spec.rb +4 -4
  132. data/spec/processors/processor_spec.rb +9 -9
  133. data/spec/processors/statistics_processor_spec.rb +21 -21
  134. data/spec/processors/watermark_processor_spec.rb +12 -12
  135. data/spec/script/script_spec.rb +158 -158
  136. data/spec/spec_helper.rb +44 -13
  137. data/spec/streams/burst_stream_protocol_spec.rb +8 -8
  138. data/spec/streams/fixed_stream_protocol_spec.rb +26 -26
  139. data/spec/streams/length_stream_protocol_spec.rb +27 -27
  140. data/spec/streams/preidentified_stream_protocol_spec.rb +25 -25
  141. data/spec/streams/serial_stream_spec.rb +19 -19
  142. data/spec/streams/stream_protocol_spec.rb +52 -52
  143. data/spec/streams/stream_spec.rb +1 -1
  144. data/spec/streams/tcpip_client_stream_spec.rb +7 -7
  145. data/spec/streams/tcpip_socket_stream_spec.rb +84 -49
  146. data/spec/streams/template_stream_protocol_spec.rb +17 -17
  147. data/spec/streams/terminated_stream_protocol_spec.rb +19 -19
  148. data/spec/system/system_spec.rb +95 -95
  149. data/spec/system/target_spec.rb +32 -32
  150. data/spec/tools/cmd_tlm_server/api_spec.rb +386 -386
  151. data/spec/tools/cmd_tlm_server/background_task_spec.rb +3 -3
  152. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +8 -8
  153. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +57 -57
  154. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +85 -85
  155. data/spec/tools/cmd_tlm_server/commanding_spec.rb +11 -11
  156. data/spec/tools/cmd_tlm_server/connections_spec.rb +23 -23
  157. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +57 -57
  158. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +32 -32
  159. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +17 -17
  160. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +15 -15
  161. data/spec/tools/cmd_tlm_server/routers_spec.rb +36 -36
  162. data/spec/top_level/top_level_spec.rb +60 -60
  163. data/spec/utilities/crc_spec.rb +6 -6
  164. data/spec/utilities/csv_spec.rb +13 -13
  165. data/spec/utilities/logger_spec.rb +20 -20
  166. data/spec/utilities/message_log_spec.rb +13 -13
  167. data/spec/utilities/quaternion_spec.rb +30 -30
  168. data/spec/utilities/ruby_lex_utils_spec.rb +14 -14
  169. data/test/benchmarks/binary_accessor_benchmark.rb +14 -0
  170. data/test/benchmarks/gsub_benchmark.rb +114 -0
  171. data/test/performance/PACKETS.bat +1 -0
  172. data/test/performance/Rakefile +77 -0
  173. data/test/performance/THREADS.bat +1 -0
  174. data/test/performance/config/data/attitude.bin +0 -0
  175. data/test/performance/config/data/crc.txt +206 -0
  176. data/test/performance/config/data/diamond.STL +58 -0
  177. data/test/performance/config/data/groundoff.gif +0 -0
  178. data/test/performance/config/data/groundon.gif +0 -0
  179. data/test/performance/config/data/hselectoff.gif +0 -0
  180. data/test/performance/config/data/hselecton.gif +0 -0
  181. data/test/performance/config/data/hswitchoff.gif +0 -0
  182. data/test/performance/config/data/hswitchon.gif +0 -0
  183. data/test/performance/config/data/meta_init.txt +4 -0
  184. data/test/performance/config/data/position.bin +0 -0
  185. data/test/performance/config/data/poweroff.gif +0 -0
  186. data/test/performance/config/data/poweron.gif +0 -0
  187. data/test/performance/config/data/satellite.gif +0 -0
  188. data/test/performance/config/data/tada.wav +0 -0
  189. data/test/performance/config/data/vswitchoff.gif +0 -0
  190. data/test/performance/config/data/vswitchon.gif +0 -0
  191. data/test/performance/config/system/system_packets.txt +39 -0
  192. data/test/performance/config/system/system_threads.txt +59 -0
  193. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  194. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  195. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  196. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -0
  197. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -0
  198. data/test/performance/config/targets/COSMOS/target.txt +11 -0
  199. data/test/performance/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +17 -0
  200. data/test/performance/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +18 -0
  201. data/test/performance/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -0
  202. data/test/performance/config/targets/EXAMPLE/lib/example_interface.rb +22 -0
  203. data/test/performance/config/targets/EXAMPLE/target.txt +7 -0
  204. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -0
  205. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +34 -0
  206. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -0
  207. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -0
  208. data/test/performance/config/tools/handbook_creator/default_toc.xsl +59 -0
  209. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -0
  210. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  211. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  212. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  213. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -0
  214. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  215. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  216. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  217. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  218. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  219. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  220. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  221. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  222. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -0
  223. data/test/performance/config/tools/launcher/launcher_packets.txt +29 -0
  224. data/test/performance/config/tools/launcher/launcher_threads.txt +70 -0
  225. data/test/performance/config/tools/limits_monitor/README.txt +1 -0
  226. data/test/performance/config/tools/opengl_builder/README.txt +1 -0
  227. data/test/performance/config/tools/script_runner/script_runner.txt +3 -0
  228. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -0
  229. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -0
  230. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -0
  231. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -0
  232. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -0
  233. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -0
  234. data/test/performance/config/tools/test_runner/test_runner.txt +17 -0
  235. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -0
  236. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -0
  237. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -0
  238. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -0
  239. data/test/performance/config/tools/tlm_grapher/README.txt +1 -0
  240. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +41 -0
  241. data/test/performance/lib/example_background_task.rb +57 -0
  242. data/test/performance/lib/example_target.rb +120 -0
  243. data/test/performance/lib/scpi_target.rb +74 -0
  244. data/test/performance/lib/user_version.rb +3 -0
  245. data/test/performance/outputs/handbooks/README.txt +1 -0
  246. data/test/performance/outputs/logs/README.txt +1 -0
  247. data/test/performance/outputs/saved_config/README.txt +1 -0
  248. data/test/performance/outputs/tables/README.txt +1 -0
  249. data/test/performance/outputs/tmp/README.txt +1 -0
  250. data/test/performance/procedures/checks.rb +11 -0
  251. data/test/performance/procedures/clear_util.rb +7 -0
  252. data/test/performance/procedures/collect.rb +18 -0
  253. data/test/performance/procedures/collect_util.rb +14 -0
  254. data/test/performance/procedures/cosmos_api_test.rb +293 -0
  255. data/test/performance/procedures/disconnect.rb +29 -0
  256. data/test/performance/procedures/example_test.rb +182 -0
  257. data/test/performance/procedures/plot_test.rb +8 -0
  258. data/test/performance/procedures/procedure.rb +3 -0
  259. data/test/performance/procedures/run_example_test.rb +3 -0
  260. data/test/performance/procedures/test.rb +51 -0
  261. data/test/performance/tools/CmdExtractor +14 -0
  262. data/test/performance/tools/CmdExtractor.bat +59 -0
  263. data/test/performance/tools/CmdSender +14 -0
  264. data/test/performance/tools/CmdSender.bat +59 -0
  265. data/test/performance/tools/CmdTlmServer +16 -0
  266. data/test/performance/tools/CmdTlmServer.bat +59 -0
  267. data/test/performance/tools/CmdTlmServerMemProf +20 -0
  268. data/test/performance/tools/CmdTlmServerMemProf.bat +59 -0
  269. data/test/performance/tools/DataViewer +14 -0
  270. data/test/performance/tools/DataViewer.bat +59 -0
  271. data/test/performance/tools/ExampleTarget +14 -0
  272. data/test/performance/tools/ExampleTarget.bat +59 -0
  273. data/test/performance/tools/HandbookCreator +14 -0
  274. data/test/performance/tools/HandbookCreator.bat +61 -0
  275. data/test/performance/tools/Launcher +14 -0
  276. data/test/performance/tools/Launcher.bat +59 -0
  277. data/test/performance/tools/LimitsMonitor +14 -0
  278. data/test/performance/tools/LimitsMonitor.bat +59 -0
  279. data/test/performance/tools/OpenGLBuilder +14 -0
  280. data/test/performance/tools/OpenGLBuilder.bat +59 -0
  281. data/test/performance/tools/PacketViewer +14 -0
  282. data/test/performance/tools/PacketViewer.bat +59 -0
  283. data/test/performance/tools/Replay +14 -0
  284. data/test/performance/tools/Replay.bat +59 -0
  285. data/test/performance/tools/ScpiTarget +14 -0
  286. data/test/performance/tools/ScpiTarget.bat +59 -0
  287. data/test/performance/tools/ScriptRunner +14 -0
  288. data/test/performance/tools/ScriptRunner.bat +59 -0
  289. data/test/performance/tools/TableManager +14 -0
  290. data/test/performance/tools/TableManager.bat +59 -0
  291. data/test/performance/tools/TestRunner +14 -0
  292. data/test/performance/tools/TestRunner.bat +59 -0
  293. data/test/performance/tools/TlmExtractor +14 -0
  294. data/test/performance/tools/TlmExtractor.bat +59 -0
  295. data/test/performance/tools/TlmGrapher +14 -0
  296. data/test/performance/tools/TlmGrapher.bat +59 -0
  297. data/test/performance/tools/TlmViewer +14 -0
  298. data/test/performance/tools/TlmViewer.bat +59 -0
  299. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -0
  300. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -0
  301. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -0
  302. data/test/performance/tools/mac/CmdExtractor.app/Contents/Resources/appIcon.icns +0 -0
  303. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -0
  304. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -0
  305. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -0
  306. data/test/performance/tools/mac/CmdSender.app/Contents/Resources/appIcon.icns +0 -0
  307. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -0
  308. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -0
  309. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -0
  310. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Resources/appIcon.icns +0 -0
  311. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -0
  312. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -0
  313. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -0
  314. data/test/performance/tools/mac/DataViewer.app/Contents/Resources/appIcon.icns +0 -0
  315. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -0
  316. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -0
  317. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -0
  318. data/test/performance/tools/mac/HandbookCreator.app/Contents/Resources/appIcon.icns +0 -0
  319. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -0
  320. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -0
  321. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -0
  322. data/test/performance/tools/mac/Launcher.app/Contents/Resources/appIcon.icns +0 -0
  323. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -0
  324. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -0
  325. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -0
  326. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Resources/appIcon.icns +0 -0
  327. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -0
  328. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -0
  329. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -0
  330. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Resources/appIcon.icns +0 -0
  331. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -0
  332. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -0
  333. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -0
  334. data/test/performance/tools/mac/PacketViewer.app/Contents/Resources/appIcon.icns +0 -0
  335. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -0
  336. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -0
  337. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -0
  338. data/test/performance/tools/mac/Replay.app/Contents/Resources/appIcon.icns +0 -0
  339. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -0
  340. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -0
  341. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -0
  342. data/test/performance/tools/mac/ScriptRunner.app/Contents/Resources/appIcon.icns +0 -0
  343. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -0
  344. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -0
  345. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -0
  346. data/test/performance/tools/mac/TableManager.app/Contents/Resources/appIcon.icns +0 -0
  347. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -0
  348. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -0
  349. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -0
  350. data/test/performance/tools/mac/TestRunner.app/Contents/Resources/appIcon.icns +0 -0
  351. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -0
  352. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -0
  353. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -0
  354. data/test/performance/tools/mac/TlmExtractor.app/Contents/Resources/appIcon.icns +0 -0
  355. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -0
  356. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -0
  357. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -0
  358. data/test/performance/tools/mac/TlmGrapher.app/Contents/Resources/appIcon.icns +0 -0
  359. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -0
  360. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -0
  361. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -0
  362. data/test/performance/tools/mac/TlmViewer.app/Contents/Resources/appIcon.icns +0 -0
  363. data/test/performance/userpath.txt +1 -0
  364. metadata +197 -2
@@ -88,6 +88,7 @@ module Cosmos
88
88
  @file_size = 0
89
89
  @filename = nil
90
90
  @label = nil
91
+ @entry_header = String.new
91
92
  @start_time = Time.now
92
93
 
93
94
  @cancel_threads = false
@@ -246,10 +247,10 @@ module Cosmos
246
247
  start_new_file()
247
248
  end
248
249
  if @file
249
- entry_header = build_entry_header(packet)
250
- if entry_header
251
- @file.write(entry_header)
252
- @file_size += entry_header.length
250
+ @entry_header = build_entry_header(packet) # populate @entry_header
251
+ if @entry_header
252
+ @file.write(@entry_header)
253
+ @file_size += @entry_header.length
253
254
  end
254
255
  buffer = packet.buffer
255
256
  @file.write(buffer)
@@ -300,24 +301,21 @@ module Cosmos
300
301
  def build_entry_header(packet)
301
302
  received_time = packet.received_time
302
303
  received_time = Time.now unless received_time
304
+ # This is an optimization to avoid creating a new entry_header object
305
+ # each time we create an entry_header which we do a LOT!
306
+ @entry_header.clear
307
+ @entry_header << [received_time.tv_sec].pack('N'.freeze)
308
+ @entry_header << [received_time.tv_usec].pack('N'.freeze)
303
309
  target_name = packet.target_name
304
- target_name = 'UNKNOWN' unless target_name
310
+ target_name = 'UNKNOWN'.freeze unless target_name
311
+ @entry_header << target_name.length
312
+ @entry_header << target_name
305
313
  packet_name = packet.packet_name
306
- packet_name = 'UNKNOWN' unless packet_name
307
- data_length = [packet.length].pack('N')
308
- time_seconds = [received_time.tv_sec].pack('N')
309
- time_microseconds = [received_time.tv_usec].pack('N')
310
-
311
- header = ''
312
- header << time_seconds
313
- header << time_microseconds
314
- header << target_name.length
315
- header << target_name
316
- header << packet_name.length
317
- header << packet_name
318
- header << data_length
319
-
320
- return header
314
+ packet_name = 'UNKNOWN'.freeze unless packet_name
315
+ @entry_header << packet_name.length
316
+ @entry_header << packet_name
317
+ @entry_header << [packet.length].pack('N'.freeze)
318
+ return @entry_header
321
319
  end
322
320
 
323
321
  end # class PacketLogWriter
@@ -38,9 +38,11 @@ module Cosmos
38
38
  return @config.warnings
39
39
  end
40
40
 
41
- # @return [Array<String>] The command target names
41
+ # @return [Array<String>] The command target names (excluding UNKNOWN)
42
42
  def target_names
43
- return @config.commands.keys.sort
43
+ result = @config.commands.keys.sort
44
+ result.delete('UNKNOWN'.freeze)
45
+ return result
44
46
  end
45
47
 
46
48
  # @param target_name [String] The target name
@@ -194,17 +196,17 @@ module Cosmos
194
196
  items.each do |item_name, item_value|
195
197
  unless ignored_parameters.include?(item_name)
196
198
  if first
197
- string << ' with '
199
+ string << ' with '.freeze
198
200
  first = false
199
201
  else
200
- string << ', '
202
+ string << ', '.freeze
201
203
  end
202
204
 
203
205
  item = packet.get_item(item_name)
204
206
  if item.data_type ==:STRING or item.data_type == :BLOCK
205
207
  item_value = item_value.inspect
206
208
  if item_value.length > 256
207
- item_value = item_value[0..255] + '..."'
209
+ item_value = item_value[0..255] + '..."'.freeze
208
210
  end
209
211
  string << "#{item_name} #{item_value}"
210
212
  else
@@ -216,7 +218,7 @@ module Cosmos
216
218
  end
217
219
  end
218
220
  end
219
- string << "')"
221
+ string << "')".freeze
220
222
  string
221
223
  end
222
224
 
@@ -201,7 +201,8 @@ module Cosmos
201
201
  # @return [Array<limits_set, persistence, enabled, red_low, yellow_low, red_high, yellow_high, green_low (optional), green_high (optional)] Limits information
202
202
  def set(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true)
203
203
  packet = get_packet(target_name, packet_name)
204
- limits = packet.get_item(item_name).limits
204
+ item = packet.get_item(item_name)
205
+ limits = item.limits
205
206
  if limits_set
206
207
  limits_set = limits_set.to_s.upcase.intern
207
208
  else
@@ -231,7 +232,7 @@ module Cosmos
231
232
  end
232
233
  limits.enabled = enabled
233
234
  limits.persistence_setting = Integer(persistence) if persistence
234
- packet.update_limits_items_cache
235
+ packet.update_limits_items_cache(item)
235
236
  @config.limits_sets << limits_set
236
237
  @config.limits_sets.uniq!
237
238
  return [limits_set, limits.persistence_setting, limits.enabled, limits_for_set[0], limits_for_set[1], limits_for_set[2], limits_for_set[3], limits_for_set[4], limits_for_set[5]]
@@ -279,7 +279,7 @@ module Cosmos
279
279
  def define(item)
280
280
  item = super(item)
281
281
  update_id_items(item)
282
- update_limits_items_cache()
282
+ update_limits_items_cache(item)
283
283
  item
284
284
  end
285
285
 
@@ -532,16 +532,19 @@ module Cosmos
532
532
  end
533
533
  end
534
534
 
535
- # Force the packet to update its knowledge of items with limits. This is an
536
- # optimization so we don't have to iterate through all the items when
535
+ # Add an item to the limits items cache if necessary.
536
+ # You MUST call this after adding limits to an item
537
+ #This is an optimization so we don't have to iterate through all the items when
537
538
  # checking for limits.
538
- def update_limits_items_cache
539
- # Collect only the items who have limits values or states and then
540
- # compact the array to remove all the nil values
541
- @limits_items = @sorted_items.collect do |item|
542
- item if item.limits.values || item.state_colors
539
+ def update_limits_items_cache(item)
540
+ if item.limits.values || item.state_colors
541
+ @limits_items ||= []
542
+ @limits_items_hash ||= {}
543
+ unless @limits_items_hash[item]
544
+ @limits_items << item
545
+ @limits_items_hash[item] = true
546
+ end
543
547
  end
544
- @limits_items.compact!
545
548
  end
546
549
 
547
550
  # Return an array of arrays indicating all items in the packet that are out of limits
@@ -629,8 +632,8 @@ module Cosmos
629
632
  # buffer of data and processors
630
633
  def clone
631
634
  packet = super()
632
- if packet.instance_variable_get("@processors")
633
- packet.instance_variable_set("@processors", packet.processors.clone)
635
+ if packet.instance_variable_get("@processors".freeze)
636
+ packet.instance_variable_set("@processors".freeze, packet.processors.clone)
634
637
  packet.processors.each do |processor_name, processor|
635
638
  packet.processors[processor_name] = processor.clone
636
639
  end
@@ -47,7 +47,7 @@ module Cosmos
47
47
  item.limits.persistence_setting = get_persistence()
48
48
  item.limits.persistence_count = 0
49
49
 
50
- packet.update_limits_items_cache
50
+ packet.update_limits_items_cache(item)
51
51
  limits_set
52
52
  end
53
53
 
@@ -71,7 +71,7 @@ module Cosmos
71
71
  raise @parser.error("Missing MACRO_APPEND_START before this config.line.", @parser.keyword) unless @macro
72
72
  raise @parser.error("No items appended in MACRO_APPEND list", @parser.keyword) if @macro.list.empty?
73
73
 
74
- create_new_packet_items(packet)#, new_item_names)
74
+ create_new_packet_items(packet)
75
75
  end
76
76
 
77
77
  private
@@ -85,11 +85,11 @@ module Cosmos
85
85
  end
86
86
 
87
87
  def create_new_packet_items(packet)
88
+ # Shift off the first macro index because since the first item(s) already exist we just rename
89
+ first_index = @macro.indices.shift
88
90
  @macro.list.each do |name|
89
91
  original_item_name = name
90
- # Shift off the macro indices because since the first item already
91
- # exists we just rename it
92
- new_name = format_item_name(name, @macro.indices.shift)
92
+ new_name = format_item_name(name, first_index)
93
93
  item = packet.rename_item(name, new_name)
94
94
 
95
95
  # The renaming indices create new items
@@ -85,7 +85,7 @@ module Cosmos
85
85
  get_hazardous(item)
86
86
  else
87
87
  get_state_colors(item)
88
- packet.update_limits_items_cache
88
+ packet.update_limits_items_cache(item)
89
89
  end
90
90
  end
91
91
 
@@ -371,7 +371,7 @@ module Cosmos
371
371
  structure = super()
372
372
  # Use instance_variable_set since we have overriden buffer= to do
373
373
  # additional work that isn't neccessary here
374
- structure.instance_variable_set("@buffer", @buffer.clone) if @buffer
374
+ structure.instance_variable_set("@buffer".freeze, @buffer.clone) if @buffer
375
375
  return structure
376
376
  end
377
377
  alias dup clone
@@ -442,7 +442,7 @@ module Cosmos
442
442
  def internal_buffer_equals(buffer)
443
443
  raise ArgumentError, "Buffer class is #{buffer.class} but must be String" unless String === buffer
444
444
  @buffer = buffer.dup
445
- @buffer.force_encoding('ASCII-8BIT')
445
+ @buffer.force_encoding('ASCII-8BIT'.freeze)
446
446
  if @buffer.length != @defined_length
447
447
  if @buffer.length < @defined_length
448
448
  resize_buffer()
@@ -39,9 +39,11 @@ module Cosmos
39
39
  return @config.warnings
40
40
  end
41
41
 
42
- # @return [Array<String>] The telemetry target names
42
+ # @return [Array<String>] The telemetry target names (excluding UNKNOWN)
43
43
  def target_names
44
- return @config.telemetry.keys.sort
44
+ result = @config.telemetry.keys.sort
45
+ result.delete('UNKNOWN'.freeze)
46
+ return result
45
47
  end
46
48
 
47
49
  # @param target_name [String] The target name
@@ -285,7 +287,6 @@ module Cosmos
285
287
  tnames = target_names()
286
288
  total = tnames.length.to_f
287
289
  tnames.each_with_index do |target_name, index|
288
- next if target_name == 'UNKNOWN'
289
290
  if splash
290
291
  splash.message = "Processing #{target_name} telemetry"
291
292
  splash.progress = index / total
@@ -296,7 +297,7 @@ module Cosmos
296
297
  packets(target_name).each do |packet_name, packet|
297
298
  # We don't audit against hidden or disabled packets
298
299
  next if !include_hidden and (packet.hidden || packet.disabled)
299
- packet.items.keys.each do |item_name|
300
+ packet.items.each_key do |item_name|
300
301
  # Skip ignored items
301
302
  next if !include_hidden and ignored_items.include? item_name
302
303
  strings << "#{target_name} #{packet_name} #{item_name}"
@@ -598,7 +598,7 @@ module Cosmos
598
598
  def _wait_tolerance(raw, *args)
599
599
  type = (raw ? :RAW : :CONVERTED)
600
600
  type_string = 'wait_tolerance'
601
- type_string += '_raw' if raw
601
+ type_string << '_raw' if raw
602
602
  target_name, packet_name, item_name, expected_value, tolerance, timeout, polling_rate = wait_tolerance_process_args(args, type_string)
603
603
  start_time = Time.now
604
604
  success, value = cosmos_script_wait_implementation_tolerance(target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate)
@@ -682,7 +682,7 @@ module Cosmos
682
682
 
683
683
  def _wait_check_tolerance(raw, *args)
684
684
  type_string = 'wait_check_tolerance'
685
- type_string += '_raw' if raw
685
+ type_string << '_raw' if raw
686
686
  type = (raw ? :RAW : :CONVERTED)
687
687
  target_name, packet_name, item_name, expected_value, tolerance, timeout, polling_rate = wait_tolerance_process_args(args, type_string)
688
688
  start_time = Time.now
@@ -1067,7 +1067,7 @@ module Cosmos
1067
1067
 
1068
1068
  if use_file_cache
1069
1069
  # Check file based instrumented cache
1070
- flat_path = path.gsub("/", "_").gsub("\\", "_").gsub(":", "_").gsub(" ", "_")
1070
+ flat_path = path.tr("/", "_").gsub("\\", "_").tr(":", "_").tr(" ", "_")
1071
1071
  flat_path_with_md5 = flat_path + '_' + md5
1072
1072
  cache_filename = File.join(cache_path, flat_path_with_md5)
1073
1073
  end
@@ -1418,7 +1418,7 @@ module Cosmos
1418
1418
  end
1419
1419
  output_string << target_name + ' ' + cmd_name
1420
1420
  if cmd_params.nil? or cmd_params.empty?
1421
- output_string += '")'
1421
+ output_string << '")'
1422
1422
  else
1423
1423
  params = []
1424
1424
  cmd_params.each do |key, value|
@@ -1428,13 +1428,13 @@ module Cosmos
1428
1428
  if value.length > 256
1429
1429
  value = value[0..255] + "...'"
1430
1430
  end
1431
- value.gsub!('"',"'")
1431
+ value.tr!('"',"'")
1432
1432
  end
1433
1433
  end
1434
1434
  params << "#{key} #{value}"
1435
1435
  end
1436
1436
  params = params.join(", ")
1437
- output_string += ' with ' + params + '")'
1437
+ output_string << ' with ' + params + '")'
1438
1438
  end
1439
1439
  return output_string
1440
1440
  end
@@ -39,6 +39,7 @@ module Cosmos
39
39
  # Mutex on write is needed to protect from commands coming in from more
40
40
  # than one tool
41
41
  @write_mutex = Mutex.new
42
+ @connected = false
42
43
  end
43
44
 
44
45
  # @return [String] Returns a binary string of data from the socket
@@ -50,7 +51,7 @@ module Cosmos
50
51
  begin
51
52
  data = @read_socket.recv_nonblock(65535)
52
53
  @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
53
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK
54
+ rescue IO::WaitReadable
54
55
  # Wait for the socket to be ready for reading or for the timeout
55
56
  begin
56
57
  result = IO.fast_select([@read_socket], nil, nil, @read_timeout)
@@ -126,7 +126,7 @@ module Cosmos
126
126
  # Scan the response for the variables in brackets <VARIABLE>
127
127
  # Write the packet value with each of the values received
128
128
  response_values = response_string.scan(response_regexp)[0]
129
- raise "Unexpected response received: #{response_string}" if response_values.length != response_item_names.length
129
+ raise "Unexpected response received: #{response_string}" if !response_values or (response_values.length != response_item_names.length)
130
130
  response_values.each_with_index do |value, i|
131
131
  result_packet.write(response_item_names[i], value)
132
132
  end
@@ -443,7 +443,7 @@ module Cosmos
443
443
  def update_targets
444
444
  @target_select.clearItems()
445
445
  target_names = System.commands.target_names
446
- target_names_to_delete = ['UNKNOWN']
446
+ target_names_to_delete = []
447
447
  target_names.each do |target_name|
448
448
  found_non_hidden = false
449
449
  begin
@@ -149,7 +149,9 @@ module Cosmos
149
149
  # Add the message output
150
150
  @output = Qt::PlainTextEdit.new
151
151
  @output.setReadOnly(true)
152
- @output.setMaximumBlockCount(10000) # 10000 lines of history will be displayed
152
+ # Block count does NOT equal line numbers. Testing on Windows indicates
153
+ # 100 blocks equals a little over 27000 lines.
154
+ @output.setMaximumBlockCount(100)
153
155
 
154
156
  @splitter.addWidget(@output)
155
157
  # Set the stretch factor to give priority to the tab_widget (index 0) instead of the output (index 1)
@@ -218,16 +220,11 @@ module Cosmos
218
220
 
219
221
  # Update the status tab of the server
220
222
  def handle_status_tab
221
- if CmdTlmServer.json_drb
222
- previous_request_count = CmdTlmServer.json_drb.request_count
223
- else
224
- previous_request_count = 0
225
- end
226
223
  @tab_thread = Thread.new do
227
224
  begin
228
225
  while true
229
226
  start_time = Time.now
230
- Qt.execute_in_main_thread(true) { @status_tab.update(previous_request_count) }
227
+ Qt.execute_in_main_thread(true) { @status_tab.update }
231
228
  total_time = Time.now - start_time
232
229
  if total_time > 0.0 and total_time < 1.0
233
230
  break if @tab_sleeper.sleep(1.0 - total_time)
@@ -296,7 +293,7 @@ module Cosmos
296
293
  lines_to_write = ''
297
294
  string = @string_output.string.clone
298
295
  @string_output.string = @string_output.string[string.length..-1]
299
- string.each_line {|out_line| @output.add_formatted_text(out_line); lines_to_write += out_line }
296
+ string.each_line {|out_line| @output.add_formatted_text(out_line); lines_to_write << out_line }
300
297
  @output.flush
301
298
  if @first_output < 2
302
299
  # Scroll to the bottom on the first two outputs for Linux
@@ -17,6 +17,7 @@ module Cosmos
17
17
  class InterfacesTab
18
18
  INTERFACES = 'Interfaces'
19
19
  ROUTERS = 'Routers'
20
+ ALIGN_CENTER = Qt::AlignCenter
20
21
 
21
22
  def initialize
22
23
  @interfaces_table = {}
@@ -116,7 +117,7 @@ module Cosmos
116
117
  row = 0
117
118
  interfaces.all.each do |interface_name, interface|
118
119
  item = Qt::TableWidgetItem.new(Qt::Object.tr(interface_name))
119
- item.setTextAlignment(Qt::AlignCenter)
120
+ item.setTextAlignment(ALIGN_CENTER)
120
121
  interfaces_table.setItem(row, 0, item)
121
122
  interfaces_table.setCellWidget(row, 1, create_button(name, interface, interface_name))
122
123
  interfaces_table.setItem(row, 2, create_state(interface))
@@ -126,8 +127,8 @@ module Cosmos
126
127
  interface.bytes_written, interface.bytes_read,
127
128
  interface.write_count, interface.read_count].each do |val|
128
129
 
129
- item = Qt::TableWidgetItem.new(Qt::Object.tr(val.to_s))
130
- item.setTextAlignment(Qt::AlignCenter)
130
+ item = Qt::TableWidgetItem.new(val.to_s)#Qt::Object.tr(val.to_s))
131
+ item.setTextAlignment(ALIGN_CENTER)
131
132
  interfaces_table.setItem(row, index, item)
132
133
  index += 1
133
134
  end
@@ -39,7 +39,7 @@ module Cosmos
39
39
  return if cmd_tlm.nil? || cmd_tlm.target_names.empty?
40
40
 
41
41
  row = 0
42
- cmd_tlm.target_names.sort.each do |target_name|
42
+ cmd_tlm.target_names.each do |target_name|
43
43
  packets = cmd_tlm.packets(target_name)
44
44
  packets.sort.each do |packet_name, packet|
45
45
  next if packet.hidden
@@ -47,6 +47,9 @@ module Cosmos
47
47
  row += 1
48
48
  end
49
49
  end
50
+ packet = cmd_tlm.packet('UNKNOWN', 'UNKNOWN')
51
+ @packets_table[name].item(row, 2).setText(packet.received_count.to_s)
52
+ row += 1
50
53
  end
51
54
 
52
55
  private
@@ -55,12 +58,13 @@ module Cosmos
55
58
  return if cmd_tlm.target_names.empty?
56
59
 
57
60
  count = 0
58
- cmd_tlm.target_names.sort.each do |target_name|
61
+ cmd_tlm.target_names.each do |target_name|
59
62
  packets = cmd_tlm.packets(target_name)
60
63
  packets.each do |packet_name, packet|
61
64
  count += 1 unless packet.hidden
62
65
  end
63
66
  end
67
+ count += 1 # For UNKNOWN UNKNOWN
64
68
 
65
69
  scroll = Qt::ScrollArea.new
66
70
  widget = Qt::Widget.new
@@ -95,7 +99,9 @@ module Cosmos
95
99
 
96
100
  def populate_packets_table(name, cmd_tlm, table)
97
101
  row = 0
98
- cmd_tlm.target_names.sort.each do |target_name|
102
+ target_names = cmd_tlm.target_names
103
+ target_names << 'UNKNOWN'.freeze
104
+ target_names.each do |target_name|
99
105
  packets = cmd_tlm.packets(target_name)
100
106
  packets.sort.each do |packet_name, packet|
101
107
  packet.received_count ||= 0