cosmos 4.3.0-java → 4.4.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 (288) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
  5. data/.gitignore +1 -0
  6. data/.travis.yml +5 -5
  7. data/Manifest.txt +81 -44
  8. data/Rakefile +9 -0
  9. data/appveyor.yml +2 -1
  10. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  11. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  12. data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
  13. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  14. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  15. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  16. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  17. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  18. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  19. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  20. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  21. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  22. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  23. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
  24. data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
  25. data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
  26. data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
  27. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  28. data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
  29. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  30. data/autohotkey/tools/limits_monitor.ahk +1 -1
  31. data/autohotkey/tools/packet_viewer.ahk +1 -1
  32. data/autohotkey/tools/script_runner.ahk +16 -4
  33. data/bin/cosmos +1 -1
  34. data/bin/xtce_converter +1 -1
  35. data/cosmos.gemspec +5 -7
  36. data/data/config/_interfaces.yaml +4 -0
  37. data/data/config/cmd_sequence.yaml +14 -0
  38. data/data/config/housekeeping_params.yaml +14 -0
  39. data/data/config/interface_modifiers.yaml +11 -0
  40. data/data/config/item_modifiers.yaml +2 -1
  41. data/data/config/launcher.yaml +12 -2
  42. data/data/config/param_item_modifiers.yaml +2 -2
  43. data/data/config/parameter_modifiers.yaml +20 -0
  44. data/data/config/screen.yaml +2 -0
  45. data/data/config/script_runner.yaml +9 -0
  46. data/data/config/system.yaml +47 -10
  47. data/data/config/table_manager.yaml +7 -0
  48. data/data/config/target.yaml +12 -0
  49. data/data/config/telemetry_modifiers.yaml +3 -1
  50. data/data/config/test_runner.yaml +10 -9
  51. data/data/config/widgets.yaml +174 -11
  52. data/data/crc.txt +128 -125
  53. data/demo/Gemfile +1 -1
  54. data/demo/Launcher.bat +1 -9
  55. data/demo/Launcher2.bat +1 -0
  56. data/demo/LauncherMini.bat +1 -0
  57. data/demo/config/data/crc.txt +40 -20
  58. data/demo/config/system/system.txt +1 -1
  59. data/demo/config/system/system_alt_ports.txt +1 -1
  60. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
  61. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +2 -1
  62. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +7 -7
  63. data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
  64. data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
  65. data/demo/config/targets/INST/screens/adcs.txt +2 -2
  66. data/demo/config/targets/INST/screens/block.txt +1 -1
  67. data/demo/config/targets/INST/screens/commanding.txt +1 -1
  68. data/demo/config/targets/INST/screens/ground.txt +27 -5
  69. data/demo/config/targets/INST/screens/ground_error.gif +0 -0
  70. data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
  71. data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
  72. data/demo/config/targets/INST/screens/limits.txt +69 -31
  73. data/demo/config/targets/INST/screens/other.txt +13 -3
  74. data/demo/config/targets/INST/screens/params.txt +54 -0
  75. data/demo/config/targets/INST/screens/satellite.gif +0 -0
  76. data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
  77. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  78. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  79. data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  80. data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  81. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  82. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  83. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  84. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  85. data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  86. data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  87. data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  88. data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  89. data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  90. data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  91. data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  92. data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  93. data/demo/config/tools/script_runner/script_runner.txt +1 -2
  94. data/demo/config/tools/test_runner/test_runner.txt +3 -1
  95. data/demo/lib/example_background_task.rb +1 -0
  96. data/demo/procedures/cosmos_api_test.rb +1 -1
  97. data/demo/procedures/interactive.rb +22 -0
  98. data/ext/cosmos/ext/packet/packet.c +0 -77
  99. data/install/Gemfile +1 -1
  100. data/install/Launcher.bat +1 -9
  101. data/install/config/data/crc.txt +17 -1
  102. data/install/config/system/system.txt +1 -1
  103. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  104. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  105. data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  106. data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  107. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  108. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  109. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  110. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  111. data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  112. data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  113. data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  114. data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  115. data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  116. data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  117. data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  118. data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  119. data/lib/cosmos/config/config_parser.rb +4 -5
  120. data/lib/cosmos/dart/lib/dart_common.rb +1 -1
  121. data/lib/cosmos/gui/dialogs/details_dialog.rb +16 -1
  122. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -0
  123. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
  124. data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
  125. data/lib/cosmos/gui/qt.rb +3 -1
  126. data/lib/cosmos/gui/qt_tool.rb +46 -23
  127. data/lib/cosmos/gui/text/ruby_editor.rb +44 -41
  128. data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
  129. data/lib/cosmos/gui/utilities/script_module_gui.rb +92 -92
  130. data/lib/cosmos/interfaces.rb +1 -0
  131. data/lib/cosmos/interfaces/interface.rb +5 -1
  132. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
  133. data/lib/cosmos/interfaces/protocols/template_protocol.rb +6 -1
  134. data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
  135. data/lib/cosmos/io/json_drb.rb +11 -7
  136. data/lib/cosmos/packets/commands.rb +28 -11
  137. data/lib/cosmos/packets/packet.rb +69 -32
  138. data/lib/cosmos/packets/packet_config.rb +34 -1
  139. data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
  140. data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
  141. data/lib/cosmos/packets/parsers/xtce_parser.rb +4 -3
  142. data/lib/cosmos/packets/structure.rb +4 -2
  143. data/lib/cosmos/packets/telemetry.rb +19 -3
  144. data/lib/cosmos/script/api_shared.rb +12 -9
  145. data/lib/cosmos/script/scripting.rb +16 -14
  146. data/lib/cosmos/system/system.rb +39 -20
  147. data/lib/cosmos/system/target.rb +39 -9
  148. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +94 -35
  149. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +3 -0
  150. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +1 -1
  151. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
  152. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +30 -4
  153. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +1 -0
  154. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +9 -12
  155. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +5 -2
  156. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
  157. data/lib/cosmos/tools/config_editor/config_editor.rb +80 -24
  158. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +2 -0
  159. data/lib/cosmos/tools/data_viewer/data_viewer.rb +15 -9
  160. data/lib/cosmos/tools/data_viewer/dump_component.rb +2 -9
  161. data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
  162. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +64 -38
  163. data/lib/cosmos/tools/launcher/launcher.rb +1 -0
  164. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -17
  165. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +8 -6
  166. data/lib/cosmos/tools/script_runner/script_runner.rb +87 -29
  167. data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
  168. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +41 -7
  169. data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
  170. data/lib/cosmos/tools/table_manager/table_manager.rb +6 -3
  171. data/lib/cosmos/tools/test_runner/test_runner.rb +14 -9
  172. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +21 -9
  173. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
  174. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
  175. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +11 -8
  176. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +9 -15
  177. data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -1
  178. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +19 -13
  179. data/lib/cosmos/tools/tlm_viewer/widgets.rb +2 -0
  180. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
  181. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
  182. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
  183. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
  184. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
  185. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
  186. data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +1 -1
  187. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
  188. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
  189. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
  190. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
  191. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
  192. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
  193. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
  194. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
  195. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
  196. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
  197. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
  198. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
  199. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
  200. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
  201. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
  202. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
  203. data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
  204. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
  205. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
  206. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
  207. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
  208. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
  209. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
  210. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
  211. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
  212. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
  213. data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
  214. data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
  215. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
  216. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
  217. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
  218. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
  219. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
  220. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
  221. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
  222. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
  223. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
  224. data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
  225. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
  226. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
  227. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
  228. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
  229. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
  230. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
  231. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
  232. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
  233. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +2 -7
  234. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
  235. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
  236. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
  237. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
  238. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
  239. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
  240. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
  241. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
  242. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
  243. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
  244. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +54 -46
  245. data/lib/cosmos/top_level.rb +23 -12
  246. data/lib/cosmos/version.rb +4 -4
  247. data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
  248. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  249. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  250. data/spec/install/yaml_docs_spec.rb +112 -0
  251. data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
  252. data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
  253. data/spec/packets/commands_spec.rb +22 -0
  254. data/spec/packets/packet_config_spec.rb +24 -0
  255. data/spec/packets/packet_item_spec.rb +2 -2
  256. data/spec/packets/packet_spec.rb +39 -6
  257. data/spec/packets/parsers/state_parser_spec.rb +33 -11
  258. data/spec/packets/structure_spec.rb +41 -0
  259. data/spec/packets/telemetry_spec.rb +23 -0
  260. data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
  261. data/spec/system/system_spec.rb +77 -2
  262. data/spec/system/target_spec.rb +62 -1
  263. data/spec/tools/cmd_tlm_server/api_spec.rb +1 -1
  264. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
  265. data/spec/top_level/top_level_spec.rb +29 -5
  266. data/tasks/gemfile_stats.rake +28 -14
  267. data/test/performance/config/system/system.txt +0 -0
  268. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
  269. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  270. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  271. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  272. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  273. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  274. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  275. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  276. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  277. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  278. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  279. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  280. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  281. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  282. data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  283. data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  284. data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  285. data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
  286. data/test/performance/procedures/cosmos_api_test.rb +1 -1
  287. data/test/performance/tools/identify_performance.rb +82 -0
  288. metadata +92 -55
@@ -33,6 +33,7 @@ module Cosmos
33
33
 
34
34
  UNTITLED = 'Untitled'
35
35
  UNTITLED_TAB_TEXT = " #{UNTITLED} "
36
+ MAX_RECENT_FILES = 20
36
37
  # Mapping of the human readable configuration name to an array containing the
37
38
  # yaml file name and typical location of the configuration file
38
39
  CONFIGURATION_FILES = {
@@ -47,6 +48,8 @@ module Cosmos
47
48
  "Screen Definition" =>
48
49
  ["screen", "/config/targets/TARGET/screens/*.txt"],
49
50
  "Separator" => [nil, nil],
51
+ "Command Sequence Configuration" =>
52
+ ["cmd_sequence", "/config/tools/cmd_sequence/cmd_sequence.txt"],
50
53
  "Data Viewer Configuration" =>
51
54
  ["data_viewer", "/config/tools/data_viewer/data_viewer.txt"],
52
55
  "Handbook Creator Configuration" =>
@@ -100,13 +103,17 @@ module Cosmos
100
103
  @file_new.statusTip = 'Start a new file'
101
104
  @file_new.connect(SIGNAL('triggered()')) { file_new() }
102
105
 
106
+ @clear_file_open_recent = Qt::Action.new('&Clear Recent', self)
107
+ @clear_file_open_recent.statusTip = 'Clear the recently opened file list'
108
+ @clear_file_open_recent.connect(SIGNAL('triggered()')) { clear_file_open_recent() }
109
+
103
110
  @file_close = Qt::Action.new('&Close', self)
104
111
  @file_close_keyseq = Qt::KeySequence.new('Ctrl+W')
105
112
  @file_close.shortcut = @file_close_keyseq
106
113
  @file_close.statusTip = 'Close the file'
107
114
  @file_close.connect(SIGNAL('triggered()')) { file_close() }
108
115
 
109
- @file_reload = Qt::Action.new('&Reload', self)
116
+ @file_reload = Qt::Action.new('Re&load', self)
110
117
  @file_reload_keyseq = Qt::KeySequence.new('Ctrl+R')
111
118
  @file_reload.shortcut = @file_reload_keyseq
112
119
  @file_reload.statusTip = 'Reload a file'
@@ -239,6 +246,20 @@ module Cosmos
239
246
  @file_open.setIcon(Cosmos.get_icon('open.png'))
240
247
  target_dirs_action(@file_open, File.join(Cosmos::USERPATH,'config'), '', method(:file_open))
241
248
 
249
+ @file_open_recent = @file_menu.addMenu('Open &Recent')
250
+ @file_open_recent.setIcon(Cosmos.get_icon('open.png'))
251
+ settings = Qt::Settings.new('Ball Aerospace', self.class.to_s)
252
+ if settings.contains('recent_files')
253
+ recent = settings.value('recent_files').toStringList()
254
+ recent.each do |filename|
255
+ action = Qt::Action.new(filename, self)
256
+ action.connect(SIGNAL('triggered()')) { open_filename(filename) }
257
+ @file_open_recent.addAction(action)
258
+ end
259
+ end
260
+ @file_open_recent.addSeparator()
261
+ @file_open_recent.addAction(@clear_file_open_recent)
262
+
242
263
  @file_menu.addAction(@file_close)
243
264
  @file_menu.addAction(@file_reload)
244
265
  @file_menu.addSeparator()
@@ -408,36 +429,67 @@ module Cosmos
408
429
  # File->Open
409
430
  def file_open(filename = nil)
410
431
  if File.directory?(filename)
411
- filename = Qt::FileDialog.getOpenFileName(self, "Select File", filename)
412
- end
413
- unless filename.nil? || filename.empty?
414
- # If the user opens a file we already have open
415
- # just set the current tab to that file and return
416
- @tab_book.tabs.each_with_index do |tab, index|
417
- if tab.filename == filename
418
- @tab_book.setCurrentIndex(index)
419
- @tab_book.currentTab.set_text_from_file(filename)
420
- @tab_book.currentTab.filename = filename
421
- return
422
- end
432
+ filenames = Qt::FileDialog.getOpenFileNames(self, "Select File(s)", filename, "COSMOS (*.rb *.txt);;All Files(*.*)")
433
+ else
434
+ filenames = [filename]
435
+ end
436
+ # Remove nils and convert filenames to UNIX path structure
437
+ filenames = filenames.compact.map {|filename| filename.gsub("\\","/") }
438
+ return if filenames.nil? || filenames.empty?
439
+ Qt::Application.setOverrideCursor(Qt::Cursor.new(Qt::WaitCursor))
440
+ filenames.each do |filename|
441
+ open_filename(filename)
442
+
443
+ found = false
444
+ @file_open_recent.actions.each do |action|
445
+ found = true if action.text == filename
423
446
  end
447
+ next if found
448
+ action = Qt::Action.new(filename, self)
449
+ action.connect(SIGNAL('triggered()')) { open_filename(filename) }
450
+ @file_open_recent.insertAction(@file_open_recent.actions[0], action)
451
+ # Add 2 for the separator and Clear Recent action
452
+ if @file_open_recent.actions.length > (MAX_RECENT_FILES + 2)
453
+ @file_open_recent.removeAction(@file_open_recent.actions[-3]) # ignore last 2
454
+ end
455
+ end
456
+ update_tree()
457
+ Qt::Application.restoreOverrideCursor()
458
+ end
424
459
 
425
- if ((@tab_book.count == 1) &&
426
- @tab_book.currentTab.filename.empty? &&
427
- !@tab_book.currentTab.modified)
428
- # Active Tab is an unmodified Untitled so just open the file in it
460
+ def clear_file_open_recent
461
+ # Subtract 2 for the separator and Clear Recent action
462
+ (@file_open_recent.actions.length - 2).times do
463
+ @file_open_recent.removeAction(@file_open_recent.actions[0])
464
+ end
465
+ end
466
+
467
+ def open_filename(filename)
468
+ # If the user opens a file we already have open
469
+ # just set the current tab to that file and return
470
+ @tab_book.tabs.each_with_index do |tab, index|
471
+ if tab.filename == filename
472
+ @tab_book.setCurrentIndex(index)
429
473
  @tab_book.currentTab.set_text_from_file(filename)
430
474
  @tab_book.currentTab.filename = filename
431
- @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
432
- else
433
- create_tab(filename)
475
+ return
434
476
  end
477
+ end
435
478
 
436
- update_title()
437
- @procedure_dir = File.dirname(filename)
438
- @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
479
+ if ((@tab_book.count == 1) &&
480
+ @tab_book.currentTab.filename.empty? &&
481
+ !@tab_book.currentTab.modified)
482
+ # Active Tab is an unmodified Untitled so just open the file in it
483
+ @tab_book.currentTab.set_text_from_file(filename)
484
+ @tab_book.currentTab.filename = filename
485
+ @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
486
+ else
487
+ create_tab(filename)
439
488
  end
440
- update_tree()
489
+
490
+ update_title()
491
+ @procedure_dir = File.dirname(filename)
492
+ @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
441
493
  end
442
494
 
443
495
  # File->Reload
@@ -615,6 +667,10 @@ module Cosmos
615
667
 
616
668
  def closeEvent(event)
617
669
  if prompt_for_save_if_needed_on_close()
670
+ settings = Qt::Settings.new('Ball Aerospace', self.class.to_s)
671
+ recent_files = @file_open_recent.actions.collect {|action| action.text }
672
+ # Ignore the last 2 because of the separator and Clear Recent action
673
+ settings.setValue('recent_files', Qt::Variant.new(recent_files[0..-3]))
618
674
  super(event)
619
675
  else
620
676
  event.ignore()
@@ -249,6 +249,8 @@ module Cosmos
249
249
  elsif @filename.include?('/config/tools/')
250
250
  if @filename.include?('cmd_tlm_server')
251
251
  @file_type = "Server Configuration"
252
+ elsif @filename.include?('cmd_sequence')
253
+ @file_type = "Command Sequence Configuration"
252
254
  elsif @filename.include?('data_viewer')
253
255
  @file_type = "Data Viewer Configuration"
254
256
  elsif @filename.include?('handbook_creator')
@@ -20,12 +20,14 @@ Cosmos.catch_fatal_exception do
20
20
  require 'cosmos/gui/widgets/realtime_button_bar'
21
21
  require 'cosmos/tools/data_viewer/data_viewer_component'
22
22
  require 'cosmos/tools/data_viewer/dump_component'
23
+ require 'cosmos/tools/data_viewer/text_component'
23
24
  require 'cosmos/config/config_parser'
24
25
  require 'cosmos/script'
25
26
  end
26
27
 
27
28
  module Cosmos
28
-
29
+ # Displays data in text format. Useful for telemetry that doesn't work well with
30
+ # telemetry screens such as memory dumps or large amounts of text.
29
31
  class DataViewer < QtTool
30
32
  slots 'context_menu(const QPoint&)'
31
33
  slots 'handle_tab_change(int)'
@@ -80,7 +82,8 @@ module Cosmos
80
82
  component.initialize_gui
81
83
  @tab_book.addTab(component, component.tab_name)
82
84
  end
83
- if @auto_start
85
+ toggle_replay_mode() if options.replay
86
+ if @auto_start || options.start
84
87
  handle_start()
85
88
  end
86
89
  ConfigParser.splash = nil
@@ -767,17 +770,20 @@ module Cosmos
767
770
  options.width = 550
768
771
  options.height = 500
769
772
  options.title = "Data Viewer"
770
- options.config_file = 'data_viewer.txt'
773
+ options.start = false
774
+ options.replay = false
775
+ options.config_file = true # config_file is required
771
776
  option_parser.separator "Data Viewer Specific Options:"
772
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
773
- options.config_file = arg
777
+ option_parser.on("-s", "--start", "Start processing immediately") do |arg|
778
+ options.start = true
779
+ end
780
+ option_parser.on("--replay", "Start Data Viewer in Replay mode") do
781
+ options.replay = true
774
782
  end
775
783
  end
776
784
 
777
785
  super(option_parser, options)
778
786
  end
779
787
  end
780
-
781
- end # class DataViewer
782
-
783
- end # module Cosmos
788
+ end
789
+ end
@@ -12,13 +12,8 @@ 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)
@@ -35,7 +30,5 @@ module Cosmos
35
30
  @processed_queue << processed_text
36
31
  end
37
32
  end
38
-
39
33
  end
40
-
41
- 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,6 +38,7 @@ 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
44
  @hide_ignored_action = Qt::Action.new('&Hide Ignored Items', self)
@@ -48,44 +47,26 @@ module Cosmos
48
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
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\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.")
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