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
@@ -26,6 +26,7 @@ module Cosmos
26
26
  slots 'undo_available(bool)'
27
27
 
28
28
  UNTITLED_TAB_TEXT = ' Untitled '
29
+ MAX_RECENT_FILES = 20
29
30
 
30
31
  def initialize(options)
31
32
  # All code before super is executed twice in RubyQt Based classes
@@ -50,7 +51,9 @@ module Cosmos
50
51
  @no_icon = Qt::Icon.new
51
52
 
52
53
  begin
53
- ScriptRunnerConfig.new(options.config_file)
54
+ # Always create the ScriptRunnerConfig but note that it's optional to pass a config file
55
+ # If the user doesn't have one it will be created automatically if the default config is changed
56
+ @config = ScriptRunnerConfig.new(options.config_file)
54
57
  rescue => error
55
58
  ExceptionDialog.new(self, error, "Error parsing #{options.config_file}")
56
59
  end
@@ -89,188 +92,226 @@ module Cosmos
89
92
  super()
90
93
 
91
94
  # File actions
92
- @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), tr('&New'), self)
93
- @file_new_keyseq = Qt::KeySequence.new(tr('Ctrl+N'))
95
+ @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), '&New', self)
96
+ @file_new_keyseq = Qt::KeySequence.new('Ctrl+N')
94
97
  @file_new.shortcut = @file_new_keyseq
95
- @file_new.statusTip = tr('Start a new script')
98
+ @file_new.statusTip = 'Start a new script'
96
99
  @file_new.connect(SIGNAL('triggered()')) { file_new() }
97
100
 
98
- @file_close = Qt::Action.new(tr('&Close'), self)
99
- @file_close_keyseq = Qt::KeySequence.new(tr('Ctrl+W'))
101
+ @clear_file_open_recent = Qt::Action.new('&Clear Recent', self)
102
+ @clear_file_open_recent.statusTip = 'Clear the recently opened file list'
103
+ @clear_file_open_recent.connect(SIGNAL('triggered()')) { clear_file_open_recent() }
104
+
105
+ @file_close = Qt::Action.new('&Close', self)
106
+ @file_close_keyseq = Qt::KeySequence.new('Ctrl+W')
100
107
  @file_close.shortcut = @file_close_keyseq
101
- @file_close.statusTip = tr('Close the script')
108
+ @file_close.statusTip = 'Close the script'
102
109
  @file_close.connect(SIGNAL('triggered()')) { file_close() }
103
110
 
104
- @file_reload = Qt::Action.new(tr('&Reload'), self)
105
- @file_reload_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
111
+ @file_reload = Qt::Action.new('Re&load', self)
112
+ @file_reload_keyseq = Qt::KeySequence.new('Ctrl+R')
106
113
  @file_reload.shortcut = @file_reload_keyseq
107
- @file_reload.statusTip = tr('Reload a script')
114
+ @file_reload.statusTip = 'Reload a script'
108
115
  @file_reload.connect(SIGNAL('triggered()')) { file_reload() }
109
116
 
110
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save'), self)
111
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
117
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), '&Save', self)
118
+ @file_save_keyseq = Qt::KeySequence.new('Ctrl+S')
112
119
  @file_save.shortcut = @file_save_keyseq
113
- @file_save.statusTip = tr('Save the script')
120
+ @file_save.statusTip = 'Save the script'
114
121
  @file_save.connect(SIGNAL('triggered()')) { file_save(false) }
115
122
 
116
- @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), tr('Save &As'), self)
117
- @file_save_as.statusTip = tr('Save the script')
123
+ @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), 'Save &As', self)
124
+ @file_save_as.statusTip = 'Save the script'
118
125
  @file_save_as.connect(SIGNAL('triggered()')) { file_save(true) }
119
126
 
120
- @file_options = Qt::Action.new(tr('O&ptions'), self)
121
- @file_options.statusTip = tr('Application Options')
127
+ @file_options = Qt::Action.new('O&ptions', self)
128
+ @file_options.statusTip = 'Application Options'
122
129
  @file_options.connect(SIGNAL('triggered()')) { file_options() }
123
130
 
124
131
  # Edit actions
125
- @edit_undo = Qt::Action.new(Cosmos.get_icon('undo.png'), tr('&Undo'), self)
126
- @edit_undo_keyseq = Qt::KeySequence.new(tr('Ctrl+Z'))
132
+ @edit_undo = Qt::Action.new(Cosmos.get_icon('undo.png'), '&Undo', self)
133
+ @edit_undo_keyseq = Qt::KeySequence.new('Ctrl+Z')
127
134
  @edit_undo.shortcut = @edit_undo_keyseq
128
- @edit_undo.statusTip = tr('Undo')
135
+ @edit_undo.statusTip = 'Undo'
129
136
  @edit_undo.connect(SIGNAL('triggered()')) { active_script_runner_frame().undo }
130
137
 
131
- @edit_redo = Qt::Action.new(Cosmos.get_icon('redo.png'), tr('&Redo'), self)
132
- @edit_redo_keyseq = Qt::KeySequence.new(tr('Ctrl+Y'))
138
+ @edit_redo = Qt::Action.new(Cosmos.get_icon('redo.png'), '&Redo', self)
139
+ @edit_redo_keyseq = Qt::KeySequence.new('Ctrl+Y')
133
140
  @edit_redo.shortcut = @edit_redo_keyseq
134
- @edit_redo.statusTip = tr('Redo')
141
+ @edit_redo.statusTip = 'Redo'
135
142
  @edit_redo.connect(SIGNAL('triggered()')) { active_script_runner_frame().redo }
136
143
 
137
- @edit_cut = Qt::Action.new(Cosmos.get_icon('cut.png'), tr('Cu&t'), self)
138
- @edit_cut_keyseq = Qt::KeySequence.new(tr('Ctrl+X'))
144
+ @edit_cut = Qt::Action.new(Cosmos.get_icon('cut.png'), 'Cu&t', self)
145
+ @edit_cut_keyseq = Qt::KeySequence.new('Ctrl+X')
139
146
  @edit_cut.shortcut = @edit_cut_keyseq
140
- @edit_cut.statusTip = tr('Cut')
147
+ @edit_cut.statusTip = 'Cut'
141
148
  @edit_cut.connect(SIGNAL('triggered()')) { active_script_runner_frame().cut }
142
149
 
143
- @edit_copy = Qt::Action.new(Cosmos.get_icon('copy.png'), tr('&Copy'), self)
144
- @edit_copy_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
150
+ @edit_copy = Qt::Action.new(Cosmos.get_icon('copy.png'), '&Copy', self)
151
+ @edit_copy_keyseq = Qt::KeySequence.new('Ctrl+C')
145
152
  @edit_copy.shortcut = @edit_copy_keyseq
146
- @edit_copy.statusTip = tr('Copy')
153
+ @edit_copy.statusTip = 'Copy'
147
154
  @edit_copy.connect(SIGNAL('triggered()')) { active_script_runner_frame().copy }
148
155
 
149
- @edit_paste = Qt::Action.new(tr('&Paste'), self)
150
- @edit_paste_keyseq = Qt::KeySequence.new(tr('Ctrl+V'))
156
+ @edit_paste = Qt::Action.new('&Paste', self)
157
+ @edit_paste_keyseq = Qt::KeySequence.new('Ctrl+V')
151
158
  @edit_paste.shortcut = @edit_paste_keyseq
152
- @edit_paste.statusTip = tr('Paste')
159
+ @edit_paste.statusTip = 'Paste'
153
160
  @edit_paste.connect(SIGNAL('triggered()')) { active_script_runner_frame().paste }
154
161
 
155
- @edit_select_all = Qt::Action.new(tr('Select &All'), self)
156
- @edit_select_all_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
162
+ @edit_select_all = Qt::Action.new('Select &All', self)
163
+ @edit_select_all_keyseq = Qt::KeySequence.new('Ctrl+A')
157
164
  @edit_select_all.shortcut = @edit_select_all_keyseq
158
- @edit_select_all.statusTip = tr('Select All')
165
+ @edit_select_all.statusTip = 'Select All'
159
166
  @edit_select_all.connect(SIGNAL('triggered()')) { active_script_runner_frame().select_all }
160
167
 
161
- @edit_comment = Qt::Action.new(tr('Comment/Uncomment &Lines'), self)
162
- @edit_comment_keyseq = Qt::KeySequence.new(tr('Ctrl+K'))
168
+ @edit_comment = Qt::Action.new('Comment/Uncomment &Lines', self)
169
+ @edit_comment_keyseq = Qt::KeySequence.new('Ctrl+K')
163
170
  @edit_comment.shortcut = @edit_comment_keyseq
164
- @edit_comment.statusTip = tr('Comment/Uncomment Lines')
171
+ @edit_comment.statusTip = 'Comment/Uncomment Lines'
165
172
  @edit_comment.connect(SIGNAL('triggered()')) { active_script_runner_frame().comment_or_uncomment_lines }
166
173
 
174
+ @edit_zoom_in = Qt::Action.new('&Increase Font Size', self)
175
+ @edit_zoom_in_keyseq = Qt::KeySequence.new(Qt::KeySequence::ZoomIn)
176
+ @edit_zoom_in.shortcut = @edit_zoom_in_keyseq
177
+ @edit_zoom_in.connect(SIGNAL('triggered()')) { active_script_runner_frame().zoom_in }
178
+
179
+ @edit_zoom_out = Qt::Action.new('&Decrease Font Size', self)
180
+ @edit_zoom_out_keyseq = Qt::KeySequence.new(Qt::KeySequence::ZoomOut)
181
+ @edit_zoom_out.shortcut = @edit_zoom_out_keyseq
182
+ @edit_zoom_out.connect(SIGNAL('triggered()')) { active_script_runner_frame().zoom_out }
183
+
184
+ @edit_zoom_default = Qt::Action.new('Restore &Font Size', self)
185
+ @edit_zoom_default.connect(SIGNAL('triggered()')) { active_script_runner_frame().zoom_default }
186
+
167
187
  # Search Actions
168
- @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
169
- @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
188
+ @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), '&Find', self)
189
+ @search_find_keyseq = Qt::KeySequence.new('Ctrl+F')
170
190
  @search_find.shortcut = @search_find_keyseq
171
- @search_find.statusTip = tr('Find text')
191
+ @search_find.statusTip = 'Find text'
172
192
  @search_find.connect(SIGNAL('triggered()')) do
173
193
  FindReplaceDialog.show_find(self)
174
194
  end
175
195
 
176
- @search_find_next = Qt::Action.new(tr('Find &Next'), self)
177
- @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
196
+ @search_find_next = Qt::Action.new('Find &Next', self)
197
+ @search_find_next_keyseq = Qt::KeySequence.new('F3')
178
198
  @search_find_next.shortcut = @search_find_next_keyseq
179
- @search_find_next.statusTip = tr('Find next instance')
199
+ @search_find_next.statusTip = 'Find next instance'
180
200
  @search_find_next.connect(SIGNAL('triggered()')) do
181
201
  FindReplaceDialog.find_next(self)
182
202
  end
183
203
 
184
- @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
185
- @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
204
+ @search_find_previous = Qt::Action.new('Find &Previous', self)
205
+ @search_find_previous_keyseq = Qt::KeySequence.new('Shift+F3')
186
206
  @search_find_previous.shortcut = @search_find_previous_keyseq
187
- @search_find_previous.statusTip = tr('Find previous instance')
207
+ @search_find_previous.statusTip = 'Find previous instance'
188
208
  @search_find_previous.connect(SIGNAL('triggered()')) do
189
209
  FindReplaceDialog.find_previous(self)
190
210
  end
191
211
 
192
- @search_replace = Qt::Action.new(tr('&Replace'), self)
193
- @search_replace_keyseq = Qt::KeySequence.new(tr('Ctrl+H'))
212
+ @search_replace = Qt::Action.new('&Replace', self)
213
+ @search_replace_keyseq = Qt::KeySequence.new('Ctrl+H')
194
214
  @search_replace.shortcut = @search_replace_keyseq
195
- @search_replace.statusTip = tr('Replace')
215
+ @search_replace.statusTip = 'Replace'
196
216
  @search_replace.connect(SIGNAL('triggered()')) do
197
217
  FindReplaceDialog.show_replace(self)
198
218
  end
199
219
 
200
220
  # Script Actions
201
- @script_syntax_all = Qt::Action.new(tr('&Ruby Syntax Check'), self)
202
- @script_syntax_all.statusTip = tr('Check ruby syntax of this script')
221
+ @script_syntax_all = Qt::Action.new('&Ruby Syntax Check', self)
222
+ @script_syntax_all.statusTip = 'Check ruby syntax of this script'
203
223
  @script_syntax_all.connect(SIGNAL('triggered()')) do
204
224
  active_script_runner_frame().ruby_syntax_check_text()
205
225
  end
206
226
 
207
- @script_mnemonic_all = Qt::Action.new(tr('&Mnemonic Check'), self)
208
- @script_mnemonic_all.statusTip = tr('Check mnemonics of this script')
227
+ @script_mnemonic_all = Qt::Action.new('&Mnemonic Check', self)
228
+ @script_mnemonic_all.statusTip = 'Check mnemonics of this script'
209
229
  @script_mnemonic_all.connect(SIGNAL('triggered()')) do
210
230
  active_script_runner_frame().mnemonic_check_text(active_script_runner_frame().text)
211
231
  end
212
232
 
213
- @script_execute_lines = Qt::Action.new(tr('&Execute Selected Lines'), self)
214
- @script_execute_lines.statusTip = tr('Execute selected lines')
233
+ @script_execute_lines = Qt::Action.new('&Execute Selected Lines', self)
234
+ @script_execute_lines.statusTip = 'Execute selected lines'
215
235
  @script_execute_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_selection }
216
236
 
217
- @script_execute_cursor = Qt::Action.new(tr('E&xecute From Cursor'), self)
218
- @script_execute_cursor.statusTip = tr('Execute from cursor position')
237
+ @script_execute_cursor = Qt::Action.new('E&xecute From Cursor', self)
238
+ @script_execute_cursor.statusTip = 'Execute from cursor position'
219
239
  @script_execute_cursor.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_from_cursor }
220
240
 
221
- @script_syntax_lines = Qt::Action.new(tr('Ruby &Syntax Check Selected Lines'), self)
222
- @script_syntax_lines.statusTip = tr('Check ruby syntax of selected lines')
241
+ @script_syntax_lines = Qt::Action.new('Ruby &Syntax Check Selected Lines', self)
242
+ @script_syntax_lines.statusTip = 'Check ruby syntax of selected lines'
223
243
  @script_syntax_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().ruby_syntax_check_selection }
224
244
 
225
- @script_mnemonic_lines = Qt::Action.new(tr('M&nemonic Check Selected Lines'), self)
226
- @script_mnemonic_lines.statusTip = tr('Check mnemonics of selected lines')
245
+ @script_mnemonic_lines = Qt::Action.new('M&nemonic Check Selected Lines', self)
246
+ @script_mnemonic_lines.statusTip = 'Check mnemonics of selected lines'
227
247
  @script_mnemonic_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().mnemonic_check_selection }
228
248
 
229
- @script_audit = Qt::Action.new(tr('&Generate Cmd/Tlm Audit'), self)
230
- @script_audit.statusTip = tr('Generate audit about commands sent and telemetry checked')
249
+ @script_audit = Qt::Action.new('&Generate Cmd/Tlm Audit', self)
250
+ @script_audit.statusTip = 'Generate audit about commands sent and telemetry checked'
231
251
  @script_audit.connect(SIGNAL('triggered()')) { script_audit() }
232
252
 
233
- @script_instrumented = Qt::Action.new(tr('&View Instrumented Script'), self)
234
- @script_instrumented.statusTip = tr('View instrumented script')
253
+ @script_instrumented = Qt::Action.new('&View Instrumented Script', self)
254
+ @script_instrumented.statusTip = 'View instrumented script'
235
255
  @script_instrumented.connect(SIGNAL('triggered()')) { script_view_instrumented() }
236
256
 
237
- @script_log_message = Qt::Action.new(tr('Log Message to Script Log'), self)
238
- @script_log_message.statusTip = tr('Log Message to Script Log')
257
+ @script_log_message = Qt::Action.new('Log Message to Script Log', self)
258
+ @script_log_message.statusTip = 'Log Message to Script Log'
239
259
  @script_log_message.connect(SIGNAL('triggered()')) { script_log_message() }
240
260
  @script_log_message.setEnabled(false)
241
261
 
242
- @script_call_stack = Qt::Action.new(tr('Show Call Stack'), self)
243
- @script_call_stack.statusTip = tr('Show Call Stack')
262
+ @script_call_stack = Qt::Action.new('Show Call Stack', self)
263
+ @script_call_stack.statusTip = 'Show Call Stack'
244
264
  @script_call_stack.connect(SIGNAL('triggered()')) { script_call_stack() }
245
265
  @script_call_stack.setEnabled(false)
246
266
 
247
- @script_debug = Qt::Action.new(Cosmos.get_icon('bug.png'), tr('Toggle &Debug'), self)
248
- @script_debug_keyseq = Qt::KeySequence.new(tr('Ctrl+D'))
267
+ @script_error_backtrace = Qt::Action.new('Show Error Backtrace', self)
268
+ @script_error_backtrace.statusTip = 'Show Error Backtrace from the last encountered exception'
269
+ @script_error_backtrace.connect(SIGNAL('triggered()')) do
270
+ ScriptRunnerFrame.show_backtrace = @script_error_backtrace.checked?
271
+ end
272
+ @script_error_backtrace.setCheckable(true)
273
+
274
+ @script_debug = Qt::Action.new(Cosmos.get_icon('bug.png'), 'Toggle &Debug', self)
275
+ @script_debug_keyseq = Qt::KeySequence.new('Ctrl+D')
249
276
  @script_debug.shortcut = @script_debug_keyseq
250
- @script_debug.statusTip = tr('Toggle debug capabilities for the script')
277
+ @script_debug.statusTip = 'Toggle debug capabilities for the script'
251
278
  @script_debug.connect(SIGNAL('triggered()')) { script_toggle_debug() }
252
279
 
253
- @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), tr('&Toggle Disconnect'), self)
254
- @script_disconnect_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
280
+ @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), '&Toggle Disconnect', self)
281
+ @script_disconnect_keyseq = Qt::KeySequence.new('Ctrl+T')
255
282
  @script_disconnect.shortcut = @script_disconnect_keyseq
256
- @script_disconnect.statusTip = tr('Toggle disconnect from the server')
283
+ @script_disconnect.statusTip = 'Toggle disconnect from the server'
257
284
  @script_disconnect.connect(SIGNAL('triggered()')) { script_toggle_disconnect() }
258
285
  end
259
286
 
260
287
  def initialize_menus
261
288
  # File Menu
262
- @file_menu = menuBar.addMenu(tr('&File'))
289
+ @file_menu = menuBar.addMenu('&File')
263
290
  @file_menu.addAction(@file_new)
264
291
 
265
292
  open_action = Qt::Action.new(self)
266
- open_action.shortcut = Qt::KeySequence.new(tr('Ctrl+O'))
293
+ open_action.shortcut = Qt::KeySequence.new('Ctrl+O')
267
294
  open_action.connect(SIGNAL('triggered()')) { file_open(@procedure_dir) }
268
295
  self.addAction(open_action)
269
296
 
270
- @file_open = @file_menu.addMenu(tr('&Open'))
297
+ @file_open = @file_menu.addMenu('&Open')
271
298
  @file_open.setIcon(Cosmos.get_icon('open.png'))
272
299
  target_dirs_action(@file_open, System.paths['PROCEDURES'], 'procedures', method(:file_open))
273
300
 
301
+ @file_open_recent = @file_menu.addMenu('Open &Recent')
302
+ @file_open_recent.setIcon(Cosmos.get_icon('open.png'))
303
+ settings = Qt::Settings.new('Ball Aerospace', self.class.to_s)
304
+ if settings.contains('recent_files')
305
+ recent = settings.value('recent_files').toStringList()
306
+ recent.each do |filename|
307
+ action = Qt::Action.new(filename, self)
308
+ action.connect(SIGNAL('triggered()')) { open_filename(filename) }
309
+ @file_open_recent.addAction(action)
310
+ end
311
+ end
312
+ @file_open_recent.addSeparator()
313
+ @file_open_recent.addAction(@clear_file_open_recent)
314
+
274
315
  @file_menu.addAction(@file_close)
275
316
  @file_menu.addAction(@file_reload)
276
317
  @file_menu.addSeparator()
@@ -282,7 +323,7 @@ module Cosmos
282
323
  @file_menu.addAction(@exit_action)
283
324
 
284
325
  # Edit Menu
285
- mode_menu = menuBar.addMenu(tr('&Edit'))
326
+ mode_menu = menuBar.addMenu('&Edit')
286
327
  mode_menu.addAction(@edit_undo)
287
328
  mode_menu.addAction(@edit_redo)
288
329
  mode_menu.addSeparator()
@@ -293,16 +334,20 @@ module Cosmos
293
334
  mode_menu.addAction(@edit_select_all)
294
335
  mode_menu.addSeparator()
295
336
  mode_menu.addAction(@edit_comment)
337
+ mode_menu.addSeparator()
338
+ mode_menu.addAction(@edit_zoom_in)
339
+ mode_menu.addAction(@edit_zoom_out)
340
+ mode_menu.addAction(@edit_zoom_default)
296
341
 
297
342
  # Search Menu
298
- view_menu = menuBar.addMenu(tr('&Search'))
343
+ view_menu = menuBar.addMenu('&Search')
299
344
  view_menu.addAction(@search_find)
300
345
  view_menu.addAction(@search_find_next)
301
346
  view_menu.addAction(@search_find_previous)
302
347
  view_menu.addAction(@search_replace)
303
348
 
304
349
  # Script Menu
305
- view_menu = menuBar.addMenu(tr('Scrip&t'))
350
+ view_menu = menuBar.addMenu('Scrip&t')
306
351
  view_menu.addAction(@script_syntax_all)
307
352
  view_menu.addAction(@script_syntax_lines)
308
353
  view_menu.addSeparator()
@@ -317,6 +362,7 @@ module Cosmos
317
362
  view_menu.addSeparator()
318
363
  view_menu.addAction(@script_log_message)
319
364
  view_menu.addAction(@script_call_stack)
365
+ view_menu.addAction(@script_error_backtrace)
320
366
  view_menu.addAction(@script_debug)
321
367
  view_menu.addAction(@script_disconnect)
322
368
 
@@ -392,35 +438,63 @@ module Cosmos
392
438
  # File->Open
393
439
  def file_open(filename = nil)
394
440
  if File.directory?(filename)
395
- filename = Qt::FileDialog.getOpenFileName(self, "Select Script", filename)
441
+ filenames = Qt::FileDialog.getOpenFileNames(self, "Select Script(s)", filename, "Scripts (*.rb);;All Files(*.*)")
442
+ else
443
+ filenames = [filename]
396
444
  end
397
- unless filename.nil? || filename.empty?
398
- # If the user opens a file we already have open
399
- # just set the current tab to that file and return
400
- @tab_book.tabs.each_with_index do |tab, index|
401
- if tab.filename == filename
402
- @tab_book.setCurrentIndex(index)
403
- @tab_book.currentTab.set_text_from_file(filename)
404
- @tab_book.currentTab.filename = filename
405
- return
406
- end
445
+ filenames.compact!
446
+ return if filenames.nil? || filenames.empty?
447
+ filenames.each do |filename|
448
+ open_filename(filename)
449
+
450
+ found = false
451
+ @file_open_recent.actions.each do |action|
452
+ found = true if action.text == filename
453
+ end
454
+ next if found
455
+ action = Qt::Action.new(filename, self)
456
+ action.connect(SIGNAL('triggered()')) { open_filename(filename) }
457
+ @file_open_recent.insertAction(@file_open_recent.actions[0], action)
458
+ # Add 2 for the separator and Clear Recent action
459
+ if @file_open_recent.actions.length > (MAX_RECENT_FILES + 2)
460
+ @file_open_recent.removeAction(@file_open_recent.actions[-3]) # ignore last 2
407
461
  end
462
+ end
463
+ end
408
464
 
409
- if ((@tab_book.count == 1) &&
410
- @tab_book.currentTab.filename.empty? &&
411
- !@tab_book.currentTab.modified)
412
- # Active Tab is an unmodified Untitled so just open the file in it
465
+ def clear_file_open_recent
466
+ # Subtract 2 for the separator and Clear Recent action
467
+ (@file_open_recent.actions.length - 2).times do
468
+ @file_open_recent.removeAction(@file_open_recent.actions[0])
469
+ end
470
+ end
471
+
472
+ def open_filename(filename)
473
+ # If the user opens a file we already have open
474
+ # just set the current tab to that file and return
475
+ @tab_book.tabs.each_with_index do |tab, index|
476
+ if tab.filename == filename
477
+ @tab_book.setCurrentIndex(index)
413
478
  @tab_book.currentTab.set_text_from_file(filename)
414
479
  @tab_book.currentTab.filename = filename
415
- @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
416
- else
417
- create_tab(filename)
480
+ return
418
481
  end
482
+ end
419
483
 
420
- update_title()
421
- @procedure_dir = File.dirname(filename)
422
- @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
484
+ if ((@tab_book.count == 1) &&
485
+ @tab_book.currentTab.filename.empty? &&
486
+ !@tab_book.currentTab.modified)
487
+ # Active Tab is an unmodified Untitled so just open the file in it
488
+ @tab_book.currentTab.set_text_from_file(filename)
489
+ @tab_book.currentTab.filename = filename
490
+ @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
491
+ else
492
+ create_tab(filename)
423
493
  end
494
+
495
+ update_title()
496
+ @procedure_dir = File.dirname(filename)
497
+ @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
424
498
  end
425
499
 
426
500
  # File->Reload
@@ -472,11 +546,11 @@ module Cosmos
472
546
  File.open(filename, "w") {|file| file.write(active_script_runner_frame().text)}
473
547
  saved = true
474
548
  update_title()
475
- statusBar.showMessage(tr("#{filename} saved"))
549
+ statusBar.showMessage("#{filename} saved")
476
550
  @procedure_dir = File.dirname(filename)
477
551
  @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
478
552
  rescue => error
479
- statusBar.showMessage(tr("Error Saving Script : #{error.class} : #{error.message}"))
553
+ statusBar.showMessage("Error Saving Script : #{error.class} : #{error.message}")
480
554
  end
481
555
  end
482
556
 
@@ -508,18 +582,18 @@ module Cosmos
508
582
  box = Qt::DoubleSpinBox.new
509
583
  box.setRange(0, 60)
510
584
  box.setValue(ScriptRunnerFrame.line_delay)
511
- form.addRow(tr("&Delay between each script line:"), box)
585
+ form.addRow("&Delay between each script line:", box)
512
586
  pause_on_error = Qt::CheckBox.new
513
- form.addRow(tr("&Pause on error:"), pause_on_error)
587
+ form.addRow("&Pause on error:", pause_on_error)
514
588
  monitor = Qt::CheckBox.new
515
- form.addRow(tr("&Monitor limits:"), monitor)
589
+ form.addRow("&Monitor limits:", monitor)
516
590
  if ScriptRunnerFrame.pause_on_error
517
591
  pause_on_error.setCheckState(Qt::Checked)
518
592
  else
519
593
  pause_on_error.setCheckState(Qt::Unchecked)
520
594
  end
521
595
  pause_on_red = Qt::CheckBox.new
522
- form.addRow(tr("Pause on &red limit:"), pause_on_red)
596
+ form.addRow("Pause on &red limit:", pause_on_red)
523
597
  if ScriptRunnerFrame.monitor_limits
524
598
  monitor.setCheckState(Qt::Checked)
525
599
  pause_on_red.setCheckState(Qt::Checked) if ScriptRunnerFrame.pause_on_red
@@ -548,6 +622,7 @@ module Cosmos
548
622
  ScriptRunnerFrame.pause_on_error = (pause_on_error.checkState == Qt::Checked)
549
623
  ScriptRunnerFrame.monitor_limits = (monitor.checkState == Qt::Checked)
550
624
  ScriptRunnerFrame.pause_on_red = (pause_on_red.checkState == Qt::Checked)
625
+ @config.write_config
551
626
  dialog.accept
552
627
  end
553
628
  cancel = Qt::PushButton.new('Cancel')
@@ -652,6 +727,10 @@ module Cosmos
652
727
  def closeEvent(event)
653
728
  if active_script_runner_frame().prompt_if_running_on_close()
654
729
  if prompt_for_save_if_needed_on_close()
730
+ settings = Qt::Settings.new('Ball Aerospace', self.class.to_s)
731
+ recent_files = @file_open_recent.actions.collect {|action| action.text }
732
+ # Ignore the last 2 because of the separator and Clear Recent action
733
+ settings.setValue('recent_files', Qt::Variant.new(recent_files[0..-3]))
655
734
  shutdown_cmd_tlm()
656
735
  @tab_book.tabs.each_with_index do |tab, index|
657
736
  tab.stop_message_log
@@ -787,23 +866,23 @@ module Cosmos
787
866
 
788
867
  menu = Qt::Menu.new()
789
868
 
790
- new_action = Qt::Action.new(tr("&New"), self)
791
- new_action.statusTip = tr("Create a new script")
869
+ new_action = Qt::Action.new("&New", self)
870
+ new_action.statusTip = "Create a new script"
792
871
  new_action.connect(SIGNAL('triggered()')) { file_new() }
793
872
  menu.addAction(new_action)
794
873
 
795
- close_action = Qt::Action.new(tr("&Close"), self)
796
- close_action.statusTip = tr("Close the script")
874
+ close_action = Qt::Action.new("&Close", self)
875
+ close_action.statusTip = "Close the script"
797
876
  close_action.connect(SIGNAL('triggered()')) { file_close() }
798
877
  menu.addAction(close_action)
799
878
 
800
- save_action = Qt::Action.new(tr("&Save"), self)
801
- save_action.statusTip = tr("Save the script")
879
+ save_action = Qt::Action.new("&Save", self)
880
+ save_action.statusTip = "Save the script"
802
881
  save_action.connect(SIGNAL('triggered()')) { file_save(false) }
803
882
  menu.addAction(save_action)
804
883
 
805
- save_action = Qt::Action.new(tr("Save &As"), self)
806
- save_action.statusTip = tr("Save the script as")
884
+ save_action = Qt::Action.new("Save &As", self)
885
+ save_action.statusTip = "Save the script as"
807
886
  save_action.connect(SIGNAL('triggered()')) { file_save(true) }
808
887
  menu.addAction(save_action)
809
888
 
@@ -969,9 +1048,6 @@ module Cosmos
969
1048
  options.disconnect_mode = false
970
1049
 
971
1050
  option_parser.separator "Script Runner Specific Options:"
972
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
973
- options.config_file = arg
974
- end
975
1051
  option_parser.on("-s", "--server FILE", "Use the specified server configuration file for disconnect mode") do |arg|
976
1052
  options.server_config_file = arg
977
1053
  end
@@ -986,6 +1062,5 @@ module Cosmos
986
1062
  super(option_parser, options)
987
1063
  end
988
1064
  end
989
- end # class ScriptRunner
990
-
991
- end # module Cosmos
1065
+ end
1066
+ end