cosmos 4.3.0-java → 4.4.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
- data/.gitignore +1 -0
- data/.travis.yml +5 -5
- data/Manifest.txt +81 -44
- data/Rakefile +9 -0
- data/appveyor.yml +2 -1
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
- data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
- data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
- data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/tools/limits_monitor.ahk +1 -1
- data/autohotkey/tools/packet_viewer.ahk +1 -1
- data/autohotkey/tools/script_runner.ahk +16 -4
- data/bin/cosmos +1 -1
- data/bin/xtce_converter +1 -1
- data/cosmos.gemspec +5 -7
- data/data/config/_interfaces.yaml +4 -0
- data/data/config/cmd_sequence.yaml +14 -0
- data/data/config/housekeeping_params.yaml +14 -0
- data/data/config/interface_modifiers.yaml +11 -0
- data/data/config/item_modifiers.yaml +2 -1
- data/data/config/launcher.yaml +12 -2
- data/data/config/param_item_modifiers.yaml +2 -2
- data/data/config/parameter_modifiers.yaml +20 -0
- data/data/config/screen.yaml +2 -0
- data/data/config/script_runner.yaml +9 -0
- data/data/config/system.yaml +47 -10
- data/data/config/table_manager.yaml +7 -0
- data/data/config/target.yaml +12 -0
- data/data/config/telemetry_modifiers.yaml +3 -1
- data/data/config/test_runner.yaml +10 -9
- data/data/config/widgets.yaml +174 -11
- data/data/crc.txt +128 -125
- data/demo/Gemfile +1 -1
- data/demo/Launcher.bat +1 -9
- data/demo/Launcher2.bat +1 -0
- data/demo/LauncherMini.bat +1 -0
- data/demo/config/data/crc.txt +40 -20
- data/demo/config/system/system.txt +1 -1
- data/demo/config/system/system_alt_ports.txt +1 -1
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +2 -1
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +7 -7
- data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
- data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
- data/demo/config/targets/INST/screens/adcs.txt +2 -2
- data/demo/config/targets/INST/screens/block.txt +1 -1
- data/demo/config/targets/INST/screens/commanding.txt +1 -1
- data/demo/config/targets/INST/screens/ground.txt +27 -5
- data/demo/config/targets/INST/screens/ground_error.gif +0 -0
- data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
- data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
- data/demo/config/targets/INST/screens/limits.txt +69 -31
- data/demo/config/targets/INST/screens/other.txt +13 -3
- data/demo/config/targets/INST/screens/params.txt +54 -0
- data/demo/config/targets/INST/screens/satellite.gif +0 -0
- data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/demo/config/tools/script_runner/script_runner.txt +1 -2
- data/demo/config/tools/test_runner/test_runner.txt +3 -1
- data/demo/lib/example_background_task.rb +1 -0
- data/demo/procedures/cosmos_api_test.rb +1 -1
- data/demo/procedures/interactive.rb +22 -0
- data/ext/cosmos/ext/packet/packet.c +0 -77
- data/install/Gemfile +1 -1
- data/install/Launcher.bat +1 -9
- data/install/config/data/crc.txt +17 -1
- data/install/config/system/system.txt +1 -1
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/lib/cosmos/config/config_parser.rb +4 -5
- data/lib/cosmos/dart/lib/dart_common.rb +1 -1
- data/lib/cosmos/gui/dialogs/details_dialog.rb +16 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -0
- data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
- data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
- data/lib/cosmos/gui/qt.rb +3 -1
- data/lib/cosmos/gui/qt_tool.rb +46 -23
- data/lib/cosmos/gui/text/ruby_editor.rb +44 -41
- data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
- data/lib/cosmos/gui/utilities/script_module_gui.rb +92 -92
- data/lib/cosmos/interfaces.rb +1 -0
- data/lib/cosmos/interfaces/interface.rb +5 -1
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +6 -1
- data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
- data/lib/cosmos/io/json_drb.rb +11 -7
- data/lib/cosmos/packets/commands.rb +28 -11
- data/lib/cosmos/packets/packet.rb +69 -32
- data/lib/cosmos/packets/packet_config.rb +34 -1
- data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
- data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
- data/lib/cosmos/packets/parsers/xtce_parser.rb +4 -3
- data/lib/cosmos/packets/structure.rb +4 -2
- data/lib/cosmos/packets/telemetry.rb +19 -3
- data/lib/cosmos/script/api_shared.rb +12 -9
- data/lib/cosmos/script/scripting.rb +16 -14
- data/lib/cosmos/system/system.rb +39 -20
- data/lib/cosmos/system/target.rb +39 -9
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +94 -35
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +3 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +30 -4
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +1 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +9 -12
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +5 -2
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
- data/lib/cosmos/tools/config_editor/config_editor.rb +80 -24
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +2 -0
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +15 -9
- data/lib/cosmos/tools/data_viewer/dump_component.rb +2 -9
- data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +64 -38
- data/lib/cosmos/tools/launcher/launcher.rb +1 -0
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -17
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +8 -6
- data/lib/cosmos/tools/script_runner/script_runner.rb +87 -29
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +41 -7
- data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
- data/lib/cosmos/tools/table_manager/table_manager.rb +6 -3
- data/lib/cosmos/tools/test_runner/test_runner.rb +14 -9
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +21 -9
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +11 -8
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +9 -15
- data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -1
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +19 -13
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +2 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +2 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +54 -46
- data/lib/cosmos/top_level.rb +23 -12
- data/lib/cosmos/version.rb +4 -4
- data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/spec/install/yaml_docs_spec.rb +112 -0
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
- data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
- data/spec/packets/commands_spec.rb +22 -0
- data/spec/packets/packet_config_spec.rb +24 -0
- data/spec/packets/packet_item_spec.rb +2 -2
- data/spec/packets/packet_spec.rb +39 -6
- data/spec/packets/parsers/state_parser_spec.rb +33 -11
- data/spec/packets/structure_spec.rb +41 -0
- data/spec/packets/telemetry_spec.rb +23 -0
- data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
- data/spec/system/system_spec.rb +77 -2
- data/spec/system/target_spec.rb +62 -1
- data/spec/tools/cmd_tlm_server/api_spec.rb +1 -1
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
- data/spec/top_level/top_level_spec.rb +29 -5
- data/tasks/gemfile_stats.rake +28 -14
- data/test/performance/config/system/system.txt +0 -0
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
- data/test/performance/procedures/cosmos_api_test.rb +1 -1
- data/test/performance/tools/identify_performance.rb +82 -0
- 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,
|
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,
|
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
|
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
|
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
|
-
|
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
|
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 = "(
|
438
|
+
@cmd_info.text = "(Hazardous)"
|
439
439
|
else
|
440
440
|
@cmd_info.text = ""
|
441
441
|
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
|
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
|
-
|
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
|
-
|
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
|