diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 7555cd38f129aada6df5dc73a9db9065dcd5de75..fded1e00dee298b48229b0bf51a7198408f1d545 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -9,10 +9,11 @@
src/ui/toolbar/GPSRTKIndicator.qml
src/ui/toolbar/MessageIndicator.qml
src/ui/toolbar/ModeIndicator.qml
- src/ui/toolbar/VTOLModeIndicator.qml
+ src/ui/toolbar/VTOLModeIndicator.qml
src/ui/toolbar/RCRSSIIndicator.qml
src/ui/toolbar/TelemetryRSSIIndicator.qml
src/ui/toolbar/JoystickIndicator.qml
+ src/ui/toolbar/LinkIndicator.qml
src/PlanView/CorridorScanEditor.qml
@@ -126,7 +127,7 @@
src/QmlControls/SliderSwitch.qml
src/QmlControls/SubMenuButton.qml
src/PlanView/SurveyMapVisual.qml
- src/PlanView/TransectStyleComplexItemStats.qml
+ src/PlanView/TransectStyleComplexItemStats.qml
src/QmlControls/ToolStrip.qml
src/QmlControls/VehicleRotationCal.qml
src/QmlControls/VehicleSummaryRow.qml
@@ -139,7 +140,7 @@
src/FactSystem/FactControls/FactTextField.qml
src/FactSystem/FactControls/FactTextFieldGrid.qml
src/FactSystem/FactControls/FactTextFieldRow.qml
- src/FactSystem/FactControls/FactValueSlider.qml
+ src/FactSystem/FactControls/FactValueSlider.qml
src/FactSystem/FactControls/qmldir
src/FlightDisplay/FlightDisplayView.qml
src/FlightDisplay/FlightDisplayViewMap.qml
@@ -225,10 +226,10 @@
src/comm/USBBoardInfo.json
src/Vehicle/BatteryFact.json
src/Vehicle/ClockFact.json
- src/Vehicle/DistanceSensorFact.json
+ src/Vehicle/DistanceSensorFact.json
src/Vehicle/GPSFact.json
src/Vehicle/GPSRTKFact.json
- src/Vehicle/SetpointFact.json
+ src/Vehicle/SetpointFact.json
src/Vehicle/SubmarineFact.json
src/Vehicle/TemperatureFact.json
src/Vehicle/VehicleFact.json
diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc
index 39b5c7689572c3571fdec8d3777d9ae26b2698d0..344748ac96bf8aac2659006ad708564f3f43d3ed 100644
--- a/src/FirmwarePlugin/FirmwarePlugin.cc
+++ b/src/FirmwarePlugin/FirmwarePlugin.cc
@@ -344,6 +344,7 @@ const QVariantList &FirmwarePlugin::toolBarIndicators(const Vehicle* vehicle)
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/VTOLModeIndicator.qml")));
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ArmedIndicator.qml")));
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSRTKIndicator.qml")));
+ _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/LinkIndicator.qml")));
}
return _toolBarIndicatorList;
}
diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc
index 128ab8b45a16258df0b0eb512e9db030ba1c44df..7473bc8189242db0776f5cb1f52a9a15902373fb 100644
--- a/src/Vehicle/Vehicle.cc
+++ b/src/Vehicle/Vehicle.cc
@@ -1683,6 +1683,7 @@ void Vehicle::_sendMessageOnLink(LinkInterface* link, mavlink_message_t message)
void Vehicle::_updatePriorityLink(void)
{
+ emit linkNamesChanged();
LinkInterface* newPriorityLink = NULL;
// This routine specifically does not clear _priorityLink when there are no links remaining.
@@ -1747,6 +1748,7 @@ void Vehicle::_updatePriorityLink(void)
_priorityLink = _toolbox->linkManager()->sharedLinkInterfacePointerForLink(newPriorityLink);
_updateHighLatencyLink();
+ emit priorityLinkNameChanged(_priorityLink->getName());
}
void Vehicle::_updateAttitude(UASInterface*, double roll, double pitch, double yaw, quint64)
@@ -2088,6 +2090,44 @@ void Vehicle::setFlightMode(const QString& flightMode)
}
}
+QStringList Vehicle::linkNames(void) const
+{
+ QStringList names;
+
+ for (int i=0; i<_links.count(); i++) {
+ names += _links[i]->getName();
+ }
+ return names;
+}
+
+QString Vehicle::priorityLinkName(void) const
+{
+ return _priorityLink->getName();
+}
+
+void Vehicle::setPriorityLinkByName(const QString& priorityLinkName)
+{
+ if (priorityLinkName == _priorityLink->getName()) {
+ // The link did not change
+ return;
+ }
+
+ LinkInterface* newPriorityLink = NULL;
+
+
+ for (int i=0; i<_links.count(); i++) {
+ if (_links[i]->getName() == priorityLinkName) {
+ newPriorityLink = _links[i];
+ }
+ }
+
+ if (newPriorityLink) {
+ _priorityLink = _toolbox->linkManager()->sharedLinkInterfacePointerForLink(newPriorityLink);
+ _updateHighLatencyLink();
+ emit priorityLinkNameChanged(_priorityLink->getName());
+ }
+}
+
bool Vehicle::hilMode(void)
{
return _base_mode & MAV_MODE_FLAG_HIL_ENABLED;
diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h
index 1323f6fb2d687255da10da365ce098a99173b6fa..4c8c5d3b78adcf7bf3b75110cf644e5991580bf0 100644
--- a/src/Vehicle/Vehicle.h
+++ b/src/Vehicle/Vehicle.h
@@ -493,6 +493,8 @@ public:
Q_PROPERTY(bool vtolInFwdFlight READ vtolInFwdFlight WRITE setVtolInFwdFlight NOTIFY vtolInFwdFlightChanged)
Q_PROPERTY(bool highLatencyLink READ highLatencyLink NOTIFY highLatencyLinkChanged)
Q_PROPERTY(bool supportsTerrainFrame READ supportsTerrainFrame NOTIFY firmwareTypeChanged)
+ Q_PROPERTY(QStringList linkNames READ linkNames NOTIFY linkNamesChanged)
+ Q_PROPERTY(QString priorityLinkName READ priorityLinkName WRITE setPriorityLinkByName NOTIFY priorityLinkNameChanged)
// Vehicle state used for guided control
Q_PROPERTY(bool flying READ flying NOTIFY flyingChanged) ///< Vehicle is flying
@@ -692,6 +694,10 @@ public:
QString flightMode(void) const;
void setFlightMode(const QString& flightMode);
+ QStringList linkNames(void) const;
+ QString priorityLinkName(void) const;
+ void setPriorityLinkByName(const QString& priorityLinkName);
+
bool hilMode(void);
void setHilMode(bool hilMode);
@@ -943,6 +949,8 @@ signals:
void capabilityBitsChanged(uint64_t capabilityBits);
void toolBarIndicatorsChanged(void);
void highLatencyLinkChanged(bool highLatencyLink);
+ void linkNamesChanged(void);
+ void priorityLinkNameChanged(const QString& priorityLinkName);
void messagesReceivedChanged ();
void messagesSentChanged ();
diff --git a/src/ui/toolbar/LinkIndicator.qml b/src/ui/toolbar/LinkIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3c12b52fb0dd746804bf0b85d04a89a259dbd4b1
--- /dev/null
+++ b/src/ui/toolbar/LinkIndicator.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+ *
+ * (c) 2009-2016 QGROUNDCONTROL PROJECT
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+
+import QGroundControl 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.MultiVehicleManager 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.Palette 1.0
+
+//-------------------------------------------------------------------------
+//-- Link Indicator
+Item {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ width: priorityLinkSelector.width
+
+ property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
+
+ QGCLabel {
+ id: priorityLinkSelector
+ text: _activeVehicle ? _activeVehicle.priorityLinkName : qsTr("N/A", "No data to display")
+ font.pointSize: ScreenTools.mediumFontPointSize
+ color: qgcPal.buttonText
+ anchors.verticalCenter: parent.verticalCenter
+ Menu {
+ id: linkSelectionMenu
+ }
+ Component {
+ id: linkSelectionMenuItemComponent
+ MenuItem {
+ onTriggered: _activeVehicle.priorityLinkName = text
+ }
+ }
+ property var linkSelectionMenuItems: []
+ function updatelinkSelectionMenu() {
+ if (_activeVehicle) {
+ // Remove old menu items
+ for (var i = 0; i < linkSelectionMenuItems.length; i++) {
+ linkSelectionMenu.removeItem(linkSelectionMenuItems[i])
+ }
+ linkSelectionMenuItems.length = 0
+ // Add new items
+ for (var i = 0; i < _activeVehicle.linkNames.length; i++) {
+ var menuItem = linkSelectionMenuItemComponent.createObject(null, { "text": _activeVehicle.linkNames[i] })
+ linkSelectionMenuItems.push(menuItem)
+ linkSelectionMenu.insertItem(i, menuItem)
+ }
+ }
+ }
+ Component.onCompleted: priorityLinkSelector.updatelinkSelectionMenu()
+ Connections {
+ target: QGroundControl.multiVehicleManager
+ onActiveVehicleChanged: priorityLinkSelector.updatelinkSelectionMenu()
+ }
+ Connections {
+ target: _activeVehicle
+ onLinkNamesChanged: priorityLinkSelector.updatelinkSelectionMenu()
+ }
+ MouseArea {
+ visible: _activeVehicle
+ anchors.fill: parent
+ onClicked: linkSelectionMenu.popup()
+ }
+ }
+}