diff --git a/src/MissionManager/FWLandingPattern.FactMetaData.json b/src/MissionManager/FWLandingPattern.FactMetaData.json index 37237a956875698b71781a321c14156d6a4866ab..fb781e10e201ebed5166abcdb35671f6133d8a4c 100644 --- a/src/MissionManager/FWLandingPattern.FactMetaData.json +++ b/src/MissionManager/FWLandingPattern.FactMetaData.json @@ -1,6 +1,6 @@ [ { - "name": "Landing distance", + "name": "Landing dist", "shortDescription": "Distance between landing and loiter points.", "type": "double", "units": "m", @@ -42,5 +42,15 @@ "units": "m", "decimalPlaces": 1, "defaultValue": 0.0 +}, +{ + "name": "Fall rate", + "shortDescription": "Fall rate between landing and loiter altitude.", + "type": "double", + "units": "%", + "min": 0.1, + "max": 100, + "decimalPlaces": 1, + "defaultValue": 12.0 } ] diff --git a/src/MissionManager/FixedWingLandingComplexItem.cc b/src/MissionManager/FixedWingLandingComplexItem.cc index 753213ddb131e4f87a03b4bf50bc47375ec709ab..028ef1bf8900b469f139c4467e883c42bd809efb 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.cc +++ b/src/MissionManager/FixedWingLandingComplexItem.cc @@ -20,11 +20,12 @@ QGC_LOGGING_CATEGORY(FixedWingLandingComplexItemLog, "FixedWingLandingComplexIte const char* FixedWingLandingComplexItem::jsonComplexItemTypeValue = "fwLandingPattern"; -const char* FixedWingLandingComplexItem::_loiterToLandDistanceName = "Landing distance"; +const char* FixedWingLandingComplexItem::_loiterToLandDistanceName = "Landing dist"; const char* FixedWingLandingComplexItem::_landingHeadingName = "Landing heading"; const char* FixedWingLandingComplexItem::_loiterAltitudeName = "Loiter altitude"; const char* FixedWingLandingComplexItem::_loiterRadiusName = "Loiter radius"; const char* FixedWingLandingComplexItem::_landingAltitudeName = "Landing altitude"; +const char* FixedWingLandingComplexItem::_fallRateName = "Fall rate"; const char* FixedWingLandingComplexItem::_jsonLoiterCoordinateKey = "loiterCoordinate"; const char* FixedWingLandingComplexItem::_jsonLoiterRadiusKey = "loiterRadius"; @@ -32,6 +33,7 @@ const char* FixedWingLandingComplexItem::_jsonLoiterClockwiseKey = "loi const char* FixedWingLandingComplexItem::_jsonLoiterAltitudeRelativeKey = "loiterAltitudeRelative"; const char* FixedWingLandingComplexItem::_jsonLandingCoordinateKey = "landCoordinate"; const char* FixedWingLandingComplexItem::_jsonLandingAltitudeRelativeKey = "landAltitudeRelative"; +const char* FixedWingLandingComplexItem::_jsonFallRateKey = "fallRate"; QMap FixedWingLandingComplexItem::_metaDataMap; @@ -46,6 +48,7 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObje , _loiterRadiusFact (0, _loiterRadiusName, FactMetaData::valueTypeDouble) , _landingHeadingFact (0, _landingHeadingName, FactMetaData::valueTypeDouble) , _landingAltitudeFact (0, _landingAltitudeName, FactMetaData::valueTypeDouble) + , _fallRateFact (0, _fallRateName, FactMetaData::valueTypeDouble) , _loiterClockwise(true) , _loiterAltitudeRelative(true) , _landingAltitudeRelative(true) @@ -61,12 +64,14 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, QObje _loiterRadiusFact.setMetaData (_metaDataMap[_loiterRadiusName]); _landingHeadingFact.setMetaData (_metaDataMap[_landingHeadingName]); _landingAltitudeFact.setMetaData (_metaDataMap[_landingAltitudeName]); + _fallRateFact.setMetaData (_metaDataMap[_fallRateName]); _landingDistanceFact.setRawValue (_landingDistanceFact.rawDefaultValue()); _loiterAltitudeFact.setRawValue (_loiterAltitudeFact.rawDefaultValue()); _loiterRadiusFact.setRawValue (_loiterRadiusFact.rawDefaultValue()); _landingHeadingFact.setRawValue (_landingHeadingFact.rawDefaultValue()); _landingAltitudeFact.setRawValue (_landingAltitudeFact.rawDefaultValue()); + _fallRateFact.setRawValue (_fallRateFact.rawDefaultValue()); connect(&_loiterAltitudeFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_updateLoiterCoodinateAltitudeFromFact); connect(&_landingAltitudeFact, &Fact::valueChanged, this, &FixedWingLandingComplexItem::_updateLandingCoodinateAltitudeFromFact); diff --git a/src/MissionManager/FixedWingLandingComplexItem.h b/src/MissionManager/FixedWingLandingComplexItem.h index f723ad5831f1df8edb78b6ee78c6e62b71d63f33..0c838076cb40793b2dfb77ee595c525b1c829614 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.h +++ b/src/MissionManager/FixedWingLandingComplexItem.h @@ -29,6 +29,7 @@ public: 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) @@ -42,6 +43,7 @@ public: Fact* landingAltitude (void) { return &_landingAltitudeFact; } Fact* landingDistance (void) { return &_landingDistanceFact; } Fact* landingHeading (void) { return &_landingHeadingFact; } + Fact* fallRate (void) { return &_fallRateFact; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; } @@ -124,6 +126,7 @@ private: Fact _loiterRadiusFact; Fact _landingHeadingFact; Fact _landingAltitudeFact; + Fact _fallRateFact; bool _loiterClockwise; bool _loiterAltitudeRelative; @@ -136,6 +139,7 @@ private: static const char* _loiterRadiusName; static const char* _landingHeadingName; static const char* _landingAltitudeName; + static const char* _fallRateName; static const char* _jsonLoiterCoordinateKey; static const char* _jsonLoiterRadiusKey; @@ -143,6 +147,7 @@ private: static const char* _jsonLoiterAltitudeRelativeKey; static const char* _jsonLandingCoordinateKey; static const char* _jsonLandingAltitudeRelativeKey; + static const char* _jsonFallRateKey; }; #endif diff --git a/src/PlanView/FWLandingPatternEditor.qml b/src/PlanView/FWLandingPatternEditor.qml index de2a84dadc90e94efc62d95780b2f51a8b99ff87..a4ecc8a2c2b2209e27e50c9a856beb61288ca464 100644 --- a/src/PlanView/FWLandingPatternEditor.qml +++ b/src/PlanView/FWLandingPatternEditor.qml @@ -39,6 +39,7 @@ Rectangle { anchors.margins: _margin anchors.left: parent.left anchors.right: parent.right + spacing: _margin visible: missionItem.landingCoordSet SectionHeader { @@ -79,7 +80,63 @@ Rectangle { FactTextFieldGrid { anchors.left: parent.left anchors.right: parent.right - factList: [ missionItem.landingAltitude, missionItem.landingDistance, missionItem.landingHeading ] + factList: [ missionItem.landingHeading, missionItem.landingAltitude] + } + + GridLayout { + anchors.left: parent.left + anchors.right: parent.right + columns: 2 + + QGCRadioButton { + id: useLandingDistance + text: missionItem.landingDistance.name + checked: !useFallRate.checked + onClicked: { + useFallRate.checked = false + missionItem.fallRate.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.landingDistance.value) + } + Layout.fillWidth: true + } + + FactTextField { + fact: missionItem.landingDistance + enabled: useLandingDistance.checked + Layout.fillWidth: true + } + + QGCRadioButton { + id: useFallRate + text: missionItem.fallRate.name + checked: !useLandingDistance.checked + onClicked: { + useLandingDistance.checked = false + missionItem.landingDistance.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.fallRate.value) + } + 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) + } + } } Item { width: 1; height: _spacer }