From bdfacbd2b5ed5c96e70e53b95ea85248e380add5 Mon Sep 17 00:00:00 2001
From: dogmaphobic <mavlink@grubba.com>
Date: Thu, 4 Feb 2016 10:15:57 -0500
Subject: [PATCH] General Clean Up

---
 .../Common/ESP8266ComponentSummary.qml        |   4 +-
 .../PX4/AirframeComponentSummary.qml          |   8 +-
 .../PX4/FlightModesComponentSummary.qml       |   8 +-
 .../PX4/PX4RadioComponentSummary.qml          |  14 +-
 .../PX4/PowerComponentSummary.qml             |   8 +-
 .../PX4/SafetyComponentSummary.qml            |  10 +-
 .../PX4/SensorsComponentSummary.qml           |   8 +-
 .../PX4/SensorsComponentSummaryFixedWing.qml  |   8 +-
 src/FactSystem/FactControls/FactTextField.qml |   4 +-
 src/MissionManager/MissionController.cc       |   2 +-
 src/QGCDockWidget.cc                          |   6 +-
 src/VehicleSetup/VehicleSummary.qml           |   4 +-
 src/ViewWidgets/CustomCommandWidget.qml       | 142 +++++++++---------
 .../CustomCommandWidgetController.cc          |  29 ++--
 .../CustomCommandWidgetController.h           |  15 +-
 src/comm/LinkInterface.h                      |  16 +-
 src/comm/UDPLink.cc                           |   4 +-
 17 files changed, 152 insertions(+), 138 deletions(-)

diff --git a/src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml b/src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml
index 1cd4465cfe..f7c1048584 100644
--- a/src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml
+++ b/src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml
@@ -34,7 +34,7 @@ FactPanel {
         }
         VehicleSummaryRow {
             labelText: "WiFi Channel:"
-            valueText: wifiChannel.valueString
+            valueText: wifiChannel ? wifiChannel.valueString : ""
         }
         VehicleSummaryRow {
             labelText: "WiFi SSID:"
@@ -46,7 +46,7 @@ FactPanel {
         }
         VehicleSummaryRow {
             labelText: "UART Baud Rate:"
-            valueText: uartBaud.valueString
+            valueText: uartBaud ? uartBaud.valueString : ""
         }
     }
 }
diff --git a/src/AutoPilotPlugins/PX4/AirframeComponentSummary.qml b/src/AutoPilotPlugins/PX4/AirframeComponentSummary.qml
index 75dc76ddb0..d3f9222869 100644
--- a/src/AutoPilotPlugins/PX4/AirframeComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/AirframeComponentSummary.qml
@@ -18,15 +18,15 @@ FactPanel {
     property Fact sysIdFact:        controller.getParameterFact(-1, "MAV_SYS_ID")
     property Fact sysAutoStartFact: controller.getParameterFact(-1, "SYS_AUTOSTART")
 
-    property bool autoStartSet: sysAutoStartFact.value != 0
+    property bool autoStartSet: sysAutoStartFact ? (sysAutoStartFact.value !== 0) : false
 
     Column {
-        anchors.fill: parent
+        anchors.fill:    parent
         anchors.margins: 8
 
         VehicleSummaryRow {
             labelText: "System ID:"
-            valueText: sysIdFact.valueString
+            valueText: sysIdFact ? sysIdFact.valueString : ""
         }
 
         VehicleSummaryRow {
@@ -39,4 +39,4 @@ FactPanel {
             valueText: autoStartSet ? controller.currentVehicleName : "Setup required"
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml b/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml
index bbf7cf4438..87b392db26 100644
--- a/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml
@@ -25,22 +25,22 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "Mode switch:"
-            valueText: modeSwFact.value == 0 ? "Setup required" : modeSwFact.valueString
+            valueText: modeSwFact ? (modeSwFact.value === 0 ? "Setup required" : modeSwFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Position Ctl switch:"
-            valueText: posCtlSwFact.value == 0 ? "Disabled" : posCtlSwFact.valueString
+            valueText: posCtlSwFact ? (posCtlSwFact.value === 0 ? "Disabled" : posCtlSwFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Loiter switch:"
-            valueText: loiterSwFact.value == 0 ? "Disabled" : loiterSwFact.valueString
+            valueText: loiterSwFact ? (loiterSwFact.value === 0 ? "Disabled" : loiterSwFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Return switch:"
-            valueText: returnSwFact.value == 0 ? "Disabled" : returnSwFact.valueString
+            valueText: returnSwFact ? (returnSwFact.value === 0 ? "Disabled" : returnSwFact.valueString) : ""
         }
     }
 }
diff --git a/src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml b/src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml
index 663d2649be..877b9826d2 100644
--- a/src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml
@@ -28,37 +28,37 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "Roll:"
-            valueText: mapRollFact.value == 0 ? "Setup required" : mapRollFact.valueString
+            valueText: mapRollFact ? (mapRollFact.value === 0 ? "Setup required" : mapRollFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Pitch:"
-            valueText: mapPitchFact.value == 0 ? "Setup required" : mapPitchFact.valueString
+            valueText: mapPitchFact ? (mapPitchFact.value === 0 ? "Setup required" : mapPitchFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Yaw:"
-            valueText: mapYawFact.value == 0 ? "Setup required" : mapYawFact.valueString
+            valueText: mapYawFact ? (mapYawFact.value === 0 ? "Setup required" : mapYawFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Throttle:"
-            valueText: mapThrottleFact.value == 0 ? "Setup required" : mapThrottleFact.valueString
+            valueText: mapThrottleFact ? (mapThrottleFact.value === 0 ? "Setup required" : mapThrottleFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Flaps:"
-            valueText: mapFlapsFact.value == 0 ? "Disabled" : mapFlapsFact.valueString
+            valueText: mapFlapsFact ? (mapFlapsFact.value === 0 ? "Disabled" : mapFlapsFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Aux1:"
-            valueText: mapAux1Fact.value == 0 ? "Disabled" : mapAux1Fact.valueString
+            valueText: mapAux1Fact ? (mapAux1Fact.value === 0 ? "Disabled" : mapAux1Fact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Aux2:"
-            valueText: mapAux2Fact.value == 0 ? "Disabled" : mapAux2Fact.valueString
+            valueText: mapAux2Fact ? (mapAux2Fact.value === 0 ? "Disabled" : mapAux2Fact.valueString) : ""
         }
     }
 }
diff --git a/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml b/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml
index 3343295371..ced305e2d4 100644
--- a/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml
@@ -51,17 +51,17 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "Battery Full:"
-            valueText: batVChargedFact.valueString
+            valueText: batVChargedFact ? batVChargedFact.valueString : ""
         }
 
         VehicleSummaryRow {
             labelText: "Battery Empty:"
-            valueText: batVEmptyFact.valueString
+            valueText: batVEmptyFact ? batVEmptyFact.valueString : ""
         }
 
         VehicleSummaryRow {
             labelText: "Number of Cells:"
-            valueText: batCellsFact.valueString
+            valueText: batCellsFact ? batCellsFact.valueString : ""
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/AutoPilotPlugins/PX4/SafetyComponentSummary.qml b/src/AutoPilotPlugins/PX4/SafetyComponentSummary.qml
index 46785ad603..b875a37542 100644
--- a/src/AutoPilotPlugins/PX4/SafetyComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/SafetyComponentSummary.qml
@@ -26,27 +26,27 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "RTL min alt:"
-            valueText: returnAltFact.valueString
+            valueText: returnAltFact ? returnAltFact.valueString : ""
         }
 
         VehicleSummaryRow {
             labelText: "RTL home alt:"
-            valueText: descendAltFact.valueString
+            valueText: descendAltFact ? descendAltFact.valueString : ""
         }
 
         VehicleSummaryRow {
             labelText: "RTL loiter delay:"
-            valueText: landDelayFact.value < 0 ? "Disabled" : landDelayFact.valueString
+            valueText: landDelayFact ? (landDelayFact.value < 0 ? "Disabled" : landDelayFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "Telemetry loss RTL:"
-            valueText: commDLLossFact.value != -1 ? "Disabled" : commDLLossFact.valueString
+            valueText: commDLLossFact ? (commDLLossFact.value != -1 ? "Disabled" : commDLLossFact.valueString) : ""
         }
 
         VehicleSummaryRow {
             labelText: "RC loss RTL (seconds):"
-            valueText: commRCLossFact.valueString
+            valueText: commRCLossFact ? commRCLossFact.valueString : ""
         }
     }
 }
diff --git a/src/AutoPilotPlugins/PX4/SensorsComponentSummary.qml b/src/AutoPilotPlugins/PX4/SensorsComponentSummary.qml
index 2f7a3edb9f..2fd15c11c4 100644
--- a/src/AutoPilotPlugins/PX4/SensorsComponentSummary.qml
+++ b/src/AutoPilotPlugins/PX4/SensorsComponentSummary.qml
@@ -29,17 +29,17 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "Compass:"
-            valueText: mag0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: mag0IdFact ? (mag0IdFact.value === 0 ? "Setup required" : "Ready") : ""
         }
 
         VehicleSummaryRow {
             labelText: "Gyro:"
-            valueText: gyro0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: gyro0IdFact ? (gyro0IdFact.value === 0 ? "Setup required" : "Ready") : ""
         }
 
         VehicleSummaryRow {
             labelText: "Accelerometer:"
-            valueText: accel0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: accel0IdFact ? (accel0IdFact.value === 0 ? "Setup required" : "Ready") : ""
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml b/src/AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml
index 5c4e4ff63e..513cf3e86e 100644
--- a/src/AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml
+++ b/src/AutoPilotPlugins/PX4/SensorsComponentSummaryFixedWing.qml
@@ -29,22 +29,22 @@ FactPanel {
 
         VehicleSummaryRow {
             labelText: "Compass:"
-            valueText: mag0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: mag0IdFact ? (mag0IdFact.value  === 0 ? "Setup required" : "Ready") : ""
         }
 
         VehicleSummaryRow {
             labelText: "Gyro:"
-            valueText: gyro0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: gyro0IdFact ? (gyro0IdFact.value === 0 ? "Setup required" : "Ready") : ""
         }
 
         VehicleSummaryRow {
             labelText: "Accelerometer:"
-            valueText: accel0IdFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: accel0IdFact ? (accel0IdFact.value === 0 ? "Setup required" : "Ready") : ""
         }
 
         VehicleSummaryRow {
             labelText: "Airspeed:"
-            valueText: dpressOffFact.value  == 0 ? "Setup required" : "Ready"
+            valueText: dpressOffFact ? (dpressOffFact.value === 0 ? "Setup required" : "Ready") : ""
         }
     }
 }
diff --git a/src/FactSystem/FactControls/FactTextField.qml b/src/FactSystem/FactControls/FactTextField.qml
index e22416945a..edd594f0db 100644
--- a/src/FactSystem/FactControls/FactTextField.qml
+++ b/src/FactSystem/FactControls/FactTextField.qml
@@ -11,8 +11,8 @@ import QGroundControl.Controls 1.0
 QGCTextField {
     id: _textField
 
-    text:       fact.valueString
-    unitsLabel: fact.units
+    text:       fact ? fact.valueString : ""
+    unitsLabel: fact ? fact.units : ""
     showUnits:  true
 
     property Fact   fact:           null
diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc
index c03bcfe08e..beb56a4b58 100644
--- a/src/MissionManager/MissionController.cc
+++ b/src/MissionManager/MissionController.cc
@@ -514,7 +514,7 @@ void MissionController::_initAllMissionItems(void)
         homeItem->setCoordinate(QGeoCoordinate(37.803784, -122.462276, 0.0));
     }
 
-    qDebug() << "home item" << homeItem->homePositionValid() << homeItem->coordinate();
+    //qDebug() << "home item" << homeItem->homePositionValid() << homeItem->coordinate();
 
     for (int i=0; i<_missionItems->count(); i++) {
         _initMissionItem(qobject_cast<MissionItem*>(_missionItems->get(i)));
diff --git a/src/QGCDockWidget.cc b/src/QGCDockWidget.cc
index 0adb405e62..2d21ed74b6 100644
--- a/src/QGCDockWidget.cc
+++ b/src/QGCDockWidget.cc
@@ -52,7 +52,8 @@ void QGCDockWidget::closeEvent(QCloseEvent* event)
 
 void QGCDockWidget::loadSettings(void)
 {
-    if (_action) {
+    // TODO: This is crashing for some reason. Disabled until sorted out.
+    if (0 /*_action*/) {
         QSettings settings;
         settings.beginGroup(_settingsGroup);
         if (settings.contains(_title)) {
@@ -64,7 +65,8 @@ void QGCDockWidget::loadSettings(void)
 
 void QGCDockWidget::saveSettings(void)
 {
-    if (_action) {
+    // TODO: This is crashing for some reason. Disabled until sorted out.
+    if (0 /*_action*/) {
         QSettings settings;
         settings.beginGroup(_settingsGroup);
         settings.setValue(_title, saveGeometry());
diff --git a/src/VehicleSetup/VehicleSummary.qml b/src/VehicleSetup/VehicleSummary.qml
index a0230e7b6f..82b4029573 100644
--- a/src/VehicleSetup/VehicleSummary.qml
+++ b/src/VehicleSetup/VehicleSummary.qml
@@ -95,7 +95,7 @@ Rectangle {
                 text:           setupComplete ?
                     "Below you will find a summary of the settings for your vehicle. To the left are the setup menus for each component." :
                     "WARNING: Your vehicle requires setup prior to flight. Please resolve the items marked in red using the menu on the left."
-                property bool setupComplete: multiVehicleManager.activeVehicle.autopilot.setupComplete
+                property bool setupComplete: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.autopilot.setupComplete : false
             }
 
             Flow {
@@ -104,7 +104,7 @@ Rectangle {
                 spacing:    _summaryBoxSpace
 
                 Repeater {
-                    model: multiVehicleManager.activeVehicle.autopilot.vehicleComponents
+                    model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.autopilot.vehicleComponents : undefined
 
                     // Outer summary item rectangle
                     Rectangle {
diff --git a/src/ViewWidgets/CustomCommandWidget.qml b/src/ViewWidgets/CustomCommandWidget.qml
index d955436483..149a87200b 100644
--- a/src/ViewWidgets/CustomCommandWidget.qml
+++ b/src/ViewWidgets/CustomCommandWidget.qml
@@ -24,87 +24,89 @@ along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
 /// @file
 ///     @author Don Gagne <don@thegagnes.com>
 
-import QtQuick 2.2
-
-import QGroundControl.Palette 1.0
-import QGroundControl.Controls 1.0
-import QGroundControl.Controllers 1.0
-
-ViewWidget {
-	connectedComponent: commandComponenet
-
-	Component {
-		id: commandComponenet
-
-        Item {
-            id: bogusFactPanel
-
-            // We aren't really using the controller in a FactPanel for this usage so we
-            // pass in a bogus item to keep it from getting upset.
-            CustomCommandWidgetController { id: controller; factPanel: bogusFactPanel }
-
-            Item {
-                anchors.top:    parent.top
-                anchors.bottom: buttonRow.top
-                width:          parent.width
-
-                QGCLabel {
-                    id:             errorOutput
-                    anchors.fill:   parent
-                    wrapMode:       Text.WordWrap
-                    visible:        false
-                }
-
-                QGCLabel {
-                    id:             warning
-                    anchors.fill:   parent
-                    wrapMode:       Text.WordWrap
-                    visible:        !controller.customQmlFile
-                    text:           "You can create your own commands and parameter editing user interface in this widget. " +
-                                        "You do this by providing your own Qml file. " +
-                                        "This support is a work in progress and the details may change somewhat in the future. " +
-                                        "By using this feature you are connecting directly to the internals of QGroundControl. " +
-                                        "Doing so incorrectly may cause instability both in QGroundControl and/or your vehicle. " +
-                                        "So make sure to test your changes thoroughly before using them in flight.\n\n" +
-                                        "Click 'Select Qml file' to provide your custom qml file.\n" +
-                                        "Click 'Clear Qml file' to reset to none.\n" +
-                                        "Example usage: http://www.qgroundcontrol.org/custom_command_qml_widgets"
-                }
-
-                Loader {
-                    id: loader
-                    anchors.fill:   parent
-                    source:         controller.customQmlFile
-                    visible:        controller.customQmlFile
-
-                    onStatusChanged: {
-                        if (loader.status == Loader.Error) {
-                            if (sourceComponent.status == Component.Error) {
-                                errorOutput.text = sourceComponent.errorString()
-                                errorOutput.visible = true
-                                loader.visible = false
-                            }
+import QtQuick                  2.5
+import QtQuick.Controls         1.2
+import QtQuick.Controls.Styles  1.2
+import QtQuick.Dialogs          1.2
+
+import QGroundControl.Palette       1.0
+import QGroundControl.Controls      1.0
+import QGroundControl.Controllers   1.0
+import QGroundControl.ScreenTools   1.0
+
+QGCView {
+    viewPanel:  panel
+
+    property real   _margins:    ScreenTools.defaultFontPixelHeight
+    property string _emptyText:  "<p>" +
+        "You can create your own commands and parameter editing user interface in this widget. " +
+        "You do this by providing your own Qml file. " +
+        "This support is a work in progress and the details may change somewhat in the future. " +
+        "By using this feature you are connecting directly to the internals of QGroundControl. " +
+        "Doing so incorrectly may cause instability both in QGroundControl and/or your vehicle. " +
+        "So make sure to test your changes thoroughly before using them in flight.</p>" +
+        "<p>Click 'Load Custom Qml file' to provide your custom qml file.</p>" +
+        "<p>Click 'Reset' to reset to none.</p>" +
+        "<p>Example usage: http://www.qgroundcontrol.org/custom_command_qml_widgets</p>"
+
+    QGCPalette                      { id: qgcPal; colorGroupEnabled: enabled }
+    CustomCommandWidgetController   { id: controller; factPanel: panel }
+
+    QGCViewPanel {
+        id:             panel
+        anchors.fill:   parent
+        Rectangle {
+            anchors.fill:   parent
+            color:          qgcPal.window
+            QGCLabel {
+                id:                 textOutput
+                anchors.margins:    _margins
+                anchors.left:       parent.left
+                anchors.right:      parent.right
+                anchors.top:        parent.top
+                anchors.bottom:     buttonRow.top
+                wrapMode:           Text.WordWrap
+                textFormat:         Text.RichText
+                text:               _emptyText
+                visible:            !loader.visible
+            }
+            Loader {
+                id:                 loader
+                anchors.margins:    _margins
+                anchors.left:       parent.left
+                anchors.right:      parent.right
+                anchors.top:        parent.top
+                anchors.bottom:     buttonRow.top
+                source:             controller.customQmlFile
+                visible:            false
+                onStatusChanged: {
+                    loader.visible = true
+                    if (loader.status == Loader.Error) {
+                        if (sourceComponent.status == Component.Error) {
+                            textOutput.text = sourceComponent.errorString()
+                            loader.visible = false
                         }
                     }
                 }
             }
-
             Row {
-                id:             buttonRow
-                spacing:        10
-                anchors.bottom: parent.bottom
-
+                id:                 buttonRow
+                spacing:            ScreenTools.defaultFontPixelWidth
+                anchors.margins:    _margins
+                anchors.bottom:     parent.bottom
+                anchors.horizontalCenter: parent.horizontalCenter
                 QGCButton {
-                    text:       "Select Qml file..."
+                    text:       "Load Custom Qml file..."
+                    width:      ScreenTools.defaultFontPixelWidth * 22
                     onClicked:  controller.selectQmlFile()
                 }
-
                 QGCButton {
-                    text:       "Clear Qml file"
-
+                    text:       "Reset"
+                    width:      ScreenTools.defaultFontPixelWidth * 22
                     onClicked: {
-                        errorOutput.visible = false
                         controller.clearQmlFile()
+                        loader.visible  = false
+                        textOutput.text = _emptyText
                     }
                 }
             }
diff --git a/src/ViewWidgets/CustomCommandWidgetController.cc b/src/ViewWidgets/CustomCommandWidgetController.cc
index 24e1a06f10..38d48bf54b 100644
--- a/src/ViewWidgets/CustomCommandWidgetController.cc
+++ b/src/ViewWidgets/CustomCommandWidgetController.cc
@@ -36,32 +36,30 @@ const char* CustomCommandWidgetController::_settingsKey = "CustomCommand.QmlFile
 CustomCommandWidgetController::CustomCommandWidgetController(void) :
 	_uas(NULL)
 {
-    _uas = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()->uas();
-    Q_ASSERT(_uas);
-    
+    if(qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()) {
+        _uas = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()->uas();
+    }
     QSettings settings;
     _customQmlFile = settings.value(_settingsKey).toString();
+    connect(qgcApp()->toolbox()->multiVehicleManager(), &MultiVehicleManager::activeVehicleChanged, this, &CustomCommandWidgetController::_activeVehicleChanged);
 }
 
 void CustomCommandWidgetController::sendCommand(int commandId, QVariant componentId, QVariant confirm, QVariant param1, QVariant param2, QVariant param3, QVariant param4, QVariant param5, QVariant param6, QVariant param7)
 {
-    Q_UNUSED(commandId);
-    Q_UNUSED(componentId);
-    Q_UNUSED(confirm);
-    Q_UNUSED(param1);
-    Q_UNUSED(param2);
-    Q_UNUSED(param3);
-    Q_UNUSED(param4);
-    Q_UNUSED(param5);
-    Q_UNUSED(param6);
-    Q_UNUSED(param7);
-    _uas->executeCommand((MAV_CMD)commandId, confirm.toInt(), param1.toFloat(), param2.toFloat(), param3.toFloat(), param4.toFloat(), param5.toFloat(), param6.toFloat(), param7.toFloat(), componentId.toInt());
+    if(_uas) {
+        _uas->executeCommand((MAV_CMD)commandId, confirm.toInt(), param1.toFloat(), param2.toFloat(), param3.toFloat(), param4.toFloat(), param5.toFloat(), param6.toFloat(), param7.toFloat(), componentId.toInt());
+    }
+}
+
+void CustomCommandWidgetController::_activeVehicleChanged(Vehicle* activeVehicle)
+{
+    if(activeVehicle)
+        _uas = activeVehicle->uas();
 }
 
 void CustomCommandWidgetController::selectQmlFile(void)
 {
     QSettings settings;
-    
     QString qmlFile = QGCFileDialog::getOpenFileName(NULL, "Select custom Qml file", QString(), "Qml files (*.qml)");
     if (qmlFile.isEmpty()) {
         _customQmlFile.clear();
@@ -71,7 +69,6 @@ void CustomCommandWidgetController::selectQmlFile(void)
 		_customQmlFile = url.toString();
         settings.setValue(_settingsKey, _customQmlFile);
     }
-    
     emit customQmlFileChanged(_customQmlFile);
 }
 
diff --git a/src/ViewWidgets/CustomCommandWidgetController.h b/src/ViewWidgets/CustomCommandWidgetController.h
index 63a67a2b8b..0427747f33 100644
--- a/src/ViewWidgets/CustomCommandWidgetController.h
+++ b/src/ViewWidgets/CustomCommandWidgetController.h
@@ -39,17 +39,20 @@ public:
     
     Q_PROPERTY(QString customQmlFile MEMBER _customQmlFile NOTIFY customQmlFileChanged)
 	
-	Q_INVOKABLE void sendCommand(int commandId, QVariant componentId, QVariant confirm, QVariant param1, QVariant param2, QVariant param3, QVariant param4, QVariant param5, QVariant param6, QVariant param7);
-    Q_INVOKABLE void selectQmlFile(void);
-    Q_INVOKABLE void clearQmlFile(void);
+    Q_INVOKABLE void sendCommand    (int commandId, QVariant componentId, QVariant confirm, QVariant param1, QVariant param2, QVariant param3, QVariant param4, QVariant param5, QVariant param6, QVariant param7);
+    Q_INVOKABLE void selectQmlFile  (void);
+    Q_INVOKABLE void clearQmlFile   (void);
     
 signals:
-    void customQmlFileChanged(const QString& customQmlFile);
-	
+    void customQmlFileChanged   (const QString& customQmlFile);
+
+private slots:
+    void _activeVehicleChanged  (Vehicle* activeVehicle);
+
 private:
 	UASInterface*       _uas;
     QString             _customQmlFile;
     static const char*  _settingsKey;
 };
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/comm/LinkInterface.h b/src/comm/LinkInterface.h
index b2b18d2e91..cb5c7c3aa0 100644
--- a/src/comm/LinkInterface.h
+++ b/src/comm/LinkInterface.h
@@ -101,6 +101,14 @@ public:
     /// @return true: This link is replaying a log file, false: Normal two-way communication link
     virtual bool isLogReplay(void) { return false; }
 
+    /**
+     * @Enable/Disable data rate collection
+     **/
+    void enableDataRate(bool enable)
+    {
+        _enableRateCollection = enable;
+    }
+
     /**
      * @Brief Get the current incoming data rate.
      *
@@ -192,6 +200,7 @@ protected:
         QThread(0)
         , _mavlinkChannelSet(false)
         , _active(false)
+        , _enableRateCollection(false)
     {
         // Initialize everything for the data rate calculation buffers.
         _inDataIndex  = 0;
@@ -211,7 +220,8 @@ protected:
     ///     @param byteCount Number of bytes received
     ///     @param time Time in ms send occured
     void _logInputDataRate(quint64 byteCount, qint64 time) {
-        _logDataRateToBuffer(_inDataWriteAmounts, _inDataWriteTimes, &_inDataIndex, byteCount, time);
+        if(_enableRateCollection)
+            _logDataRateToBuffer(_inDataWriteAmounts, _inDataWriteTimes, &_inDataIndex, byteCount, time);
     }
     
     /// This function logs the send times and amounts of datas for output. Data is used for calculating
@@ -219,7 +229,8 @@ protected:
     ///     @param byteCount Number of bytes sent
     ///     @param time Time in ms receive occured
     void _logOutputDataRate(quint64 byteCount, qint64 time) {
-        _logDataRateToBuffer(_outDataWriteAmounts, _outDataWriteTimes, &_outDataIndex, byteCount, time);
+        if(_enableRateCollection)
+            _logDataRateToBuffer(_outDataWriteAmounts, _outDataWriteTimes, &_outDataIndex, byteCount, time);
     }
     
 protected slots:
@@ -354,6 +365,7 @@ private:
     mutable QMutex _dataRateMutex; // Mutex for accessing the data rate member variables
 
     bool _active;       ///< true: link is actively receiving mavlink messages
+    bool _enableRateCollection;
 };
 
 typedef QSharedPointer<LinkInterface> SharedLinkInterface;
diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc
index 61bdcb87af..c3cedf5f1b 100644
--- a/src/comm/UDPLink.cc
+++ b/src/comm/UDPLink.cc
@@ -99,8 +99,6 @@ UDPLink::UDPLink(UDPConfiguration* config)
     // We're doing it wrong - because the Qt folks got the API wrong:
     // http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
     moveToThread(this);
-
-    //qDebug() << "UDP Created " << _config->name();
 }
 
 UDPLink::~UDPLink()
@@ -140,7 +138,7 @@ void UDPLink::run()
                 if(!_running)
                     break;
                 //-- Settle down (it gets here if there is nothing to read or write)
-                this->msleep(5);
+                _socket->waitForReadyRead(5);
             }
         } else {
             exec();
-- 
GitLab