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
@@ -102,6 +102,7 @@ module Cosmos
102
102
  processed_text = ''
103
103
  processed_text << '*' * 80 << "\n"
104
104
  processed_text << "* #{packet.target_name} #{packet.packet_name}\n"
105
+ processed_text << "* Packet Time: #{packet.packet_time.formatted}\n" if packet.packet_time
105
106
  processed_text << "* Received Time: #{packet.received_time.formatted}\n" if packet.received_time
106
107
  processed_text << "* Received Count: #{packet.received_count}\n"
107
108
  processed_text << '*' * 80 << "\n"
@@ -12,19 +12,15 @@ require 'cosmos'
12
12
  require 'cosmos/tools/data_viewer/data_viewer_component'
13
13
 
14
14
  module Cosmos
15
-
16
- # DumpComponent class
17
- #
18
- # This class displays packets as raw hex values
19
- #
15
+ # Displays packets as raw hex values
20
16
  class DumpComponent < DataViewerComponent
21
-
22
17
  # Processes the given packet. No gui interaction should be done in this
23
18
  # method. Override this method for other components.
24
19
  def process_packet (packet)
25
20
  processed_text = ''
26
21
  processed_text << '*' * 80 << "\n"
27
22
  processed_text << "* #{packet.target_name} #{packet.packet_name}\n"
23
+ processed_text << "* Packet Time: #{packet.packet_time.formatted}\n" if packet.packet_time
28
24
  processed_text << "* Received Time: #{packet.received_time.formatted}\n" if packet.received_time
29
25
  processed_text << "* Received Count: #{packet.received_count}\n"
30
26
  processed_text << '*' * 80 << "\n"
@@ -34,7 +30,5 @@ module Cosmos
34
30
  @processed_queue << processed_text
35
31
  end
36
32
  end
37
-
38
33
  end
39
-
40
- end # module Cosmos
34
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ require 'cosmos/tools/data_viewer/data_viewer_component'
13
+
14
+ module Cosmos
15
+ # Displays strings from a telemetry item. To use this in a script
16
+ # you can call with inject_tlm("TGT", "PKT", "ITEM": "<R>Error text")
17
+ # or pass a color with inject_tlm("TGT", "PKT", "ITEM": "<grey>Error text")
18
+ # The color is in brackets and can be B, G, Y, R for COSMOS blue, green
19
+ # yellow and red or simply a color name recognized by Qt.
20
+ class TextComponent < DataViewerComponent
21
+ # @param parent [Qt::Widget] Parent widget
22
+ # @param tab_name [String] Name of the tab which displays this widget
23
+ # @param item_name [String] Name of the item to read from the packet
24
+ def initialize(parent, tab_name, item_name)
25
+ super(parent, tab_name)
26
+ @item_name = item_name
27
+ end
28
+
29
+ # Override the update_gui to display the text
30
+ def update_gui
31
+ begin
32
+ loop do
33
+ latest = @processed_queue.pop(true)
34
+ # Check for optional formatted date followed by COSMOS color <G>,<Y>,<R>,<B>
35
+ # Regex notes:
36
+ # ?: makes the optional date a non-matching group
37
+ # The \d+ after the dot matches subseconds which is followed by a space.
38
+ # The whole date match is optional if there is no packet.received_time.
39
+ # The matching group surrounds the GYRB single character set.
40
+ if match = latest.match(/^(?:\d{4}\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+ )?<([GYRB])>/)
41
+ case match.captures[0]
42
+ when 'G'
43
+ color = Cosmos::GREEN
44
+ when 'Y'
45
+ color = Cosmos::YELLOW
46
+ when 'R'
47
+ color = Cosmos::RED
48
+ when 'B'
49
+ color = Cosmos::BLUE
50
+ end
51
+ @text.appendText(latest.sub(/<.*?>/,''), color)
52
+ # Check for optional formatted date followed by color name
53
+ # See Regex notes above for more information. Note that the .*? makes the match
54
+ # inside the parens non greedy so it matches the first close bracket '>'
55
+ elsif match = latest.match(/^(?:\d{4}\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+ )?<(.*?)>/)
56
+ @text.appendText(latest.sub(/<.*?>/,''), Cosmos.getColor(match.captures[0]))
57
+ else # add black text
58
+ @text.appendText(latest)
59
+ end
60
+ end
61
+ rescue ThreadError
62
+ # Nothing to do
63
+ end
64
+ end
65
+
66
+ # Add the time and the item to the queue
67
+ def process_packet(packet)
68
+ processed_text = ''
69
+ processed_text << "#{packet.received_time.formatted} " if packet.received_time
70
+ processed_text << packet.read(@item_name)
71
+ # Ensure that queue does not grow infinitely while paused
72
+ if @processed_queue.length < 1000
73
+ @processed_queue << processed_text
74
+ end
75
+ end
76
+ end
77
+ end
@@ -17,12 +17,10 @@ Cosmos.catch_fatal_exception do
17
17
  end
18
18
 
19
19
  module Cosmos
20
-
21
20
  # Creates command and telemetry handbooks from the COSMOS definitions in
22
21
  # both HTML and PDF format.
23
22
  class HandbookCreator < QtTool
24
-
25
- def initialize (options)
23
+ def initialize(options)
26
24
  super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
27
25
  Cosmos.load_cosmos_icon("handbook_creator.png")
28
26
 
@@ -40,52 +38,35 @@ module Cosmos
40
38
  end
41
39
  end
42
40
 
41
+ # Create the application menu actions
43
42
  def initialize_actions
44
43
  super()
45
- @hide_ignored_action = Qt::Action.new(tr('&Hide Ignored Items'), self)
46
- @hide_ignored_keyseq = Qt::KeySequence.new(tr('Ctrl+H'))
44
+ @hide_ignored_action = Qt::Action.new('&Hide Ignored Items', self)
45
+ @hide_ignored_keyseq = Qt::KeySequence.new('Ctrl+H')
47
46
  @hide_ignored_action.shortcut = @hide_ignored_keyseq
48
- @hide_ignored_action.statusTip = tr('Do not include ignored items in command and telemetry handbooks')
47
+ @hide_ignored_action.statusTip = 'Do not include ignored items in command and telemetry handbooks'
49
48
  @hide_ignored_action.setCheckable(true)
50
49
  @hide_ignored_action.setChecked(false)
50
+
51
+ @copy_assets_action = Qt::Action.new('&Copy Assets to Output', self)
52
+ @copy_assets_action.statusTip = 'Copy the default assets to the output directory'
53
+ @copy_assets_action.connect(SIGNAL('triggered()')) { copy_assets(true) }
51
54
  end
52
55
 
56
+ # Create the application menus and add the actions to the menu
53
57
  def initialize_menus
54
- # File Menu
55
- @file_menu = menuBar.addMenu(tr('&File'))
58
+ @file_menu = menuBar.addMenu('&File')
56
59
  @file_menu.addAction(@hide_ignored_action)
60
+ @file_menu.addAction(@copy_assets_action)
57
61
  @file_menu.addAction(@exit_action)
58
62
 
59
- # Help Menu
60
63
  @about_string = "Handbook Creator creates Command and Telemetry Handbooks"
61
64
  initialize_help_menu()
62
65
  end
63
66
 
64
- def create_pdfs(both, hide_ignored)
65
- success = false
66
- ProgressDialog.execute(self, 'PDF Creation Progress', 700, 600, true, false, true, true, false) do |progress_dialog|
67
- begin
68
- success = @config.create_pdf(hide_ignored, progress_dialog)
69
- if success
70
- msg = "\n\n"
71
- msg << "HTML and " if both
72
- msg << "PDF Handbooks created successfully"
73
- progress_dialog.append_text(msg)
74
- else
75
- progress_dialog.append_text("\nPDF Handbooks could not be created.\n\nIs wkhtmltopdf in your PATH and are all existing pdfs closed?\n\nUsing version 0.11.0_rc1 of wkhtmltox is recommended which can be found at: http://download.gna.org/wkhtmltopdf/obsolete/\n\nVersion 0.12.x has shown issues with Handbook Creator's default templates.")
76
- end
77
- rescue => error
78
- progress_dialog.append_text("\n\nError processing:\n#{error.formatted}")
79
- ensure
80
- progress_dialog.complete
81
- end
82
- end
83
- rescue Exception => err
84
- Cosmos.handle_critical_exception(err)
85
- end
86
-
67
+ # Create the application with several buttons to create handbooks (HTML & PDF)
68
+ # and open the generated HTML output in a browser.
87
69
  def initialize_central_widget
88
- # Create the central widget
89
70
  @central_widget = Qt::Widget.new
90
71
  setCentralWidget(@central_widget)
91
72
 
@@ -95,6 +76,7 @@ module Cosmos
95
76
  @html_button.setStyleSheet("text-align:left")
96
77
  @html_button.connect(SIGNAL('clicked()')) do
97
78
  begin
79
+ copy_assets()
98
80
  @config.create_html(@hide_ignored_action.isChecked)
99
81
  Qt::MessageBox.information(self, 'Done', 'HTML Handbooks created successfully')
100
82
  rescue Exception => err
@@ -106,6 +88,7 @@ module Cosmos
106
88
  @pdf_button = Qt::PushButton.new(Cosmos.get_icon('pdf-32.png'), 'Create PDF Handbooks')
107
89
  @pdf_button.setStyleSheet("text-align:left")
108
90
  @pdf_button.connect(SIGNAL('clicked()')) do
91
+ copy_assets()
109
92
  create_pdfs(false, @hide_ignored_action.isChecked)
110
93
  end
111
94
  @top_layout.addWidget(@pdf_button)
@@ -114,6 +97,7 @@ module Cosmos
114
97
  @html_pdf_button.setStyleSheet("text-align:left")
115
98
  @html_pdf_button.connect(SIGNAL('clicked()')) do
116
99
  begin
100
+ copy_assets()
117
101
  @config.create_html(@hide_ignored_action.isChecked)
118
102
  create_pdfs(true, @hide_ignored_action.isChecked)
119
103
  rescue Exception => err
@@ -136,21 +120,63 @@ module Cosmos
136
120
  @central_widget.setLayout(@top_layout)
137
121
  end
138
122
 
139
- # Runs the application
123
+ # Copy the assets (css, fonts, images, javascript) from the project config directory
124
+ # into the outputs/handbooks directory. When called as a part of generating the output
125
+ # files this copy will not occur if the assets directory already exists in case it has
126
+ # been modified by the user. This is also called from a menu option which can copy over
127
+ # existing output assets if permitted by the user.
128
+ def copy_assets(menu_request = false)
129
+ source_path = File.join(::Cosmos::USERPATH,'config','tools','handbook_creator','assets')
130
+ output_path = File.join(System.paths['HANDBOOKS'], 'assets')
131
+ if menu_request
132
+ if File.exist?(output_path)
133
+ if Qt::MessageBox.warning(self, "Warning!", "#{output_path} already exists. Overwrite?",
134
+ Qt::MessageBox::Yes | Qt::MessageBox::No) == Qt::MessageBox::No
135
+ return
136
+ else
137
+ FileUtils.cp_r(source_path, System.paths['HANDBOOKS'])
138
+ end
139
+ else
140
+ FileUtils.cp_r(source_path, System.paths['HANDBOOKS'])
141
+ end
142
+ else
143
+ FileUtils.cp_r(source_path, System.paths['HANDBOOKS']) unless File.exist?(output_path)
144
+ end
145
+ end
146
+
147
+ # Create the PDFs inside a progress dialog as this action takes a significant amount of time
148
+ def create_pdfs(both, hide_ignored)
149
+ success = false
150
+ ProgressDialog.execute(self, 'PDF Creation Progress', 700, 600, true, false, true, true, false) do |progress_dialog|
151
+ begin
152
+ success = @config.create_pdf(hide_ignored, progress_dialog)
153
+ if success
154
+ msg = "\n\n"
155
+ msg << "HTML and " if both
156
+ msg << "PDF Handbooks created successfully"
157
+ progress_dialog.append_text(msg)
158
+ else
159
+ progress_dialog.append_text("\nPDF Handbooks could not be created.\n\nIs wkhtmltopdf in your PATH and are all existing pdfs closed?\n\nwkhtmltopdf can be found at: https://wkhtmltopdf.org/downloads.html.")
160
+ end
161
+ rescue => error
162
+ progress_dialog.append_text("\n\nError processing:\n#{error.formatted}")
163
+ ensure
164
+ progress_dialog.complete
165
+ end
166
+ end
167
+ rescue Exception => err
168
+ Cosmos.handle_critical_exception(err)
169
+ end
170
+
140
171
  def self.run(option_parser = nil, options = nil)
141
172
  Cosmos.catch_fatal_exception do
142
173
  unless option_parser and options
143
174
  option_parser, options = create_default_options()
144
175
  options.title = "Handbook Creator"
145
- options.config_file = File.join(Cosmos::USERPATH, 'config', 'tools', 'handbook_creator', 'handbook_creator.txt')
146
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
147
- options.config_file = File.join(Cosmos::USERPATH, 'config', 'tools', 'handbook_creator', arg)
148
- end
176
+ options.config_file = true # config_file is required
149
177
  end
150
178
  super(option_parser, options)
151
179
  end
152
180
  end
153
-
154
- end # class HandbookCreator
155
-
156
- end # module Cosmos
181
+ end
182
+ end
@@ -115,7 +115,7 @@ module Cosmos
115
115
  cover, cover_file = make_pdf_detail('cover', @pdf_cover_filename, @pdf_cover_title, target_name)
116
116
  header, header_file = make_pdf_detail('--header-spacing 3 --header-html', @pdf_header_filename, @pdf_header_title, target_name)
117
117
  footer, footer_file = make_pdf_detail('--footer-spacing 3 --footer-html', @pdf_footer_filename, @pdf_footer_title, target_name)
118
- system_call = "wkhtmltopdf -L #{@pdf_side_margin} -R #{@pdf_side_margin} -T #{@pdf_top_margin} -B #{@pdf_bottom_margin} -s Letter #{header} #{footer} #{cover} #{@pdf_toc} \"#{tmp_html_file.path}\" \"#{File.dirname(filename)}/#{File.basename(filename, '.*')}.pdf\""
118
+ system_call = "wkhtmltopdf --enable-local-file-access -L #{@pdf_side_margin} -R #{@pdf_side_margin} -T #{@pdf_top_margin} -B #{@pdf_bottom_margin} -s Letter #{header} #{footer} #{cover} #{@pdf_toc} \"#{tmp_html_file.path}\" \"#{File.dirname(filename)}/#{File.basename(filename, '.*')}.pdf\""
119
119
  status = nil
120
120
  begin
121
121
  Cosmos.set_working_dir(System.paths['HANDBOOKS']) do
@@ -40,7 +40,7 @@ module Cosmos
40
40
  end
41
41
 
42
42
  def initialize_menus
43
- @file_menu = menuBar().addMenu(tr('&File'))
43
+ @file_menu = menuBar().addMenu('&File')
44
44
  @file_menu.addAction(@exit_action)
45
45
  initialize_help_menu()
46
46
  end
@@ -181,6 +181,7 @@ module Cosmos
181
181
  unless option_parser and options
182
182
  option_parser, options = create_default_options()
183
183
  options.title = 'Launcher'
184
+ options.config_file = true # config_file is required
184
185
  end
185
186
  option_parser.separator "Launcher Specific Options:"
186
187
  option_parser.on("-m", "--mini", "Create mini launcher") do |arg|
@@ -84,11 +84,13 @@ module Cosmos
84
84
  # @param update_item_callback [Proc] Method to update an item in the GUI
85
85
  # @param clear_items_callback [Proc] Method to clear all items in the GUI
86
86
  # @param remove_item_callback [Proc] Method to remove an item from the GUI
87
- def initialize(new_item_callback, update_item_callback, clear_items_callback, remove_item_callback)
87
+ # @param clear_log_callback [Proc] Method to clear the log tab in the GUI
88
+ def initialize(new_item_callback, update_item_callback, clear_items_callback, remove_item_callback, clear_log_callback)
88
89
  @new_item_callback = new_item_callback
89
90
  @update_item_callback = update_item_callback
90
91
  @clear_items_callback = clear_items_callback
91
92
  @remove_item_callback = remove_item_callback
93
+ @clear_log_callback = clear_log_callback
92
94
  @ignored = []
93
95
  @ignored_stale = []
94
96
  @items = {}
@@ -98,15 +100,21 @@ module Cosmos
98
100
  @limits_set = :DEFAULT
99
101
  @colorblind = false
100
102
  @monitor_operational = true
103
+ @toggle_mode = false
101
104
  request_reset()
102
105
  end
103
106
 
104
107
  # Request that the limits items be refreshed from the server
105
- def request_reset(toggle_mode = false)
106
- @toggle_mode = toggle_mode
108
+ def request_reset
107
109
  @initialized = false
108
110
  end
109
111
 
112
+ # Switch between realtime and replay modes
113
+ def toggle_mode
114
+ @toggle_mode = true
115
+ request_reset()
116
+ end
117
+
110
118
  # Remove an item and optionally ignore it which means don't display it
111
119
  # again if it goes out of limits and don't have it count towards the
112
120
  # overall limit state. Still display its limits transitions in the log.
@@ -219,8 +227,8 @@ module Cosmos
219
227
 
220
228
  case type
221
229
  when :LIMITS_CHANGE
222
- # The most common event: target, packet, item, state
223
- result = limits_change(data[0], data[1], data[2], data[4])
230
+ # The most common event: target, packet, item, state, packet_time
231
+ result = limits_change(data[0], data[1], data[2], data[4], data[5])
224
232
 
225
233
  when :LIMITS_SET
226
234
  # Check if the overall limits set changed. If so we need to reset
@@ -350,12 +358,16 @@ module Cosmos
350
358
  @items = {}
351
359
  @out_of_limits = []
352
360
  @stale = []
353
- @limits_set = get_limits_set()
354
361
  unsubscribe_limits_events(@queue_id) if @queue_id
355
- set_replay_mode(!get_replay_mode()) if @toggle_mode
356
- @toggle_mode = false
357
- @queue_id = subscribe_limits_events(100000)
362
+ if @toggle_mode
363
+ set_replay_mode(!get_replay_mode())
364
+ @clear_log_callback.call
365
+ @toggle_mode = false
366
+ end
358
367
  @clear_items_callback.call
368
+
369
+ @limits_set = get_limits_set()
370
+ @queue_id = subscribe_limits_events(100000)
359
371
  get_out_of_limits().each do |target, packet, item, state|
360
372
  limits_change(target, packet, item, state)
361
373
  end
@@ -368,7 +380,7 @@ module Cosmos
368
380
 
369
381
  # Process a limits_change event by recoloring out of limits events
370
382
  # and creating a log message.
371
- def limits_change(target_name, packet_name, item_name, state)
383
+ def limits_change(target_name, packet_name, item_name, state, packet_time = nil)
372
384
  message = ''
373
385
  color = :BLACK
374
386
  item = [target_name, packet_name, item_name]
@@ -392,9 +404,13 @@ module Cosmos
392
404
  when :BLUE
393
405
  message << "INFO: "
394
406
  color = :BLUE
407
+ when nil
408
+ return nil
395
409
  end
396
410
  value = tlm(target_name, packet_name, item_name)
397
- message << "#{target_name} #{packet_name} #{item_name} = #{value} is #{state}\n"
411
+ packet_time_str = ""
412
+ packet_time_str = " (#{packet_time.sys.formatted})" if packet_time
413
+ message << "#{target_name} #{packet_name} #{item_name} = #{value} is #{state}#{packet_time_str}\n"
398
414
  [message, color]
399
415
  end
400
416
 
@@ -530,12 +546,12 @@ module Cosmos
530
546
  initialize_central_widget()
531
547
  complete_initialize()
532
548
 
533
- @limits_items = LimitsItems.new(
534
- method(:new_gui_item), method(:update_gui_item), method(:clear_gui_items), method(:remove_gui_item))
549
+ @limits_items = LimitsItems.new(method(:new_gui_item), method(:update_gui_item), \
550
+ method(:clear_gui_items), method(:remove_gui_item), method(:clear_log))
535
551
  if options.config_file
536
552
  begin
537
553
  result = @limits_items.open_config(options.config_file)
538
- statusBar.showMessage(tr(result))
554
+ statusBar.showMessage(result)
539
555
  rescue => error
540
556
  ExceptionDialog.new(self, error, "Error parsing #{@options.config_file}")
541
557
  end
@@ -543,50 +559,51 @@ module Cosmos
543
559
 
544
560
  limits_thread()
545
561
  value_thread()
562
+ toggle_replay_mode() if options.replay
546
563
  end
547
564
 
548
565
  # Initialize all the actions in the application Menu
549
566
  def initialize_actions
550
567
  super
551
568
 
552
- @options_action = Qt::Action.new(tr('O&ptions'), self)
553
- @options_action.statusTip = tr('Open the options dialog')
569
+ @options_action = Qt::Action.new('O&ptions', self)
570
+ @options_action.statusTip = 'Open the options dialog'
554
571
  @options_action.connect(SIGNAL('triggered()')) { show_options_dialog() }
555
572
 
556
- @reset_action = Qt::Action.new(tr('&Reset'), self)
557
- @reset_action_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
573
+ @reset_action = Qt::Action.new('&Reset', self)
574
+ @reset_action_keyseq = Qt::KeySequence.new('Ctrl+R')
558
575
  @reset_action.shortcut = @reset_action_keyseq
559
- @reset_action.statusTip = tr('Reset connection and clear all items. This does not modify the ignored items.')
576
+ @reset_action.statusTip = 'Reset connection and clear all items. This does not modify the ignored items.'
560
577
  @reset_action.connect(SIGNAL('triggered()')) { @limits_items.request_reset() }
561
578
 
562
- @replay_action = Qt::Action.new(tr('Toggle Replay Mode'), self)
563
- @replay_action.statusTip = tr('Toggle Replay Mode')
579
+ @replay_action = Qt::Action.new('Toggle Replay Mode', self)
580
+ @replay_action.statusTip = 'Toggle Replay Mode'
564
581
  @replay_action.connect(SIGNAL('triggered()')) { toggle_replay_mode() }
565
582
 
566
583
  @open_ignored_action = Qt::Action.new(Cosmos.get_icon('open.png'),
567
- tr('&Open Config'), self)
568
- @open_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
584
+ '&Open Config', self)
585
+ @open_ignored_action_keyseq = Qt::KeySequence.new('Ctrl+O')
569
586
  @open_ignored_action.shortcut = @open_ignored_action_keyseq
570
- @open_ignored_action.statusTip = tr('Open ignored telemetry items configuration file')
587
+ @open_ignored_action.statusTip = 'Open ignored telemetry items configuration file'
571
588
  @open_ignored_action.connect(SIGNAL('triggered()')) { open_config_file() }
572
589
 
573
590
  @save_ignored_action = Qt::Action.new(Cosmos.get_icon('save.png'),
574
- tr('&Save Config'), self)
575
- @save_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
591
+ '&Save Config', self)
592
+ @save_ignored_action_keyseq = Qt::KeySequence.new('Ctrl+S')
576
593
  @save_ignored_action.shortcut = @save_ignored_action_keyseq
577
- @save_ignored_action.statusTip = tr('Save all ignored telemetry items in a configuration file')
594
+ @save_ignored_action.statusTip = 'Save all ignored telemetry items in a configuration file'
578
595
  @save_ignored_action.connect(SIGNAL('triggered()')) { save_config_file() }
579
596
 
580
- @edit_ignored_action = Qt::Action.new(tr('&Edit Ignored'), self)
581
- @edit_ignored_action_keyseq = Qt::KeySequence.new(tr('Ctrl+E'))
597
+ @edit_ignored_action = Qt::Action.new('&Edit Ignored', self)
598
+ @edit_ignored_action_keyseq = Qt::KeySequence.new('Ctrl+E')
582
599
  @edit_ignored_action.shortcut = @edit_ignored_action_keyseq
583
- @edit_ignored_action.statusTip = tr('Edit the ignored telemetry items list')
600
+ @edit_ignored_action.statusTip = 'Edit the ignored telemetry items list'
584
601
  @edit_ignored_action.connect(SIGNAL('triggered()')) { edit_ignored_items() }
585
602
  end
586
603
 
587
604
  # Initialize the application menu bar options
588
605
  def initialize_menus
589
- @file_menu = menuBar.addMenu(tr('&File'))
606
+ @file_menu = menuBar.addMenu('&File')
590
607
  @file_menu.addAction(@open_ignored_action)
591
608
  @file_menu.addAction(@save_ignored_action)
592
609
  @file_menu.addAction(@edit_ignored_action)
@@ -606,7 +623,6 @@ module Cosmos
606
623
  # Layout the main GUI tab widget with a view of all the out of limits items
607
624
  # in one tab and a log tab showing all limits events.
608
625
  def initialize_central_widget
609
-
610
626
  widget = Qt::Widget.new
611
627
  layout = Qt::VBoxLayout.new(widget)
612
628
  setCentralWidget(widget)
@@ -703,7 +719,7 @@ module Cosmos
703
719
  end
704
720
 
705
721
  def toggle_replay_mode
706
- @limits_items.request_reset(true)
722
+ @limits_items.toggle_mode()
707
723
  end
708
724
 
709
725
  # @return [String] Fully qualified path to the configuration file
@@ -720,7 +736,7 @@ module Cosmos
720
736
  "Open Configuration File", default_config_path())
721
737
  unless filename.nil? || filename.empty?
722
738
  result = @limits_items.open_config(filename)
723
- statusBar.showMessage(tr(result))
739
+ statusBar.showMessage(result)
724
740
  end
725
741
  end
726
742
 
@@ -730,7 +746,7 @@ module Cosmos
730
746
  'Save As...', default_config_path(), 'Configuration Files (*.txt)')
731
747
  unless filename.nil? || filename.empty?
732
748
  result = @limits_items.save_config(filename)
733
- statusBar.showMessage(tr(result))
749
+ statusBar.showMessage(result)
734
750
  @filename = filename
735
751
  end
736
752
  end
@@ -811,9 +827,7 @@ module Cosmos
811
827
  @limits_thread = Thread.new do
812
828
  while true
813
829
  break if @cancel_thread
814
- Qt.execute_in_main_thread(true) do
815
- result, color = @limits_items.process_events()
816
- end
830
+ result, color = @limits_items.process_events()
817
831
  if result
818
832
  update_log(result, color)
819
833
  else
@@ -873,6 +887,10 @@ module Cosmos
873
887
  end
874
888
  end
875
889
 
890
+ def clear_log
891
+ Qt.execute_in_main_thread(true) { @log_output.clear() }
892
+ end
893
+
876
894
  # Remove a limits item from the list and optionally ignore
877
895
  #
878
896
  # @param widget [Qt::Widget] Widget to remove
@@ -995,12 +1013,12 @@ module Cosmos
995
1013
  options.remember_geometry = false
996
1014
  options.title = "Limits Monitor"
997
1015
  options.auto_size = false
998
- options.config_file = nil
999
1016
  options.production = false
1000
1017
  options.no_prompt = false
1001
1018
  option_parser.separator "Limits Monitor Specific Options:"
1002
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
1003
- options.config_file = arg
1019
+ options.replay = false
1020
+ option_parser.on("--replay", "Start Limits Monitor in Replay mode") do
1021
+ options.replay = true
1004
1022
  end
1005
1023
  end
1006
1024