Unverified Commit 0d9f4025 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #6253 from DonLakeFlyer/GlideSlope

Fixed Wing Landing pattern: Change from Descent Rate to Glide slope
parents bda9e6dc 825ba9e4
...@@ -44,12 +44,12 @@ ...@@ -44,12 +44,12 @@
"defaultValue": 0.0 "defaultValue": 0.0
}, },
{ {
"name": "DescentRate", "name": "GlideSlope",
"shortDescription": "Descent rate between landing and loiter altitude.", "shortDescription": "The glide slope between the loiter and landing point.",
"type": "double", "type": "double",
"units": "%", "units": "deg",
"min": 0.1, "min": 0.1,
"max": 100, "max": 90,
"decimalPlaces": 1, "decimalPlaces": 1,
"defaultValue": 12.0 "defaultValue": 12.0
} }
......
...@@ -27,12 +27,12 @@ public: ...@@ -27,12 +27,12 @@ public:
Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT) Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT)
Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT) Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT)
Q_PROPERTY(Fact* landingAltitude READ landingAltitude 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* landingHeading READ landingHeading CONSTANT)
Q_PROPERTY(Fact* fallRate READ fallRate 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 loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged)
Q_PROPERTY(bool loiterAltitudeRelative MEMBER _loiterAltitudeRelative NOTIFY loiterAltitudeRelativeChanged) Q_PROPERTY(bool altitudesAreRelative MEMBER _altitudesAreRelative NOTIFY altitudesAreRelativeChanged)
Q_PROPERTY(bool landingAltitudeRelative MEMBER _landingAltitudeRelative NOTIFY landingAltitudeRelativeChanged)
Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged)
Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged)
Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged)
...@@ -43,7 +43,7 @@ public: ...@@ -43,7 +43,7 @@ public:
Fact* landingAltitude (void) { return &_landingAltitudeFact; } Fact* landingAltitude (void) { return &_landingAltitudeFact; }
Fact* landingDistance (void) { return &_landingDistanceFact; } Fact* landingDistance (void) { return &_landingDistanceFact; }
Fact* landingHeading (void) { return &_landingHeadingFact; } Fact* landingHeading (void) { return &_landingHeadingFact; }
Fact* fallRate (void) { return &_fallRateFact; } Fact* glideSlope (void) { return &_glideSlopeFact; }
QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; }
QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; }
QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; } QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; }
...@@ -81,8 +81,8 @@ public: ...@@ -81,8 +81,8 @@ public:
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double newAltitude) final; void applyNewAltitude (double newAltitude) final;
bool coordinateHasRelativeAltitude (void) const final { return _loiterAltitudeRelative; } bool coordinateHasRelativeAltitude (void) const final { return _altitudesAreRelative; }
bool exitCoordinateHasRelativeAltitude (void) const final { return _landingAltitudeRelative; } bool exitCoordinateHasRelativeAltitude (void) const final { return _altitudesAreRelative; }
bool exitCoordinateSameAsEntry (void) const final { return false; } bool exitCoordinateSameAsEntry (void) const final { return false; }
void setDirty (bool dirty) final; void setDirty (bool dirty) final;
...@@ -97,7 +97,7 @@ public: ...@@ -97,7 +97,7 @@ public:
static const char* loiterRadiusName; static const char* loiterRadiusName;
static const char* landingHeadingName; static const char* landingHeadingName;
static const char* landingAltitudeName; static const char* landingAltitudeName;
static const char* fallRateName; static const char* glideSlopeName;
signals: signals:
void loiterCoordinateChanged (QGeoCoordinate coordinate); void loiterCoordinateChanged (QGeoCoordinate coordinate);
...@@ -105,21 +105,23 @@ signals: ...@@ -105,21 +105,23 @@ signals:
void landingCoordinateChanged (QGeoCoordinate coordinate); void landingCoordinateChanged (QGeoCoordinate coordinate);
void landingCoordSetChanged (bool landingCoordSet); void landingCoordSetChanged (bool landingCoordSet);
void loiterClockwiseChanged (bool loiterClockwise); void loiterClockwiseChanged (bool loiterClockwise);
void loiterAltitudeRelativeChanged (bool loiterAltitudeRelative); void altitudesAreRelativeChanged (bool altitudesAreRelative);
void landingAltitudeRelativeChanged (bool loiterAltitudeRelative); void valueSetIsDistanceChanged (bool valueSetIsDistance);
private slots: private slots:
void _recalcFromHeadingAndDistanceChange(void); void _recalcFromHeadingAndDistanceChange (void);
void _recalcFromCoordinateChange(void); void _recalcFromCoordinateChange (void);
void _recalcFromRadiusChange(void); void _recalcFromRadiusChange (void);
void _updateLoiterCoodinateAltitudeFromFact(void); void _updateLoiterCoodinateAltitudeFromFact (void);
void _updateLandingCoodinateAltitudeFromFact(void); void _updateLandingCoodinateAltitudeFromFact (void);
double _mathematicAngleToHeading(double angle); double _mathematicAngleToHeading (double angle);
double _headingToMathematicAngle(double heading); double _headingToMathematicAngle (double heading);
void _setDirty(void); void _setDirty (void);
void _glideSlopeChanged (void);
private: 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; int _sequenceNumber;
bool _dirty; bool _dirty;
...@@ -136,18 +138,22 @@ private: ...@@ -136,18 +138,22 @@ private:
Fact _loiterRadiusFact; Fact _loiterRadiusFact;
Fact _landingHeadingFact; Fact _landingHeadingFact;
Fact _landingAltitudeFact; Fact _landingAltitudeFact;
Fact _fallRateFact; Fact _glideSlopeFact;
bool _loiterClockwise; bool _loiterClockwise;
bool _loiterAltitudeRelative; bool _altitudesAreRelative;
bool _landingAltitudeRelative; bool _valueSetIsDistance;
static const char* _jsonLoiterCoordinateKey; static const char* _jsonLoiterCoordinateKey;
static const char* _jsonLoiterRadiusKey; static const char* _jsonLoiterRadiusKey;
static const char* _jsonLoiterClockwiseKey; static const char* _jsonLoiterClockwiseKey;
static const char* _jsonLoiterAltitudeRelativeKey;
static const char* _jsonLandingCoordinateKey; static const char* _jsonLandingCoordinateKey;
static const char* _jsonValueSetIsDistanceKey;
static const char* _jsonAltitudesAreRelativeKey;
// Only in older file formats
static const char* _jsonLandingAltitudeRelativeKey; static const char* _jsonLandingAltitudeRelativeKey;
static const char* _jsonLoiterAltitudeRelativeKey;
static const char* _jsonFallRateKey; static const char* _jsonFallRateKey;
}; };
......
...@@ -34,6 +34,8 @@ Rectangle { ...@@ -34,6 +34,8 @@ Rectangle {
property real _margin: ScreenTools.defaultFontPixelWidth / 2 property real _margin: ScreenTools.defaultFontPixelWidth / 2
property real _spacer: ScreenTools.defaultFontPixelWidth / 2 property real _spacer: ScreenTools.defaultFontPixelWidth / 2
ExclusiveGroup { id: distanceGlideGroup }
Column { Column {
id: editorColumn id: editorColumn
anchors.margins: _margin anchors.margins: _margin
...@@ -58,17 +60,6 @@ Rectangle { ...@@ -58,17 +60,6 @@ Rectangle {
Item { width: 1; height: _spacer } Item { width: 1; height: _spacer }
QGCCheckBox { 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") text: qsTr("Loiter clockwise")
checked: missionItem.loiterClockwise checked: missionItem.loiterClockwise
onClicked: missionItem.loiterClockwise = checked onClicked: missionItem.loiterClockwise = checked
...@@ -98,63 +89,43 @@ Rectangle { ...@@ -98,63 +89,43 @@ Rectangle {
} }
QGCRadioButton { QGCRadioButton {
id: useLandingDistance id: specifyLandingDistance
text: qsTr("Landing dist") text: qsTr("Landing Dist")
checked: !useFallRate.checked checked: missionItem.valueSetIsDistance
onClicked: { exclusiveGroup: distanceGlideGroup
useFallRate.checked = false onClicked: missionItem.valueSetIsDistance = checked
missionItem.fallRate.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.landingDistance.value)
}
Layout.fillWidth: true Layout.fillWidth: true
} }
FactTextField { FactTextField {
fact: missionItem.landingDistance fact: missionItem.landingDistance
enabled: useLandingDistance.checked enabled: specifyLandingDistance.checked
Layout.fillWidth: true Layout.fillWidth: true
} }
QGCRadioButton { QGCRadioButton {
id: useFallRate id: specifyGlideSlope
text: qsTr("Descent rate") text: qsTr("Glide Slope")
checked: !useLandingDistance.checked checked: !missionItem.valueSetIsDistance
onClicked: { exclusiveGroup: distanceGlideGroup
useLandingDistance.checked = false onClicked: missionItem.valueSetIsDistance = !checked
missionItem.landingDistance.value = parseFloat(missionItem.loiterAltitude.value)*100/parseFloat (missionItem.fallRate.value)
}
Layout.fillWidth: true Layout.fillWidth: true
} }
FactTextField { FactTextField {
fact: missionItem.fallRate fact: missionItem.glideSlope
enabled: useFallRate.checked enabled: specifyGlideSlope.checked
Layout.fillWidth: true 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 } Item { width: 1; height: _spacer }
QGCCheckBox { QGCCheckBox {
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Altitude relative to home") text: qsTr("Altitudes relative to home")
checked: missionItem.landingAltitudeRelative checked: missionItem.altitudesAreRelative
onClicked: missionItem.landingAltitudeRelative = checked onClicked: missionItem.altitudesAreRelative = checked
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment