cosmos 4.1.1-java → 4.2.0-java

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 (336) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.travis.yml +2 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +1 -0
  6. data/Manifest.txt +130 -0
  7. data/autohotkey/tools/ConfigEditorAHK +19 -0
  8. data/autohotkey/tools/cmd_extractor.ahk +4 -4
  9. data/autohotkey/tools/cmd_sequence.ahk +9 -5
  10. data/autohotkey/tools/config_editor.ahk +197 -0
  11. data/autohotkey/tools/packet_viewer.ahk +12 -6
  12. data/autohotkey/tools/replay.ahk +29 -29
  13. data/autohotkey/tools/script_runner.ahk +10 -2
  14. data/autohotkey/tools/tlm_extractor.ahk +7 -8
  15. data/autohotkey/tools/tlm_grapher.ahk +21 -9
  16. data/bin/dart_import +2 -0
  17. data/cosmos.gemspec +18 -16
  18. data/data/config/cmd_tlm_server.yaml +9 -0
  19. data/data/config/interface_modifiers.yaml +17 -0
  20. data/data/config/item_modifiers.yaml +3 -3
  21. data/data/crc.txt +184 -90
  22. data/data/dart.png +0 -0
  23. data/demo/Gemfile +1 -0
  24. data/demo/Rakefile +4 -0
  25. data/demo/config/dart/Gemfile +54 -0
  26. data/demo/config/data/crc.txt +28 -21
  27. data/demo/config/system/system.txt +3 -0
  28. data/demo/config/system/system2.txt +3 -0
  29. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +3 -3
  30. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -1
  31. data/demo/config/targets/INST/lib/sim_inst.rb +1 -1
  32. data/demo/config/targets/INST/screens/adcs.txt +2 -1
  33. data/demo/config/targets/INST/screens/array.txt +1 -1
  34. data/demo/config/targets/INST/screens/block.txt +1 -1
  35. data/demo/config/targets/INST/screens/commanding.txt +7 -2
  36. data/demo/config/targets/INST/screens/graphs.txt +1 -1
  37. data/demo/config/targets/INST/screens/ground.txt +1 -1
  38. data/demo/config/targets/INST/screens/hs.txt +2 -1
  39. data/demo/config/targets/INST/screens/latest.txt +1 -1
  40. data/demo/config/targets/INST/screens/limits.txt +1 -1
  41. data/demo/config/targets/INST/screens/other.txt +1 -1
  42. data/demo/config/targets/INST/screens/tabs.txt +1 -1
  43. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  44. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +3 -1
  45. data/demo/config/tools/launcher/launcher.txt +3 -2
  46. data/demo/tools/Dart +16 -0
  47. data/demo/tools/Dart.bat +9 -0
  48. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  49. data/demo/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  50. data/install/Gemfile +1 -0
  51. data/install/Rakefile +4 -0
  52. data/install/config/dart/Gemfile +54 -0
  53. data/install/config/data/crc.txt +6 -3
  54. data/install/config/system/system.txt +3 -0
  55. data/install/config/tools/launcher/launcher.txt +3 -2
  56. data/install/tools/Dart +16 -0
  57. data/install/tools/Dart.bat +9 -0
  58. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  59. data/install/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  60. data/lib/cosmos/core_ext/time.rb +8 -8
  61. data/lib/cosmos/dart/.rspec +1 -0
  62. data/lib/cosmos/dart/Gemfile +69 -0
  63. data/lib/cosmos/dart/Rakefile +7 -0
  64. data/lib/cosmos/dart/app/assets/config/manifest.js +4 -0
  65. data/lib/cosmos/dart/app/assets/images/.keep +0 -0
  66. data/lib/cosmos/dart/app/assets/javascripts/application.js +13 -0
  67. data/lib/cosmos/dart/app/assets/javascripts/cable.js +13 -0
  68. data/lib/cosmos/dart/app/assets/stylesheets/application.css.scss +15 -0
  69. data/lib/cosmos/dart/app/channels/application_cable/channel.rb +4 -0
  70. data/lib/cosmos/dart/app/channels/application_cable/connection.rb +4 -0
  71. data/lib/cosmos/dart/app/controllers/application_controller.rb +3 -0
  72. data/lib/cosmos/dart/app/helpers/application_helper.rb +2 -0
  73. data/lib/cosmos/dart/app/jobs/application_job.rb +2 -0
  74. data/lib/cosmos/dart/app/mailers/application_mailer.rb +4 -0
  75. data/lib/cosmos/dart/app/models/application_record.rb +3 -0
  76. data/lib/cosmos/dart/app/models/item.rb +6 -0
  77. data/lib/cosmos/dart/app/models/item_to_decom_table_mapping.rb +9 -0
  78. data/lib/cosmos/dart/app/models/packet.rb +4 -0
  79. data/lib/cosmos/dart/app/models/packet_config.rb +7 -0
  80. data/lib/cosmos/dart/app/models/packet_log.rb +3 -0
  81. data/lib/cosmos/dart/app/models/packet_log_entry.rb +41 -0
  82. data/lib/cosmos/dart/app/models/system_config.rb +2 -0
  83. data/lib/cosmos/dart/app/models/target.rb +4 -0
  84. data/lib/cosmos/dart/app/views/layouts/application.html.erb +14 -0
  85. data/lib/cosmos/dart/app/views/layouts/mailer.html.erb +13 -0
  86. data/lib/cosmos/dart/app/views/layouts/mailer.text.erb +1 -0
  87. data/lib/cosmos/dart/bin/bundle +3 -0
  88. data/lib/cosmos/dart/bin/rails +4 -0
  89. data/lib/cosmos/dart/bin/rake +4 -0
  90. data/lib/cosmos/dart/bin/setup +34 -0
  91. data/lib/cosmos/dart/bin/update +29 -0
  92. data/lib/cosmos/dart/config.ru +5 -0
  93. data/lib/cosmos/dart/config/application.rb +29 -0
  94. data/lib/cosmos/dart/config/boot.rb +3 -0
  95. data/lib/cosmos/dart/config/cable.yml +9 -0
  96. data/lib/cosmos/dart/config/database.yml +23 -0
  97. data/lib/cosmos/dart/config/environment.rb +5 -0
  98. data/lib/cosmos/dart/config/environments/development.rb +62 -0
  99. data/lib/cosmos/dart/config/environments/production.rb +84 -0
  100. data/lib/cosmos/dart/config/environments/test.rb +42 -0
  101. data/lib/cosmos/dart/config/initializers/application_controller_renderer.rb +6 -0
  102. data/lib/cosmos/dart/config/initializers/assets.rb +12 -0
  103. data/lib/cosmos/dart/config/initializers/backtrace_silencers.rb +7 -0
  104. data/lib/cosmos/dart/config/initializers/cookies_serializer.rb +5 -0
  105. data/lib/cosmos/dart/config/initializers/filter_parameter_logging.rb +4 -0
  106. data/lib/cosmos/dart/config/initializers/inflections.rb +16 -0
  107. data/lib/cosmos/dart/config/initializers/mime_types.rb +4 -0
  108. data/lib/cosmos/dart/config/initializers/new_framework_defaults.rb +25 -0
  109. data/lib/cosmos/dart/config/initializers/session_store.rb +3 -0
  110. data/lib/cosmos/dart/config/initializers/wrap_parameters.rb +14 -0
  111. data/lib/cosmos/dart/config/locales/en.yml +23 -0
  112. data/lib/cosmos/dart/config/puma.rb +47 -0
  113. data/lib/cosmos/dart/config/routes.rb +3 -0
  114. data/lib/cosmos/dart/config/secrets.yml +22 -0
  115. data/lib/cosmos/dart/db/migrate/20170406172907_create_targets.rb +8 -0
  116. data/lib/cosmos/dart/db/migrate/20170406172927_create_packets.rb +10 -0
  117. data/lib/cosmos/dart/db/migrate/20170406172937_create_packet_logs.rb +9 -0
  118. data/lib/cosmos/dart/db/migrate/20170406172943_create_packet_log_entries.rb +16 -0
  119. data/lib/cosmos/dart/db/migrate/20170406183500_change_packet_log_entries_primary_key.rb +5 -0
  120. data/lib/cosmos/dart/db/migrate/20170407153618_add_unique_requirements.rb +7 -0
  121. data/lib/cosmos/dart/db/migrate/20170511155447_add_meta_id_to_packet_log_entries.rb +6 -0
  122. data/lib/cosmos/dart/db/migrate/20170523185056_rename_received_time_and_add_is_tlm_to_packet_log_entries.rb +7 -0
  123. data/lib/cosmos/dart/db/migrate/20170525201157_create_items.rb +10 -0
  124. data/lib/cosmos/dart/db/migrate/20170525201315_create_system_configs.rb +9 -0
  125. data/lib/cosmos/dart/db/migrate/20170525201624_create_packet_configs.rb +11 -0
  126. data/lib/cosmos/dart/db/migrate/20170525201745_create_item_to_decom_table_mappings.rb +12 -0
  127. data/lib/cosmos/dart/db/migrate/20170525201939_create_decom_tables.rb +12 -0
  128. data/lib/cosmos/dart/db/migrate/20170525202051_add_decom_state_to_packet_log_entry.rb +5 -0
  129. data/lib/cosmos/dart/db/migrate/20170913160409_update_items.rb +6 -0
  130. data/lib/cosmos/dart/db/migrate/20170913160558_update_item_to_decom_table_mapping.rb +11 -0
  131. data/lib/cosmos/dart/db/migrate/20170913160916_udpate_decom_table.rb +6 -0
  132. data/lib/cosmos/dart/db/migrate/20170913212026_add_ready_to_packet_configs.rb +5 -0
  133. data/lib/cosmos/dart/db/migrate/20170913223556_modify_tables.rb +9 -0
  134. data/lib/cosmos/dart/db/migrate/20170914215744_modify_mapping_table.rb +6 -0
  135. data/lib/cosmos/dart/db/migrate/20170919201433_add_system_config_id_to_packet_config.rb +11 -0
  136. data/lib/cosmos/dart/db/migrate/20170919210307_add_max_table_index_to_packet_configs.rb +5 -0
  137. data/lib/cosmos/dart/db/migrate/20171215225546_add_ready_to_packet_log_entries.rb +5 -0
  138. data/lib/cosmos/dart/db/migrate/20180116214338_add_index_for_ple_ready_to_packet_log_entries.rb +5 -0
  139. data/lib/cosmos/dart/db/schema.rb +103 -0
  140. data/lib/cosmos/dart/db/seeds.rb +7 -0
  141. data/lib/cosmos/dart/examples/dart_decom_client.rb +45 -0
  142. data/lib/cosmos/dart/examples/dart_stream_client.rb +93 -0
  143. data/lib/cosmos/dart/lib/dart_common.rb +749 -0
  144. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +172 -0
  145. data/lib/cosmos/dart/lib/dart_decom_query.rb +184 -0
  146. data/lib/cosmos/dart/lib/dart_decommutator.rb +235 -0
  147. data/lib/cosmos/dart/lib/dart_importer.rb +154 -0
  148. data/lib/cosmos/dart/lib/dart_logging.rb +50 -0
  149. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +139 -0
  150. data/lib/cosmos/dart/lib/dart_reducer_manager.rb +85 -0
  151. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +263 -0
  152. data/lib/cosmos/dart/lib/dart_tcpip_server_interface.rb +142 -0
  153. data/lib/cosmos/dart/processes/dart.rb +145 -0
  154. data/lib/cosmos/dart/processes/dart_decom_server.rb +39 -0
  155. data/lib/cosmos/dart/processes/dart_import.rb +63 -0
  156. data/lib/cosmos/dart/processes/dart_ingester.rb +92 -0
  157. data/lib/cosmos/dart/processes/dart_reducer.rb +27 -0
  158. data/lib/cosmos/dart/processes/dart_stream_server.rb +31 -0
  159. data/lib/cosmos/dart/processes/dart_worker.rb +37 -0
  160. data/lib/cosmos/dart/spec/dart/dart_common_spec.rb +333 -0
  161. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +455 -0
  162. data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +153 -0
  163. data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +336 -0
  164. data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +83 -0
  165. data/lib/cosmos/dart/spec/dart/dart_logging_spec.rb +30 -0
  166. data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +149 -0
  167. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +289 -0
  168. data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +241 -0
  169. data/lib/cosmos/dart/spec/rails_helper.rb +60 -0
  170. data/lib/cosmos/dart/spec/spec_helper.rb +139 -0
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +1 -1
  172. data/lib/cosmos/gui/dialogs/dart_dialog.rb +60 -0
  173. data/lib/cosmos/gui/dialogs/legal_dialog.rb +1 -0
  174. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +0 -3
  175. data/lib/cosmos/gui/qt.rb +10 -1
  176. data/lib/cosmos/gui/text/completion.rb +10 -9
  177. data/lib/cosmos/gui/text/completion_text_edit.rb +16 -14
  178. data/lib/cosmos/gui/text/ruby_editor.rb +2 -2
  179. data/lib/cosmos/gui/widgets/dart_frame.rb +142 -0
  180. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +119 -0
  181. data/lib/cosmos/gui/widgets/packet_log_frame.rb +42 -12
  182. data/lib/cosmos/interfaces/interface.rb +1 -2
  183. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +26 -8
  184. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +8 -2
  185. data/lib/cosmos/interfaces/protocols/protocol.rb +2 -1
  186. data/lib/cosmos/interfaces/protocols/template_protocol.rb +1 -1
  187. data/lib/cosmos/interfaces/stream_interface.rb +1 -0
  188. data/lib/cosmos/interfaces/tcpip_server_interface.rb +2 -3
  189. data/lib/cosmos/io/json_drb_object.rb +1 -1
  190. data/lib/cosmos/io/json_rpc.rb +2 -1
  191. data/lib/cosmos/io/win32_serial_driver.rb +2 -9
  192. data/lib/cosmos/packet_logs/packet_log_writer.rb +1 -1
  193. data/lib/cosmos/packets/packet.rb +22 -12
  194. data/lib/cosmos/packets/packet_config.rb +2 -1
  195. data/lib/cosmos/packets/packet_item.rb +26 -24
  196. data/lib/cosmos/packets/parsers/macro_parser.rb +5 -2
  197. data/lib/cosmos/packets/parsers/packet_item_parser.rb +35 -17
  198. data/lib/cosmos/packets/parsers/packet_parser.rb +3 -10
  199. data/lib/cosmos/packets/parsers/xtce_converter.rb +21 -35
  200. data/lib/cosmos/packets/parsers/xtce_parser.rb +54 -46
  201. data/lib/cosmos/packets/structure.rb +10 -2
  202. data/lib/cosmos/packets/structure_item.rb +22 -8
  203. data/lib/cosmos/processors/statistics_processor.rb +2 -0
  204. data/lib/cosmos/script/api_shared.rb +13 -12
  205. data/lib/cosmos/script/cmd_tlm_server.rb +4 -0
  206. data/lib/cosmos/script/commands.rb +3 -15
  207. data/lib/cosmos/script/script.rb +69 -23
  208. data/lib/cosmos/streams/tcpip_client_stream.rb +2 -2
  209. data/lib/cosmos/system/system.rb +42 -25
  210. data/lib/cosmos/system/target.rb +6 -2
  211. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +177 -36
  212. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +3 -2
  213. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +34 -8
  214. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +80 -25
  215. data/lib/cosmos/tools/cmd_tlm_server/api.rb +19 -4
  216. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +15 -14
  217. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +15 -9
  218. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +1 -9
  219. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -6
  220. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +1 -3
  221. data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +84 -7
  222. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +0 -1
  223. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +1 -5
  224. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +3 -2
  225. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +159 -27
  226. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +1 -1
  227. data/lib/cosmos/tools/config_editor/config_editor.rb +17 -52
  228. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +0 -5
  229. data/lib/cosmos/tools/data_viewer/data_viewer.rb +111 -0
  230. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -18
  231. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +12 -3
  232. data/lib/cosmos/tools/script_runner/script_runner.rb +27 -14
  233. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +104 -37
  234. data/lib/cosmos/tools/table_manager/table_config.rb +1 -1
  235. data/lib/cosmos/tools/table_manager/table_item_parser.rb +4 -2
  236. data/lib/cosmos/tools/table_manager/table_manager.rb +0 -5
  237. data/lib/cosmos/tools/table_manager/table_manager_core.rb +0 -1
  238. data/lib/cosmos/tools/test_runner/test.rb +1 -3
  239. data/lib/cosmos/tools/test_runner/test_runner.rb +26 -15
  240. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +290 -137
  241. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +122 -25
  242. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +67 -0
  243. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +28 -0
  244. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +36 -0
  245. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +42 -3
  246. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +88 -14
  247. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +2 -5
  248. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +2 -6
  249. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +74 -18
  250. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +3 -7
  251. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +159 -0
  252. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +49 -2
  253. data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -0
  254. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +0 -2
  255. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  256. data/lib/cosmos/tools/tlm_viewer/widgets/backgroundbutton_widget.rb +54 -0
  257. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +5 -5
  258. data/lib/cosmos/top_level.rb +1 -0
  259. data/lib/cosmos/utilities/crc.rb +3 -0
  260. data/lib/cosmos/utilities/csv.rb +1 -0
  261. data/lib/cosmos/utilities/message_log.rb +2 -1
  262. data/lib/cosmos/utilities/simulated_target.rb +8 -8
  263. data/lib/cosmos/version.rb +5 -5
  264. data/lib/cosmos/win32/win32.rb +4 -10
  265. data/run_gui_tests.bat +2 -1
  266. data/spec/config/config_parser_spec.rb +4 -4
  267. data/spec/core_ext/array_spec.rb +1 -1
  268. data/spec/core_ext/exception_spec.rb +12 -12
  269. data/spec/core_ext/file_spec.rb +6 -6
  270. data/spec/core_ext/hash_spec.rb +1 -1
  271. data/spec/core_ext/socket_spec.rb +2 -2
  272. data/spec/core_ext/string_spec.rb +13 -13
  273. data/spec/core_ext/time_spec.rb +0 -2
  274. data/spec/gui/utilities/script_module_gui_spec.rb +3 -3
  275. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +6 -6
  276. data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +4 -0
  277. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +6 -2
  278. data/spec/interfaces/interface_spec.rb +0 -1
  279. data/spec/interfaces/linc_interface_spec.rb +0 -5
  280. data/spec/interfaces/protocols/crc_protocol_spec.rb +201 -85
  281. data/spec/interfaces/protocols/fixed_protocol_spec.rb +33 -9
  282. data/spec/interfaces/protocols/length_protocol_spec.rb +1 -1
  283. data/spec/interfaces/protocols/override_protocol_spec.rb +6 -2
  284. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +1 -5
  285. data/spec/interfaces/protocols/template_protocol_spec.rb +0 -1
  286. data/spec/interfaces/simulated_target_interface_spec.rb +5 -5
  287. data/spec/interfaces/udp_interface_spec.rb +2 -4
  288. data/spec/io/buffered_file_spec.rb +8 -12
  289. data/spec/io/json_drb_spec.rb +9 -9
  290. data/spec/io/json_rpc_spec.rb +4 -4
  291. data/spec/io/raw_logger_spec.rb +4 -3
  292. data/spec/packet_logs/packet_log_reader_spec.rb +3 -6
  293. data/spec/packet_logs/packet_log_writer_spec.rb +4 -4
  294. data/spec/packets/binary_accessor_spec.rb +5 -8
  295. data/spec/packets/commands_spec.rb +2 -2
  296. data/spec/packets/limits_spec.rb +2 -2
  297. data/spec/packets/packet_config_spec.rb +12 -0
  298. data/spec/packets/packet_item_limits_spec.rb +1 -1
  299. data/spec/packets/packet_item_spec.rb +9 -9
  300. data/spec/packets/packet_spec.rb +15 -5
  301. data/spec/packets/parsers/packet_item_parser_spec.rb +27 -0
  302. data/spec/packets/parsers/xtce_parser_spec.rb +27 -30
  303. data/spec/packets/structure_spec.rb +2 -1
  304. data/spec/packets/telemetry_spec.rb +3 -5
  305. data/spec/processors/statistics_processor_spec.rb +35 -0
  306. data/spec/script/cmd_tlm_server_spec.rb +4 -21
  307. data/spec/script/commands_disconnect_spec.rb +46 -58
  308. data/spec/script/commands_spec.rb +40 -61
  309. data/spec/script/limits_spec.rb +1 -21
  310. data/spec/script/script_spec.rb +32 -41
  311. data/spec/script/scripting_spec.rb +166 -185
  312. data/spec/script/telemetry_spec.rb +10 -5
  313. data/spec/script/tools_spec.rb +2 -24
  314. data/spec/spec_helper.rb +11 -5
  315. data/spec/system/system_spec.rb +17 -12
  316. data/spec/tools/cmd_tlm_server/api_spec.rb +21 -10
  317. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -16
  318. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +0 -1
  319. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +16 -27
  320. data/spec/tools/cmd_tlm_server/commanding_spec.rb +2 -6
  321. data/spec/tools/cmd_tlm_server/connections_spec.rb +0 -4
  322. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +13 -13
  323. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +5 -9
  324. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +11 -3
  325. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +0 -4
  326. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +5 -5
  327. data/spec/tools/cmd_tlm_server/routers_spec.rb +5 -9
  328. data/spec/tools/table_manager/table_config_spec.rb +0 -1
  329. data/spec/tools/table_manager/tablemanager_core_spec.rb +23 -23
  330. data/spec/tools/tlm_viewer/tlm_viewer_config_spec.rb +6 -4
  331. data/spec/top_level/top_level_spec.rb +9 -9
  332. data/spec/utilities/csv_spec.rb +2 -12
  333. data/spec/utilities/logger_spec.rb +6 -6
  334. data/spec/utilities/message_log_spec.rb +3 -11
  335. data/tasks/gemfile_stats.rake +2 -2
  336. metadata +167 -60
@@ -126,11 +126,15 @@ module Cosmos
126
126
  begin
127
127
  # Require absolute path to file in target lib folder. Prevents name
128
128
  # conflicts at the require step
129
- Cosmos.require_file(File.join(@dir, 'lib', parameters[0]), false)
129
+ Cosmos.disable_warnings do
130
+ Cosmos.require_file(File.join(@dir, 'lib', parameters[0]), false)
131
+ end
130
132
  rescue LoadError
131
133
  begin
132
134
  # If we couldn't load at the target/lib level check everywhere
133
- Cosmos.require_file(parameters[0])
135
+ Cosmos.disable_warnings do
136
+ Cosmos.require_file(parameters[0])
137
+ end
134
138
  rescue Exception => err
135
139
  raise parser.error(err.message)
136
140
  end
@@ -14,6 +14,7 @@ Cosmos.catch_fatal_exception do
14
14
  require 'cosmos/gui/dialogs/packet_log_dialog'
15
15
  require 'cosmos/gui/dialogs/splash'
16
16
  require 'cosmos/gui/dialogs/progress_dialog'
17
+ require 'cosmos/gui/widgets/dart_meta_frame'
17
18
  require 'cosmos/gui/utilities/analyze_log'
18
19
  end
19
20
 
@@ -35,6 +36,11 @@ module Cosmos
35
36
  @packet_log_reader = System.default_packet_log_reader.new(*System.default_packet_log_reader_params)
36
37
  @time_start = nil
37
38
  @time_end = nil
39
+ @interface = Cosmos::TcpipClientInterface.new(
40
+ Cosmos::System.connect_hosts['DART_STREAM'],
41
+ Cosmos::System.ports['DART_STREAM'],
42
+ Cosmos::System.ports['DART_STREAM'],
43
+ 10, 30, 'PREIDENTIFIED')
38
44
 
39
45
  Cosmos.load_cosmos_icon("cmd_extractor.png")
40
46
 
@@ -83,15 +89,46 @@ module Cosmos
83
89
  # Create the CmdExtractor application which primarily consists of a
84
90
  # {PacketLogFrame}
85
91
  def initialize_central_widget
92
+ @resize_timer = Qt::Timer.new
93
+ @resize_timer.connect(SIGNAL('timeout()')) { self.resize(self.width, self.minimumHeight) }
94
+
86
95
  @central_widget = Qt::Widget.new
87
96
  setCentralWidget(@central_widget)
88
97
  @top_layout = Qt::VBoxLayout.new(@central_widget)
89
98
 
99
+ # Data Source Selection
100
+ @data_source_layout = Qt::HBoxLayout.new()
101
+ label = Qt::Label.new("Data Source: ")
102
+ @data_source_layout.addWidget(label)
103
+ @log_file_radio = Qt::RadioButton.new("Log File", self)
104
+ @log_file_radio.setChecked(true)
105
+ @log_file_radio.connect(SIGNAL('clicked()')) do
106
+ @packet_log_frame.show_log_fields(true)
107
+ @packet_log_frame.output_filename = ""
108
+ @dart_meta_frame.hide
109
+ @resize_timer.start(100)
110
+ end
111
+ @data_source_layout.addWidget(@log_file_radio)
112
+ @dart_radio = Qt::RadioButton.new("DART Database", self)
113
+ @dart_radio.connect(SIGNAL('clicked()')) do
114
+ @packet_log_frame.show_log_fields(false)
115
+ @packet_log_frame.output_filename = ""
116
+ @dart_meta_frame.show
117
+ @resize_timer.start(100)
118
+ end
119
+ @data_source_layout.addWidget(@dart_radio)
120
+ @data_source_layout.addStretch()
121
+ @top_layout.addLayout(@data_source_layout)
122
+
90
123
  # Packet Log Frame
91
124
  @packet_log_frame = PacketLogFrame.new(self, @log_dir, System.default_packet_log_reader.new(*System.default_packet_log_reader_params), @input_filenames, @output_filename, true, true, true, Cosmos::CMD_FILE_PATTERN, Cosmos::TXT_FILE_PATTERN)
92
125
  @packet_log_frame.change_callback = method(:change_callback)
93
126
  @top_layout.addWidget(@packet_log_frame)
94
127
 
128
+ @dart_meta_frame = DartMetaFrame.new(self)
129
+ @dart_meta_frame.hide
130
+ @top_layout.addWidget(@dart_meta_frame)
131
+
95
132
  # Separator before buttons
96
133
  @sep2 = Qt::Frame.new(@central_widget)
97
134
  @sep2.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
@@ -99,8 +136,8 @@ module Cosmos
99
136
 
100
137
  # Process and Open Buttons
101
138
  @button_layout = Qt::HBoxLayout.new
102
- @process_button = Qt::PushButton.new('&Process Files')
103
- @process_button.connect(SIGNAL('clicked()')) { process_log_files() }
139
+ @process_button = Qt::PushButton.new('&Process Data')
140
+ @process_button.connect(SIGNAL('clicked()')) { process_data() }
104
141
  @button_layout.addWidget(@process_button)
105
142
 
106
143
  @open_button = Qt::PushButton.new('&Open in Text Editor')
@@ -134,41 +171,138 @@ module Cosmos
134
171
  AnalyzeLog.execute(self, @packet_log_frame)
135
172
  end
136
173
 
137
- def process_log_files
174
+ def process_data
138
175
  @cancel = false
139
- begin
140
- @packet_log_reader = @packet_log_frame.packet_log_reader
141
- @input_filenames = @packet_log_frame.filenames.sort
142
- @time_start = @packet_log_frame.time_start
143
- @time_end = @packet_log_frame.time_end
144
- @output_filename = @packet_log_frame.output_filename
145
- include_raw = @include_raw.isChecked
146
- return unless pre_process_tests()
147
-
148
- ProgressDialog.execute(self, # parent
149
- 'Log File Progress', # title
150
- 600, # width, height
151
- 300) do |progress_dialog|
152
- progress_dialog.cancel_callback = method(:cancel_callback)
153
- progress_dialog.enable_cancel_button
154
-
155
- begin
156
- Cosmos.set_working_dir do
157
- File.open(@output_filename, 'w') do |output_file|
158
- process_files(output_file, include_raw, progress_dialog)
176
+ @time_start = @packet_log_frame.time_start
177
+ @time_end = @packet_log_frame.time_end
178
+ @packet_log_reader = @packet_log_frame.packet_log_reader
179
+ @input_filenames = @packet_log_frame.filenames.sort
180
+ @output_filename = @packet_log_frame.output_filename
181
+ @output_filename = nil if @output_filename.strip.empty?
182
+ @meta_filters = @dart_meta_frame.meta_filters
183
+
184
+ return unless pre_process_tests()
185
+
186
+ include_raw = @include_raw.isChecked
187
+ if @log_file_radio.isChecked
188
+ begin
189
+ ProgressDialog.execute(self, # parent
190
+ 'Log File Progress', # title
191
+ 600, # width, height
192
+ 300) do |progress_dialog|
193
+ progress_dialog.cancel_callback = method(:cancel_callback)
194
+ progress_dialog.enable_cancel_button
195
+
196
+ begin
197
+ Cosmos.set_working_dir do
198
+ File.open(@output_filename, 'w') do |output_file|
199
+ process_files(output_file, include_raw, progress_dialog)
200
+ end
201
+ end
202
+ ensure
203
+ progress_dialog.complete
204
+ Qt.execute_in_main_thread(true) do
205
+ @open_button.setEnabled(true)
159
206
  end
160
- end
161
- ensure
162
- progress_dialog.complete
163
- Qt.execute_in_main_thread(true) do
164
- @open_button.setEnabled(true)
165
207
  end
166
208
  end
209
+ rescue => error
210
+ Qt::MessageBox.critical(self, 'Error!', "Error Processing Log File(s)\n#{error.formatted}")
167
211
  end
168
- rescue => error
169
- Qt::MessageBox.critical(self, 'Error!', "Error Processing Log File(s)\n#{error.formatted}")
212
+ else
213
+ begin
214
+ ProgressDialog.execute(self, # parent
215
+ 'Log File Progress', # title
216
+ 600, # width, height
217
+ 300,
218
+ true, # Overall progress, no step progress
219
+ false) do |progress_dialog|
220
+ progress_dialog.cancel_callback = method(:cancel_callback)
221
+ progress_dialog.enable_cancel_button
222
+
223
+ begin
224
+ Cosmos.set_working_dir do
225
+ File.open(@output_filename, 'w') do |output_file|
226
+
227
+ @interface.disconnect
228
+ request_packet = Cosmos::Packet.new('DART', 'DART')
229
+ request_packet.define_item('REQUEST', 0, 0, :BLOCK)
230
+
231
+ @time_start ||= Time.utc(1970, 1, 1)
232
+ @time_end ||= Time.now
233
+ @time_delta = @time_end - @time_start
234
+ request = {}
235
+ request['start_time_sec'] = @time_start.tv_sec
236
+ request['start_time_usec'] = @time_start.tv_usec
237
+ request['end_time_sec'] = @time_end.tv_sec
238
+ request['end_time_usec'] = @time_end.tv_usec
239
+ request['cmd_tlm'] = 'CMD'
240
+ request['meta_filters'] = @meta_filters unless @meta_filters.empty?
241
+ request_packet.write('REQUEST', JSON.dump(request))
242
+
243
+ progress_dialog.append_text("Connecting to DART Database...")
244
+ @interface.connect
245
+ progress_dialog.append_text("Sending DART Database Query...")
246
+ @interface.write(request_packet)
247
+ progress_dialog.append_text("Receiving Packets...")
248
+
249
+ first = true
250
+ while true
251
+ break if @cancel
252
+ packet = @interface.read
253
+ unless packet
254
+ progress_dialog.append_text("Done!")
255
+ progress_dialog.set_overall_progress(1.0)
256
+ @interface.disconnect
257
+ break
258
+ end
259
+
260
+ # Switch to correct configuration from SYSTEM META when needed
261
+ if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
262
+ meta_packet = System.commands.packet('SYSTEM', 'META')
263
+ meta_packet.buffer = packet.buffer
264
+ Cosmos::System.load_configuration(meta_packet.read('CONFIG'))
265
+ elsif first
266
+ first = false
267
+ @time_start = packet.received_time
268
+ @time_delta = @time_end - @time_start
269
+ end
270
+
271
+ defined_packet = System.commands.packet(packet.target_name, packet.packet_name)
272
+ defined_packet.buffer = packet.buffer
273
+ defined_packet.received_time = packet.received_time
274
+
275
+ output_file.puts "#{defined_packet.target_name} #{defined_packet.packet_name}"
276
+ output_file.puts " RECEIVED_TIMEFORMATTED: #{defined_packet.received_time.formatted}"
277
+ output_file.puts defined_packet.formatted(:WITH_UNITS, 2)
278
+ if include_raw or !defined_packet.identified? or !defined_packet.defined?
279
+ output_file.puts " RAW PACKET DATA (#{defined_packet.length} bytes):"
280
+ output_file.puts defined_packet.buffer.formatted(1, 16, ' ', 4)
281
+ end
282
+ output_file.puts
283
+
284
+ progress = ((@time_delta - (@time_end - defined_packet.received_time)).to_f / @time_delta.to_f)
285
+ progress_dialog.set_overall_progress(progress) if !@cancel
286
+ end
287
+
288
+ end
289
+ end
290
+
291
+ ensure
292
+ progress_dialog.append_text("Canceled!") if @cancel
293
+ progress_dialog.complete
294
+ Qt.execute_in_main_thread(true) do
295
+ @open_button.setEnabled(true)
296
+ end
297
+ end
298
+ end
299
+ rescue => error
300
+ Qt::MessageBox.critical(self, 'Error!', "Error Querying DART Database\n#{error.formatted}")
301
+ ensure
302
+ @interface.disconnect
303
+ end
170
304
  end
171
- end # def process_log_files
305
+ end # def process_data
172
306
 
173
307
  def open_button
174
308
  Cosmos.open_in_text_editor(@output_filename)
@@ -224,14 +358,21 @@ module Cosmos
224
358
  ###############################################################################
225
359
 
226
360
  def pre_process_tests
227
- unless @input_filenames and @input_filenames[0]
228
- Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 input file')
229
- return false
361
+ if @log_file_radio.isChecked
362
+ unless @input_filenames and @input_filenames[0]
363
+ Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 input file')
364
+ return false
365
+ end
230
366
  end
231
367
 
232
368
  unless @output_filename
233
- Qt::MessageBox.critical(self, 'Error', 'No Output File Selected')
234
- return false
369
+ if @log_file_radio.isChecked
370
+ Qt::MessageBox.critical(self, 'Error', 'No Output File Selected')
371
+ return false
372
+ else
373
+ @packet_log_frame.output_filename = File.join(System.paths['LOGS'], File.build_timestamped_filename(['cmd_extractor', 'dart']))
374
+ @output_filename = @packet_log_frame.output_filename
375
+ end
235
376
  end
236
377
 
237
378
  if File.exist?(@output_filename)
@@ -12,9 +12,10 @@ module Cosmos
12
12
  class CmdParamTableItemDelegate < Qt::StyledItemDelegate
13
13
  MANUALLY = "MANUALLY ENTERED"
14
14
 
15
- def initialize(table, widgets)
15
+ def initialize(table, widgets, production = false)
16
16
  @table = table
17
17
  @widgets = widgets
18
+ @production = production
18
19
  super(table)
19
20
  end
20
21
 
@@ -24,7 +25,7 @@ module Cosmos
24
25
  combo = Qt::ComboBox.new(parent)
25
26
  sorted_states = packet_item.states.sort {|a, b| a[1] <=> b[1]}
26
27
  items = sorted_states.map {|state_name, state_value| state_name}
27
- items << MANUALLY
28
+ items << MANUALLY unless @production
28
29
  combo.addItems(items)
29
30
  combo.setCurrentText(@table.item(index.row, index.column).text.to_s)
30
31
  combo.setMaxVisibleItems(6)
@@ -49,7 +49,7 @@ module Cosmos
49
49
  slots 'context_menu(const QPoint&)'
50
50
  slots 'click_callback(QTableWidgetItem*)'
51
51
 
52
- MANUALLY = "MANUALLY ENTERED"
52
+ MANUALLY = CmdParamTableItemDelegate::MANUALLY
53
53
 
54
54
  # @return [Integer] Number of commands sent
55
55
  def self.send_count
@@ -86,6 +86,7 @@ module Cosmos
86
86
 
87
87
  @file_dir = System.paths['LOGS']
88
88
  @message_log = MessageLog.new('cmdsender')
89
+ @production = options.production
89
90
  @send_raw_dir = nil
90
91
  @@send_count = 0
91
92
  @@param_widgets = []
@@ -123,12 +124,22 @@ module Cosmos
123
124
  tr('&Send Raw'),
124
125
  self)
125
126
  @send_raw_action.shortcut = Qt::KeySequence.new(tr('Ctrl+S'))
126
- @send_raw_action.statusTip = tr('Send raw data from a file')
127
+ tip = 'Send raw data from a file'
128
+ if @production
129
+ tip += ' - Disabled in Production Mode'
130
+ @send_raw_action.setEnabled(false)
131
+ end
132
+ @send_raw_action.statusTip = tr(tip)
127
133
  connect(@send_raw_action, SIGNAL('triggered()'), self, SLOT('file_send_raw()'))
128
134
 
129
135
  # Mode menu actions
130
136
  @ignore_range = Qt::Action.new(tr('&Ignore Range Checks'), self)
131
- @ignore_range.statusTip = tr('Ignore range checks when processing command')
137
+ tip = 'Ignore range checks when processing command'
138
+ if @production
139
+ tip += ' - Disabled in Production Mode'
140
+ @ignore_range.setEnabled(false)
141
+ end
142
+ @ignore_range.statusTip = tr(tip)
132
143
  @ignore_range.setCheckable(true)
133
144
  @ignore_range.setChecked(false)
134
145
 
@@ -145,7 +156,12 @@ module Cosmos
145
156
  connect(@show_ignored, SIGNAL('toggled(bool)'), self, SLOT('update_cmd_params(bool)'))
146
157
 
147
158
  @cmd_raw = Qt::Action.new(tr('Disable &Parameter Conversions'), self)
148
- @cmd_raw.statusTip = tr('Send the command without running write or state conversions')
159
+ tip = 'Send the command without running write or state conversions'
160
+ if @production
161
+ tip += ' - Disabled in Production Mode'
162
+ @cmd_raw.setEnabled(false)
163
+ end
164
+ @cmd_raw.statusTip = tr(tip)
149
165
  @cmd_raw.setCheckable(true)
150
166
  @cmd_raw.setChecked(false)
151
167
  end
@@ -573,7 +589,7 @@ module Cosmos
573
589
  @@table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
574
590
  @@table.horizontalHeader.setStretchLastSection(true)
575
591
  @@table.verticalHeader.setVisible(false)
576
- @@table.setItemDelegate(CmdParamTableItemDelegate.new(@@table, @@param_widgets))
592
+ @@table.setItemDelegate(CmdParamTableItemDelegate.new(@@table, @@param_widgets, @production))
577
593
  @@table.setContextMenuPolicy(Qt::CustomContextMenu)
578
594
  @@table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
579
595
  @@table.setEditTriggers(Qt::AbstractItemView::DoubleClicked | Qt::AbstractItemView::SelectedClicked | Qt::AbstractItemView::AnyKeyPressed)
@@ -596,6 +612,8 @@ module Cosmos
596
612
  else
597
613
  if default_state
598
614
  value_item = Qt::TableWidgetItem.new(default_state.to_s)
615
+ elsif @production
616
+ value_item = Qt::TableWidgetItem.new(packet_item.states.keys[0])
599
617
  else
600
618
  value_item = Qt::TableWidgetItem.new(MANUALLY)
601
619
  end
@@ -619,13 +637,17 @@ module Cosmos
619
637
  end
620
638
  end
621
639
  state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
622
- state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
640
+ if @production
641
+ state_value_item.setFlags(Qt::NoItemFlags)
642
+ else
643
+ state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
644
+ end
623
645
  @@table.setItem(row, 2, state_value_item)
624
646
 
625
- # If the parameter is required set the combobox to MANUAL and
647
+ # If the parameter is required clear the combobox and
626
648
  # clear the value field so they have to choose something
627
649
  if packet_item.required && !old_params[packet_item.name]
628
- value_item.setText(MANUALLY)
650
+ value_item.setText('')
629
651
  state_value_item.setText('')
630
652
  end
631
653
  else
@@ -755,6 +777,7 @@ module Cosmos
755
777
  options.width = 600
756
778
  options.height = 425
757
779
  options.title = 'Command Sender'
780
+ options.production = false
758
781
  option_parser.separator "Command Sender Specific Options:"
759
782
  option_parser.on("-p", "--packet 'TARGET_NAME PACKET_NAME'", "Start with the specified command selected") do |arg|
760
783
  split = arg.split
@@ -764,6 +787,9 @@ module Cosmos
764
787
  end
765
788
  options.packet = split
766
789
  end
790
+ option_parser.on(nil, "--production", "Run in production mode which disables the ability to manually enter data.") do |arg|
791
+ options.production = true
792
+ end
767
793
  end
768
794
 
769
795
  super(option_parser, options)
@@ -339,49 +339,104 @@ module Cosmos
339
339
  # are actually going to the server.
340
340
  # @param config_file [String] cmd_tlm_server.txt configuration file to
341
341
  # process when creating the disconnected server
342
- def toggle_disconnect(config_file)
343
- if get_cmd_tlm_disconnect
344
- set_cmd_tlm_disconnect(false)
345
- self.setPalette(Cosmos::DEFAULT_PALETTE)
346
- else
347
- dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
348
- dialog.setWindowTitle(tr("Server Config File"))
349
- dialog_layout = Qt::VBoxLayout.new
342
+ def toggle_disconnect(config_file, ask_for_config_file = true)
343
+ dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
344
+ dialog.setWindowTitle(tr("Disconnect Settings"))
345
+ dialog_layout = Qt::VBoxLayout.new
346
+ dialog_layout.addWidget(Qt::Label.new("Targets checked will be disconnected."))
347
+
348
+ all_targets = {}
349
+ set_clear_layout = Qt::HBoxLayout.new
350
+ check_all = Qt::PushButton.new("Check All")
351
+ check_all.setAutoDefault(false)
352
+ check_all.setDefault(false)
353
+ check_all.connect(SIGNAL('clicked()')) do
354
+ all_targets.each do |target, checkbox|
355
+ checkbox.setChecked(true)
356
+ end
357
+ end
358
+ set_clear_layout.addWidget(check_all)
359
+ clear_all = Qt::PushButton.new("Clear All")
360
+ clear_all.connect(SIGNAL('clicked()')) do
361
+ all_targets.each do |target, checkbox|
362
+ checkbox.setChecked(false)
363
+ end
364
+ end
365
+ set_clear_layout.addWidget(clear_all)
366
+ dialog_layout.addLayout(set_clear_layout)
367
+
368
+ scroll = Qt::ScrollArea.new
369
+ target_widget = Qt::Widget.new
370
+ scroll.setWidget(target_widget)
371
+ target_layout = Qt::VBoxLayout.new(target_widget)
372
+ target_layout.setSizeConstraint(Qt::Layout::SetMinAndMaxSize)
373
+ scroll.setSizePolicy(Qt::SizePolicy::Preferred, Qt::SizePolicy::Expanding)
374
+ scroll.setWidgetResizable(true)
375
+
376
+ existing = get_disconnected_targets()
377
+ System.targets.keys.each do |target|
378
+ check_layout = Qt::HBoxLayout.new
379
+ check_label = Qt::CheckboxLabel.new(target)
380
+ checkbox = Qt::CheckBox.new
381
+ all_targets[target] = checkbox
382
+ if existing
383
+ checkbox.setChecked(existing && existing.include?(target))
384
+ else
385
+ checkbox.setChecked(true)
386
+ end
387
+ check_label.setCheckbox(checkbox)
388
+ check_layout.addWidget(checkbox)
389
+ check_layout.addWidget(check_label)
390
+ check_layout.addStretch
391
+ target_layout.addLayout(check_layout)
392
+ end
393
+ dialog_layout.addWidget(scroll)
350
394
 
395
+ if ask_for_config_file
351
396
  chooser = FileChooser.new(self, "Config File", config_file, 'Select',
352
397
  File.dirname(config_file))
353
398
  chooser.callback = lambda do |filename|
354
399
  chooser.filename = filename
355
400
  end
356
401
  dialog_layout.addWidget(chooser)
402
+ end
357
403
 
358
- button_layout = Qt::HBoxLayout.new
359
- ok = Qt::PushButton.new("Ok")
360
- ok.setDefault(true)
361
- ok.connect(SIGNAL('clicked()')) do
362
- dialog.accept()
363
- end
364
- button_layout.addWidget(ok)
365
- cancel = Qt::PushButton.new("Cancel")
366
- cancel.connect(SIGNAL('clicked()')) do
367
- dialog.reject()
404
+ button_layout = Qt::HBoxLayout.new
405
+ ok = Qt::PushButton.new("Ok")
406
+ ok.setAutoDefault(true)
407
+ ok.setDefault(true)
408
+ targets = []
409
+ ok.connect(SIGNAL('clicked()')) do
410
+ all_targets.each do |target, checkbox|
411
+ targets << target if checkbox.isChecked
368
412
  end
369
- button_layout.addWidget(cancel)
370
- dialog_layout.addLayout(button_layout)
413
+ dialog.accept()
414
+ end
415
+ button_layout.addWidget(ok)
416
+ cancel = Qt::PushButton.new("Cancel")
417
+ cancel.connect(SIGNAL('clicked()')) do
418
+ dialog.reject()
419
+ end
420
+ button_layout.addWidget(cancel)
421
+ dialog_layout.addLayout(button_layout)
371
422
 
372
- dialog.setLayout(dialog_layout)
373
- if dialog.exec == Qt::Dialog::Accepted
423
+ dialog.setLayout(dialog_layout)
424
+ if dialog.exec == Qt::Dialog::Accepted
425
+ if targets.empty?
426
+ clear_disconnected_targets()
427
+ statusBar.showMessage("")
428
+ else
374
429
  config_file = chooser.filename
375
- self.setPalette(Qt::Palette.new(Cosmos.getColor(170, 57, 57)))
430
+ statusBar.showMessage("Targets disconnected: #{targets.join(" ")}")
376
431
  Splash.execute(self) do |splash|
377
432
  ConfigParser.splash = splash
378
433
  splash.message = "Initializing Command and Telemetry Server"
379
- set_cmd_tlm_disconnect(true, config_file)
434
+ set_disconnected_targets(targets, config_file)
380
435
  ConfigParser.splash = nil
381
436
  end
382
437
  end
383
- dialog.dispose
384
438
  end
439
+ dialog.dispose
385
440
  config_file
386
441
  end
387
442