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