diff --git a/src/MissionManager/FWLandingPattern.FactMetaData.json b/src/MissionManager/FWLandingPattern.FactMetaData.json index 5605343e594a4341f131e76b659b7013ea4ba92c..1970cdbdf99856e0296c60f3f166c080af44ed3f 100644 --- a/src/MissionManager/FWLandingPattern.FactMetaData.json +++ b/src/MissionManager/FWLandingPattern.FactMetaData.json @@ -51,7 +51,13 @@ "min": 0.1, "max": 90, "decimalPlaces": 1, - "defaultValue": 12.0 + "defaultValue": 6.0 +}, +{ + "name": "ValueSetIsDistance", + "shortDescription": "Value controller loiter point is distance", + "type": "bool", + "defaultValue": false }, { "name": "StopTakingPhotos", diff --git a/src/MissionManager/FWLandingPatternTest.cc b/src/MissionManager/FWLandingPatternTest.cc index 5d8bec72181593928b94d0baed2cb27fa71af0a3..aa4399e5abb1d9e06bc4ec3c147af551717e58ea 100644 --- a/src/MissionManager/FWLandingPatternTest.cc +++ b/src/MissionManager/FWLandingPatternTest.cc @@ -149,7 +149,8 @@ void FWLandingPatternTest::_testDirty(void) << _fwItem->landingDistance() << _fwItem->glideSlope() << _fwItem->stopTakingPhotos() - << _fwItem->stopTakingVideo(); + << _fwItem->stopTakingVideo() + << _fwItem->valueSetIsDistance(); for(Fact* fact: rgFacts) { qDebug() << fact->name(); QVERIFY(!_fwItem->dirty()); @@ -167,8 +168,7 @@ void FWLandingPatternTest::_testDirty(void) // These bool properties should set dirty when changed QList rgBoolNames; - rgBoolNames << "valueSetIsDistance" - << "loiterClockwise" + rgBoolNames << "loiterClockwise" << "altitudesAreRelative"; const QMetaObject* metaObject = _fwItem->metaObject(); for(const char* boolName: rgBoolNames) { @@ -223,16 +223,16 @@ void FWLandingPatternTest::_validateItem(FixedWingLandingComplexItem* newItem) QVERIFY(fuzzyCompareLatLon(newItem->loiterTangentCoordinate(), _fwItem->loiterTangentCoordinate())); QVERIFY(fuzzyCompareLatLon(newItem->landingCoordinate(), _fwItem->landingCoordinate())); - QCOMPARE(newItem->stopTakingPhotos()->rawValue().toBool(), _fwItem->stopTakingPhotos()->rawValue().toBool()); - QCOMPARE(newItem->stopTakingVideo()->rawValue().toBool(), _fwItem->stopTakingVideo()->rawValue().toBool()); - QCOMPARE(newItem->loiterAltitude()->rawValue().toInt(), _fwItem->loiterAltitude()->rawValue().toInt()); - QCOMPARE(newItem->loiterRadius()->rawValue().toInt(), _fwItem->loiterRadius()->rawValue().toInt()); - QCOMPARE(newItem->landingAltitude()->rawValue().toInt(), _fwItem->landingAltitude()->rawValue().toInt()); - QCOMPARE(newItem->landingHeading()->rawValue().toInt(), _fwItem->landingHeading()->rawValue().toInt()); - QCOMPARE(newItem->landingDistance()->rawValue().toInt(), _fwItem->landingDistance()->rawValue().toInt()); - QCOMPARE(newItem->glideSlope()->rawValue().toInt(), _fwItem->glideSlope()->rawValue().toInt()); - QCOMPARE(newItem->_valueSetIsDistance, _fwItem->_valueSetIsDistance); - QCOMPARE(newItem->_loiterClockwise, _fwItem->_loiterClockwise); - QCOMPARE(newItem->_altitudesAreRelative, _fwItem->_altitudesAreRelative); - QCOMPARE(newItem->_landingCoordSet, _fwItem->_landingCoordSet); + QCOMPARE(newItem->stopTakingPhotos()->rawValue().toBool(), _fwItem->stopTakingPhotos()->rawValue().toBool()); + QCOMPARE(newItem->stopTakingVideo()->rawValue().toBool(), _fwItem->stopTakingVideo()->rawValue().toBool()); + QCOMPARE(newItem->loiterAltitude()->rawValue().toInt(), _fwItem->loiterAltitude()->rawValue().toInt()); + QCOMPARE(newItem->loiterRadius()->rawValue().toInt(), _fwItem->loiterRadius()->rawValue().toInt()); + QCOMPARE(newItem->landingAltitude()->rawValue().toInt(), _fwItem->landingAltitude()->rawValue().toInt()); + QCOMPARE(newItem->landingHeading()->rawValue().toInt(), _fwItem->landingHeading()->rawValue().toInt()); + QCOMPARE(newItem->landingDistance()->rawValue().toInt(), _fwItem->landingDistance()->rawValue().toInt()); + QCOMPARE(newItem->glideSlope()->rawValue().toInt(), _fwItem->glideSlope()->rawValue().toInt()); + QCOMPARE(newItem->valueSetIsDistance()->rawValue().toBool(), _fwItem->valueSetIsDistance()->rawValue().toBool()); + QCOMPARE(newItem->_loiterClockwise, _fwItem->_loiterClockwise); + QCOMPARE(newItem->_altitudesAreRelative, _fwItem->_altitudesAreRelative); + QCOMPARE(newItem->_landingCoordSet, _fwItem->_landingCoordSet); } diff --git a/src/MissionManager/FixedWingLandingComplexItem.cc b/src/MissionManager/FixedWingLandingComplexItem.cc index 813205af6c6bf11a3d9caf4a7a2d500d0d1794ec..db3ad990abe4aa4318b89a4eca11b1b112a89386 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.cc +++ b/src/MissionManager/FixedWingLandingComplexItem.cc @@ -29,6 +29,7 @@ const char* FixedWingLandingComplexItem::landingAltitudeName = "LandingAlti const char* FixedWingLandingComplexItem::glideSlopeName = "GlideSlope"; const char* FixedWingLandingComplexItem::stopTakingPhotosName = "StopTakingPhotos"; const char* FixedWingLandingComplexItem::stopTakingVideoName = "StopTakingVideo"; +const char* FixedWingLandingComplexItem::valueSetIsDistanceName = "ValueSetIsDistance"; const char* FixedWingLandingComplexItem::_jsonLoiterCoordinateKey = "loiterCoordinate"; const char* FixedWingLandingComplexItem::_jsonLoiterRadiusKey = "loiterRadius"; @@ -59,9 +60,9 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool , _glideSlopeFact (settingsGroup, _metaDataMap[glideSlopeName]) , _stopTakingPhotosFact (settingsGroup, _metaDataMap[stopTakingPhotosName]) , _stopTakingVideoFact (settingsGroup, _metaDataMap[stopTakingVideoName]) + , _valueSetIsDistanceFact (settingsGroup, _metaDataMap[valueSetIsDistanceName]) , _loiterClockwise (true) , _altitudesAreRelative (true) - , _valueSetIsDistance (true) { _editorQml = "qrc:/qml/FWLandingPatternEditor.qml"; @@ -89,6 +90,7 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool connect(&_loiterRadiusFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(&_stopTakingPhotosFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(&_stopTakingVideoFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); + connect(&_valueSetIsDistanceFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(this, &FixedWingLandingComplexItem::loiterCoordinateChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(this, &FixedWingLandingComplexItem::landingCoordinateChanged, this, &FixedWingLandingComplexItem::_setDirty); connect(this, &FixedWingLandingComplexItem::loiterClockwiseChanged, this, &FixedWingLandingComplexItem::_setDirty); @@ -97,6 +99,13 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::coordinateHasRelativeAltitudeChanged); connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::exitCoordinateHasRelativeAltitudeChanged); + + if (_valueSetIsDistanceFact.rawValue().toBool()) { + _recalcFromHeadingAndDistanceChange(); + } else { + _glideSlopeChanged(); + } + setDirty(false); } int FixedWingLandingComplexItem::lastSequenceNumber(void) const @@ -142,7 +151,7 @@ void FixedWingLandingComplexItem::save(QJsonArray& missionItems) saveObject[_jsonStopTakingVideoKey] = _stopTakingVideoFact.rawValue().toBool(); saveObject[_jsonLoiterClockwiseKey] = _loiterClockwise; saveObject[_jsonAltitudesAreRelativeKey] = _altitudesAreRelative; - saveObject[_jsonValueSetIsDistanceKey] = _valueSetIsDistance; + saveObject[_jsonValueSetIsDistanceKey] = _valueSetIsDistanceFact.rawValue().toBool(); missionItems.append(saveObject); } @@ -204,7 +213,7 @@ bool FixedWingLandingComplexItem::load(const QJsonObject& complexObject, int seq } else { _altitudesAreRelative = loiterAltitudeRelative; } - _valueSetIsDistance = true; + _valueSetIsDistanceFact.setRawValue(true); } else if (version == 2) { QList v2KeyInfoList = { { _jsonAltitudesAreRelativeKey, QJsonValue::Bool, true }, @@ -216,7 +225,7 @@ bool FixedWingLandingComplexItem::load(const QJsonObject& complexObject, int seq } _altitudesAreRelative = complexObject[_jsonAltitudesAreRelativeKey].toBool(); - _valueSetIsDistance = complexObject[_jsonValueSetIsDistanceKey].toBool(); + _valueSetIsDistanceFact.setRawValue(complexObject[_jsonValueSetIsDistanceKey].toBool()); } else { errorString = tr("%1 complex item version %2 not supported").arg(jsonComplexItemTypeValue).arg(version); _ignoreRecalcSignals = false; diff --git a/src/MissionManager/FixedWingLandingComplexItem.h b/src/MissionManager/FixedWingLandingComplexItem.h index 0b0af9d804a24fbab4000cc5e43d272ab2862528..56732322b548d5bf350e70211f7084b4222df226 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.h +++ b/src/MissionManager/FixedWingLandingComplexItem.h @@ -30,7 +30,7 @@ public: 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* valueSetIsDistance READ valueSetIsDistance CONSTANT) Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT) Q_PROPERTY(Fact* glideSlope READ glideSlope CONSTANT) Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged) @@ -50,6 +50,7 @@ public: Fact* glideSlope (void) { return &_glideSlopeFact; } Fact* stopTakingPhotos (void) { return &_stopTakingPhotosFact; } Fact* stopTakingVideo (void) { return &_stopTakingVideoFact; } + Fact* valueSetIsDistance (void) { return &_valueSetIsDistanceFact; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; } @@ -110,6 +111,7 @@ public: static const char* glideSlopeName; static const char* stopTakingPhotosName; static const char* stopTakingVideoName; + static const char* valueSetIsDistanceName; signals: void loiterCoordinateChanged (QGeoCoordinate coordinate); @@ -154,10 +156,10 @@ private: Fact _glideSlopeFact; Fact _stopTakingPhotosFact; Fact _stopTakingVideoFact; + Fact _valueSetIsDistanceFact; bool _loiterClockwise; bool _altitudesAreRelative; - bool _valueSetIsDistance; static const char* settingsGroup; static const char* _jsonLoiterCoordinateKey; diff --git a/src/PlanView/FWLandingPatternEditor.qml b/src/PlanView/FWLandingPatternEditor.qml index fcd56385d3f0ec456b3953b12789a223eea1cd7c..2bfbd1e70830991878e371d14e02e15478a9ca8d 100644 --- a/src/PlanView/FWLandingPatternEditor.qml +++ b/src/PlanView/FWLandingPatternEditor.qml @@ -119,9 +119,9 @@ Rectangle { QGCRadioButton { id: specifyLandingDistance text: qsTr("Landing Dist") - checked: missionItem.valueSetIsDistance + checked: missionItem.valueSetIsDistance.rawValue exclusiveGroup: distanceGlideGroup - onClicked: missionItem.valueSetIsDistance = checked + onClicked: missionItem.valueSetIsDistance.rawValue = checked Layout.fillWidth: true } @@ -134,9 +134,9 @@ Rectangle { QGCRadioButton { id: specifyGlideSlope text: qsTr("Glide Slope") - checked: !missionItem.valueSetIsDistance + checked: !missionItem.valueSetIsDistance.rawValue exclusiveGroup: distanceGlideGroup - onClicked: missionItem.valueSetIsDistance = !checked + onClicked: missionItem.valueSetIsDistance.rawValue = !checked Layout.fillWidth: true }