From 1ac6cd32e1b147507398963777bf4ece9ca4dd8e Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 23 Mar 2018 10:14:09 -0700 Subject: [PATCH] FW Landing Glide Slope support --- .../FWLandingPattern.FactMetaData.json | 8 +- .../FixedWingLandingComplexItem.cc | 98 ++++++++++++++----- .../FixedWingLandingComplexItem.h | 70 +++++++------ src/PlanView/FWLandingPatternEditor.qml | 75 +++++--------- 4 files changed, 138 insertions(+), 113 deletions(-) diff --git a/src/MissionManager/FWLandingPattern.FactMetaData.json b/src/MissionManager/FWLandingPattern.FactMetaData.json index ca77c066c..6d1a9a16b 100644 --- a/src/MissionManager/FWLandingPattern.FactMetaData.json +++ b/src/MissionManager/FWLandingPattern.FactMetaData.json @@ -44,12 +44,12 @@ "defaultValue": 0.0 }, { - "name": "DescentRate", - "shortDescription": "Descent rate between landing and loiter altitude.", + "name": "GlideSlope", + "shortDescription": "The glide slope between the loiter and landing point.", "type": "double", - "units": "%", + "units": "deg", "min": 0.1, - "max": 100, + "max": 90, "decimalPlaces": 1, "defaultValue": 12.0 } diff --git a/src/MissionManager/FixedWingLandingComplexItem.cc b/src/MissionManager/FixedWingLandingComplexItem.cc index e81cb512a..d11bd6dae 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.cc +++ b/src/MissionManager/FixedWingLandingComplexItem.cc @@ -25,15 +25,19 @@ const char* FixedWingLandingComplexItem::landingHeadingName = "LandingHead const char* FixedWingLandingComplexItem::loiterAltitudeName = "LoiterAltitude"; const char* FixedWingLandingComplexItem::loiterRadiusName = "LoiterRadius"; const char* FixedWingLandingComplexItem::landingAltitudeName = "LandingAltitude"; -const char* FixedWingLandingComplexItem::fallRateName = "DescentRate"; +const char* FixedWingLandingComplexItem::glideSlopeName = "GlideSlope"; const char* FixedWingLandingComplexItem::_jsonLoiterCoordinateKey = "loiterCoordinate"; const char* FixedWingLandingComplexItem::_jsonLoiterRadiusKey = "loiterRadius"; const char* FixedWingLandingComplexItem::_jsonLoiterClockwiseKey = "loiterClockwise"; -const char* FixedWingLandingComplexItem::_jsonLoiterAltitudeRelativeKey = "loiterAltitudeRelative"; const char* FixedWingLandingComplexItem::_jsonLandingCoordinateKey = "landCoordinate"; -const char* FixedWingLandingComplexItem::_jsonLandingAltitudeRelativeKey = "landAltitudeRelative"; +const char* FixedWingLandingComplexItem::_jsonValueSetIsDistanceKey = "valueSetIsDistance"; +const char* FixedWingLandingComplexItem::_jsonAltitudesAreRelativeKey = "altitudesAreRelative"; + +// Usage deprecated const char* FixedWingLandingComplexItem::_jsonFallRateKey = "fallRate"; +const char* FixedWingLandingComplexItem::_jsonLandingAltitudeRelativeKey = "landAltitudeRelative"; +const char* FixedWingLandingComplexItem::_jsonLoiterAltitudeRelativeKey = "loiterAltitudeRelative"; FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObject* parent) : ComplexMissionItem (vehicle, parent) @@ -47,10 +51,10 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObje , _loiterRadiusFact (_metaDataMap[loiterRadiusName]) , _landingHeadingFact (_metaDataMap[landingHeadingName]) , _landingAltitudeFact (_metaDataMap[landingAltitudeName]) - , _fallRateFact (_metaDataMap[fallRateName]) + , _glideSlopeFact (_metaDataMap[glideSlopeName]) , _loiterClockwise (true) - , _loiterAltitudeRelative (true) - , _landingAltitudeRelative (true) + , _altitudesAreRelative (true) + , _valueSetIsDistance (true) { _editorQml = "qrc:/qml/FWLandingPatternEditor.qml"; @@ -66,6 +70,8 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObje connect(this, &FixedWingLandingComplexItem::loiterCoordinateChanged, this, &FixedWingLandingComplexItem::_recalcFromCoordinateChange); connect(this, &FixedWingLandingComplexItem::landingCoordinateChanged, this, &FixedWingLandingComplexItem::_recalcFromCoordinateChange); + connect(&_glideSlopeFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_glideSlopeChanged); + connect(&_loiterAltitudeFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(&_landingAltitudeFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(&_landingDistanceFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); @@ -74,11 +80,10 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObje connect(this, &FixedWingLandingComplexItem::loiterCoordinateChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(this, &FixedWingLandingComplexItem::landingCoordinateChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(this, &FixedWingLandingComplexItem::loiterClockwiseChanged, this, &FixedWingLandingComplexItem::_setDirty); - connect(this, &FixedWingLandingComplexItem::loiterAltitudeRelativeChanged, this, &FixedWingLandingComplexItem::_setDirty); - connect(this, &FixedWingLandingComplexItem::landingAltitudeRelativeChanged, this, &FixedWingLandingComplexItem::_setDirty); + connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::_setDirty); - connect(this, &FixedWingLandingComplexItem::loiterAltitudeRelativeChanged, this, &FixedWingLandingComplexItem::coordinateHasRelativeAltitudeChanged); - connect(this, &FixedWingLandingComplexItem::landingAltitudeRelativeChanged, this, &FixedWingLandingComplexItem::exitCoordinateHasRelativeAltitudeChanged); + connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::coordinateHasRelativeAltitudeChanged); + connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::exitCoordinateHasRelativeAltitudeChanged); } int FixedWingLandingComplexItem::lastSequenceNumber(void) const @@ -99,7 +104,7 @@ void FixedWingLandingComplexItem::save(QJsonArray& missionItems) { QJsonObject saveObject; - saveObject[JsonHelper::jsonVersionKey] = 1; + saveObject[JsonHelper::jsonVersionKey] = 2; saveObject[VisualMissionItem::jsonTypeKey] = VisualMissionItem::jsonTypeComplexItemValue; saveObject[ComplexMissionItem::jsonComplexItemTypeKey] = jsonComplexItemTypeValue; @@ -116,10 +121,10 @@ void FixedWingLandingComplexItem::save(QJsonArray& missionItems) JsonHelper::saveGeoCoordinate(coordinate, true /* writeAltitude */, jsonCoordinate); saveObject[_jsonLandingCoordinateKey] = jsonCoordinate; - saveObject[_jsonLoiterRadiusKey] = _loiterRadiusFact.rawValue().toDouble(); - saveObject[_jsonLoiterClockwiseKey] = _loiterClockwise; - saveObject[_jsonLoiterAltitudeRelativeKey] = _loiterAltitudeRelative; - saveObject[_jsonLandingAltitudeRelativeKey] = _landingAltitudeRelative; + saveObject[_jsonLoiterRadiusKey] = _loiterRadiusFact.rawValue().toDouble(); + saveObject[_jsonLoiterClockwiseKey] = _loiterClockwise; + saveObject[_jsonAltitudesAreRelativeKey] = _altitudesAreRelative; + saveObject[_jsonValueSetIsDistanceKey] = _valueSetIsDistance; missionItems.append(saveObject); } @@ -142,9 +147,7 @@ bool FixedWingLandingComplexItem::load(const QJsonObject& complexObject, int seq { _jsonLoiterCoordinateKey, QJsonValue::Array, true }, { _jsonLoiterRadiusKey, QJsonValue::Double, true }, { _jsonLoiterClockwiseKey, QJsonValue::Bool, true }, - { _jsonLoiterAltitudeRelativeKey, QJsonValue::Bool, true }, { _jsonLandingCoordinateKey, QJsonValue::Array, true }, - { _jsonLandingAltitudeRelativeKey, QJsonValue::Bool, true }, }; if (!JsonHelper::validateKeys(complexObject, keyInfoList, errorString)) { return false; @@ -161,6 +164,31 @@ bool FixedWingLandingComplexItem::load(const QJsonObject& complexObject, int seq _ignoreRecalcSignals = true; + int version = complexObject[JsonHelper::jsonVersionKey].toInt(); + if (version == 1) { + bool loiterAltitudeRelative = complexObject[_jsonLoiterAltitudeRelativeKey].toBool(); + bool landingAltitudeRelative = complexObject[_jsonLandingAltitudeRelativeKey].toBool(); + if (loiterAltitudeRelative != landingAltitudeRelative) { + qgcApp()->showMessage(tr("Fixed Wing Landing Pattern: " + "Setting the loiter and landing altitudes with different settings for altitude relative is no longer supported. " + "Both have been set to altitude relative. Be sure to adjust/check your plan prior to flight.")); + _altitudesAreRelative = true; + } else { + _altitudesAreRelative = loiterAltitudeRelative; + } + } else if (version == 2) { + QList v2KeyInfoList = { + { _jsonAltitudesAreRelativeKey, QJsonValue::Bool, true }, + }; + if (!JsonHelper::validateKeys(complexObject, v2KeyInfoList, errorString)) { + return false; + } + } else { + errorString = tr("%1 complex item version %2 not supported").arg(jsonComplexItemTypeValue).arg(version); + _ignoreRecalcSignals = false; + return false; + } + QGeoCoordinate coordinate; if (!JsonHelper::loadGeoCoordinate(complexObject[_jsonLoiterCoordinateKey], true /* altitudeRequired */, coordinate, errorString)) { return false; @@ -175,9 +203,8 @@ bool FixedWingLandingComplexItem::load(const QJsonObject& complexObject, int seq _landingAltitudeFact.setRawValue(coordinate.altitude()); _loiterRadiusFact.setRawValue(complexObject[_jsonLoiterRadiusKey].toDouble()); - _loiterClockwise = complexObject[_jsonLoiterClockwiseKey].toBool(); - _loiterAltitudeRelative = complexObject[_jsonLoiterAltitudeRelativeKey].toBool(); - _landingAltitudeRelative = complexObject[_jsonLandingAltitudeRelativeKey].toBool(); + _loiterClockwise = complexObject[_jsonLoiterClockwiseKey].toBool(); + _altitudesAreRelative = complexObject[_jsonAltitudesAreRelativeKey].toBool(); _landingCoordSet = true; @@ -215,7 +242,7 @@ void FixedWingLandingComplexItem::appendMissionItems(QList& items, float loiterRadius = _loiterRadiusFact.rawValue().toDouble() * (_loiterClockwise ? 1.0 : -1.0); item = new MissionItem(seqNum++, MAV_CMD_NAV_LOITER_TO_ALT, - _loiterAltitudeRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, + _altitudesAreRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, 1.0, // Heading required = true loiterRadius, // Loiter radius 0.0, // param 3 - unused @@ -230,7 +257,7 @@ void FixedWingLandingComplexItem::appendMissionItems(QList& items, item = new MissionItem(seqNum++, MAV_CMD_NAV_LAND, - _landingAltitudeRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, + _altitudesAreRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, 0.0, 0.0, 0.0, 0.0, // param 1-4 _landingCoordinate.latitude(), _landingCoordinate.longitude(), @@ -261,6 +288,7 @@ bool FixedWingLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, V missionItemLand.param1() != 0 || missionItemLand.param2() != 0 || missionItemLand.param3() != 0 || missionItemLand.param4() == 1.0) { return false; } + MAV_FRAME landPointFrame = missionItemLand.frame(); item = visualItems->value(lastItem--); if (!item) { @@ -268,7 +296,7 @@ bool FixedWingLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, V } MissionItem& missionItemLoiter = item->missionItem(); if (missionItemLoiter.command() != MAV_CMD_NAV_LOITER_TO_ALT || - !(missionItemLoiter.frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT || missionItemLoiter.frame() == MAV_FRAME_GLOBAL) || + missionItemLoiter.frame() != landPointFrame || missionItemLoiter.param1() != 1.0 || missionItemLoiter.param3() != 0 || missionItemLoiter.param4() != 1.0) { return false; } @@ -289,14 +317,13 @@ bool FixedWingLandingComplexItem::scanForItem(QmlObjectListModel* visualItems, V complexItem->_ignoreRecalcSignals = true; - complexItem->_loiterAltitudeRelative = missionItemLoiter.frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT; + complexItem->_altitudesAreRelative = landPointFrame == MAV_FRAME_GLOBAL_RELATIVE_ALT; complexItem->_loiterRadiusFact.setRawValue(qAbs(missionItemLoiter.param2())); complexItem->_loiterClockwise = missionItemLoiter.param2() > 0; complexItem->_loiterCoordinate.setLatitude(missionItemLoiter.param5()); complexItem->_loiterCoordinate.setLongitude(missionItemLoiter.param6()); complexItem->_loiterAltitudeFact.setRawValue(missionItemLoiter.param7()); - complexItem->_landingAltitudeRelative = missionItemLand.frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT; complexItem->_landingCoordinate.setLatitude(missionItemLand.param5()); complexItem->_landingCoordinate.setLongitude(missionItemLand.param6()); complexItem->_landingAltitudeFact.setRawValue(missionItemLand.param7()); @@ -418,6 +445,7 @@ void FixedWingLandingComplexItem::_recalcFromHeadingAndDistanceChange(void) // Adjusted: // loiter // loiter tangent + // glide slope if (!_ignoreRecalcSignals && _landingCoordSet) { // These are our known values @@ -442,6 +470,7 @@ void FixedWingLandingComplexItem::_recalcFromHeadingAndDistanceChange(void) emit loiterTangentCoordinateChanged(_loiterTangentCoordinate); emit loiterCoordinateChanged(_loiterCoordinate); emit coordinateChanged(_loiterCoordinate); + _calcGlideSlope(); _ignoreRecalcSignals = false; } } @@ -467,6 +496,7 @@ void FixedWingLandingComplexItem::_recalcFromCoordinateChange(void) // loiter tangent // heading // distance + // glide slope if (!_ignoreRecalcSignals && _landingCoordSet) { // These are our known values @@ -493,6 +523,7 @@ void FixedWingLandingComplexItem::_recalcFromCoordinateChange(void) _landingHeadingFact.setRawValue(heading); _landingDistanceFact.setRawValue(landToTangentDistance); emit loiterTangentCoordinateChanged(_loiterTangentCoordinate); + _calcGlideSlope(); _ignoreRecalcSignals = false; } } @@ -519,3 +550,20 @@ void FixedWingLandingComplexItem::applyNewAltitude(double newAltitude) { _loiterAltitudeFact.setRawValue(newAltitude); } + +void FixedWingLandingComplexItem::_glideSlopeChanged(void) +{ + if (!_ignoreRecalcSignals) { + double landingAltDifference = _loiterAltitudeFact.rawValue().toDouble() - _landingAltitudeFact.rawValue().toDouble(); + double glideSlope = _glideSlopeFact.rawValue().toDouble(); + _landingDistanceFact.setRawValue(landingAltDifference / qTan(qDegreesToRadians(glideSlope))); + } +} + +void FixedWingLandingComplexItem::_calcGlideSlope(void) +{ + double landingAltDifference = _loiterAltitudeFact.rawValue().toDouble() - _landingAltitudeFact.rawValue().toDouble(); + double landingDistance = _landingDistanceFact.rawValue().toDouble(); + + _glideSlopeFact.setRawValue(qRadiansToDegrees(qAtan(landingAltDifference / landingDistance))); +} diff --git a/src/MissionManager/FixedWingLandingComplexItem.h b/src/MissionManager/FixedWingLandingComplexItem.h index 9d04c053a..c04d66f61 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.h +++ b/src/MissionManager/FixedWingLandingComplexItem.h @@ -24,26 +24,26 @@ class FixedWingLandingComplexItem : public ComplexMissionItem public: FixedWingLandingComplexItem(Vehicle* vehicle, QObject* parent = NULL); - Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT) - Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT) - Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT) - Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT) - Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT) - Q_PROPERTY(Fact* fallRate READ fallRate CONSTANT) - Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged) - Q_PROPERTY(bool loiterAltitudeRelative MEMBER _loiterAltitudeRelative NOTIFY loiterAltitudeRelativeChanged) - Q_PROPERTY(bool landingAltitudeRelative MEMBER _landingAltitudeRelative NOTIFY landingAltitudeRelativeChanged) - Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged) - Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged) - Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) - Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged) + Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT) + Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT) + Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT) + Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT) + Q_PROPERTY(bool valueSetIsDistance MEMBER _valueSetIsDistance NOTIFY valueSetIsDistanceChanged) + Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT) + Q_PROPERTY(Fact* glideSlope READ glideSlope CONSTANT) + Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged) + Q_PROPERTY(bool altitudesAreRelative MEMBER _altitudesAreRelative NOTIFY altitudesAreRelativeChanged) + Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged) + Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged) + Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) + Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged) Fact* loiterAltitude (void) { return &_loiterAltitudeFact; } Fact* loiterRadius (void) { return &_loiterRadiusFact; } Fact* landingAltitude (void) { return &_landingAltitudeFact; } Fact* landingDistance (void) { return &_landingDistanceFact; } Fact* landingHeading (void) { return &_landingHeadingFact; } - Fact* fallRate (void) { return &_fallRateFact; } + Fact* glideSlope (void) { return &_glideSlopeFact; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; } @@ -81,8 +81,8 @@ public: void appendMissionItems (QList& items, QObject* missionItemParent) final; void applyNewAltitude (double newAltitude) final; - bool coordinateHasRelativeAltitude (void) const final { return _loiterAltitudeRelative; } - bool exitCoordinateHasRelativeAltitude (void) const final { return _landingAltitudeRelative; } + bool coordinateHasRelativeAltitude (void) const final { return _altitudesAreRelative; } + bool exitCoordinateHasRelativeAltitude (void) const final { return _altitudesAreRelative; } bool exitCoordinateSameAsEntry (void) const final { return false; } void setDirty (bool dirty) final; @@ -97,7 +97,7 @@ public: static const char* loiterRadiusName; static const char* landingHeadingName; static const char* landingAltitudeName; - static const char* fallRateName; + static const char* glideSlopeName; signals: void loiterCoordinateChanged (QGeoCoordinate coordinate); @@ -105,21 +105,23 @@ signals: void landingCoordinateChanged (QGeoCoordinate coordinate); void landingCoordSetChanged (bool landingCoordSet); void loiterClockwiseChanged (bool loiterClockwise); - void loiterAltitudeRelativeChanged (bool loiterAltitudeRelative); - void landingAltitudeRelativeChanged (bool loiterAltitudeRelative); + void altitudesAreRelativeChanged (bool altitudesAreRelative); + void valueSetIsDistanceChanged (bool valueSetIsDistance); private slots: - void _recalcFromHeadingAndDistanceChange(void); - void _recalcFromCoordinateChange(void); - void _recalcFromRadiusChange(void); - void _updateLoiterCoodinateAltitudeFromFact(void); - void _updateLandingCoodinateAltitudeFromFact(void); - double _mathematicAngleToHeading(double angle); - double _headingToMathematicAngle(double heading); - void _setDirty(void); + void _recalcFromHeadingAndDistanceChange (void); + void _recalcFromCoordinateChange (void); + void _recalcFromRadiusChange (void); + void _updateLoiterCoodinateAltitudeFromFact (void); + void _updateLandingCoodinateAltitudeFromFact (void); + double _mathematicAngleToHeading (double angle); + double _headingToMathematicAngle (double heading); + void _setDirty (void); + void _glideSlopeChanged (void); private: - QPointF _rotatePoint(const QPointF& point, const QPointF& origin, double angle); + QPointF _rotatePoint (const QPointF& point, const QPointF& origin, double angle); + void _calcGlideSlope (void); int _sequenceNumber; bool _dirty; @@ -136,18 +138,22 @@ private: Fact _loiterRadiusFact; Fact _landingHeadingFact; Fact _landingAltitudeFact; - Fact _fallRateFact; + Fact _glideSlopeFact; bool _loiterClockwise; - bool _loiterAltitudeRelative; - bool _landingAltitudeRelative; + bool _altitudesAreRelative; + bool _valueSetIsDistance; static const char* _jsonLoiterCoordinateKey; static const char* _jsonLoiterRadiusKey; static const char* _jsonLoiterClockwiseKey; - static const char* _jsonLoiterAltitudeRelativeKey; static const char* _jsonLandingCoordinateKey; + static const char* _jsonValueSetIsDistanceKey; + static const char* _jsonAltitudesAreRelativeKey; + + // Only in older file formats static const char* _jsonLandingAltitudeRelativeKey; + static const char* _jsonLoiterAltitudeRelativeKey; static const char* _jsonFallRateKey; }; diff --git a/src/PlanView/FWLandingPatternEditor.qml b/src/PlanView/FWLandingPatternEditor.qml index b703e9a63..e629758d5 100644 --- a/src/PlanView/FWLandingPatternEditor.qml +++ b/src/PlanView/FWLandingPatternEditor.qml @@ -34,6 +34,8 @@ Rectangle { property real _margin: ScreenTools.defaultFontPixelWidth / 2 property real _spacer: ScreenTools.defaultFontPixelWidth / 2 + ExclusiveGroup { id: distanceGlideGroup } + Column { id: editorColumn anchors.margins: _margin @@ -58,17 +60,6 @@ Rectangle { Item { width: 1; height: _spacer } QGCCheckBox { - id: loiterAltRelative - anchors.right: parent.right - text: qsTr("Altitude relative to home") - checked: missionItem.loiterAltitudeRelative - onClicked: missionItem.loiterAltitudeRelative = checked - } - - Item { width: 1; height: _spacer } - - QGCCheckBox { - anchors.left: loiterAltRelative.left text: qsTr("Loiter clockwise") checked: missionItem.loiterClockwise onClicked: missionItem.loiterClockwise = checked @@ -98,53 +89,33 @@ Rectangle { } QGCRadioButton { - id: useLandingDistance - text: qsTr("Landing dist") - checked: !useFallRate.checked - onClicked: { - useFallRate.checked = false - missionItem.fallRate.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.landingDistance.value) - } - Layout.fillWidth: true + id: specifyLandingDistance + text: qsTr("Landing Dist") + checked: missionItem.valueSetIsDistance + exclusiveGroup: distanceGlideGroup + onClicked: missionItem.valueSetIsDistance = checked + Layout.fillWidth: true } FactTextField { - fact: missionItem.landingDistance - enabled: useLandingDistance.checked - Layout.fillWidth: true + fact: missionItem.landingDistance + enabled: specifyLandingDistance.checked + Layout.fillWidth: true } QGCRadioButton { - id: useFallRate - text: qsTr("Descent rate") - checked: !useLandingDistance.checked - onClicked: { - useLandingDistance.checked = false - missionItem.landingDistance.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.fallRate.value) - } - Layout.fillWidth: true + id: specifyGlideSlope + text: qsTr("Glide Slope") + checked: !missionItem.valueSetIsDistance + exclusiveGroup: distanceGlideGroup + onClicked: missionItem.valueSetIsDistance = checked + Layout.fillWidth: true } FactTextField { - fact: missionItem.fallRate - enabled: useFallRate.checked - Layout.fillWidth: true - } - - Connections { - target: missionItem.landingDistance - - onValueChanged: { - missionItem.fallRate.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.landingDistance.value) - } - } - - Connections { - target: missionItem.fallRate - - onValueChanged: { - missionItem.landingDistance.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.fallRate.value) - } + fact: missionItem.glideSlope + enabled: specifyGlideSlope.checked + Layout.fillWidth: true } } @@ -152,9 +123,9 @@ Rectangle { QGCCheckBox { anchors.right: parent.right - text: qsTr("Altitude relative to home") - checked: missionItem.landingAltitudeRelative - onClicked: missionItem.landingAltitudeRelative = checked + text: qsTr("Altitudes relative to home") + checked: missionItem.altitudesAreRelative + onClicked: missionItem.altitudesAreRelative = checked } } -- 2.22.0