cosmos 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
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