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
@@ -11,14 +11,15 @@
11
11
  require 'time'
12
12
  require 'cosmos'
13
13
  Cosmos.catch_fatal_exception do
14
- require 'cosmos/script'
15
- require 'cosmos/config/config_parser'
16
14
  require 'cosmos/gui/qt_tool'
17
15
  require 'cosmos/gui/utilities/script_module_gui'
18
16
  require 'cosmos/gui/dialogs/splash'
19
17
  require 'cosmos/gui/widgets/realtime_button_bar'
20
18
  require 'cosmos/gui/choosers/file_chooser'
19
+ require 'cosmos/config/config_parser'
21
20
  require 'cosmos/tools/cmd_sequence/sequence_list'
21
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
22
+ require 'cosmos/script'
22
23
  end
23
24
 
24
25
  module Cosmos
@@ -85,6 +86,20 @@ module Cosmos
85
86
  @target_select.setCurrentText(options.packet[0]) if options.packet
86
87
  update_commands()
87
88
  @cmd_select.setCurrentText(options.packet[1]) if options.packet
89
+
90
+ # Handle searching entries
91
+ @search_box.completion_list = System.commands.all_packet_strings(true, splash)
92
+ @search_box.callback = lambda do |cmd|
93
+ split_cmd = cmd.split(" ")
94
+ if split_cmd.length == 2
95
+ target_name = split_cmd[0].upcase
96
+ @target_select.setCurrentText(target_name)
97
+ update_commands()
98
+ command_name = split_cmd[1]
99
+ @cmd_select.setCurrentText(command_name)
100
+ add_command()
101
+ end
102
+ end
88
103
  end
89
104
  # Unconfigure CosmosConfig to interact with splash screen
90
105
  ConfigParser.splash = nil
@@ -96,59 +111,63 @@ module Cosmos
96
111
  def initialize_actions
97
112
  super()
98
113
 
99
- @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), tr('&New'), self)
100
- @file_new_keyseq = Qt::KeySequence.new(tr('Ctrl+N'))
114
+ @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), '&New', self)
115
+ @file_new_keyseq = Qt::KeySequence.new('Ctrl+N')
101
116
  @file_new.shortcut = @file_new_keyseq
102
- @file_new.statusTip = tr('Start a new sequence')
117
+ @file_new.statusTip = 'Start a new sequence'
103
118
  @file_new.connect(SIGNAL('triggered()')) { file_new() }
104
119
 
105
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save'), self)
106
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
120
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), '&Save', self)
121
+ @file_save_keyseq = Qt::KeySequence.new('Ctrl+S')
107
122
  @file_save.shortcut = @file_save_keyseq
108
- @file_save.statusTip = tr('Save the sequence')
123
+ @file_save.statusTip = 'Save the sequence'
109
124
  @file_save.connect(SIGNAL('triggered()')) { file_save(false) }
110
125
 
111
- @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), tr('Save &As'), self)
112
- @file_save_as.statusTip = tr('Save the sequence')
126
+ @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), 'Save &As', self)
127
+ @file_save_as.statusTip = 'Save the sequence'
113
128
  @file_save_as.connect(SIGNAL('triggered()')) { file_save(true) }
114
129
 
115
- @file_export = Qt::Action.new(tr('&Export Sequence'), self)
116
- @file_export.shortcut = Qt::KeySequence.new(tr('Ctrl+E'))
117
- @file_export.statusTip = tr('Export the current sequence to a custom binary format')
130
+ @file_export = Qt::Action.new('&Export Sequence', self)
131
+ @file_export.shortcut = Qt::KeySequence.new('Ctrl+E')
132
+ @file_export.statusTip = 'Export the current sequence to a custom binary format'
118
133
  @file_export.connect(SIGNAL('triggered()')) { file_export() }
119
134
 
120
- @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
121
- @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
135
+ @show_ignored = Qt::Action.new('&Show Ignored Parameters', self)
136
+ @show_ignored.statusTip = 'Show ignored parameters which are normally hidden'
122
137
  @show_ignored.setCheckable(true)
123
- @show_ignored.setChecked(false)
124
- @show_ignored.connect(SIGNAL('toggled(bool)')) do |bool|
125
- @sequence_list.map {|item| item.show_ignored(bool) }
138
+ @show_ignored.setChecked(CmdParams.show_ignored)
139
+ @show_ignored.connect(SIGNAL('toggled(bool)')) do |checked|
140
+ # In case there aren't any sequences open, make sure to store the current value
141
+ CmdParams.show_ignored = checked
142
+ @sequence_list.map {|item| item.show_ignored(checked) }
126
143
  end
127
144
 
128
- @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
129
- @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
145
+ @states_in_hex = Qt::Action.new('&Display State Values in Hex', self)
146
+ @states_in_hex.statusTip = 'Display states values in hex instead of decimal'
130
147
  @states_in_hex.setCheckable(true)
131
- @states_in_hex.setChecked(false)
132
- @states_in_hex.connect(SIGNAL('toggled(bool)')) do |bool|
133
- @sequence_list.map {|item| item.states_in_hex(bool) }
148
+ @states_in_hex.setChecked(CmdParams.states_in_hex)
149
+ @states_in_hex.connect(SIGNAL('toggled(bool)')) do |checked|
150
+ # In case there aren't any sequences open, make sure to store the current value
151
+ CmdParams.states_in_hex = checked
152
+ @sequence_list.map {|item| item.states_in_hex(checked) }
134
153
  end
135
154
 
136
- @expand_action = Qt::Action.new(tr('&Expand All'), self)
137
- @expand_action.statusTip = tr('Expand all currently visible commands')
155
+ @expand_action = Qt::Action.new('&Expand All', self)
156
+ @expand_action.statusTip = 'Expand all currently visible commands'
138
157
  @expand_action.connect(SIGNAL('triggered()')) do
139
158
  @sequence_list.map {|item| item.expand }
140
159
  end
141
160
 
142
- @collapse_action = Qt::Action.new(tr('&Collapse All'), self)
143
- @collapse_action.statusTip = tr('Collapse all currently visible commands')
161
+ @collapse_action = Qt::Action.new('&Collapse All', self)
162
+ @collapse_action.statusTip = 'Collapse all currently visible commands'
144
163
  @collapse_action.connect(SIGNAL('triggered()')) do
145
164
  @sequence_list.map {|item| item.collapse }
146
165
  end
147
166
 
148
- @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), tr('&Toggle Disconnect'), self)
149
- @script_disconnect_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
167
+ @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), '&Toggle Disconnect', self)
168
+ @script_disconnect_keyseq = Qt::KeySequence.new('Ctrl+T')
150
169
  @script_disconnect.shortcut = @script_disconnect_keyseq
151
- @script_disconnect.statusTip = tr('Toggle disconnect from the server')
170
+ @script_disconnect.statusTip = 'Toggle disconnect from the server'
152
171
  @script_disconnect.connect(SIGNAL('triggered()')) do
153
172
  @server_config_file ||= CmdTlmServer::DEFAULT_CONFIG_FILE
154
173
  @server_config_file = toggle_disconnect(@server_config_file)
@@ -157,15 +176,15 @@ module Cosmos
157
176
 
158
177
  # Create the application menus and assign the actions
159
178
  def initialize_menus
160
- file_menu = menuBar.addMenu(tr('&File'))
179
+ file_menu = menuBar.addMenu('&File')
161
180
  file_menu.addAction(@file_new)
162
181
 
163
182
  open_action = Qt::Action.new(self)
164
- open_action.shortcut = Qt::KeySequence.new(tr('Ctrl+O'))
183
+ open_action.shortcut = Qt::KeySequence.new('Ctrl+O')
165
184
  open_action.connect(SIGNAL('triggered()')) { file_open(@sequence_dir) }
166
185
  self.addAction(open_action)
167
186
 
168
- file_open = file_menu.addMenu(tr('&Open'))
187
+ file_open = file_menu.addMenu('&Open')
169
188
  file_open.setIcon(Cosmos.get_icon('open.png'))
170
189
  target_dirs_action(file_open, System.paths['SEQUENCES'], 'sequences', method(:file_open))
171
190
 
@@ -178,7 +197,7 @@ module Cosmos
178
197
  file_menu.addSeparator()
179
198
  file_menu.addAction(@exit_action)
180
199
 
181
- action_menu = menuBar.addMenu(tr('&Actions'))
200
+ action_menu = menuBar.addMenu('&Actions')
182
201
  action_menu.addAction(@show_ignored)
183
202
  action_menu.addAction(@states_in_hex)
184
203
  action_menu.addSeparator()
@@ -205,27 +224,23 @@ module Cosmos
205
224
  @realtime_button_bar.state = 'Stopped'
206
225
  central_layout.addWidget(@realtime_button_bar)
207
226
 
227
+ # Mnemonic Search Box
228
+ @search_box = FullTextSearchLineEdit.new(self)
229
+ central_layout.addWidget(@search_box)
230
+
208
231
  @target_select = Qt::ComboBox.new
209
232
  @target_select.setMaxVisibleItems(6)
210
- @target_select.connect(SIGNAL('activated(const QString&)')) do |target|
211
- target_changed()
212
- end
213
- target_label = Qt::Label.new(tr("&Target:"))
233
+ @target_select.connect(SIGNAL('activated(const QString&)')) {|target| target_changed() }
234
+ target_label = Qt::Label.new("&Target:")
214
235
  target_label.setBuddy(@target_select)
215
236
 
216
237
  @cmd_select = Qt::ComboBox.new
217
238
  @cmd_select.setMaxVisibleItems(20)
218
- cmd_label = Qt::Label.new(tr("&Command:"))
239
+ cmd_label = Qt::Label.new("&Command:")
219
240
  cmd_label.setBuddy(@cmd_select)
220
241
 
221
242
  add = Qt::PushButton.new("Add")
222
- add.connect(SIGNAL('clicked()')) do
223
- command = System.commands.packet(@target_select.text, @cmd_select.text).dup
224
- command.restore_defaults
225
- item = @sequence_list.add(command)
226
- item.show_ignored(@show_ignored.isChecked())
227
- item.states_in_hex(@states_in_hex.isChecked())
228
- end
243
+ add.connect(SIGNAL('clicked()')) { add_command() }
229
244
 
230
245
  # Layout the target and command selection with Add button
231
246
  select_layout = Qt::HBoxLayout.new
@@ -240,7 +255,7 @@ module Cosmos
240
255
  splitter = Qt::Splitter.new(Qt::Vertical, self)
241
256
  central_layout.addWidget(splitter)
242
257
 
243
- @sequence_list = SequenceList.new
258
+ @sequence_list = SequenceList.new(self)
244
259
  @sequence_list.connect(SIGNAL("modified()")) { update_title }
245
260
 
246
261
  @scroll = Qt::ScrollArea.new()
@@ -264,10 +279,18 @@ module Cosmos
264
279
  splitter.setStretchFactor(1,0)
265
280
  end
266
281
 
282
+ def add_command
283
+ item = @sequence_list.add(@target_select.text.strip, @cmd_select.text.strip)
284
+ end
285
+
267
286
  # Export the sequence list into a custom binary format
268
287
  def file_export
269
288
  return if @sequence_list.empty? || @exporter.nil?
270
- @exporter.export(@filename, @sequence_dir, @sequence_list)
289
+ begin
290
+ @exporter.export(@filename, @sequence_dir, @sequence_list)
291
+ rescue => error
292
+ ExceptionDialog.new(self, error, 'Export Error', false)
293
+ end
271
294
  end
272
295
 
273
296
  # Clears the sequence list
@@ -275,6 +298,7 @@ module Cosmos
275
298
  return unless prompt_for_save_if_needed()
276
299
  @sequence_list.clear
277
300
  @filename = "Untitled"
301
+ update_title()
278
302
  end
279
303
 
280
304
  # Opens a sequence list file and populates the GUI
@@ -289,8 +313,6 @@ module Cosmos
289
313
  if !filename.nil? && File.exist?(filename) && !File.directory?(filename)
290
314
  # Try to open and load the file. Errors are handled here.
291
315
  @sequence_list.open(filename)
292
- @sequence_list.map {|item| item.show_ignored(@show_ignored.isChecked()) }
293
- @sequence_list.map {|item| item.states_in_hex(@states_in_hex.isChecked()) }
294
316
  @filename = filename
295
317
  @sequence_dir = File.dirname(filename)
296
318
  @sequence_dir << '/' if @sequence_dir[-1..-1] != '/' and @sequence_dir[-1..-1] != '\\'
@@ -341,7 +363,7 @@ module Cosmos
341
363
  # process when creating the disconnected server
342
364
  def toggle_disconnect(config_file, ask_for_config_file = true)
343
365
  dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
344
- dialog.setWindowTitle(tr("Disconnect Settings"))
366
+ dialog.setWindowTitle("Disconnect Settings")
345
367
  dialog_layout = Qt::VBoxLayout.new
346
368
  dialog_layout.addWidget(Qt::Label.new("Targets checked will be disconnected."))
347
369
 
@@ -431,7 +453,7 @@ module Cosmos
431
453
  Splash.execute(self) do |splash|
432
454
  ConfigParser.splash = splash
433
455
  splash.message = "Initializing Command and Telemetry Server"
434
- set_disconnected_targets(targets, config_file)
456
+ set_disconnected_targets(targets, targets.length == all_targets.length, config_file)
435
457
  ConfigParser.splash = nil
436
458
  end
437
459
  end
@@ -14,7 +14,7 @@ Cosmos.catch_fatal_exception do
14
14
  require 'cosmos/script'
15
15
  require 'cosmos/gui/dialogs/calendar_dialog'
16
16
  require 'cosmos/gui/dialogs/cmd_details_dialog'
17
- require 'cosmos/tools/cmd_sender/cmd_param_table_item_delegate'
17
+ require 'cosmos/tools/cmd_sender/cmd_params'
18
18
  end
19
19
 
20
20
  module Cosmos
@@ -26,36 +26,18 @@ module Cosmos
26
26
  signals 'modified()'
27
27
  MANUALLY = "MANUALLY ENTERED"
28
28
 
29
- # Parse a time and command string into a SequenceItem which is returned
30
- # @param time [String] Time (absolute or relative delay). Supports a single
31
- # float value (relative delay) or a absolute time specified as
32
- # "YYYY/MM/DD HH:MM:SS.MS"
33
- # @param command [String] Command String which should not be
34
- # quoted and is everything inside the quotes of a command.
35
- # For example: TGT PKT with STRING 'HI', VALUE 12. Parse errors are
36
- # raised as execptions which must be handled by higher level code.
37
- # @return [SequenceItem] SequenceItem which the line represents
38
- def self.parse(time, command)
39
- tgt_name, pkt_name, cmd_params = extract_fields_from_cmd_text(command)
40
- packet = System.commands.packet(tgt_name, pkt_name).dup
41
- packet.restore_defaults
42
- cmd_params.each do |param_name, param_value|
43
- packet.write(param_name, param_value)
44
- end
45
- SequenceItem.new(packet, time)
46
- end
47
-
48
29
  # Create a new SequenceItem based on the given command with the given delay
49
- # @param command [Packet] Command packet
50
30
  # @param time [String] Absolute time in YYYY/MM/DD HH:MM:SS format or a
51
31
  # single float value representing the delta delay time
52
- def initialize(command, time = nil)
32
+ def initialize(parent, target_name, packet_name, params = nil, time = nil)
53
33
  super()
54
- @command = command
55
- @table = nil
56
- @param_widgets = []
57
- @show_ignored = false
58
- @states_in_hex = false
34
+ @cmd_params = CmdParams.new
35
+ # Propagate the modified signal up
36
+ @cmd_params.connect(SIGNAL('modified()')) do
37
+ set_cmd_name_info()
38
+ emit modified
39
+ end
40
+ @command = System.commands.packet(target_name, packet_name)
59
41
  @expanded = false
60
42
  @file_dir = System.paths['LOGS']
61
43
 
@@ -66,50 +48,30 @@ module Cosmos
66
48
  top_layout = Qt::VBoxLayout.new
67
49
  top_layout.setContentsMargins(2, 0, 0, 0)
68
50
  setLayout(top_layout)
69
- top_layout.addLayout(create_cmd_layout(command, time))
51
+ top_layout.addLayout(create_cmd_layout(target_name, packet_name, time))
70
52
  top_layout.addWidget(create_parameters())
71
- update_cmd_params()
53
+ add_table(@cmd_params.update_cmd_params(@command, existing: params))
72
54
  set_cmd_name_info()
73
55
  end
74
56
 
75
- # Set or clear read only status on the item
76
- # @param bool [Boolean] Whether to make the item read only
77
- def read_only(bool)
78
- @time.setReadOnly(bool)
57
+ def add_table(table)
58
+ return unless table
59
+ @table_layout.addWidget(table)
79
60
  end
80
-
81
- # Show or hide ignored parameters
82
- # @param bool [Boolean] Whether to show ignored command items
83
- def show_ignored(bool)
84
- @show_ignored = bool
85
- update_cmd_params(bool)
61
+
62
+ def states_in_hex(checked)
63
+ @cmd_params.states_in_hex(checked)
86
64
  end
87
65
 
88
- # Display state values in hex (or decimal)
89
- # @param bool [Boolean] Whether to display state values in hex
90
- def states_in_hex(bool)
91
- @states_in_hex = bool
92
- @param_widgets.each do |_, _, state_value_item|
93
- next unless state_value_item
94
- text = state_value_item.text
95
- quotes_removed = text.remove_quotes
96
- if text == quotes_removed
97
- if bool
98
- if text.is_int?
99
- @table.blockSignals(true)
100
- state_value_item.text = sprintf("0x%X", text.to_i)
101
- @table.blockSignals(false)
102
- end
103
- else
104
- if text.is_hex?
105
- @table.blockSignals(true)
106
- state_value_item.text = Integer(text).to_s
107
- @table.blockSignals(false)
108
- end
109
- end
110
- end
111
- end
66
+ def show_ignored(checked)
67
+ add_table(@cmd_params.update_cmd_params(@command, show_ignored: checked))
68
+ set_cmd_name_info()
69
+ end
112
70
 
71
+ # Set or clear read only status on the item
72
+ # @param bool [Boolean] Whether to make the item read only
73
+ def read_only(bool)
74
+ @time.setReadOnly(bool)
113
75
  end
114
76
 
115
77
  # Show the command parameters part of the GUI
@@ -124,33 +86,9 @@ module Cosmos
124
86
  @parameters.hide
125
87
  end
126
88
 
127
- # @return [Hash] All the parameter item values keyed by their name
128
- def command_params
129
- params = {}
130
- @param_widgets.each do |packet_item, value_item, state_value_item|
131
- text = ''
132
- Qt.execute_in_main_thread do
133
- text = value_item.text
134
- text = state_value_item.text if state_value_item && (text == MANUALLY)
135
- end
136
- quotes_removed = text.remove_quotes
137
- if text == quotes_removed
138
- if (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK) and text.upcase.start_with?("0X")
139
- params[packet_item.name] = text.hex_to_byte_string
140
- else
141
- params[packet_item.name] = text.convert_to_value
142
- end
143
- else
144
- params[packet_item.name] = quotes_removed
145
- end
146
- raise "#{packet_item.name} is required" if quotes_removed == '' && packet_item.required
147
- end
148
- params
149
- end
150
-
151
89
  # @return [String] Command to be executed with no quotes or other decorations
152
90
  def command_string
153
- output_string = System.commands.build_cmd_output_string(@command.target_name, @command.packet_name, command_params(), false)
91
+ output_string = System.commands.build_cmd_output_string(@command.target_name, @command.packet_name, @cmd_params.params_text, false)
154
92
  if output_string =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
155
93
  output_string = output_string.inspect.remove_quotes
156
94
  end
@@ -165,7 +103,7 @@ module Cosmos
165
103
  end
166
104
 
167
105
  def command
168
- System.commands.build_cmd(@command.target_name, @command.packet_name, command_params(), false)
106
+ System.commands.build_cmd(@command.target_name, @command.packet_name, @cmd_params.params_text, false)
169
107
  end
170
108
 
171
109
  # @return [String] Time and command string
@@ -193,12 +131,12 @@ module Cosmos
193
131
  # and the delete button to remove the sequence item.
194
132
  # @param command [Packet] Command packet
195
133
  # @param time [String] Execution delay in absolute or relative time
196
- def create_cmd_layout(command, time)
134
+ def create_cmd_layout(target_name, packet_name, time)
197
135
  cmd_layout = Qt::HBoxLayout.new
198
136
  cmd_layout.setContentsMargins(0, 0, 0, 0)
199
137
  cmd_layout.addWidget(create_time_edit(time))
200
138
 
201
- @cmd_name = Qt::Label.new("#{command.target_name} #{command.packet_name}")
139
+ @cmd_name = Qt::Label.new("#{target_name} #{packet_name}")
202
140
  cmd_layout.addWidget(@cmd_name)
203
141
  @cmd_info = Qt::Label.new("") # Label for the hazardous designation
204
142
  cmd_layout.addWidget(@cmd_info)
@@ -246,7 +184,7 @@ module Cosmos
246
184
  @parameters = Qt::Widget.new
247
185
  parameters_layout = Qt::VBoxLayout.new
248
186
  # Command Description Label
249
- dec_label = Qt::Label.new(tr("Description:"))
187
+ dec_label = Qt::Label.new("Description:")
250
188
  description = Qt::Label.new(@command.description)
251
189
  description.setWordWrap(true)
252
190
  desc_layout = Qt::HBoxLayout.new
@@ -254,7 +192,7 @@ module Cosmos
254
192
  desc_layout.addWidget(description, 1)
255
193
  parameters_layout.addLayout(desc_layout)
256
194
 
257
- param_label = Qt::Label.new(tr("Parameters:"))
195
+ param_label = Qt::Label.new("Parameters:")
258
196
  parameters_layout.addWidget(param_label)
259
197
  @table_layout = Qt::VBoxLayout.new
260
198
  parameters_layout.addLayout(@table_layout, 500)
@@ -263,252 +201,21 @@ module Cosmos
263
201
  @parameters
264
202
  end
265
203
 
266
- # Update the command parameters table for the given command
267
- # @param ignored_toggle [Boolean] Whether to display the ignored
268
- # parameters. Pass nil (the default) to keep the existing setting.
269
- def update_cmd_params(ignored_toggle = nil)
270
- old_params = {}
271
- if !ignored_toggle.nil?
272
- # Save parameter values
273
- @param_widgets.each do |packet_item, value_item, state_value_item|
274
- text = value_item.text
275
- if state_value_item
276
- old_params[packet_item.name] = [text, state_value_item.text]
277
- else
278
- old_params[packet_item.name] = text
279
- end
280
- end
281
- end
282
-
283
- target = System.targets[@command.target_name]
284
- packet_items = @command.sorted_items
285
- shown_packet_items = []
286
- packet_items.each do |packet_item|
287
- if target && target.ignored_parameters.include?(packet_item.name) && !@show_ignored
288
- if @param_widgets.empty? # First time rendering the parameters
289
- if packet_item.states
290
- # Skip this if the default matches the saved value
291
- next if @command.read_item(packet_item, :RAW) == packet_item.default
292
- else
293
- # Skip this if the default matches the saved value
294
- next if @command.read_item(packet_item) == packet_item.default
295
- end
296
- else # Check the current values
297
- result = @param_widgets.select {|item,_,_| item == packet_item }
298
- next if result.empty?
299
- _, value_item, state_value_item = result[0]
300
- value = state_value_item ? state_value_item.text : value_item.text
301
- # Skip this if the default matches the current value
302
- next if packet_item.default.to_s == value
303
- end
304
- end
305
- shown_packet_items << packet_item
306
- end
307
-
308
- @table.dispose if @table
309
- @table = nil
310
-
311
- # Update Parameters
312
- @param_widgets = []
313
- drawn_header = false
314
-
315
- row = 0
316
- shown_packet_items.each do |packet_item|
317
- value_item = nil
318
- state_value_item = nil
319
-
320
- unless drawn_header
321
- @table = Qt::TableWidget.new()
322
- @table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
323
- @table.setWordWrap(true)
324
- @table.setRowCount(shown_packet_items.length)
325
- @table.setColumnCount(5)
326
- @table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
327
- @table.verticalHeader.setVisible(false)
328
- @table.setItemDelegate(CmdParamTableItemDelegate.new(@table, @param_widgets))
329
- @table.setEditTriggers(Qt::AbstractItemView::DoubleClicked | Qt::AbstractItemView::SelectedClicked | Qt::AbstractItemView::AnyKeyPressed)
330
- @table.setSelectionMode(Qt::AbstractItemView::NoSelection)
331
- @table.setContextMenuPolicy(Qt::CustomContextMenu)
332
- @table.connect(SIGNAL('customContextMenuRequested(const QPoint&)')) do |point|
333
- context_menu(point)
334
- end
335
- drawn_header = true
336
- end
337
-
338
- # Parameter Name
339
- item = Qt::TableWidgetItem.new("#{packet_item.name}:")
340
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
341
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
342
- @table.setItem(row, 0, item)
343
-
344
- if packet_item.states
345
- default = @command.read_item(packet_item, :RAW)
346
- default_state = packet_item.states.key(default)
347
- if old_params[packet_item.name]
348
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
349
- else
350
- if default_state
351
- value_item = Qt::TableWidgetItem.new(default_state.to_s)
352
- else
353
- value_item = Qt::TableWidgetItem.new(MANUALLY)
354
- end
355
- end
356
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
357
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
358
- @table.setItem(row, 1, value_item)
359
-
360
- if old_params[packet_item.name]
361
- state_value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][1])
362
- else
363
- if @states_in_hex && packet_item.default.kind_of?(Integer)
364
- state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", default))
365
- else
366
- default_str = default.to_s
367
- if default_str.is_printable?
368
- state_value_item = Qt::TableWidgetItem.new(default_str)
369
- else
370
- state_value_item = Qt::TableWidgetItem.new("0x" + default_str.simple_formatted)
371
- end
372
- end
373
- end
374
- state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
375
- state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
376
- @table.setItem(row, 2, state_value_item)
377
- else # Parameter Value
378
- if old_params[packet_item.name]
379
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name])
380
- else
381
- default = @command.read_item(packet_item)
382
- if packet_item.format_string
383
- begin
384
- value_text = sprintf(packet_item.format_string, default)
385
- rescue
386
- # Oh well - Don't use the format string
387
- value_text = default.to_s
388
- end
389
- else
390
- value_text = default.to_s
391
- end
392
- if !value_text.is_printable?
393
- value_text = "0x" + value_text.simple_formatted
394
- end
395
- value_item = Qt::TableWidgetItem.new(value_text)
396
- end
397
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
398
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
399
- @table.setItem(row, 1, value_item)
400
- @table.setSpan(row, 1, 1, 2)
401
- end
402
-
403
- # Units
404
- item = Qt::TableWidgetItem.new(packet_item.units.to_s)
405
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
406
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
407
- @table.setItem(row, 3, item)
408
-
409
- # Description
410
- item = Qt::TableWidgetItem.new(packet_item.description.to_s)
411
- item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
412
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
413
- @table.setItem(row, 4, item)
414
-
415
- @param_widgets << [packet_item, value_item, state_value_item]
416
- row += 1
417
- end
418
-
419
- if @table
420
- connect_table_item_changed()
421
- @table.setSizePolicy(Qt::SizePolicy.Minimum, Qt::SizePolicy.Minimum)
422
- @table.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff)
423
- @table.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff)
424
- @table.resizeColumnsToContents()
425
- @table.resizeRowsToContents()
426
- @table.setFixedSize(@table.horizontalHeader.length + @table.verticalHeader.width,
427
- 2 + @table.verticalHeader.length + @table.horizontalHeader.height)
428
- @table_layout.addWidget(@table)
429
- end
430
- end
431
-
432
204
  # Sets the @cmd_name label to the command that will be sent. Also udpates
433
205
  # the @cmd_info with whether this command is hazardous or not.
434
206
  def set_cmd_name_info
435
- @cmd_name.text = command_string
436
- hazardous, _ = System.commands.cmd_hazardous?(@command.target_name, @command.packet_name, command_params())
437
- if hazardous
438
- @cmd_info.text = "(Hazarous)"
439
- else
440
- @cmd_info.text = ""
207
+ Qt.execute_in_main_thread do
208
+ @cmd_name.text = command_string
209
+ hazardous, _ = System.commands.cmd_hazardous?(@command.target_name, @command.packet_name, @cmd_params.params_text)
210
+ if hazardous
211
+ @cmd_info.text = "(Hazardous)"
212
+ else
213
+ @cmd_info.text = ""
214
+ end
441
215
  end
442
216
  rescue => error
443
217
  @cmd_info.text = "(Error)"
444
- Qt::MessageBox.warning(self, 'Error', error.message)
445
- end
446
-
447
- # If the user right clicks over a table item, this method displays a context
448
- # menu with various options.
449
- # @param point [Qt::Point] Point to display the context menu
450
- def context_menu(point)
451
- target_name = @command.target_name
452
- packet_name = @command.packet_name
453
- item = @table.itemAt(point)
454
- if item
455
- item_name = @table.item(item.row, 0).text[0..-2] # Remove :
456
- if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
457
- menu = Qt::Menu.new()
458
-
459
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
460
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
461
- details_action.connect(SIGNAL('triggered()')) do
462
- CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
463
- end
464
- menu.addAction(details_action)
465
-
466
- file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
467
- file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
468
- file_chooser_action.connect(SIGNAL('triggered()')) do
469
- filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
470
- if filename && !filename.empty?
471
- @file_dir = File.dirname(filename)
472
- _, value_item, state_value_item = @param_widgets[item.row]
473
- if state_value_item
474
- state_value_item.setText(filename)
475
- elsif value_item
476
- value_item.setText(filename)
477
- end
478
- end
479
- end
480
- menu.addAction(file_chooser_action)
481
-
482
- menu.exec(@table.mapToGlobal(point))
483
- menu.dispose
484
- end
485
- end # if item
486
- end
487
-
488
- # Connect the itemChanged signal to the table so we can handle user edits
489
- # of the table parameters. This method emits the modified signal.
490
- def connect_table_item_changed
491
- @table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
492
- packet_item, value_item, state_value_item = @param_widgets[item.row]
493
- if item.column == 1
494
- if packet_item.states
495
- value = packet_item.states[value_item.text]
496
- @table.blockSignals(true)
497
- if @states_in_hex && value.kind_of?(Integer)
498
- state_value_item.setText(sprintf("0x%X", value))
499
- else
500
- state_value_item.setText(value.to_s)
501
- end
502
- @table.blockSignals(false)
503
- end
504
- elsif item.column == 2
505
- @table.blockSignals(true)
506
- @table.item(item.row, 1).setText(MANUALLY)
507
- @table.blockSignals(false)
508
- end
509
- set_cmd_name_info()
510
- emit modified # Tell the higher level that something changed
511
- end
218
+ Qt::MessageBox.warning(self, 'Error', "Error parsing #{@command.target_name} #{@command.packet_name} due to #{error.message}")
512
219
  end
513
220
  end
514
221
  end