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
@@ -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