Commit 1ac6cd32 authored by Don Gagne's avatar Don Gagne

FW Landing Glide Slope support

parent 2296ed0d
......@@ -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
}
......
......@@ -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<MissionItem*>& 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;
};
......
......@@ -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
}
}
......
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