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
@@ -36,7 +36,7 @@ module Cosmos
36
36
  @list = Qt::ListWidget.new
37
37
  @exception_list.each_with_index do |exception, index|
38
38
  string = "#{index + 1}. #{exception.class} : #{exception.message}"
39
- Qt::ListWidgetItem.new(tr(string), @list)
39
+ Qt::ListWidgetItem.new(string, @list)
40
40
  end
41
41
  layout.addWidget(@list)
42
42
  @list.connect(SIGNAL('itemSelectionChanged ()')) do
@@ -103,9 +103,9 @@ module Cosmos
103
103
  def create_input_layout
104
104
  input_layout = Qt::FormLayout.new
105
105
  @find_box = Qt::LineEdit.new
106
- input_layout.addRow(tr("Fi&nd what:"), @find_box)
106
+ input_layout.addRow("Fi&nd what:", @find_box)
107
107
  @replace_box = Qt::LineEdit.new
108
- replace_label = Qt::Label.new(tr("Re&place with:"))
108
+ replace_label = Qt::Label.new("Re&place with:")
109
109
  replace_label.setBuddy(@replace_box)
110
110
  @replace_items << replace_label
111
111
  input_layout.addRow(replace_label, @replace_box)
@@ -141,7 +141,7 @@ module Cosmos
141
141
  direction_layout.addWidget(@up)
142
142
  direction_layout.addWidget(down)
143
143
  direction_layout.addStretch
144
- direction = Qt::GroupBox.new(tr("Direction"))
144
+ direction = Qt::GroupBox.new("Direction")
145
145
  direction.setLayout(direction_layout)
146
146
  direction
147
147
  end
@@ -43,14 +43,14 @@ module Cosmos
43
43
  top_layout = Qt::HBoxLayout.new
44
44
  text_layout = Qt::VBoxLayout.new
45
45
 
46
- title_label = Qt::Label.new(tr(title))
46
+ title_label = Qt::Label.new(title)
47
47
  text_layout.addWidget(title_label)
48
48
  @read_raw_data_time = Qt::Label.new("Read Raw Data Time: ")
49
49
  text_layout.addWidget(@read_raw_data_time)
50
50
  top_layout.addLayout(text_layout)
51
51
  top_layout.addStretch(1)
52
52
 
53
- button = Qt::PushButton.new(tr("Pause"))
53
+ button = Qt::PushButton.new("Pause")
54
54
  top_layout.addWidget(button)
55
55
  button.connect(SIGNAL('clicked()')) do
56
56
  if button.text == "Pause"
@@ -20,7 +20,7 @@ module Cosmos
20
20
  # are written back into the packet.
21
21
  class SetTlmDialog < Qt::Dialog
22
22
  # @return [Array<String>] Items which should not be displayed in the dialog
23
- IGNORED_ITEMS = ['RECEIVED_TIMESECONDS', 'RECEIVED_TIMEFORMATTED', 'RECEIVED_COUNT', 'PKTID', 'CONFIG']
23
+ IGNORED_ITEMS = ['PACKET_TIMESECONDS', 'PACKET_TIMEFORMATTED', 'RECEIVED_TIMESECONDS', 'RECEIVED_TIMEFORMATTED', 'RECEIVED_COUNT', 'PKTID', 'CONFIG']
24
24
 
25
25
  # @return [String] Errors encountered when trying to set the values back
26
26
  # into the packet
@@ -50,15 +50,15 @@ module Cosmos
50
50
  setWindowTitle("#{@target_name} #{@packet_name} #{@item_name} Details")
51
51
 
52
52
  layout = Qt::VBoxLayout.new
53
- layout.addWidget(Qt::Label.new(tr("#{target_name} #{packet_name} #{item_name}")))
53
+ layout.addWidget(Qt::Label.new("#{target_name} #{packet_name} #{item_name}"))
54
54
 
55
55
  # Display the item values
56
- item_values = Qt::GroupBox.new(tr("Item Values"))
56
+ item_values = Qt::GroupBox.new("Item Values")
57
57
 
58
58
  values_layout = Qt::FormLayout.new
59
59
  @raw_value = Qt::LineEdit.new
60
60
  @raw_value.setReadOnly(true)
61
- values_layout.addRow(tr("Raw Value:"), @raw_value)
61
+ values_layout.addRow("Raw Value:", @raw_value)
62
62
  @hex_raw_value = nil
63
63
  @hex_raw_num_digits = 0
64
64
  case item.data_type
@@ -67,21 +67,21 @@ module Cosmos
67
67
  @hex_raw_value = Qt::LineEdit.new
68
68
  @hex_raw_value.setReadOnly(true)
69
69
  @hex_raw_num_digits = (((item.bit_size - 1) / 8) + 1) * 2
70
- values_layout.addRow(tr("Hex Raw Value:"), @hex_raw_value)
70
+ values_layout.addRow("Hex Raw Value:", @hex_raw_value)
71
71
  end
72
72
  end
73
73
  @converted_value = Qt::LineEdit.new
74
74
  @converted_value.setReadOnly(true)
75
- values_layout.addRow(tr("Converted Value:"), @converted_value)
75
+ values_layout.addRow("Converted Value:", @converted_value)
76
76
  @formatted_value = Qt::LineEdit.new
77
77
  @formatted_value.setReadOnly(true)
78
- values_layout.addRow(tr("Formatted Value:"), @formatted_value)
78
+ values_layout.addRow("Formatted Value:", @formatted_value)
79
79
  @formatted_with_units_value = Qt::LineEdit.new
80
80
  @formatted_with_units_value.setReadOnly(true)
81
- values_layout.addRow(tr("Formatted with Units Value:"), @formatted_with_units_value)
81
+ values_layout.addRow("Formatted with Units Value:", @formatted_with_units_value)
82
82
  @limits_state = Qt::LineEdit.new
83
83
  @limits_state.setReadOnly(true)
84
- values_layout.addRow(tr("Limits State:"), @limits_state)
84
+ values_layout.addRow("Limits State:", @limits_state)
85
85
 
86
86
  item_values.setLayout(values_layout)
87
87
  layout.addWidget(item_values)
@@ -101,7 +101,7 @@ module Cosmos
101
101
  end
102
102
 
103
103
  # Display the item details
104
- item_details = Qt::GroupBox.new(tr("Item Details"))
104
+ item_details = Qt::GroupBox.new("Item Details")
105
105
  item_details.setLayout(build_details_layout(item, :TLM))
106
106
  layout.addWidget(item_details)
107
107
 
@@ -159,8 +159,9 @@ module Cosmos
159
159
  elsif @limits_layout
160
160
  label = Qt::Label.new(label_text)
161
161
  @limits_labels[limits_set] = label
162
- @limits_layout.addRow(tr("#{limits_set}:"), label)
162
+ @limits_layout.addRow("#{limits_set}:", label)
163
163
  end
164
+ update_limits_checking()
164
165
  end
165
166
 
166
167
  def determine_limits_color(limit_state)
@@ -28,7 +28,7 @@ module Cosmos
28
28
  # @param target_name [String] Name of the target
29
29
  # @param packet_name [String] Name of the packet
30
30
  # @param item_name [String] Name of the item
31
- def initialize(parent, target_name, packet_name, item_name)
31
+ def initialize(parent, target_name, packet_name, item_name, replay = false)
32
32
  packet, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
33
33
 
34
34
  num_array_elements = 0
@@ -101,7 +101,9 @@ module Cosmos
101
101
 
102
102
  # Start grapher if necessary
103
103
  if !item_string.empty?
104
- Cosmos.run_cosmos_tool("TlmGrapher", "#{item_string} --system #{File.basename(System.initial_filename)}")
104
+ options = "#{item_string} --system #{File.basename(System.initial_filename)}"
105
+ options += " --replay" if replay
106
+ Cosmos.run_cosmos_tool("TlmGrapher", options)
105
107
  end
106
108
  end
107
109
  end
@@ -19,7 +19,7 @@ module Cosmos
19
19
  # @param y (see TextureMappedSphere#initialize)
20
20
  # @param z (see TextureMappedSphere#initialize)
21
21
  def initialize(x, y, z)
22
- super(x, y, z, File.join(::Cosmos::PATH, 'data', 'EarthMap1024x512.gif'))
22
+ super(x, y, z, File.join(::Cosmos::PATH, 'data', 'Earthmap1024x512.gif'))
23
23
  end
24
24
  end
25
25
  end
@@ -12,6 +12,7 @@
12
12
  # adding workarounds should they be needed to work through problems with
13
13
  # interacting with QT from Ruby.
14
14
 
15
+ require 'stringio'
15
16
  require 'cosmos'
16
17
  check_filename = File.join(Cosmos::USERPATH, "#{File.basename($0, File.extname($0))}_qt_check.txt")
17
18
  qt_in_system_folder = false
@@ -70,8 +71,16 @@ if Kernel.is_windows?
70
71
  end
71
72
  end
72
73
 
74
+ if Kernel.is_windows?
75
+ temp_stderr = $stderr.clone
76
+ $stderr.reopen(File.new('nul', 'w'))
77
+ end
73
78
  # This will either lock up or raise an error if older Qt dlls are present in the Windows system folders
74
- require 'Qt'
79
+ begin
80
+ require 'Qt'
81
+ ensure
82
+ $stderr.reopen(temp_stderr) if Kernel.is_windows?
83
+ end
75
84
  File.delete(check_filename) if Kernel.is_windows? and File.exist?(check_filename)
76
85
 
77
86
  module Cosmos
@@ -165,8 +174,10 @@ module Cosmos
165
174
  FONTS[font_face][font_size][font_attrs] ||= {}
166
175
  font = FONTS[font_face][font_size][font_attrs][font_italics]
167
176
  unless font
168
- if font_attrs and font_italics
177
+ if font_attrs && font_italics
169
178
  font = Qt::Font.new(font_face, font_size, font_attrs, font_italics)
179
+ elsif font_attrs
180
+ font = Qt::Font.new(font_face, font_size, font_attrs)
170
181
  else
171
182
  font = Qt::Font.new(font_face, font_size)
172
183
  end
@@ -14,10 +14,12 @@ require 'cosmos/gui/dialogs/about_dialog'
14
14
  require 'cosmos/gui/dialogs/exception_dialog'
15
15
  require 'cosmos/gui/dialogs/pry_dialog'
16
16
  require 'cosmos/gui/dialogs/scroll_text_dialog'
17
+ require 'cosmos/gui/utilities/classification_banner'
17
18
  require 'ostruct'
18
19
  require 'optparse'
19
20
 
20
21
  module Cosmos
22
+
21
23
  # Base class of all COSMOS GUI Tools based on QT. It creates the help menu
22
24
  # which contains the About menu option. It provides configuration to all
23
25
  # tools to remember both the application window location and size across
@@ -28,6 +30,8 @@ module Cosmos
28
30
 
29
31
  @@redirect_io_thread = nil
30
32
 
33
+ include ClassificationBanner
34
+
31
35
  # Create a new application. IO is redirected such that writing to stdout or
32
36
  # stderr will result in a popup to be displayed to the user. Thus
33
37
  # applications should not write to stdout (i.e. puts or write) or stderr
@@ -56,14 +60,28 @@ module Cosmos
56
60
  @stylesheet = ''
57
61
  @stylesheet = File.read(app_style) if File.exist? app_style
58
62
 
59
- # Get the source file location of the tool calling this method
60
- location = self.class.instance_method(:initialize).source_location[0]
61
- tool_name = location.split('/')[-2]
62
- config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', tool_name)
63
- if File.exist? config_dir
64
- @options.config_dir = config_dir
65
- @options.config_file = config_path(@options.config_file, ".txt", tool_name)
66
- @options.stylesheet = config_path(@options.stylesheet, ".css", tool_name)
63
+ self.class.normalize_config_options(@options)
64
+
65
+ # Add a banner based on system configuration
66
+ add_classification_banner
67
+ end
68
+
69
+ # Normalizes config_dir, config_file, and stylesheet options
70
+ def self.normalize_config_options(options)
71
+ # Determine the tool name based on the class
72
+ tool_name = self.to_s.class_name_to_filename.split('.')[0] # remove .rb
73
+ options.config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', tool_name) unless options.config_dir
74
+ tool_name = options.config_dir.split('/')[-1]
75
+ if File.exist?(options.config_dir)
76
+ options.config_file = config_path(options, options.config_file, ".txt", tool_name)
77
+ options.stylesheet = config_path(options, options.stylesheet, ".css", tool_name)
78
+ elsif options.config_file == true
79
+ # If the config_file is required and the config_dir doesn't exist then
80
+ # this is a core COSMOS configuration error so just raise an error
81
+ raise "ERROR! config_dir #{options.config_dir} does not exist. tool_name = #{tool_name}"
82
+ else
83
+ options.config_file = nil
84
+ options.stylesheet = nil
67
85
  end
68
86
  end
69
87
 
@@ -72,41 +90,51 @@ module Cosmos
72
90
  # directory is prepended to the filename. If no file is given a default is
73
91
  # generated based on the application name.
74
92
  #
75
- # @param filename [String] Path to a configuration file
93
+ # @param filename [String|Boolean|nil] Path to a configuration file which means
94
+ # the file must be found. true which means that a default configuration file
95
+ # is required and must be found. nil which means a default file is acceptable
96
+ # but not required.
76
97
  # @param type [String] File extension, e.g. '.txt'
77
98
  # @param tool_name [String] Name of the tool calling this method
78
- # @return [String|nil] Path to a configuration file. If a filename was
79
- # passed and the configuration file is not found, the original filename
80
- # is returned. If no filename was passed nil is returned.
81
- def config_path(filename, type, tool_name)
82
- return filename if filename && File.exist?(filename)
83
- if filename
84
- # Add the configuration dir onto the filename
85
- new_filename = File.join(@options.config_dir, filename)
86
- return new_filename if File.exist?(new_filename)
87
- else
88
- # No file passed so default to a file named after the class
89
- new_filename = File.join(@options.config_dir, "#{tool_name}#{type}")
99
+ # @return [String|nil] Path to an existing configuration file. nil is returned
100
+ # if filename is nil and the default is not found. An error is raised if
101
+ # filename is a string or true and it is not found.
102
+ def self.config_path(options, filename, type, tool_name)
103
+ # First check for an absolute path
104
+ return filename if filename && filename != true && File.exist?(filename)
105
+ # Build a default filename
106
+ default_filename = File.join(options.config_dir, "#{tool_name}#{type}")
107
+ if filename == true # The config file is required but not given
108
+ return default_filename if File.exist?(default_filename)
109
+ message = "\n\nDefault configuration file #{default_filename} not found.\n"\
110
+ "Either create this file or pass a configuration filename using the --config option.\n"
111
+ raise message
112
+ elsif filename # Filename was given so look for it in the config dir
113
+ new_filename = File.join(options.config_dir, filename)
90
114
  return new_filename if File.exist?(new_filename)
115
+ # If a filename is passed in it is an error if it does not exist
116
+ raise "\n\nConfiguration file #{new_filename} not found.\n"
91
117
  end
92
- filename
118
+ # If filename is nil check for the default and return it
119
+ return default_filename if File.exist?(default_filename)
120
+ nil # return nil if filename is nil and the default is not found
93
121
  end
94
122
 
95
123
  # Create the exit_action and the about_action. The exit_action is not
96
124
  # placed in the File menu and must be manually added by the user. The
97
125
  # about_action is added to the Help menu by {#initialize_help_menu}.
98
126
  def initialize_actions
99
- @exit_action = Qt::Action.new(Cosmos.get_icon('close.png'), tr('E&xit'), self)
100
- @exit_keyseq = Qt::KeySequence.new(tr('Ctrl+Q'))
127
+ @exit_action = Qt::Action.new(Cosmos.get_icon('close.png'), 'E&xit', self)
128
+ @exit_keyseq = Qt::KeySequence.new('Ctrl+Q')
101
129
  @exit_action.shortcut = @exit_keyseq
102
- @exit_action.statusTip = tr('Exit the application')
130
+ @exit_action.statusTip = 'Exit the application'
103
131
  connect(@exit_action, SIGNAL('triggered()'), self, SLOT('close()'))
104
132
 
105
- @about_action = Qt::Action.new(Cosmos.get_icon('help.png'), tr('&About'), self)
106
- @about_action.statusTip = tr('About the application')
133
+ @about_action = Qt::Action.new(Cosmos.get_icon('help.png'), '&About', self)
134
+ @about_action.statusTip = 'About the application'
107
135
  connect(@about_action, SIGNAL('triggered()'), self, SLOT('about()'))
108
- @documentation_action = Qt::Action.new(tr('&Documentation'), self)
109
- @documentation_action.statusTip = tr('COSMOS Online Documentation')
136
+ @documentation_action = Qt::Action.new('&Documentation', self)
137
+ @documentation_action.statusTip = 'COSMOS Online Documentation'
110
138
  self.connect(@documentation_action, SIGNAL('triggered()')) do
111
139
  Qt::DesktopServices.openUrl(Qt::Url.new("http://cosmosrb.com"))
112
140
  end
@@ -130,7 +158,7 @@ module Cosmos
130
158
  default_dirs = [default_dirs] unless default_dirs.is_a? Array
131
159
  default_dirs.each do |default_dir|
132
160
  default_context = default_dir.split('/')[-2..-1].join('/')
133
- action = Qt::Action.new(tr(default_context), self)
161
+ action = Qt::Action.new(default_context, self)
134
162
  action.statusTip = status_tip if status_tip
135
163
  action.connect(SIGNAL('triggered()')) { callback.call(default_dir) }
136
164
  menu.addAction(action)
@@ -149,7 +177,7 @@ module Cosmos
149
177
  else
150
178
  name = "#{target_name}/#{target_sub_dir}"
151
179
  end
152
- action = Qt::Action.new(tr(name), self)
180
+ action = Qt::Action.new(name, self)
153
181
  action.statusTip = status_tip if status_tip
154
182
  action.connect(SIGNAL('triggered()')) { callback.call(dir) }
155
183
  menu.addAction(action)
@@ -160,7 +188,7 @@ module Cosmos
160
188
  # Creates the Help menu and adds the about_action to it. Thus this MUST be
161
189
  # called after initialize_actions.
162
190
  def initialize_help_menu
163
- @help_menu = menuBar().addMenu(tr('&Help'))
191
+ @help_menu = menuBar().addMenu('&Help')
164
192
  @help_menu.addAction(@about_action)
165
193
  @help_menu.addAction(@documentation_action)
166
194
  end
@@ -181,28 +209,26 @@ module Cosmos
181
209
 
182
210
  # Handle manually positioning the window
183
211
  unless @options.auto_position
184
- # Get the desktop's geometry
185
- desktop = Qt::Application.desktop
186
-
187
- # Handle position relative to right edge
188
- @options.x = desktop.width - frameGeometry().width + @options.x + 1 if @options.x < 0
189
-
190
- # Handle position relative to bottom edge
191
- @options.y = desktop.height - frameGeometry().height + @options.y + 1 if @options.y < 0
192
-
193
212
  # Move to the desired position
194
213
  move(@options.x, @options.y)
195
214
  end
196
215
 
197
216
  if @options.remember_geometry and !@options.command_line_geometry
217
+ # Get the desktop's geometry
218
+ desktop = Qt::Application.desktop
219
+ screen = desktop.screen
198
220
  settings = Qt::Settings.new('Ball Aerospace', self.class.to_s)
199
221
  if settings.contains('size') and @options.restore_size and @options.startup_state != :DEFAULT
200
222
  size = settings.value('size').toSize
201
- resize(size)
223
+ if size.height > 0 and size.height < screen.height and size.width > 0 and size.width < screen.width
224
+ resize(size)
225
+ end
202
226
  end
203
227
  if settings.contains('position') and @options.restore_position
204
228
  position = settings.value('position').toPoint
205
- move(position)
229
+ if position.x > 0 and position.y > 0 and position.x < screen.width and position.y < screen.height
230
+ move(position)
231
+ end
206
232
  end
207
233
  end
208
234
 
@@ -326,6 +352,8 @@ module Cosmos
326
352
  options.restore_size = true
327
353
  options.redirect_io = true
328
354
  options.title = "COSMOS Tool"
355
+ options.config_file = nil
356
+ options.stylesheet = nil
329
357
 
330
358
  parser = OptionParser.new do |option_parser|
331
359
  option_parser.banner = "Usage: ruby #{option_parser.program_name} [options]"
@@ -24,6 +24,7 @@ module Cosmos
24
24
  signals 'breakpoint_set(int)'
25
25
  signals 'breakpoint_cleared(int)'
26
26
  signals 'breakpoints_cleared()'
27
+ signals 'font_changed(const QFont &)'
27
28
 
28
29
  attr_accessor :enable_breakpoints
29
30
  attr_accessor :filename
@@ -75,67 +76,63 @@ module Cosmos
75
76
 
76
77
  RULES = []
77
78
  RUBY_KEYWORDS.each do |w|
78
- RULES << ['\b'+w+'\b', 0, STYLES['ruby_keyword']]
79
+ RULES << ['\b'+w+'\b', STYLES['ruby_keyword']]
79
80
  end
80
81
  Script.private_instance_methods.each do |w|
81
- RULES << ['\b'+w.to_s+'\b', 0, STYLES['cosmos_keyword']]
82
+ RULES << ['\b'+w.to_s+'\b', STYLES['cosmos_keyword']]
82
83
  end
83
84
  BRACES.each do |b|
84
- RULES << ["#{b}", 0, STYLES['brace']]
85
+ RULES << ["#{b}", STYLES['brace']]
85
86
  end
86
87
  RULES.concat([
87
88
  # 'def' followed by an identifier
88
- ['\bdef\b\s*(\w+)', 1, STYLES['method']],
89
+ ['\bdef\b\s*(\w+)', STYLES['method']],
89
90
  # 'class' followed by an identifier
90
- ['\bclass\b\s*(\w+)', 1, STYLES['class']],
91
+ ['\bclass\b\s*(\w+)', STYLES['class']],
91
92
  # Ruby symbol
92
- [':\b\w+', 0, STYLES['symbol']],
93
+ [':\b\w+', STYLES['symbol']],
93
94
  # Ruby namespace operator
94
- ['\b\w+(::\b\w+)+', 0, STYLES['class']],
95
+ ['\b\w+(::\b\w+)+', STYLES['class']],
95
96
  # Ruby global
96
- ['\\$\b\w+', 0, STYLES['string']],
97
+ ['\\$\b\w+', STYLES['string']],
97
98
  # Regex, possibly containing escape sequences
98
- ["/.*/", 0, STYLES['string']],
99
+ ["/.*/", STYLES['string']],
99
100
  # Double-quoted string, possibly containing escape sequences
100
- ['"([^"\\\\]|\\\\.)*"', 0, STYLES['string']],
101
+ ['"(?:[^"\\\\]|\\\\.)*"', STYLES['string']],
101
102
  # Match interpolated strings "blah #{code} blah"
102
- ['(\#\\{)[^\\}]*\\}', 1, STYLES['brace']],
103
- ['\#\\{[^\\}]*(\\})', 1, STYLES['brace']],
104
- ['\#\\{([^\\}]*)\\}', 1, STYLES['normal']],
103
+ # This comes before single-quote and back-tick because
104
+ # those strings should not interpolate variables
105
+ ['(\#\\{)[^\\}]*\\}', STYLES['brace']],
106
+ ['\#\\{[^\\}]*(\\})', STYLES['brace']],
107
+ ['\#\\{([^\\}]*)\\}', STYLES['normal']],
105
108
  # Single-quoted string, possibly containing escape sequences
106
- ["'[^'\\\\]*(\\.[^'\\\\]*)*'", 0, STYLES['string']],
109
+ ["'[^'\\\\]*(?:\\.[^'\\\\]*)*'", STYLES['string']],
107
110
  # Back-tick string, possibly containing escape sequences
108
- ["`[^`\\\\]*(\\.[^`\\\\]*)*`", 0, STYLES['string']],
109
- # A single # possibly followed by matched quotes
110
- ['#(?=([^\'"]*(\'|")[^\'"]*(\'|"))*[^\'"]*$).*', 0, STYLES['comment']],
111
+ ["`[^`\\\\]*(\\.[^`\\\\]*)*`", STYLES['string']],
112
+ # Double quoted string | single quoted string | comment
113
+ # We don't want the first two but we want the last
114
+ ["\"[^\"]*\"|\'[^\']*\'|(#.*)", STYLES['comment']],
111
115
  ])
112
116
 
113
- # Build a QRegExp for each pattern
117
+ # Build a RegExp for each pattern
114
118
  RULES_INFO = []
115
- RULES.each do |pat, index, fmt|
116
- RULES_INFO << [Qt::RegExp.new(pat, Qt::CaseSensitive, Qt::RegExp::RegExp2), index, fmt]
119
+ RULES.each do |pat, fmt|
120
+ RULES_INFO << [Regexp.new(pat), fmt]
117
121
  end
118
122
 
119
123
  def highlightBlock(text)
120
124
  # Do other syntax formatting
121
- RULES_INFO.each do |expression, nth, format|
122
- index = expression.indexIn(text, 0)
123
- last_index = index
124
- last_length = -1
125
- while index >= 0
126
- # We actually want the index of the nth match
127
- index = expression.pos(nth)
128
- # Bail if the index goes negative because it means
129
- # we won't have a valid capture
130
- break if index < 0
131
- length = expression.cap(nth).length()
132
- break if length <= 0
133
- # Break if we're in an endless loop
134
- break if (last_index == index and last_length == length)
135
- last_length = length
136
- last_index = index
137
- self.setFormat(index, length, format)
138
- index = expression.indexIn(text, index + length)
125
+ RULES_INFO.each do |expression, format|
126
+ match = text.scan(expression).flatten.compact
127
+ next unless match && !match.empty?
128
+ i = 0 # initial string match offset
129
+ match.each do |part|
130
+ # Index the match part starting at the offset
131
+ index = text.index(part, i)
132
+ self.setFormat(index, part.length, format)
133
+ # Increment the index so we can match the same string
134
+ # in two different locations in the text, e.g. "#{x} #{y}"
135
+ i = index + part.length
139
136
  end
140
137
  end
141
138
  end
@@ -156,10 +153,10 @@ module Cosmos
156
153
  CHAR_57 = Qt::Char.new(57)
157
154
  BREAKPOINT_SET = 1
158
155
  BREAKPOINT_CLEAR = -1
156
+ MINIMUM_POINT_SIZE = 4
159
157
 
160
- def initialize(parent)
158
+ def initialize(parent, font = Cosmos.get_default_font)
161
159
  super(parent)
162
- font = Cosmos.get_default_font
163
160
  setFont(font)
164
161
  @fontMetrics = Cosmos.getFontMetrics(font)
165
162
 
@@ -180,6 +177,18 @@ module Cosmos
180
177
  line_count_changed(-1)
181
178
  end
182
179
 
180
+ def wheelEvent(event)
181
+ if event.modifiers() == Qt::ControlModifier && event.delta > 0
182
+ event.setAccepted(true)
183
+ zoom_in()
184
+ elsif event.modifiers() == Qt::ControlModifier && event.delta < 0
185
+ event.setAccepted(true)
186
+ zoom_out()
187
+ else
188
+ super(event)
189
+ end
190
+ end
191
+
183
192
  def dispose
184
193
  super()
185
194
  @syntax.dispose
@@ -288,6 +297,31 @@ module Cosmos
288
297
  cursor.endEditBlock
289
298
  end
290
299
 
300
+ def zoom_in
301
+ font = Cosmos.getFont(font().family, font().pointSize + 1)
302
+ setFont(font)
303
+ @fontMetrics = Cosmos.getFontMetrics(font)
304
+ emit font_changed(font)
305
+ end
306
+
307
+ def zoom_out
308
+ return if font().pointSize <= MINIMUM_POINT_SIZE
309
+ font = Cosmos.getFont(font().family, font().pointSize - 1)
310
+ setFont(font)
311
+ @fontMetrics = Cosmos.getFontMetrics(font)
312
+ emit font_changed(font)
313
+ end
314
+
315
+ def zoom_default
316
+ font = Cosmos.get_default_font
317
+ setFont(font)
318
+ @fontMetrics = Cosmos.getFontMetrics(font)
319
+ # Force a repaint of the number area by doing a small scroll
320
+ verticalScrollBar.setValue(verticalScrollBar.minimum+1)
321
+ verticalScrollBar.setValue(verticalScrollBar.minimum)
322
+ emit font_changed(font)
323
+ end
324
+
291
325
  def resizeEvent(e)
292
326
  super(e)
293
327
  cr = self.contentsRect()
@@ -302,6 +336,7 @@ module Cosmos
302
336
 
303
337
  def line_number_area_paint_event(event)
304
338
  painter = Qt::Painter.new(@lineNumberArea)
339
+ painter.setFont(font())
305
340
  # Check for weird bad initialization conditions
306
341
  if painter.isActive and not painter.paintEngine.nil?
307
342
  event_rect = event.rect()
@@ -397,14 +432,21 @@ module Cosmos
397
432
  end
398
433
 
399
434
  def line_at_point(point)
400
- line = point.y / @fontMetrics.height() + 1 +
401
- firstVisibleBlock().blockNumber()
402
- yield line if line <= document.blockCount()
435
+ block_num = firstVisibleBlock().blockNumber()
436
+ while block_num < document.blockCount()
437
+ block = document.findBlockByNumber(block_num)
438
+ top, bottom = block_top_and_bottom(block)
439
+ if (top..bottom).include?(point.y)
440
+ yield block_num + 1
441
+ break
442
+ end
443
+ block_num += 1
444
+ end
403
445
  end
404
446
 
405
447
  def create_add_breakpoint_action(point)
406
- action = Qt::Action.new(tr("Add Breakpoint"), self)
407
- action.statusTip = tr("Add a breakpoint at this line")
448
+ action = Qt::Action.new("Add Breakpoint", self)
449
+ action.statusTip = "Add a breakpoint at this line"
408
450
  action.connect(SIGNAL('triggered()')) do
409
451
  line_at_point(point) do |line|
410
452
  add_breakpoint(line)
@@ -415,8 +457,8 @@ module Cosmos
415
457
  end
416
458
 
417
459
  def create_clear_breakpoint_action(point)
418
- action = Qt::Action.new(tr("Clear Breakpoint"), self)
419
- action.statusTip = tr("Clear an existing breakpoint at this line")
460
+ action = Qt::Action.new("Clear Breakpoint", self)
461
+ action.statusTip = "Clear an existing breakpoint at this line"
420
462
  action.connect(SIGNAL('triggered()')) do
421
463
  line_at_point(point) do |line|
422
464
  clear_breakpoint(line)
@@ -427,8 +469,8 @@ module Cosmos
427
469
  end
428
470
 
429
471
  def create_clear_all_breakpoints_action
430
- action = Qt::Action.new(tr("Clear All Breakpoints"), self)
431
- action.statusTip = tr("Clear all existing breakpoints")
472
+ action = Qt::Action.new("Clear All Breakpoints", self)
473
+ action.statusTip = "Clear all existing breakpoints"
432
474
  action.connect(SIGNAL('triggered()')) do
433
475
  clear_breakpoints
434
476
  emit breakpoints_cleared