cosmos 4.2.4 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (458) hide show
  1. checksums.yaml +5 -5
  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 +154 -64
  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