cosmos 4.2.4-java → 4.5.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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  5. data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
  6. data/.gitignore +2 -0
  7. data/.travis.yml +6 -6
  8. data/Dockerfile +69 -0
  9. data/Gemfile +1 -1
  10. data/Manifest.txt +130 -46
  11. data/README.md +9 -0
  12. data/Rakefile +57 -0
  13. data/appveyor.yml +18 -7
  14. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  15. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  16. data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
  17. data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
  18. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  19. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  20. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  21. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  22. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  23. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  24. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  25. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  26. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  27. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  28. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
  29. data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
  30. data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
  31. data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
  32. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  33. data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
  34. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  35. data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
  36. data/autohotkey/procedures/collect.rb +2 -2
  37. data/autohotkey/procedures/collect_util.rb +1 -1
  38. data/autohotkey/procedures/script_test.rb +1 -1
  39. data/autohotkey/tools/CmdSenderAHK2 +18 -0
  40. data/autohotkey/tools/cmd_sender.ahk +34 -6
  41. data/autohotkey/tools/cmd_sender2.ahk +4 -0
  42. data/autohotkey/tools/cmd_sequence.ahk +36 -22
  43. data/autohotkey/tools/cmd_sequence2.ahk +1 -1
  44. data/autohotkey/tools/config_editor.ahk +5 -5
  45. data/autohotkey/tools/launcher.ahk +1 -0
  46. data/autohotkey/tools/limits_monitor.ahk +1 -1
  47. data/autohotkey/tools/packet_viewer.ahk +7 -6
  48. data/autohotkey/tools/script_runner.ahk +16 -4
  49. data/autohotkey/tools/test_runner.ahk +8 -8
  50. data/bin/cosmos +38 -1
  51. data/bin/cstol_converter +1 -1
  52. data/bin/dart_util +0 -0
  53. data/bin/rubysloc +73 -28
  54. data/bin/xtce_converter +1 -1
  55. data/cosmos.gemspec +7 -9
  56. data/data/config/_interfaces.yaml +4 -0
  57. data/data/config/cmd_sequence.yaml +14 -0
  58. data/data/config/command_modifiers.yaml +16 -1
  59. data/data/config/housekeeping_params.yaml +14 -0
  60. data/data/config/interface_modifiers.yaml +14 -2
  61. data/data/config/item_modifiers.yaml +11 -1
  62. data/data/config/launcher.yaml +12 -2
  63. data/data/config/param_item_modifiers.yaml +7 -2
  64. data/data/config/parameter_modifiers.yaml +20 -0
  65. data/data/config/screen.yaml +2 -0
  66. data/data/config/script_runner.yaml +9 -0
  67. data/data/config/system.yaml +152 -28
  68. data/data/config/table_manager.yaml +7 -0
  69. data/data/config/target.yaml +12 -0
  70. data/data/config/telemetry_modifiers.yaml +19 -2
  71. data/data/config/test_runner.yaml +10 -9
  72. data/data/config/widgets.yaml +174 -11
  73. data/data/crc.txt +428 -415
  74. data/demo/Gemfile +1 -1
  75. data/demo/Launcher.bat +1 -9
  76. data/demo/Launcher2.bat +1 -0
  77. data/demo/LauncherMini.bat +1 -0
  78. data/demo/Rakefile +2 -0
  79. data/demo/config/dart/Gemfile +2 -7
  80. data/demo/config/data/crc.txt +243 -219
  81. data/demo/config/system/system.txt +42 -3
  82. data/demo/config/system/system2.txt +34 -5
  83. data/demo/config/system/system_alt_ports.txt +80 -0
  84. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
  85. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +5 -4
  86. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +12 -7
  87. data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  88. data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
  89. data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
  90. data/demo/config/targets/INST/screens/adcs.txt +2 -2
  91. data/demo/config/targets/INST/screens/block.txt +1 -1
  92. data/demo/config/targets/INST/screens/commanding.txt +1 -1
  93. data/demo/config/targets/INST/screens/ground.txt +27 -5
  94. data/demo/config/targets/INST/screens/ground_error.gif +0 -0
  95. data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
  96. data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
  97. data/demo/config/targets/INST/screens/limits.txt +69 -31
  98. data/demo/config/targets/INST/screens/other.txt +13 -3
  99. data/demo/config/targets/INST/screens/params.txt +54 -0
  100. data/demo/config/targets/INST/screens/satellite.gif +0 -0
  101. data/demo/config/targets/INST/target.txt +1 -0
  102. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
  103. data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
  104. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  105. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  106. data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  107. data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  108. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  109. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  110. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  111. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  112. data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  113. data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  114. data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  115. data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  116. data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  117. data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  118. data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  119. data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  120. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
  121. data/demo/config/tools/script_runner/script_runner.txt +1 -2
  122. data/demo/config/tools/test_runner/test_runner.txt +3 -1
  123. data/demo/lib/example_background_task.rb +1 -0
  124. data/demo/procedures/cosmos_api_test.rb +26 -22
  125. data/demo/procedures/interactive.rb +22 -0
  126. data/demo/procedures/local_screen_example.rb +51 -0
  127. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
  128. data/ext/cosmos/ext/packet/packet.c +6 -77
  129. data/ext/mkrf_conf.rb +2 -2
  130. data/extensions/vscode/.gitignore +4 -0
  131. data/extensions/vscode/.vscode/launch.json +32 -0
  132. data/extensions/vscode/.vscode/settings.json +13 -0
  133. data/extensions/vscode/.vscode/tasks.json +79 -0
  134. data/extensions/vscode/License.txt +879 -0
  135. data/extensions/vscode/README.md +9 -0
  136. data/extensions/vscode/client/License.txt +879 -0
  137. data/extensions/vscode/client/README.md +39 -0
  138. data/extensions/vscode/client/cosmos.configuration.json +23 -0
  139. data/extensions/vscode/client/images/icon.png +0 -0
  140. data/extensions/vscode/client/package-lock.json +414 -0
  141. data/extensions/vscode/client/package.json +105 -0
  142. data/extensions/vscode/client/src/extension.ts +132 -0
  143. data/extensions/vscode/client/src/screen_preview.rb +25 -0
  144. data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
  145. data/extensions/vscode/client/tsconfig.json +17 -0
  146. data/extensions/vscode/package-lock.json +26 -0
  147. data/extensions/vscode/package.json +35 -0
  148. data/extensions/vscode/server/License.txt +879 -0
  149. data/extensions/vscode/server/package-lock.json +236 -0
  150. data/extensions/vscode/server/package.json +29 -0
  151. data/extensions/vscode/server/src/server.ts +59 -0
  152. data/extensions/vscode/server/tsconfig.json +16 -0
  153. data/install/Gemfile +1 -1
  154. data/install/Launcher.bat +1 -9
  155. data/install/config/dart/Gemfile +3 -8
  156. data/install/config/data/crc.txt +148 -132
  157. data/install/config/system/system.txt +36 -3
  158. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  159. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  160. data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  161. data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  162. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  163. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  164. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  165. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  166. data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  167. data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  168. data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  169. data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  170. data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  171. data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  172. data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  173. data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  174. data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
  175. data/lib/cosmos/config/config_parser.rb +4 -5
  176. data/lib/cosmos/conversions.rb +2 -0
  177. data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
  178. data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
  179. data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
  180. data/lib/cosmos/core_ext/time.rb +3 -1
  181. data/lib/cosmos/dart/config/boot.rb +1 -1
  182. data/lib/cosmos/dart/config/database.yml +2 -0
  183. data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
  184. data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
  185. data/lib/cosmos/dart/lib/dart_common.rb +13 -6
  186. data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
  187. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
  188. data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
  189. data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
  190. data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
  191. data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
  192. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
  193. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
  194. data/lib/cosmos/dart/processes/dart.rb +4 -2
  195. data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
  196. data/lib/cosmos/dart/processes/dart_ingester.rb +40 -1
  197. data/lib/cosmos/dart/processes/dart_master.rb +44 -0
  198. data/lib/cosmos/dart/processes/dart_util.rb +119 -4
  199. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
  200. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
  201. data/lib/cosmos/gui/dialogs/details_dialog.rb +44 -29
  202. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
  203. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
  204. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
  205. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
  206. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +11 -10
  207. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
  208. data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
  209. data/lib/cosmos/gui/qt.rb +13 -2
  210. data/lib/cosmos/gui/qt_tool.rb +71 -43
  211. data/lib/cosmos/gui/text/ruby_editor.rb +91 -49
  212. data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
  213. data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
  214. data/lib/cosmos/gui/utilities/script_module_gui.rb +117 -91
  215. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
  216. data/lib/cosmos/interfaces.rb +2 -0
  217. data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
  218. data/lib/cosmos/interfaces/interface.rb +9 -1
  219. data/lib/cosmos/interfaces/linc_interface.rb +3 -3
  220. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
  221. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
  222. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
  223. data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
  224. data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
  225. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
  226. data/lib/cosmos/interfaces/protocols/template_protocol.rb +9 -4
  227. data/lib/cosmos/interfaces/serial_interface.rb +7 -1
  228. data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
  229. data/lib/cosmos/interfaces/stream_interface.rb +1 -1
  230. data/lib/cosmos/interfaces/tcpip_server_interface.rb +13 -13
  231. data/lib/cosmos/io/json_drb.rb +16 -12
  232. data/lib/cosmos/io/json_drb_object.rb +7 -2
  233. data/lib/cosmos/io/json_drb_rack.rb +25 -5
  234. data/lib/cosmos/io/json_rpc.rb +1 -1
  235. data/lib/cosmos/io/posix_serial_driver.rb +60 -22
  236. data/lib/cosmos/io/serial_driver.rb +11 -8
  237. data/lib/cosmos/io/win32_serial_driver.rb +31 -3
  238. data/lib/cosmos/packet_logs/packet_log_reader.rb +71 -28
  239. data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
  240. data/lib/cosmos/packets/commands.rb +30 -9
  241. data/lib/cosmos/packets/packet.rb +105 -34
  242. data/lib/cosmos/packets/packet_config.rb +60 -10
  243. data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
  244. data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
  245. data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
  246. data/lib/cosmos/packets/parsers/xtce_parser.rb +5 -4
  247. data/lib/cosmos/packets/structure.rb +32 -4
  248. data/lib/cosmos/packets/structure_item.rb +5 -1
  249. data/lib/cosmos/packets/telemetry.rb +30 -4
  250. data/lib/cosmos/script/api_shared.rb +22 -10
  251. data/lib/cosmos/script/extract.rb +1 -1
  252. data/lib/cosmos/script/limits.rb +4 -0
  253. data/lib/cosmos/script/script.rb +29 -20
  254. data/lib/cosmos/script/scripting.rb +16 -14
  255. data/lib/cosmos/script/telemetry.rb +3 -1
  256. data/lib/cosmos/script/tools.rb +18 -8
  257. data/lib/cosmos/streams/serial_stream.rb +11 -6
  258. data/lib/cosmos/system/system.rb +214 -76
  259. data/lib/cosmos/system/target.rb +39 -9
  260. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +116 -55
  261. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
  262. data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
  263. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +54 -340
  264. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +74 -52
  265. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +40 -333
  266. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
  267. data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
  268. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
  269. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +44 -15
  270. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +8 -1
  271. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +18 -20
  272. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
  273. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  274. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
  275. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +9 -6
  276. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
  277. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
  278. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
  279. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
  280. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
  281. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
  282. data/lib/cosmos/tools/config_editor/config_editor.rb +181 -94
  283. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +10 -9
  284. data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
  285. data/lib/cosmos/tools/data_viewer/data_viewer.rb +57 -47
  286. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
  287. data/lib/cosmos/tools/data_viewer/dump_component.rb +3 -9
  288. data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
  289. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +68 -42
  290. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
  291. data/lib/cosmos/tools/launcher/launcher.rb +2 -1
  292. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +59 -41
  293. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
  294. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +64 -59
  295. data/lib/cosmos/tools/script_runner/script_runner.rb +198 -123
  296. data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
  297. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +87 -35
  298. data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
  299. data/lib/cosmos/tools/table_manager/table_manager.rb +48 -45
  300. data/lib/cosmos/tools/test_runner/test.rb +5 -2
  301. data/lib/cosmos/tools/test_runner/test_runner.rb +61 -38
  302. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +24 -12
  303. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +48 -48
  304. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +5 -8
  305. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
  306. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
  307. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
  308. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
  309. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
  310. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
  311. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
  312. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
  313. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
  314. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +94 -91
  315. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +27 -26
  316. data/lib/cosmos/tools/tlm_viewer/screen.rb +76 -14
  317. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +51 -34
  318. data/lib/cosmos/tools/tlm_viewer/widgets.rb +3 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
  320. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
  321. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
  322. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
  323. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
  324. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
  325. data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
  326. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
  327. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
  328. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
  329. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
  330. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
  331. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
  332. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
  333. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
  334. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
  335. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
  336. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
  337. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
  338. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
  339. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
  340. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
  341. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
  342. data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
  343. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
  344. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
  345. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
  346. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
  347. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
  348. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
  349. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
  350. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
  351. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
  352. data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
  353. data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
  354. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
  355. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
  356. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
  357. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
  358. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
  359. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
  360. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
  361. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
  362. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
  363. data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
  364. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
  365. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
  366. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
  367. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
  368. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
  369. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
  370. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
  371. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
  372. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +3 -8
  373. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
  374. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
  375. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
  376. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
  377. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
  378. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
  379. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
  380. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
  381. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
  382. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
  383. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +60 -47
  384. data/lib/cosmos/top_level.rb +37 -13
  385. data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
  386. data/lib/cosmos/version.rb +5 -5
  387. data/lib/cosmos/win32/excel.rb +81 -24
  388. data/make_gems.sh +10 -0
  389. data/run_gui_tests.bat +1 -0
  390. data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
  391. data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
  392. data/spec/core_ext/socket_spec.rb +1 -1
  393. data/spec/core_ext/time_spec.rb +4 -0
  394. data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
  395. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  396. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  397. data/spec/install/yaml_docs_spec.rb +132 -0
  398. data/spec/interfaces/linc_interface_spec.rb +1 -1
  399. data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
  400. data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
  401. data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
  402. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
  403. data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
  404. data/spec/io/json_drb_rack_spec.rb +166 -0
  405. data/spec/io/json_drb_spec.rb +14 -0
  406. data/spec/io/json_rpc_spec.rb +4 -5
  407. data/spec/io/posix_serial_driver_spec.rb +81 -0
  408. data/spec/io/serial_driver_spec.rb +15 -13
  409. data/spec/io/win32_serial_driver_spec.rb +33 -3
  410. data/spec/packet_logs/packet_log_reader_spec.rb +106 -52
  411. data/spec/packets/commands_spec.rb +22 -0
  412. data/spec/packets/packet_config_spec.rb +29 -16
  413. data/spec/packets/packet_item_spec.rb +2 -2
  414. data/spec/packets/packet_spec.rb +39 -6
  415. data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
  416. data/spec/packets/parsers/macro_parser_spec.rb +36 -36
  417. data/spec/packets/parsers/state_parser_spec.rb +69 -11
  418. data/spec/packets/structure_spec.rb +93 -2
  419. data/spec/packets/telemetry_spec.rb +63 -10
  420. data/spec/script/extract_spec.rb +4 -1
  421. data/spec/script/script_spec.rb +2 -3
  422. data/spec/script/scripting_spec.rb +2 -1
  423. data/spec/script/tools_spec.rb +0 -1
  424. data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
  425. data/spec/system/system_spec.rb +187 -4
  426. data/spec/system/target_spec.rb +62 -1
  427. data/spec/tools/cmd_tlm_server/api_spec.rb +29 -21
  428. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
  429. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
  430. data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
  431. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
  432. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
  433. data/spec/top_level/top_level_spec.rb +29 -5
  434. data/spec/utilities/message_log_spec.rb +6 -3
  435. data/tasks/gemfile_stats.rake +38 -14
  436. data/test/performance/config/system/system.txt +0 -0
  437. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
  438. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  439. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  440. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  441. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  442. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  443. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  444. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  445. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  446. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  447. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  448. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  449. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  450. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  451. data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  452. data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  453. data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  454. data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
  455. data/test/performance/procedures/cosmos_api_test.rb +1 -1
  456. data/test/performance/tools/identify_performance.rb +82 -0
  457. metadata +146 -62
  458. data/lib/cosmos/dart/Gemfile +0 -69
@@ -42,6 +42,9 @@ module Cosmos
42
42
  def paint(painter, option, index)
43
43
  packet_item, _, _ = @widgets[index.row]
44
44
  if index.column == 1 and packet_item and packet_item.states
45
+ painter.save
46
+ option = Qt::StyleOptionViewItemV4.new(option)
47
+ initStyleOption(option, index)
45
48
  # This code simply draws the current combo box text inside a button to
46
49
  # give the user an idea that they have to click it to activate it
47
50
  opt = Qt::StyleOptionButton.new
@@ -49,6 +52,18 @@ module Cosmos
49
52
  opt.text = @table.item(index.row, index.column).text.to_s
50
53
  Qt::Application.style.drawControl(Qt::Style::CE_PushButton, opt, painter)
51
54
  opt.dispose
55
+ painter.restore
56
+ # Not sure why but once we re-implement paint() the word wrapping
57
+ # doesn't work when we simply call super(painter, option, index)
58
+ # Thus we implement this to support word wrapping on the description
59
+ elsif index.column == 4
60
+ painter.save
61
+ option = Qt::StyleOptionViewItemV4.new(option)
62
+ initStyleOption(option, index)
63
+ option.text = index.data().toString()
64
+ option.features = Qt::StyleOptionViewItemV2::WrapText
65
+ self.parent().style().drawControl(Qt::Style.CE_ItemViewItem, option, painter)
66
+ painter.restore
52
67
  else
53
68
  super(painter, option, index)
54
69
  end
@@ -0,0 +1,382 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/tools/cmd_sender/cmd_param_table_item_delegate'
14
+ require 'cosmos/gui/dialogs/cmd_details_dialog'
15
+ end
16
+
17
+ module Cosmos
18
+ # Builds a command parameter widget for use in Command Sender and Command Sequence.
19
+ # The main method is update_cmd_params which builds all the widgets. It can take
20
+ # existing values for use in populating the command parameter widgets.
21
+ class CmdParams < Qt::Widget
22
+ # Class instance variables which apply to all command parameters
23
+ @states_in_hex = false
24
+ @show_ignored = false
25
+ class << self
26
+ attr_accessor :states_in_hex, :show_ignored
27
+ end
28
+ MANUALLY = CmdParamTableItemDelegate::MANUALLY
29
+ # Emit the modified signal to allow changes to propagate upwards
30
+ signals 'modified()'
31
+
32
+ def initialize
33
+ super()
34
+ @param_widgets = []
35
+ @table = nil
36
+ @packet = nil
37
+ @file_dir = System.paths['LOGS']
38
+ end
39
+
40
+ # Changes the display of items with states to hex if checked is true.
41
+ # Otherwise state values are displayed as decimal.
42
+ # @param checked [Boolean] Whether to display state values in hex
43
+ def states_in_hex(checked)
44
+ CmdParams.states_in_hex = checked
45
+ @param_widgets.each do |_, _, state_value_item|
46
+ next unless state_value_item
47
+ text = state_value_item.text
48
+ quotes_removed = text.remove_quotes
49
+ if text == quotes_removed
50
+ if checked
51
+ if text.is_int?
52
+ @table.blockSignals(true)
53
+ state_value_item.text = sprintf("0x%X", text.to_i)
54
+ @table.blockSignals(false)
55
+ end
56
+ else
57
+ if text.is_hex?
58
+ @table.blockSignals(true)
59
+ state_value_item.text = Integer(text).to_s
60
+ @table.blockSignals(false)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ # @return [Hash] Hash keyed by parameter name with String formatted value
68
+ def params_text(raw = false)
69
+ params = {}
70
+ Qt.execute_in_main_thread do
71
+ @param_widgets.each do |packet_item, value_item, state_value_item|
72
+ text = value_item.text
73
+ text = state_value_item.text if state_value_item && (text == MANUALLY or raw)
74
+ quotes_removed = text.remove_quotes
75
+ if text == quotes_removed
76
+ if (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK) and text.upcase.start_with?("0X")
77
+ params[packet_item.name] = text.hex_to_byte_string
78
+ else
79
+ params[packet_item.name] = text.convert_to_value
80
+ end
81
+ else
82
+ params[packet_item.name] = quotes_removed
83
+ end
84
+ Kernel.raise "#{packet_item.name} is required." if quotes_removed == '' && packet_item.required
85
+ end
86
+ end
87
+ params
88
+ end
89
+
90
+ # Primary method which builds the command parameter table. The passed in command packet
91
+ # is used to get all the command parameters to build. Existing parameters can be passed
92
+ # in to set the initial values for all command parameters. You can also specify whether
93
+ # to display the ignored parameters when building the command parameter table. Note that
94
+ # each time this method is called the TableWidget is disposed and rebuilt.
95
+ #
96
+ # @param packet [Packet] The command packet to build a parameter list for
97
+ # @param existing [Hash] Hash keyed by parameter name with text values.
98
+ # These values will be used as the defaults for all command parameters.
99
+ # @param show_ignored [Boolean] Whether to display the ignored
100
+ # parameters. Pass nil (the default) to keep the existing setting.
101
+ def update_cmd_params(packet, existing: nil, show_ignored: nil)
102
+ @packet = packet
103
+ old_params = {}
104
+ old_params = get_params(show_ignored) if !show_ignored.nil?
105
+ old_params = set_existing(packet, existing) if existing
106
+
107
+ # Determine which items to display
108
+ target = System.targets[packet.target_name]
109
+ packet_items = packet.sorted_items
110
+ shown_packet_items = []
111
+ packet_items.each do |packet_item|
112
+ next if target && target.ignored_parameters.include?(packet_item.name) && !CmdParams.show_ignored
113
+ shown_packet_items << packet_item
114
+ end
115
+
116
+ # Destroy the old table widget and parameters
117
+ @table.dispose if @table
118
+ @table = nil
119
+ @param_widgets = []
120
+ row = 0
121
+ shown_packet_items.each do |packet_item|
122
+ value_item = nil
123
+ state_value_item = nil
124
+ @table = create_table(shown_packet_items.length) unless @table
125
+
126
+ # Parameter Name
127
+ item = Qt::TableWidgetItem.new("#{packet_item.name}:")
128
+ item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
129
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
130
+ @table.setItem(row, 0, item)
131
+
132
+ # Parameter Value
133
+ if packet_item.states
134
+ value_item, state_value_item = create_state_item(packet_item, old_params, row)
135
+ else
136
+ value_item = create_item(packet_item, old_params, row)
137
+ end
138
+
139
+ # Units
140
+ item = Qt::TableWidgetItem.new(packet_item.units.to_s)
141
+ item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
142
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
143
+ @table.setItem(row, 3, item)
144
+
145
+ # Description
146
+ item = Qt::TableWidgetItem.new(packet_item.description.to_s)
147
+ item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
148
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
149
+ @table.setItem(row, 4, item)
150
+
151
+ @param_widgets << [packet_item, value_item, state_value_item]
152
+ row += 1
153
+ end
154
+
155
+ connect_table_item_changed() if @table
156
+ @table
157
+ end
158
+
159
+ # If the user right clicks over a table item, this method displays a context
160
+ # menu with various options.
161
+ # @param point [Qt::Point] Point to display the context menu
162
+ def context_menu(point)
163
+ item = @table.itemAt(point)
164
+ if item
165
+ target_name = @packet.target_name
166
+ packet_name = @packet.packet_name
167
+ item_name = @table.item(item.row, 0).text[0..-2] # Remove :
168
+ if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
169
+ menu = Qt::Menu.new()
170
+
171
+ details_action = Qt::Action.new("Details #{target_name} #{packet_name} #{item_name}", self)
172
+ details_action.statusTip = "Popup details about #{target_name} #{packet_name} #{item_name}"
173
+ details_action.connect(SIGNAL('triggered()')) do
174
+ CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
175
+ end
176
+ menu.addAction(details_action)
177
+
178
+ file_chooser_action = Qt::Action.new("Insert Filename", self)
179
+ file_chooser_action.statusTip = "Select a file and place its name into this parameter"
180
+ file_chooser_action.connect(SIGNAL('triggered()')) do
181
+ filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
182
+ if filename && !filename.empty?
183
+ @file_dir = File.dirname(filename)
184
+ _, value_item, state_value_item = @param_widgets[item.row]
185
+ if state_value_item
186
+ state_value_item.setText(filename)
187
+ elsif value_item
188
+ value_item.setText(filename)
189
+ end
190
+ end
191
+ end
192
+ menu.addAction(file_chooser_action)
193
+
194
+ menu.exec(@table.mapToGlobal(point))
195
+ menu.dispose
196
+ end
197
+ end
198
+ end
199
+
200
+ private
201
+
202
+ def get_params(show_ignored)
203
+ params = {}
204
+ CmdParams.show_ignored = show_ignored
205
+ # Save parameter values
206
+ @param_widgets.each do |packet_item, value_item, state_value_item|
207
+ text = value_item.text
208
+ if state_value_item
209
+ params[packet_item.name] = [text, state_value_item.text]
210
+ else
211
+ params[packet_item.name] = text
212
+ end
213
+ end
214
+ params
215
+ end
216
+
217
+ def set_existing(packet, existing)
218
+ params = {}
219
+ existing.each do |param_name, param_value|
220
+ packet_item = packet.items[param_name]
221
+ if packet_item.states
222
+ state_value = packet_item.states[param_value]
223
+ unless state_value # If we couldn't lookup the value by the name it's manual
224
+ state_value = param_value
225
+ param_value = MANUALLY
226
+ end
227
+ params[param_name] = [param_value.to_s, state_value.to_s]
228
+ else
229
+ params[param_name] = param_value.to_s
230
+ end
231
+ end
232
+ params
233
+ end
234
+
235
+ def create_table(length)
236
+ table = Qt::TableWidget.new()
237
+ table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
238
+ table.setWordWrap(true)
239
+ table.setRowCount(length)
240
+ table.setColumnCount(5)
241
+ table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
242
+ table.horizontalHeader.setStretchLastSection(true)
243
+ table.verticalHeader.setVisible(false)
244
+ table.setItemDelegate(CmdParamTableItemDelegate.new(table, @param_widgets, @production))
245
+ table.setContextMenuPolicy(Qt::CustomContextMenu)
246
+ table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
247
+ table.setEditTriggers(Qt::AbstractItemView::DoubleClicked | Qt::AbstractItemView::SelectedClicked | Qt::AbstractItemView::AnyKeyPressed)
248
+ table.setSelectionMode(Qt::AbstractItemView::NoSelection)
249
+ table.connect(SIGNAL('customContextMenuRequested(const QPoint&)')) {|point| context_menu(point) }
250
+ table.connect(SIGNAL('itemClicked(QTableWidgetItem*)')) do |item|
251
+ table.editItem(item) if (item.flags & Qt::ItemIsEditable) != 0
252
+ end
253
+ return table
254
+ end
255
+
256
+ def create_state_item(packet_item, old_params, row)
257
+ default_state = packet_item.states.key(packet_item.default)
258
+ if old_params[packet_item.name]
259
+ value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
260
+ else
261
+ if default_state
262
+ value_item = Qt::TableWidgetItem.new(default_state.to_s)
263
+ elsif @production
264
+ value_item = Qt::TableWidgetItem.new(packet_item.states.keys[0])
265
+ else
266
+ value_item = Qt::TableWidgetItem.new(MANUALLY)
267
+ end
268
+ end
269
+ value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
270
+ value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
271
+ @table.setItem(row, 1, value_item)
272
+
273
+ state_value = packet_item.default.to_s
274
+ if old_params[packet_item.name]
275
+ state_value = old_params[packet_item.name][1]
276
+ end
277
+ is_integer = Integer(state_value) rescue false
278
+ if CmdParams.states_in_hex && is_integer
279
+ state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", state_value))
280
+ else
281
+ if state_value.is_printable?
282
+ state_value_item = Qt::TableWidgetItem.new(state_value)
283
+ else
284
+ state_value_item = Qt::TableWidgetItem.new("0x" + state_value.simple_formatted)
285
+ end
286
+ end
287
+ state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
288
+ if @production
289
+ state_value_item.setFlags(Qt::NoItemFlags)
290
+ else
291
+ state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
292
+ end
293
+ @table.setItem(row, 2, state_value_item)
294
+
295
+ # If the parameter is required clear the combobox and
296
+ # clear the value field so they have to choose something
297
+ if packet_item.required && !old_params[packet_item.name]
298
+ value_item.setText('')
299
+ state_value_item.setText('')
300
+ end
301
+ return [value_item, state_value_item]
302
+ end
303
+
304
+ def create_item(packet_item, old_params, row)
305
+ if old_params[packet_item.name]
306
+ value_text = old_params[packet_item.name]
307
+ elsif packet_item.required
308
+ value_text = ''
309
+ else
310
+ if packet_item.format_string
311
+ begin
312
+ value_text = sprintf(packet_item.format_string, packet_item.default)
313
+ rescue
314
+ # Oh well - Don't use the format string
315
+ value_text = packet_item.default.to_s
316
+ end
317
+ else
318
+ value_text = packet_item.default.to_s
319
+ end
320
+ end
321
+ if !value_text.is_printable?
322
+ value_text = "0x" + value_text.simple_formatted
323
+ # Add quotes around STRING or BLOCK defaults so they are interpreted correctly
324
+ elsif (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK)
325
+ value_text = "'#{value_text}'"
326
+ end
327
+ value_item = Qt::TableWidgetItem.new(value_text)
328
+ value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
329
+ value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
330
+ @table.setItem(row, 1, value_item)
331
+ @table.setSpan(row, 1, 1, 2)
332
+ return value_item
333
+ end
334
+
335
+ def connect_table_item_changed
336
+ @table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
337
+ packet_item, value_item, state_value_item = @param_widgets[item.row]
338
+ if item.column == 1
339
+ if packet_item.states
340
+ value = packet_item.states[value_item.text]
341
+ if packet_item.hazardous && packet_item.hazardous.key?(value_item.text)
342
+ desc = packet_item.hazardous[value]
343
+ # Hazardous states aren't required to have a description so use the item description
344
+ desc = packet_item.description unless desc
345
+ @table.item(item.row, 4).setText("(Hazardous) #{desc}")
346
+ else
347
+ @table.item(item.row, 4).setText(packet_item.description)
348
+ end
349
+ @table.blockSignals(true)
350
+ if CmdParams.states_in_hex && value.kind_of?(Integer)
351
+ state_value_item.setText(sprintf("0x%X", value))
352
+ else
353
+ state_value_item.setText(value.to_s)
354
+ end
355
+ @table.blockSignals(false)
356
+ end
357
+ elsif item.column == 2
358
+ @table.blockSignals(true)
359
+ @table.item(item.row, 1).setText(MANUALLY)
360
+ @table.blockSignals(false)
361
+ end
362
+ calculate_height()
363
+ emit modified()
364
+ end
365
+ calculate_height()
366
+ end
367
+
368
+ def calculate_height
369
+ @table.resizeColumnsToContents()
370
+ @table.resizeRowsToContents()
371
+ height = @table.horizontalHeader.height + 2 # 2 = Header frame?
372
+ @table.rowCount.times do |i|
373
+ # TODO: rowHeight does not reflect word wrapping ... it's always 37
374
+ height += @table.rowHeight(i)
375
+ # NOTE: Checking the fontMetrics boundingRect also does not refect word wrapping
376
+ # e.g. Cosmos.getFontMetrics(@table.font).boundingRect(@table.item(x,y).text).height
377
+ end
378
+ @table.setMaximumHeight(height)
379
+ @table.setMinimumHeight(height)
380
+ end
381
+ end
382
+ end
@@ -10,16 +10,17 @@
10
10
 
11
11
  require 'cosmos'
12
12
  Cosmos.catch_fatal_exception do
13
- require 'cosmos/script'
14
13
  require 'cosmos/gui/qt_tool'
15
- require 'cosmos/config/config_parser'
16
14
  require 'cosmos/gui/text/completion'
17
15
  require 'cosmos/gui/utilities/script_module_gui'
18
16
  require 'cosmos/gui/dialogs/splash'
19
17
  require 'cosmos/gui/dialogs/cmd_details_dialog'
18
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
20
19
  require 'cosmos/tools/cmd_sender/cmd_sender_text_edit'
20
+ require 'cosmos/tools/cmd_sender/cmd_params'
21
21
  require 'cosmos/tools/cmd_sender/cmd_param_table_item_delegate'
22
- require 'cosmos/gui/widgets/full_text_search_line_edit'
22
+ require 'cosmos/config/config_parser'
23
+ require 'cosmos/script'
23
24
  end
24
25
 
25
26
  module Cosmos
@@ -27,7 +28,7 @@ module Cosmos
27
28
  module Script
28
29
  def prompt_for_script_abort
29
30
  window = get_cmd_tlm_gui_window()
30
- window.statusBar.showMessage(tr("Hazardous command not sent"))
31
+ window.statusBar.showMessage("Hazardous command not sent")
31
32
  return true # Aborted - Don't retry
32
33
  end
33
34
  end
@@ -41,15 +42,6 @@ module Cosmos
41
42
  # command is sent it is added to the command history window which allows the
42
43
  # user to resend the command or copy it for use in a script.
43
44
  class CmdSender < QtTool
44
- slots 'file_send_raw()'
45
- slots 'update_cmd_params(bool)'
46
- slots 'menu_states_in_hex(bool)'
47
- slots 'target_changed(const QString&)'
48
- slots 'cmd_changed(const QString&)'
49
- slots 'send_button()'
50
- slots 'context_menu(const QPoint&)'
51
- slots 'click_callback(QTableWidgetItem*)'
52
-
53
45
  MANUALLY = CmdParamTableItemDelegate::MANUALLY
54
46
 
55
47
  # @return [Integer] Number of commands sent
@@ -62,20 +54,6 @@ module Cosmos
62
54
  @@send_count = val
63
55
  end
64
56
 
65
- # @return [Array<PacketItem, Qt::TableWidgetItem, Qt::TableWidgetItem>]
66
- # Array of the packet item, the table widget item representing the value,
67
- # and the table widget item representing states if the packet item has
68
- # states.
69
- def self.param_widgets
70
- @@param_widgets
71
- end
72
-
73
- # @return [Qt::TableWidget] Table holding the command parameters. Each
74
- # parameter is a separate row in the table.
75
- def self.table
76
- @@table
77
- end
78
-
79
57
  # Create the application by building the GUI and loading an initial target
80
58
  # and command packet. This can be passed on the command line or the first
81
59
  # target and packet will be loaded.
@@ -85,13 +63,11 @@ module Cosmos
85
63
  super(options)
86
64
  Cosmos.load_cosmos_icon("cmd_sender.png")
87
65
 
88
- @file_dir = System.paths['LOGS']
89
66
  @message_log = MessageLog.new('cmdsender')
90
67
  @production = options.production
91
68
  @send_raw_dir = nil
92
69
  @@send_count = 0
93
- @@param_widgets = []
94
- @@table = nil
70
+ @cmd_params = CmdParams.new
95
71
 
96
72
  initialize_actions()
97
73
  initialize_menus()
@@ -137,59 +113,63 @@ module Cosmos
137
113
  super()
138
114
  # File menu actions
139
115
  @send_raw_action = Qt::Action.new(Cosmos.get_icon('send_file.png'),
140
- tr('&Send Raw'),
116
+ '&Send Raw',
141
117
  self)
142
- @send_raw_action.shortcut = Qt::KeySequence.new(tr('Ctrl+S'))
118
+ @send_raw_action.shortcut = Qt::KeySequence.new('Ctrl+S')
143
119
  tip = 'Send raw data from a file'
144
120
  if @production
145
121
  tip += ' - Disabled in Production Mode'
146
122
  @send_raw_action.setEnabled(false)
147
123
  end
148
- @send_raw_action.statusTip = tr(tip)
149
- connect(@send_raw_action, SIGNAL('triggered()'), self, SLOT('file_send_raw()'))
124
+ @send_raw_action.statusTip = tip
125
+ @send_raw_action.connect(SIGNAL('triggered()')) { file_send_raw }
150
126
 
151
127
  # Mode menu actions
152
- @ignore_range = Qt::Action.new(tr('&Ignore Range Checks'), self)
128
+ @ignore_range = Qt::Action.new('&Ignore Range Checks', self)
153
129
  tip = 'Ignore range checks when processing command'
154
130
  if @production
155
131
  tip += ' - Disabled in Production Mode'
156
132
  @ignore_range.setEnabled(false)
157
133
  end
158
- @ignore_range.statusTip = tr(tip)
134
+ @ignore_range.statusTip = tip
159
135
  @ignore_range.setCheckable(true)
160
136
  @ignore_range.setChecked(false)
161
137
 
162
- @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
163
- @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
138
+ @states_in_hex = Qt::Action.new('&Display State Values in Hex', self)
139
+ @states_in_hex.statusTip = 'Display states values in hex instead of decimal'
164
140
  @states_in_hex.setCheckable(true)
165
- @states_in_hex.setChecked(false)
166
- connect(@states_in_hex, SIGNAL('toggled(bool)'), self, SLOT('menu_states_in_hex(bool)'))
141
+ @states_in_hex.setChecked(CmdParams.states_in_hex)
142
+ @states_in_hex.connect(SIGNAL('toggled(bool)')) do |checked|
143
+ @cmd_params.states_in_hex(checked)
144
+ end
167
145
 
168
- @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
169
- @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
146
+ @show_ignored = Qt::Action.new('&Show Ignored Parameters', self)
147
+ @show_ignored.statusTip = 'Show ignored parameters which are normally hidden'
170
148
  @show_ignored.setCheckable(true)
171
- @show_ignored.setChecked(false)
172
- connect(@show_ignored, SIGNAL('toggled(bool)'), self, SLOT('update_cmd_params(bool)'))
149
+ @show_ignored.setChecked(CmdParams.show_ignored)
150
+ @show_ignored.connect(SIGNAL('toggled(bool)')) do |checked|
151
+ update_cmd_params(checked)
152
+ end
173
153
 
174
- @cmd_raw = Qt::Action.new(tr('Disable &Parameter Conversions'), self)
154
+ @cmd_raw = Qt::Action.new('Disable &Parameter Conversions', self)
175
155
  tip = 'Send the command without running write or state conversions'
176
156
  if @production
177
157
  tip += ' - Disabled in Production Mode'
178
158
  @cmd_raw.setEnabled(false)
179
159
  end
180
- @cmd_raw.statusTip = tr(tip)
160
+ @cmd_raw.statusTip = tip
181
161
  @cmd_raw.setCheckable(true)
182
162
  @cmd_raw.setChecked(false)
183
163
  end
184
164
 
185
165
  # Create the File and Mode menus and initialize the help menu
186
166
  def initialize_menus
187
- file_menu = menuBar.addMenu(tr('&File'))
167
+ file_menu = menuBar.addMenu('&File')
188
168
  file_menu.addAction(@send_raw_action)
189
169
  file_menu.addAction(@exit_action)
190
170
  file_menu.insertSeparator(@exit_action)
191
171
 
192
- mode_menu = menuBar.addMenu(tr('&Mode'))
172
+ mode_menu = menuBar.addMenu('&Mode')
193
173
  mode_menu.addAction(@ignore_range)
194
174
  mode_menu.addAction(@states_in_hex)
195
175
  mode_menu.addAction(@show_ignored)
@@ -243,20 +223,23 @@ module Cosmos
243
223
  # Set the target combobox selection
244
224
  @target_select = Qt::ComboBox.new
245
225
  @target_select.setMaxVisibleItems(6)
246
- connect(@target_select, SIGNAL('activated(const QString&)'), self, SLOT('target_changed(const QString&)'))
247
- target_label = Qt::Label.new(tr("&Target:"))
226
+ @target_select.connect(SIGNAL('activated(const QString&)')) do |target|
227
+ update_commands()
228
+ update_cmd_params()
229
+ end
230
+ target_label = Qt::Label.new("&Target:")
248
231
  target_label.setBuddy(@target_select)
249
232
 
250
233
  # Set the comamnd combobox selection
251
234
  @cmd_select = Qt::ComboBox.new
252
235
  @cmd_select.setMaxVisibleItems(20)
253
- connect(@cmd_select, SIGNAL('activated(const QString&)'), self, SLOT('cmd_changed(const QString&)'))
254
- cmd_label = Qt::Label.new(tr("&Command:"))
236
+ @cmd_select.connect(SIGNAL('activated(const QString&)')) {|command| update_cmd_params }
237
+ cmd_label = Qt::Label.new("&Command:")
255
238
  cmd_label.setBuddy(@cmd_select)
256
239
 
257
240
  # Button to send command
258
241
  send = Qt::PushButton.new("Send")
259
- connect(send, SIGNAL('clicked()'), self, SLOT('send_button()'))
242
+ send.connect(SIGNAL('clicked()')) { send_button }
260
243
 
261
244
  # Layout the top level selection
262
245
  select_layout = Qt::HBoxLayout.new
@@ -273,7 +256,7 @@ module Cosmos
273
256
  top_layout.addWidget(sep1)
274
257
 
275
258
  # Command Description Label
276
- dec_label = Qt::Label.new(tr("Description:"))
259
+ dec_label = Qt::Label.new("Description:")
277
260
  @description = Qt::Label.new('')
278
261
  @description.setWordWrap(true)
279
262
  desc_layout = Qt::HBoxLayout.new
@@ -287,7 +270,7 @@ module Cosmos
287
270
  top_layout.addWidget(sep2)
288
271
 
289
272
  # Parameters Label
290
- param_label = Qt::Label.new(tr("Parameters:"))
273
+ param_label = Qt::Label.new("Parameters:")
291
274
  top_layout.addWidget(param_label)
292
275
 
293
276
  # Grid Layout for Parameters
@@ -326,32 +309,6 @@ module Cosmos
326
309
  history
327
310
  end
328
311
 
329
- # Changes the display of items with states to hex if checked is true.
330
- # Otherwise state values are displayed as decimal.
331
- # @param checked [Boolean] Whether to display state values in hex
332
- def menu_states_in_hex(checked)
333
- @@param_widgets.each do |_, _, state_value_item|
334
- next unless state_value_item
335
- text = state_value_item.text
336
- quotes_removed = text.remove_quotes
337
- if text == quotes_removed
338
- if checked
339
- if text.is_int?
340
- @@table.blockSignals(true)
341
- state_value_item.text = sprintf("0x%X", text.to_i)
342
- @@table.blockSignals(false)
343
- end
344
- else
345
- if text.is_hex?
346
- @@table.blockSignals(true)
347
- state_value_item.text = Integer(text).to_s
348
- @@table.blockSignals(false)
349
- end
350
- end
351
- end
352
- end
353
- end
354
-
355
312
  # Opens a dialog which allows the user to select a file to read and send
356
313
  # directly over the interface.
357
314
  def file_send_raw
@@ -362,13 +319,13 @@ module Cosmos
362
319
  interfaces.addItems(get_interface_names())
363
320
  interfaces.setMaxVisibleItems(30)
364
321
  layout.addWidget(interfaces, 0, 1)
365
- int_label = Qt::Label.new(tr("&Interface:"))
322
+ int_label = Qt::Label.new("&Interface:")
366
323
  int_label.setBuddy(interfaces)
367
324
  layout.addWidget(int_label, 0, 0)
368
325
 
369
326
  file_line = Qt::LineEdit.new(@send_raw_dir)
370
327
  file_line.setMinimumSize(250, 0)
371
- file_label = Qt::Label.new(tr("&Filename:"))
328
+ file_label = Qt::Label.new("&Filename:")
372
329
  file_label.setBuddy(file_line)
373
330
  get_file = Qt::PushButton.new("Select")
374
331
  file_layout = Qt::BoxLayout.new(Qt::Horizontal)
@@ -376,7 +333,7 @@ module Cosmos
376
333
  file_layout.addWidget(file_line)
377
334
  get_file.connect(SIGNAL('clicked()')) do
378
335
  Cosmos.set_working_dir do
379
- file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, tr("Binary Files (*.bin);;All Files (*)"))
336
+ file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, "Binary Files (*.bin);;All Files (*)")
380
337
  end
381
338
  end
382
339
 
@@ -417,17 +374,6 @@ module Cosmos
417
374
  super(event)
418
375
  end
419
376
 
420
- # Updates the commands combobox and command parameters table
421
- def target_changed(_)
422
- update_commands()
423
- update_cmd_params()
424
- end
425
-
426
- # Updates the command parameters table
427
- def cmd_changed(_)
428
- update_cmd_params()
429
- end
430
-
431
377
  # Sends the current command and parameters to the target
432
378
  def send_button
433
379
  target_name = @target_select.text
@@ -470,26 +416,8 @@ module Cosmos
470
416
 
471
417
  # @return [String, Hash] Command as it would appear in a ScriptRunner script
472
418
  def view_as_script
473
- params = {}
474
-
475
- @@param_widgets.each do |packet_item, value_item, state_value_item|
476
- text = value_item.text
477
-
478
- text = state_value_item.text if state_value_item && (text == MANUALLY or @cmd_raw.checked?)
479
- quotes_removed = text.remove_quotes
480
- if text == quotes_removed
481
- if (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK) and text.upcase.start_with?("0X")
482
- params[packet_item.name] = text.hex_to_byte_string
483
- else
484
- params[packet_item.name] = text.convert_to_value
485
- end
486
- else
487
- params[packet_item.name] = quotes_removed
488
- end
489
- raise "#{packet_item.name} is required." if quotes_removed == '' && packet_item.required
490
- end
491
419
  statusBar.clearMessage()
492
-
420
+ params = @cmd_params.params_text(@cmd_raw.checked?)
493
421
  output_string = System.commands.build_cmd_output_string(@target_select.text, @cmd_select.text, params, @cmd_raw.checked?)
494
422
  if output_string =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
495
423
  output_string = output_string.inspect.remove_quotes
@@ -552,243 +480,29 @@ module Cosmos
552
480
 
553
481
  # Updates the command parameters table based on the selected target and
554
482
  # packet comboboxes
555
- # @param ignored_toggle [Boolean] Whether to display the ignored
556
- # parameters. Pass nil (the default) to keep the existing setting.
557
- def update_cmd_params(ignored_toggle = nil)
558
- old_params = {}
559
- if !ignored_toggle.nil?
560
- # Save parameter values
561
- @@param_widgets.each do |packet_item, value_item, state_value_item|
562
- text = value_item.text
563
- if state_value_item
564
- old_params[packet_item.name] = [text, state_value_item.text]
565
- else
566
- old_params[packet_item.name] = text
567
- end
568
- end
569
- end
570
-
483
+ # @param checked [Boolean] Whether the show ignored parameters option
484
+ # is checked. Pass nil (the default) to keep the existing setting.
485
+ def update_cmd_params(checked = nil)
571
486
  # Clear Status Bar
572
- statusBar.showMessage(tr(""))
487
+ statusBar.showMessage("")
573
488
 
574
489
  target_name = @target_select.text
575
490
  target = System.targets[target_name]
576
491
  packet_name = @cmd_select.text
577
492
  if target_name && packet_name
578
493
  packet = System.commands.packet(target_name, packet_name)
579
- packet_items = packet.sorted_items
580
- shown_packet_items = []
581
- packet_items.each do |packet_item|
582
- next if target && target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
583
- shown_packet_items << packet_item
584
- end
585
-
586
- # Update Command Description
587
- @description.text = packet.description.to_s
588
-
589
- # Destroy the old table widget
590
- @@table.dispose if @@table
591
- @@table = nil
592
-
593
- # Update Parameters
594
- @@param_widgets = []
595
- drawn_header = false
596
-
597
- row = 0
598
- shown_packet_items.each do |packet_item|
599
- next if target && target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
600
- value_item = nil
601
- state_value_item = nil
602
-
603
- unless drawn_header
604
- @@table = Qt::TableWidget.new()
605
- @@table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
606
- @@table.setWordWrap(true)
607
- @@table.setRowCount(shown_packet_items.length)
608
- @@table.setColumnCount(5)
609
- @@table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
610
- @@table.horizontalHeader.setStretchLastSection(true)
611
- @@table.verticalHeader.setVisible(false)
612
- @@table.setItemDelegate(CmdParamTableItemDelegate.new(@@table, @@param_widgets, @production))
613
- @@table.setContextMenuPolicy(Qt::CustomContextMenu)
614
- @@table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
615
- @@table.setEditTriggers(Qt::AbstractItemView::DoubleClicked | Qt::AbstractItemView::SelectedClicked | Qt::AbstractItemView::AnyKeyPressed)
616
- @@table.setSelectionMode(Qt::AbstractItemView::NoSelection)
617
- connect(@@table, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
618
- connect(@@table, SIGNAL('itemClicked(QTableWidgetItem*)'), self, SLOT('click_callback(QTableWidgetItem*)'))
619
- drawn_header = true
620
- end
621
-
622
- # Parameter Name
623
- item = Qt::TableWidgetItem.new("#{packet_item.name}:")
624
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
625
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
626
- @@table.setItem(row, 0, item)
627
-
628
- if packet_item.states
629
- default_state = packet_item.states.key(packet_item.default)
630
- if old_params[packet_item.name]
631
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
632
- else
633
- if default_state
634
- value_item = Qt::TableWidgetItem.new(default_state.to_s)
635
- elsif @production
636
- value_item = Qt::TableWidgetItem.new(packet_item.states.keys[0])
637
- else
638
- value_item = Qt::TableWidgetItem.new(MANUALLY)
639
- end
640
- end
641
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
642
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
643
- @@table.setItem(row, 1, value_item)
644
-
645
- if old_params[packet_item.name]
646
- state_value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][1])
647
- else
648
- if @states_in_hex.checked? && packet_item.default.kind_of?(Integer)
649
- state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", packet_item.default))
650
- else
651
- default_str = packet_item.default.to_s
652
- if default_str.is_printable?
653
- state_value_item = Qt::TableWidgetItem.new(default_str)
654
- else
655
- state_value_item = Qt::TableWidgetItem.new("0x" + default_str.simple_formatted)
656
- end
657
- end
658
- end
659
- state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
660
- if @production
661
- state_value_item.setFlags(Qt::NoItemFlags)
662
- else
663
- state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
664
- end
665
- @@table.setItem(row, 2, state_value_item)
666
-
667
- # If the parameter is required clear the combobox and
668
- # clear the value field so they have to choose something
669
- if packet_item.required && !old_params[packet_item.name]
670
- value_item.setText('')
671
- state_value_item.setText('')
672
- end
673
- else
674
- # Parameter Value
675
- if old_params[packet_item.name]
676
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name])
677
- else
678
- if packet_item.required
679
- value_text = ''
680
- else
681
- if packet_item.format_string
682
- begin
683
- value_text = sprintf(packet_item.format_string, packet_item.default)
684
- rescue
685
- # Oh well - Don't use the format string
686
- value_text = packet_item.default.to_s
687
- end
688
- else
689
- value_text = packet_item.default.to_s
690
- end
691
- if !value_text.is_printable?
692
- value_text = "0x" + value_text.simple_formatted
693
- end
694
- end
695
- value_item = Qt::TableWidgetItem.new(value_text)
696
- end
697
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
698
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
699
- @@table.setItem(row, 1, value_item)
700
- @@table.setSpan(row, 1, 1, 2)
701
- end
702
-
703
- # Units
704
- item = Qt::TableWidgetItem.new(packet_item.units.to_s)
705
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
706
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
707
- @@table.setItem(row, 3, item)
708
-
709
- # Description
710
- item = Qt::TableWidgetItem.new(packet_item.description.to_s)
711
- item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
712
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
713
- @@table.setItem(row, 4, item)
714
-
715
- @@param_widgets << [packet_item, value_item, state_value_item]
716
- row += 1
717
- end
718
-
719
- if @@table
720
- @@table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
721
- packet_item, value_item, state_value_item = @@param_widgets[item.row]
722
- if item.column == 1
723
- if packet_item.states
724
- value = packet_item.states[value_item.text]
725
- @@table.blockSignals(true)
726
- if @states_in_hex.checked? && value.kind_of?(Integer)
727
- state_value_item.setText(sprintf("0x%X", value))
728
- else
729
- state_value_item.setText(value.to_s)
730
- end
731
- @@table.blockSignals(false)
732
- end
733
- elsif item.column == 2
734
- @@table.blockSignals(true)
735
- @@table.item(item.row, 1).setText(MANUALLY)
736
- @@table.blockSignals(false)
737
- end
738
- end
739
- @table_layout.addWidget(@@table, 500)
740
- @@table.resizeColumnsToContents()
741
- @@table.resizeRowsToContents()
742
- end
743
- end # if target_name && packet_name
744
- end
745
-
746
- # If the user right clicks over a table item, this method displays a context
747
- # menu with various options.
748
- # @param point [Qt::Point] Point to display the context menu
749
- def context_menu(point)
750
- target_name = @target_select.text
751
- packet_name = @cmd_select.text
752
- item = @@table.itemAt(point)
753
- if item
754
- item_name = @@table.item(item.row, 0).text[0..-2] # Remove :
755
- if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
756
- menu = Qt::Menu.new()
757
-
758
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
759
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
760
- details_action.connect(SIGNAL('triggered()')) do
761
- CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
762
- end
763
- menu.addAction(details_action)
764
-
765
- file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
766
- file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
767
- file_chooser_action.connect(SIGNAL('triggered()')) do
768
- filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
769
- if filename && !filename.empty?
770
- @file_dir = File.dirname(filename)
771
- _, value_item, state_value_item = @@param_widgets[item.row]
772
- if state_value_item
773
- state_value_item.setText(filename)
774
- elsif value_item
775
- value_item.setText(filename)
776
- end
777
- end
778
- end
779
- menu.addAction(file_chooser_action)
780
-
781
- menu.exec(@@table.mapToGlobal(point))
782
- menu.dispose
494
+ # Directly update packet description ... safe because always in GUI thread
495
+ hazardous, _ = System.commands.cmd_hazardous?(target_name, packet_name)
496
+ if hazardous
497
+ @description.text = "(Hazardous) #{packet.description}"
498
+ else
499
+ @description.text = packet.description
783
500
  end
501
+ table = @cmd_params.update_cmd_params(packet, show_ignored: checked)
502
+ @table_layout.addWidget(table, 500) if table
784
503
  end
785
504
  end
786
505
 
787
- # @param item [Qt::TableWidgetItem] Item which was left clicked
788
- def click_callback(item)
789
- @@table.editItem(item) if (item.flags & Qt::ItemIsEditable) != 0
790
- end
791
-
792
506
  # (see QtTool.run)
793
507
  def self.run(option_parser = nil, options = nil)
794
508
  Cosmos.catch_fatal_exception do