diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index f6e741bfe1ccb35c662e71fdf80427fbe8b3b467..d2f29f0c2466096cb198194b945b886547f0eb69 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -48,6 +48,7 @@ src/ui/toolbar/MainToolBarIndicators.qml src/QmlControls/MissionItemEditor.qml src/QmlControls/MissionItemIndexLabel.qml + src/MissionEditor/MissionItemStatus.qml src/QmlControls/MissionCommandDialog.qml src/QmlControls/ModeSwitchDisplay.qml src/QmlControls/ParameterEditor.qml diff --git a/src/FlightMap/MapItems/MissionItemIndicator.qml b/src/FlightMap/MapItems/MissionItemIndicator.qml index 90b7046b5ee1684a7d298b32ffc95aade9db30c1..9610a4507e5ce006333eff4c851633f800e3c461 100644 --- a/src/FlightMap/MapItems/MissionItemIndicator.qml +++ b/src/FlightMap/MapItems/MissionItemIndicator.qml @@ -39,30 +39,11 @@ MapQuickItem { anchorPoint.x: sourceItem.width / 2 anchorPoint.y: sourceItem.height / 2 - Connections { - target: missionItem - - onCoordinateChanged: recalcLabel() - onRelativeAltitudeChanged: recalcLabel() - } - - Component.onCompleted: recalcLabel() - - function recalcLabel() { - var label = Math.round(object.coordinate.altitude) - if (!object.relativeAltitude) { - label = "=" + label - } - if (object.homePosition) { - label = "H" + label - } - _label.label = label - } - sourceItem: MissionItemIndexLabel { id: _label isCurrentItem: missionItem.isCurrentItem + label: missionItem.sequenceNumber onClicked: _item.clicked() } } diff --git a/src/FlightMap/MapItems/MissionItemView.qml b/src/FlightMap/MapItems/MissionItemView.qml index 24c4b58951fc889d70090f7f8b31e42b68a1462b..a364020a969b57c6f830b06cca6b77e93745691e 100644 --- a/src/FlightMap/MapItems/MissionItemView.qml +++ b/src/FlightMap/MapItems/MissionItemView.qml @@ -70,9 +70,6 @@ MapItemView { } } - /* - Turned off for now - // These are the non-coordinate child mission items attached to this item Row { anchors.top: parent.top @@ -90,6 +87,5 @@ MapItemView { } } } - */ } } diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml index 665dfb003fa69498510cc07b636cd955563ff0b2..eed4a7ef24fd806b2b22d4d829f93e189124d3fe 100644 --- a/src/MissionEditor/MissionEditor.qml +++ b/src/MissionEditor/MissionEditor.qml @@ -347,9 +347,6 @@ QGCView { onCommandChanged: updateItemIndicator() } - /* - Disabled for now: Not sure if they will come back - // These are the non-coordinate child mission items attached to this item Row { anchors.top: parent.top @@ -367,7 +364,6 @@ QGCView { } } } - */ } } @@ -486,16 +482,6 @@ QGCView { } } - /* - Home Position manager temporarily disable - RoundButton { - id: homePositionManagerButton - buttonImage: "/qmlimages/MapHome.svg" - //exclusiveGroup: _dropButtonsExclusiveGroup - z: QGroundControl.zOrderWidgets - } - */ - DropButton { id: syncButton dropDirection: dropRight @@ -620,48 +606,16 @@ QGCView { } } - Rectangle { + MissionItemStatus { id: waypointValuesDisplay - anchors.margins: margins + anchors.margins: ScreenTools.defaultFontPixelWidth anchors.left: parent.left anchors.bottom: parent.bottom - width: distanceLabel.width + (margins * 2) - height: valuesColumn.height + (margins * 2) - radius: ScreenTools.defaultFontPixelWidth - color: qgcPal.window - opacity: 0.80 - visible: _currentMissionItem ? _currentMissionItem.distance != -1 : false - - readonly property real margins: ScreenTools.defaultFontPixelWidth - - property real _altDifference: _currentMissionItem ? _currentMissionItem.altDifference : 0 - property real _azimuth: _currentMissionItem ? _currentMissionItem.azimuth : 0 - property real _distance: _currentMissionItem ? _currentMissionItem.distance : 0 - - Column { - id: valuesColumn - anchors.leftMargin: parent.margins - anchors.topMargin: parent.margins - anchors.left: parent.left - anchors.top: parent.top - - QGCLabel { - id: distanceLabel - color: qgcPal.text - text: "Distance: " + Math.round(waypointValuesDisplay._distance) + " meters" - } - - QGCLabel { - color: qgcPal.text - text: "Alt diff: " + Math.round(waypointValuesDisplay._altDifference) + " meters" - } - - QGCLabel { - color: qgcPal.text - text: "Azimuth: " + Math.round(waypointValuesDisplay._azimuth) - } - - } + z: QGroundControl.zOrderTopMost + currentMissionItem: _currentMissionItem + missionItems: controller.missionItems + expandedWidth: missionItemEditor.x - (ScreenTools.defaultFontPixelWidth * 2) + homePositionValid: liveHomePositionAvailable } } // FlightMap } // Item - split view container diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 9ef8d2938596b3dc352153973851ace50ed0a9f2..c22c422be9d7368ea175c6689d164d3204b1e8d4 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -341,9 +341,15 @@ void MissionController::_recalcWaypointLines(void) // both relative altitude. // No values for first item + lastCoordinateItem->setAltDifference(0.0); lastCoordinateItem->setAzimuth(0.0); lastCoordinateItem->setDistance(-1.0); + double minAltSeen = 0.0; + double maxAltSeen = 0.0; + double homePositionAltitude = homeItem->coordinate().altitude(); + minAltSeen = maxAltSeen = homeItem->coordinate().altitude(); + _waypointLines.clear(); for (int i=1; i<_missionItems->count(); i++) { @@ -353,35 +359,62 @@ void MissionController::_recalcWaypointLines(void) item->setAzimuth(0.0); item->setDistance(-1.0); - if (item->specifiesCoordinate() && !item->standaloneCoordinate()) { - if (firstCoordinateItem) { - if (item->command() == MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF) { - // The first coordinate we hit is a takeoff command so link back to home position if valid - if (homePositionValid) { - double azimuth, distance, altDifference; - - _waypointLines.append(new CoordinateVector(homeItem->coordinate(), item->coordinate())); - _calcPrevWaypointValues(homePositionValid, homeAlt, item, homeItem, &azimuth, &distance, &altDifference); - item->setAltDifference(altDifference); - item->setAzimuth(azimuth); - item->setDistance(distance); + if (item->specifiesCoordinate()) { + double absoluteAltitude = item->coordinate().altitude(); + if (item->relativeAltitude() && homePositionValid) { + absoluteAltitude += homePositionAltitude; + } + minAltSeen = std::min(minAltSeen, absoluteAltitude); + maxAltSeen = std::max(maxAltSeen, absoluteAltitude); + + if (!item->standaloneCoordinate()) { + if (firstCoordinateItem) { + if (item->command() == MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF) { + // The first coordinate we hit is a takeoff command so link back to home position if valid + if (homePositionValid) { + double azimuth, distance, altDifference; + + _waypointLines.append(new CoordinateVector(homeItem->coordinate(), item->coordinate())); + _calcPrevWaypointValues(homePositionValid, homeAlt, item, homeItem, &azimuth, &distance, &altDifference); + item->setAltDifference(altDifference); + item->setAzimuth(azimuth); + item->setDistance(distance); + } + } else { + // First coordiante is not a takeoff command, it does not link backwards to anything } - } else { - // First coordiante is not a takeoff command, it does not link backwards to anything + firstCoordinateItem = false; + } else if (!lastCoordinateItem->homePosition() || lastCoordinateItem->homePositionValid()) { + double azimuth, distance, altDifference; + + // Subsequent coordinate items link to last coordinate item. If the last coordinate item + // is an invalid home position we skip the line + _calcPrevWaypointValues(homePositionValid, homeAlt, item, lastCoordinateItem, &azimuth, &distance, &altDifference); + item->setAltDifference(altDifference); + item->setAzimuth(azimuth); + item->setDistance(distance); + _waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate())); } - firstCoordinateItem = false; - } else if (!lastCoordinateItem->homePosition() || lastCoordinateItem->homePositionValid()) { - double azimuth, distance, altDifference; - - // Subsequent coordinate items link to last coordinate item. If the last coordinate item - // is an invalid home position we skip the line - _calcPrevWaypointValues(homePositionValid, homeAlt, item, lastCoordinateItem, &azimuth, &distance, &altDifference); - item->setAltDifference(altDifference); - item->setAzimuth(azimuth); - item->setDistance(distance); - _waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate())); + lastCoordinateItem = item; + } + } + } + + // Walk the list again calculating altitude percentages + double altRange = maxAltSeen - minAltSeen; + for (int i=0; i<_missionItems->count(); i++) { + MissionItem* item = qobject_cast(_missionItems->get(i)); + + if (item->specifiesCoordinate()) { + double absoluteAltitude = item->coordinate().altitude(); + if (item->relativeAltitude() && homePositionValid) { + absoluteAltitude += homePositionAltitude; + } + if (altRange == 0.0) { + item->setAltPercent(0.0); + } else { + item->setAltPercent((absoluteAltitude - minAltSeen) / altRange); } - lastCoordinateItem = item; } } @@ -448,6 +481,11 @@ void MissionController::_initAllMissionItems(void) } homeItem->setCommand(MAV_CMD_NAV_WAYPOINT); homeItem->setFrame(MAV_FRAME_GLOBAL); + if (!homeItem->homePositionValid()) { + QGeoCoordinate homeCoord = homeItem->coordinate(); + homeCoord.setAltitude(0.0); + homeItem->setCoordinate(homeCoord); + } for (int i=0; i<_missionItems->count(); i++) { _initMissionItem(qobject_cast(_missionItems->get(i))); diff --git a/src/MissionManager/MissionItem.cc b/src/MissionManager/MissionItem.cc index c590f19a900c784d49bc9fe4106055e955c7437f..352864be05db746b9067212a4f110653cc9346f0 100644 --- a/src/MissionManager/MissionItem.cc +++ b/src/MissionManager/MissionItem.cc @@ -81,6 +81,8 @@ MissionItem::MissionItem(QObject* parent) , _dirty(false) , _sequenceNumber(0) , _isCurrentItem(false) + , _altDifference(0.0) + , _altPercent(0.0) , _azimuth(0.0) , _distance(0.0) , _homePositionSpecialCase(false) @@ -140,6 +142,7 @@ MissionItem::MissionItem(int sequenceNumber, , _sequenceNumber(sequenceNumber) , _isCurrentItem(isCurrentItem) , _altDifference(0.0) + , _altPercent(0.0) , _azimuth(0.0) , _distance(0.0) , _homePositionSpecialCase(false) @@ -198,6 +201,7 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent) , _sequenceNumber(0) , _isCurrentItem(false) , _altDifference(0.0) + , _altPercent(0.0) , _azimuth(0.0) , _distance(0.0) , _homePositionSpecialCase(false) @@ -243,6 +247,7 @@ const MissionItem& MissionItem::operator=(const MissionItem& other) setAutoContinue(other.autoContinue()); setIsCurrentItem(other._isCurrentItem); setAltDifference(other._altDifference); + setAltPercent(other._altPercent); setAzimuth(other._azimuth); setDistance(other._distance); setHomePositionSpecialCase(other._homePositionSpecialCase); @@ -734,6 +739,12 @@ void MissionItem::setAltDifference(double altDifference) emit altDifferenceChanged(_altDifference); } +void MissionItem::setAltPercent(double altPercent) +{ + _altPercent = altPercent; + emit altPercentChanged(_altPercent); +} + void MissionItem::setAzimuth(double azimuth) { _azimuth = azimuth; diff --git a/src/MissionManager/MissionItem.h b/src/MissionManager/MissionItem.h index 923054229b7df49b47aa31a85d9465eb201e524c..a0e7c832691afce9e1f66fe3c8f97d65548c52fb 100644 --- a/src/MissionManager/MissionItem.h +++ b/src/MissionManager/MissionItem.h @@ -69,6 +69,7 @@ public: const MissionItem& operator=(const MissionItem& other); Q_PROPERTY(double altDifference READ altDifference WRITE setAltDifference NOTIFY altDifferenceChanged) ///< Change in altitude from previous waypoint + Q_PROPERTY(double altPercent READ altPercent WRITE setAltPercent NOTIFY altPercentChanged) ///< Percent of total altitude change in mission altitude Q_PROPERTY(double azimuth READ azimuth WRITE setAzimuth NOTIFY azimuthChanged) ///< Azimuth to previous waypoint Q_PROPERTY(QString category READ category NOTIFY commandChanged) Q_PROPERTY(MavlinkQmlSingleton::Qml_MAV_CMD command READ command WRITE setCommand NOTIFY commandChanged) @@ -100,6 +101,7 @@ public: // Property accesors double altDifference (void) const { return _altDifference; } + double altPercent (void) const { return _altPercent; } double azimuth (void) const { return _azimuth; } QString category (void) const; MavlinkQmlSingleton::Qml_MAV_CMD command(void) const { return (MavlinkQmlSingleton::Qml_MAV_CMD)_commandFact.cookedValue().toInt(); }; @@ -139,9 +141,10 @@ public: void setHomePositionValid(bool homePositionValid); void setHomePositionSpecialCase(bool homePositionSpecialCase) { _homePositionSpecialCase = homePositionSpecialCase; } - void setAltDifference(double altDifference); - void setAzimuth(double azimuth); - void setDistance(double distance); + void setAltDifference (double altDifference); + void setAltPercent (double altPercent); + void setAzimuth (double azimuth); + void setDistance (double distance); // C++ only methods @@ -180,6 +183,7 @@ public slots: signals: void altDifferenceChanged (double altDifference); + void altPercentChanged (double altPercent); void azimuthChanged (double azimuth); void commandChanged (MavlinkQmlSingleton::Qml_MAV_CMD command); void coordinateChanged (const QGeoCoordinate& coordinate); @@ -220,6 +224,7 @@ private: int _sequenceNumber; bool _isCurrentItem; double _altDifference; ///< Difference in altitude from previous waypoint + double _altPercent; ///< Percent of total altitude change in mission double _azimuth; ///< Azimuth to previous waypoint double _distance; ///< Distance to previous waypoint bool _homePositionSpecialCase; ///< true: This item is being used as a ui home position indicator diff --git a/src/QmlControls/MissionItemIndexLabel.qml b/src/QmlControls/MissionItemIndexLabel.qml index 366467eeb4850f1787e506993eb6e2f335390ca6..c56ff939b9509643fb659aa0d35dbbd535ce2f77 100644 --- a/src/QmlControls/MissionItemIndexLabel.qml +++ b/src/QmlControls/MissionItemIndexLabel.qml @@ -1,4 +1,4 @@ -import QtQuick 2.2 +import QtQuick 2.5 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 @@ -8,31 +8,33 @@ import QGroundControl.Palette 1.0 Rectangle { property alias label: _label.text property bool isCurrentItem: false + property bool small: false signal clicked - readonly property real _margin: ScreenTools.defaultFontPixelWidth / 4 - - QGCPalette { id: qgcPal } - - width: _label.width + (_margin * 2) - height: _label.height + (_margin * 2) - radius: _margin - border.width: 1 + width: _width + height: _width + radius: _width / 2 + border.width: small ? 1 : 2 border.color: "white" color: isCurrentItem ? "green" : qgcPal.mapButtonHighlight + property real _width: small ? ScreenTools.smallFontPixelSize * 1.5 : ScreenTools.mediumFontPixelSize * 1.5 + + QGCPalette { id: qgcPal } + MouseArea { - anchors.fill: parent - onClicked: parent.clicked() + anchors.fill: parent + + onClicked: parent.clicked() } QGCLabel { id: _label - anchors.margins: _margin - anchors.left: parent.left - anchors.top: parent.top + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter color: "white" - font.pixelSize: ScreenTools.defaultFontPixelSize + font.pixelSize: small ? ScreenTools.smallFontPixelSize : ScreenTools.mediumFontPixelSize } } diff --git a/src/QmlControls/QGroundControl.Controls.qmldir b/src/QmlControls/QGroundControl.Controls.qmldir index d7a57e4e7099f924e61a81bb51b5817d9af972ac..29b6e6f797adb7bcb2fae4997251815f37d5c2eb 100644 --- a/src/QmlControls/QGroundControl.Controls.qmldir +++ b/src/QmlControls/QGroundControl.Controls.qmldir @@ -9,6 +9,7 @@ MainToolBar 1.0 MainToolBar.qml MissionCommandDialog 1.0 MissionCommandDialog.qml MissionItemEditor 1.0 MissionItemEditor.qml MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml +MissionItemStatus 1.0 MissionItemStatus.qml ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml ParameterEditor 1.0 ParameterEditor.qml ParameterEditorDialog 1.0 ParameterEditorDialog.qml diff --git a/src/QmlControls/ScreenTools.qml b/src/QmlControls/ScreenTools.qml index ba0d959174f0bc74eb8c0378a850ca0029aa059b..7dd248240508dec2a9a6fd377549016ab46b08cf 100644 --- a/src/QmlControls/ScreenTools.qml +++ b/src/QmlControls/ScreenTools.qml @@ -13,6 +13,8 @@ Item { readonly property real defaultFontPixelHeight: defaultFontPixelSize readonly property real defaultFontPixelWidth: _textMeasure.fontWidth readonly property real smallFontPixelSize: defaultFontPixelSize * ScreenToolsController.smallFontPixelSizeRatio + readonly property real smallFontPixelHeight: smallFontPixelSize + readonly property real smallFontPixelWidth: defaultFontPixelWidth * ScreenToolsController.smallFontPixelSizeRatio // To proportionally scale fonts