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() + } + } +}