cosmos 4.3.0 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -67,6 +67,15 @@ module Cosmos
67
67
  @analyze_log.connect(SIGNAL('triggered()')) { analyze_log_files() }
68
68
 
69
69
  # Mode Menu Actions
70
+ @csv_output = Qt::Action.new('&CSV Output', self)
71
+ @csv_output.statusTip = 'Output as CSV based on Packet Time'
72
+ @csv_output.setCheckable(true)
73
+ @csv_output.connect(SIGNAL('triggered()')) { change_callback(:INPUT_FILES) }
74
+
75
+ @skip_ignored = Qt::Action.new('&Skip Ignored Items', self)
76
+ @skip_ignored.statusTip = "Skip ignored items in the command when building output"
77
+ @skip_ignored.setCheckable(true)
78
+
70
79
  @include_raw = Qt::Action.new('Include &Raw Data', self)
71
80
  @include_raw_keyseq = Qt::KeySequence.new('Ctrl+R')
72
81
  @include_raw.shortcut = @include_raw_keyseq
@@ -81,6 +90,8 @@ module Cosmos
81
90
  @file_menu.addSeparator()
82
91
  @file_menu.addAction(@exit_action)
83
92
  @mode_menu = menuBar.addMenu('&Mode')
93
+ @mode_menu.addAction(@csv_output)
94
+ @mode_menu.addAction(@skip_ignored)
84
95
  @mode_menu.addAction(@include_raw)
85
96
  @about_string = "Command Extractor extracts commands from a binary command log file into a human readable text file."
86
97
  initialize_help_menu()
@@ -144,6 +155,14 @@ module Cosmos
144
155
  @open_button.connect(SIGNAL('clicked()')) { open_button() }
145
156
  @open_button.setEnabled(false)
146
157
  @button_layout.addWidget(@open_button)
158
+
159
+ if Kernel.is_windows?
160
+ @open_excel_button = Qt::PushButton.new('&Open in Excel')
161
+ @open_excel_button.connect(SIGNAL('clicked()')) { open_excel_button() }
162
+ @open_excel_button.setEnabled(false)
163
+ @button_layout.addWidget(@open_excel_button)
164
+ end
165
+
147
166
  @top_layout.addLayout(@button_layout)
148
167
  end
149
168
 
@@ -182,8 +201,10 @@ module Cosmos
182
201
  @meta_filters = @dart_meta_frame.meta_filters
183
202
 
184
203
  return unless pre_process_tests()
185
-
204
+ csv_output = @csv_output.isChecked
205
+ skip_ignored = @skip_ignored.isChecked
186
206
  include_raw = @include_raw.isChecked
207
+
187
208
  if @log_file_radio.isChecked
188
209
  begin
189
210
  ProgressDialog.execute(self, # parent
@@ -196,13 +217,14 @@ module Cosmos
196
217
  begin
197
218
  Cosmos.set_working_dir do
198
219
  File.open(@output_filename, 'w') do |output_file|
199
- process_files(output_file, include_raw, progress_dialog)
220
+ process_files(output_file, progress_dialog, csv_output, skip_ignored, include_raw)
200
221
  end
201
222
  end
202
223
  ensure
203
224
  progress_dialog.complete
204
225
  Qt.execute_in_main_thread(true) do
205
226
  @open_button.setEnabled(true)
227
+ @open_excel_button.setEnabled(true) if Kernel.is_windows?
206
228
  end
207
229
  end
208
230
  end
@@ -246,6 +268,8 @@ module Cosmos
246
268
  @interface.write(request_packet)
247
269
  progress_dialog.append_text("Receiving Packets...")
248
270
 
271
+ write_output_file_DART_header(output_file, request, csv_output)
272
+
249
273
  first = true
250
274
  while true
251
275
  break if @cancel
@@ -271,17 +295,7 @@ module Cosmos
271
295
  defined_packet = System.commands.packet(packet.target_name, packet.packet_name)
272
296
  defined_packet.buffer = packet.buffer
273
297
  defined_packet.received_time = packet.received_time
274
-
275
- output_file.puts "#{defined_packet.target_name} #{defined_packet.packet_name}"
276
- output_file.puts " PACKET_TIMEFORMATTED: #{defined_packet.packet_time.formatted}"
277
- output_file.puts " RECEIVED_TIMEFORMATTED: #{defined_packet.received_time.formatted}"
278
- output_file.puts defined_packet.formatted(:WITH_UNITS, 2)
279
- if include_raw or !defined_packet.identified? or !defined_packet.defined?
280
- output_file.puts " RAW PACKET DATA (#{defined_packet.length} bytes):"
281
- output_file.puts defined_packet.buffer.formatted(1, 16, ' ', 4)
282
- end
283
- output_file.puts
284
-
298
+ write_output_file_packet(output_file, defined_packet, csv_output, skip_ignored, include_raw)
285
299
  progress = ((@time_delta - (@time_end - defined_packet.packet_time)).to_f / @time_delta.to_f)
286
300
  progress_dialog.set_overall_progress(progress) if !@cancel
287
301
  end
@@ -294,6 +308,7 @@ module Cosmos
294
308
  progress_dialog.complete
295
309
  Qt.execute_in_main_thread(true) do
296
310
  @open_button.setEnabled(true)
311
+ @open_excel_button.setEnabled(true) if Kernel.is_windows?
297
312
  end
298
313
  end
299
314
  end
@@ -309,11 +324,15 @@ module Cosmos
309
324
  Cosmos.open_in_text_editor(@output_filename)
310
325
  end
311
326
 
327
+ def open_excel_button
328
+ system("start Excel.exe \"#{@output_filename}\"")
329
+ end
330
+
312
331
  ###############################################################################
313
332
  # Helper Methods
314
333
  ###############################################################################
315
334
 
316
- def process_files(output_file, include_raw, progress_dialog)
335
+ def process_files(output_file, progress_dialog, csv_output, skip_ignored, include_raw)
317
336
  log_file_count = 1
318
337
  @input_filenames.each do |log_file|
319
338
  break if @cancel
@@ -322,10 +341,7 @@ module Cosmos
322
341
  file_size = File.size(log_file).to_f
323
342
  progress_dialog.append_text("Processing File #{log_file_count}/#{@input_filenames.length}: #{log_file}")
324
343
  progress_dialog.set_step_progress(0.0)
325
- output_file.puts '-' * (log_file.length * 1.4).to_i
326
- output_file.puts log_file
327
- output_file.puts '-' * (log_file.length * 1.4).to_i
328
- output_file.puts
344
+ write_output_file_header(output_file, log_file, csv_output)
329
345
  @packet_log_reader.each(
330
346
  log_file, # log filename
331
347
  true, # identify and define packet
@@ -334,17 +350,7 @@ module Cosmos
334
350
 
335
351
  break if @cancel
336
352
  progress_dialog.set_step_progress(@packet_log_reader.bytes_read / file_size)
337
- output_file.puts "#{packet.target_name} #{packet.packet_name}"
338
- if packet.received_time
339
- output_file.puts " PACKET_TIMEFORMATTED: #{packet.packet_time.formatted}"
340
- output_file.puts " RECEIVED_TIMEFORMATTED: #{packet.received_time.formatted}"
341
- end
342
- output_file.puts packet.formatted(:WITH_UNITS, 2)
343
- if include_raw or !packet.identified? or !packet.defined?
344
- output_file.puts " RAW PACKET DATA (#{packet.length} bytes):"
345
- output_file.puts packet.buffer.formatted(1, 16, ' ', 4)
346
- end
347
- output_file.puts
353
+ write_output_file_packet(output_file, packet, csv_output, skip_ignored, include_raw)
348
354
  end
349
355
  progress_dialog.set_step_progress(1.0) if !@cancel
350
356
  progress_dialog.set_overall_progress(log_file_count.to_f / @input_filenames.length.to_f) if !@cancel
@@ -359,6 +365,57 @@ module Cosmos
359
365
  # Helper Methods
360
366
  ###############################################################################
361
367
 
368
+ def write_output_file_header(output_file, log_file, csv_output)
369
+ if csv_output
370
+ output_file.puts "Filename,#{log_file}"
371
+ output_file.puts "PACKET_TIMEFORMATTED,Target,Packet,Parameters"
372
+ else
373
+ output_file.puts '-' * (log_file.length * 1.4).to_i
374
+ output_file.puts log_file
375
+ output_file.puts '-' * (log_file.length * 1.4).to_i
376
+ output_file.puts
377
+ end
378
+ end
379
+
380
+ def write_output_file_DART_header(output_file, request, csv_output)
381
+ if csv_output
382
+ output_file.puts "DART Request"
383
+ output_file.puts "start secs,#{request['start_time_sec']},start usec,#{request['start_time_usec']}"
384
+ output_file.puts "end secs,#{request['end_time_sec']},end usec,#{request['end_time_usec']}"
385
+ output_file.puts "meta_filter,#{request['meta_filters']}" unless @meta_filters.empty?
386
+ else
387
+ output_file.puts "DART Request"
388
+ output_file.puts "start secs:#{request['start_time_sec']} start usec:#{request['start_time_usec']}"
389
+ output_file.puts "end secs:#{request['end_time_sec']} end usec:#{request['end_time_usec']}"
390
+ output_file.puts "meta_filter:#{request['meta_filters']}" unless @meta_filters.empty?
391
+ end
392
+ end
393
+
394
+ def write_output_file_packet(output_file, packet, csv_output, skip_ignored, include_raw)
395
+ if csv_output
396
+ items_string = ""
397
+ packet.read_all.each do |name, value|
398
+ next if skip_ignored && System.targets[packet.target_name].ignored_items.include?(name)
399
+ items_string << "#{name},#{value},"
400
+ end
401
+ output_file.puts "#{packet.packet_time.formatted},#{packet.target_name},#{packet.packet_name},#{items_string}"
402
+ output_file.puts "#{packet.buffer.formatted}" if include_raw
403
+ else
404
+ output_file.puts "#{packet.target_name} #{packet.packet_name}"
405
+ if packet.received_time
406
+ output_file.puts " PACKET_TIMEFORMATTED: #{packet.packet_time.formatted}"
407
+ output_file.puts " RECEIVED_TIMEFORMATTED: #{packet.received_time.formatted}"
408
+ end
409
+ ignored = skip_ignored ? System.targets[packet.target_name].ignored_items : nil
410
+ output_file.puts packet.formatted(:WITH_UNITS, 2, packet.buffer, ignored)
411
+ if include_raw or !packet.identified? or !packet.defined?
412
+ output_file.puts " RAW PACKET DATA (#{packet.length} bytes):"
413
+ output_file.puts packet.buffer.formatted(1, 16, ' ', 4)
414
+ end
415
+ output_file.puts
416
+ end
417
+ end
418
+
362
419
  def pre_process_tests
363
420
  if @log_file_radio.isChecked
364
421
  unless @input_filenames and @input_filenames[0]
@@ -372,7 +429,7 @@ module Cosmos
372
429
  Qt::MessageBox.critical(self, 'Error', 'No Output File Selected')
373
430
  return false
374
431
  else
375
- @packet_log_frame.output_filename = File.join(System.paths['LOGS'], File.build_timestamped_filename(['cmd_extractor', 'dart']))
432
+ @packet_log_frame.output_filename = File.join(System.paths['LOGS'], File.build_timestamped_filename(['cmd_extractor', 'dart'], get_output_file_extension()))
376
433
  @output_filename = @packet_log_frame.output_filename
377
434
  end
378
435
  end
@@ -385,6 +442,10 @@ module Cosmos
385
442
  true
386
443
  end
387
444
 
445
+ def get_output_file_extension
446
+ @csv_output.isChecked ? '.csv' : '.txt'
447
+ end
448
+
388
449
  ###############################################################################
389
450
  # Additional Callbacks
390
451
  ###############################################################################
@@ -400,12 +461,10 @@ module Cosmos
400
461
  if filename
401
462
  extension = File.extname(filename)
402
463
  filename_no_extension = filename[0..-(extension.length + 1)]
403
- filename = filename_no_extension << '.txt'
404
- @packet_log_frame.output_filename = filename
464
+ @packet_log_frame.output_filename = "#{filename_no_extension}#{get_output_file_extension}"
405
465
  end
406
466
  end
407
467
  end
408
468
 
409
- end # class CmdExtractor
410
-
411
- end # module Cosmos
469
+ end
470
+ end
@@ -690,6 +690,9 @@ module Cosmos
690
690
  end
691
691
  if !value_text.is_printable?
692
692
  value_text = "0x" + value_text.simple_formatted
693
+ # Add quotes around STRING or BLOCK defaults so CmdSender interprets them correctly
694
+ elsif (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK)
695
+ value_text = "'#{packet_item.default}'"
693
696
  end
694
697
  end
695
698
  value_item = Qt::TableWidgetItem.new(value_text)
@@ -435,7 +435,7 @@ module Cosmos
435
435
  @cmd_name.text = command_string
436
436
  hazardous, _ = System.commands.cmd_hazardous?(@command.target_name, @command.packet_name, command_params())
437
437
  if hazardous
438
- @cmd_info.text = "(Hazarous)"
438
+ @cmd_info.text = "(Hazardous)"
439
439
  else
440
440
  @cmd_info.text = ""
441
441
  end
@@ -43,6 +43,8 @@ module Cosmos
43
43
  rescue Exception => err
44
44
  Logger.error "Background Task '#{@config.background_tasks[index].name}' unexpectedly died"
45
45
  Cosmos.handle_fatal_exception(err)
46
+ ensure
47
+ @threads[index] = nil # Remove thread reference
46
48
  end
47
49
  end
48
50
  end
@@ -20,7 +20,6 @@ require 'cosmos/tools/cmd_tlm_server/routers'
20
20
  require 'cosmos/tools/cmd_tlm_server/replay_backend'
21
21
 
22
22
  module Cosmos
23
-
24
23
  # Provides the interface for all applications to get the latest telemetry and
25
24
  # to send commands.
26
25
  class CmdTlmServer
@@ -126,6 +125,9 @@ module Cosmos
126
125
  # receive data. This is useful for testing scripts when actual hardware
127
126
  # is not available.
128
127
  # @param mode [Symbol] :CMD_TLM_SERVER or :REPLAY - Defines overall mode
128
+ # @param replay_routers [Boolean] Whether to keep existing routers when starting
129
+ # the server in REPLAY mode. Default is false which means to clear all
130
+ # existing routers and simply create the preidentified routers.
129
131
  def initialize(
130
132
  config_file = DEFAULT_CONFIG_FILE,
131
133
  production = false,
@@ -218,16 +220,40 @@ module Cosmos
218
220
  @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['CTS_PREIDENTIFIED'])
219
221
  @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['CTS_CMD_ROUTER'])
220
222
  else
223
+ # Create dummy interface for Replay so we can attach the preidentified routers to it.
224
+ # This is needed because interfaces are not mapped to targets when loading a saved_config.
225
+ # Since interfaces are used to access the routers, nothing is send out the preidentified
226
+ # interface port and TlmGrapher (most notably) does not work.
227
+ @replay_interface = Interface.new
228
+ @replay_interface.name = "REPLAY"
221
229
  @routers.all.clear unless replay_routers
222
- @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['REPLAY_PREIDENTIFIED'])
223
- @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['REPLAY_CMD_ROUTER'])
230
+ @replay_interface.routers << @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['REPLAY_PREIDENTIFIED'])
231
+ @replay_interface.cmd_routers << @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['REPLAY_CMD_ROUTER'])
224
232
  end
225
233
  System.telemetry.limits_change_callback = method(:limits_change_callback)
226
234
  @routers.start
227
235
 
228
236
  start(production)
229
237
  end
230
- end # end def initialize
238
+ end
239
+
240
+ # Map any targets without interfaces to the dummy replay interface.
241
+ # Targets will only have an interface already mapped if the replay_routers
242
+ # flag was passed to the server.
243
+ def replay_map_targets_to_interfaces
244
+ # Try to map existing interfaces to targets
245
+ if @interfaces
246
+ @interfaces.all.each do |name, interface|
247
+ interface.target_names.each do |target|
248
+ System.targets[target].interface = interface
249
+ end
250
+ end
251
+ end
252
+ # If any remaing targets don't have an interface map to the @replay_interface
253
+ System.targets.each do |name, target|
254
+ target.interface = @replay_interface unless target.interface
255
+ end
256
+ end
231
257
 
232
258
  # Properly shuts down the command and telemetry server by stoping the
233
259
  # JSON-RPC server, background tasks, routers, and interfaces. Also kills
@@ -216,6 +216,7 @@ module Cosmos
216
216
  when 'LOG_RAW', 'ROUTER_LOG_RAW'
217
217
  parser.verify_num_parameters(0, nil, "#{keyword} <Raw Logger Class File (optional)> <Raw Logger Parameters (optional)>")
218
218
  current_interface_or_router.raw_logger_pair = RawLoggerPair.new(current_interface_or_router.name, params)
219
+ current_interface_or_router.start_raw_logging
219
220
 
220
221
  when 'OPTION'
221
222
  parser.verify_num_parameters(2, nil, "#{keyword} <Option Name> <Option Value 1> <Option Value 2 (optional)> <etc>")
@@ -56,9 +56,6 @@ else
56
56
  option_parser.on("--system FILE", "Use an alternative system.txt file") do |arg|
57
57
  System.instance(File.join(USERPATH, 'config', 'system', arg))
58
58
  end
59
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
60
- options.config_file = arg
61
- end
62
59
  end
63
60
 
64
61
  return parser, options
@@ -75,7 +72,6 @@ else
75
72
  end
76
73
 
77
74
  module Cosmos
78
-
79
75
  # Implements the GUI functions of the Command and Telemetry Server. All the
80
76
  # QT calls are implemented here. The non-GUI functionality is contained in
81
77
  # the CmdTlmServer class.
@@ -262,7 +258,7 @@ module Cosmos
262
258
  end
263
259
  @targets_tab = TargetsTab.new(@tab_widget)
264
260
  @commands_tab = PacketsTab.new(self, PacketsTab::COMMANDS, @tab_widget)
265
- @telemetry_tab = PacketsTab.new(self, PacketsTab::TELEMETRY, @tab_widget)
261
+ @telemetry_tab = PacketsTab.new(self, PacketsTab::TELEMETRY, @tab_widget, (@mode == :REPLAY))
266
262
  @routers_tab = InterfacesTab.new(self, InterfacesTab::ROUTERS, @tab_widget)
267
263
  if @mode == :CMD_TLM_SERVER
268
264
  @logging_tab = LoggingTab.new(@production, @tab_widget)
@@ -271,6 +267,7 @@ module Cosmos
271
267
  end
272
268
 
273
269
  def config_change_callback
270
+ CmdTlmServer.instance.replay_map_targets_to_interfaces
274
271
  start(nil)
275
272
  end
276
273
 
@@ -546,6 +543,8 @@ module Cosmos
546
543
  def self.post_options_parsed_hook(options)
547
544
  @options = options
548
545
  if options.no_gui
546
+ normalize_config_options(options)
547
+
549
548
  ["TERM", "INT"].each {|sig| Signal.trap(sig) {exit}}
550
549
 
551
550
  begin
@@ -613,16 +612,15 @@ module Cosmos
613
612
  # Set the default title which can be overridden in the config file
614
613
  options.title = TOOL_NAME
615
614
  options.auto_size = false
616
- options.config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
617
615
  options.production = false
618
616
  options.no_prompt = false
619
617
  options.no_gui = false
620
618
  options.replay_routers = false
619
+ options.config_file = true # config_file is required
620
+ # Set config_dir because by default it would be config/tools/cmd_tlm_server_gui
621
+ options.config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', 'cmd_tlm_server')
621
622
 
622
623
  option_parser.separator "CTS Specific Options:"
623
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
624
- options.config_file = arg
625
- end
626
624
  option_parser.on("-p", "--production", "Run the server in production mode which disables the ability to stop logging.") do |arg|
627
625
  options.production = true
628
626
  end
@@ -647,6 +645,5 @@ module Cosmos
647
645
  super(option_parser, options)
648
646
  end
649
647
  end
650
-
651
- end # class CmdTlmServerGui
652
- end # module Cosmos
648
+ end
649
+ end
@@ -18,9 +18,10 @@ module Cosmos
18
18
  COMMANDS = "Commands"
19
19
  TELEMETRY = "Telemetry"
20
20
 
21
- def initialize(server_gui, name, tab_widget)
21
+ def initialize(server_gui, name, tab_widget, replay = false)
22
22
  @server_gui = server_gui
23
23
  @name = name
24
+ @replay = replay
24
25
  @widget = nil
25
26
  reset()
26
27
  @scroll = Qt::ScrollArea.new
@@ -147,7 +148,9 @@ module Cosmos
147
148
  view_pv = Qt::PushButton.new("View in #{tool_name}")
148
149
  view_pv.connect(SIGNAL('clicked()')) do
149
150
  tool_name = tool_name.split.join.gsub("Command","Cmd") # remove space and convert name
150
- Cosmos.run_cosmos_tool(tool_name, "-p \"#{target_name} #{packet_name}\" --system #{File.basename(System.initial_filename)}")
151
+ options = "-p \"#{target_name} #{packet_name}\" --system #{File.basename(System.initial_filename)}"
152
+ options += " --replay" if @replay && @name == TELEMETRY
153
+ Cosmos.run_cosmos_tool(tool_name, options)
151
154
  end
152
155
  table.setCellWidget(row, 4, view_pv)
153
156
  else
@@ -49,6 +49,7 @@ module Cosmos
49
49
  router.interfaces << interface
50
50
  interface.routers << router
51
51
  end
52
+ router
52
53
  end
53
54
 
54
55
  # Adds a Preidentified command router to the system with given name and port.
@@ -72,6 +73,7 @@ module Cosmos
72
73
  @config.interfaces.each do |interface_name, interface|
73
74
  interface.cmd_routers << cmd_router
74
75
  end
76
+ cmd_router
75
77
  end
76
78
 
77
79
  # Recreate a router with new initialization parameters