FixedWingLandingComplexItem.h 11.1 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#ifndef FixedWingLandingComplexItem_H
#define FixedWingLandingComplexItem_H

#include "ComplexMissionItem.h"
#include "MissionItem.h"
#include "Fact.h"
#include "QGCLoggingCategory.h"

Q_DECLARE_LOGGING_CATEGORY(FixedWingLandingComplexItemLog)

20
class FWLandingPatternTest;
21
class PlanMasterController;
22

23 24 25 26 27
class FixedWingLandingComplexItem : public ComplexMissionItem
{
    Q_OBJECT

public:
28
    FixedWingLandingComplexItem(PlanMasterController* masterController, bool flyView, QObject* parent);
29

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    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(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)
    Q_PROPERTY(bool             altitudesAreRelative    MEMBER  _altitudesAreRelative                                       NOTIFY altitudesAreRelativeChanged)
    Q_PROPERTY(Fact*            stopTakingPhotos        READ    stopTakingPhotos                                            CONSTANT)
    Q_PROPERTY(Fact*            stopTakingVideo         READ    stopTakingVideo                                             CONSTANT)
    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)
45 46

    Q_INVOKABLE void moveLandingPosition(const QGeoCoordinate& coordinate); // Maintains the current landing distance and heading
47 48 49 50 51 52

    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; }
53
    Fact*           glideSlope              (void) { return &_glideSlopeFact; }
54 55
    Fact*           stopTakingPhotos        (void) { return &_stopTakingPhotosFact; }
    Fact*           stopTakingVideo         (void) { return &_stopTakingVideoFact; }
56
    Fact*           valueSetIsDistance      (void) { return &_valueSetIsDistanceFact; }
57 58 59 60 61 62
    QGeoCoordinate  landingCoordinate       (void) const { return _landingCoordinate; }
    QGeoCoordinate  loiterCoordinate        (void) const { return _loiterCoordinate; }
    QGeoCoordinate  loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; }

    void setLandingCoordinate       (const QGeoCoordinate& coordinate);
    void setLoiterCoordinate        (const QGeoCoordinate& coordinate);
63

64
    /// Scans the loaded items for a landing pattern complex item
65
    static bool scanForItem(QmlObjectListModel* visualItems, bool flyView, PlanMasterController* masterController);
66

67 68 69 70
    static MissionItem* createDoLandStartItem   (int seqNum, QObject* parent);
    static MissionItem* createLoiterToAltItem   (int seqNum, bool altRel, double loiterRaidus, double lat, double lon, double alt, QObject* parent);
    static MissionItem* createLandItem          (int seqNum, bool altRel, double lat, double lon, double alt, QObject* parent);

71
    // Overrides from ComplexMissionItem
72 73 74 75 76 77
    QString patternName         (void) const final { return name; }
    double  complexDistance     (void) const final;
    int     lastSequenceNumber  (void) const final;
    bool    load                (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
    double  greatestDistanceTo  (const QGeoCoordinate &other) const final;
    QString mapVisualQML        (void) const final { return QStringLiteral("FWLandingPatternMapVisual.qml"); }
78 79

    // Overrides from VisualMissionItem
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    bool                dirty                       (void) const final { return _dirty; }
    bool                isSimpleItem                (void) const final { return false; }
    bool                isStandaloneCoordinate      (void) const final { return false; }
    bool                specifiesCoordinate         (void) const final;
    bool                specifiesAltitudeOnly       (void) const final { return false; }
    QString             commandDescription          (void) const final { return "Landing Pattern"; }
    QString             commandName                 (void) const final { return "Landing Pattern"; }
    QString             abbreviation                (void) const final { return "L"; }
    QGeoCoordinate      coordinate                  (void) const final { return _loiterCoordinate; }
    QGeoCoordinate      exitCoordinate              (void) const final { return _landingCoordinate; }
    int                 sequenceNumber              (void) const final { return _sequenceNumber; }
    double              specifiedFlightSpeed        (void) final { return std::numeric_limits<double>::quiet_NaN(); }
    double              specifiedGimbalYaw          (void) final { return std::numeric_limits<double>::quiet_NaN(); }
    double              specifiedGimbalPitch        (void) final { return std::numeric_limits<double>::quiet_NaN(); }
    void                appendMissionItems          (QList<MissionItem*>& items, QObject* missionItemParent) final;
    void                applyNewAltitude            (double newAltitude) final;
    double              additionalTimeDelay         (void) const final { return 0; }
    ReadyForSaveState   readyForSaveState           (void) const final;
    bool                exitCoordinateSameAsEntry   (void) const final { return false; }
    void                setDirty                    (bool dirty) final;
    void                setCoordinate               (const QGeoCoordinate& coordinate) final { setLoiterCoordinate(coordinate); }
    void                setSequenceNumber           (int sequenceNumber) final;
    void                save                        (QJsonArray&  missionItems) final;
    double              amslEntryAlt                (void) const final;
    double              amslExitAlt                 (void) const final;
    double              minAMSLAltitude             (void) const final { return amslExitAlt(); }
    double              maxAMSLAltitude             (void) const final { return amslEntryAlt(); }

    static const QString name;
109 110 111

    static const char* jsonComplexItemTypeValue;

112
    static const char* settingsGroup;
113 114 115 116 117
    static const char* loiterToLandDistanceName;
    static const char* loiterAltitudeName;
    static const char* loiterRadiusName;
    static const char* landingHeadingName;
    static const char* landingAltitudeName;
118
    static const char* glideSlopeName;
119 120
    static const char* stopTakingPhotosName;
    static const char* stopTakingVideoName;
121
    static const char* valueSetIsDistanceName;
122

123
signals:
124
    void loiterCoordinateChanged        (QGeoCoordinate coordinate);
125
    void loiterTangentCoordinateChanged (QGeoCoordinate coordinate);
126 127 128
    void landingCoordinateChanged       (QGeoCoordinate coordinate);
    void landingCoordSetChanged         (bool landingCoordSet);
    void loiterClockwiseChanged         (bool loiterClockwise);
129 130
    void altitudesAreRelativeChanged    (bool altitudesAreRelative);
    void valueSetIsDistanceChanged      (bool valueSetIsDistance);
131
    void _updateFlightPathSegmentsSignal(void);
132 133

private slots:
134 135 136 137 138 139 140 141 142 143 144
    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);
    void    _signalLastSequenceNumberChanged            (void);
    void    _updateFlightPathSegmentsDontCallDirectly   (void);
145 146

private:
147 148
    QPointF _rotatePoint                    (const QPointF& point, const QPointF& origin, double angle);
    void    _calcGlideSlope                 (void);
149

150 151
    int             _sequenceNumber =               0;
    bool            _dirty =                        false;
152
    QGeoCoordinate  _loiterCoordinate;
153
    QGeoCoordinate  _loiterTangentCoordinate;
154
    QGeoCoordinate  _landingCoordinate;
155 156 157 158
    bool            _landingCoordSet =              false;
    bool            _ignoreRecalcSignals =          false;
    bool            _loiterClockwise =              true;
    bool            _altitudesAreRelative =         true;
159

160 161
    QMap<QString, FactMetaData*> _metaDataMap;

162
    Fact            _landingDistanceFact;
163 164 165
    Fact            _loiterAltitudeFact;
    Fact            _loiterRadiusFact;
    Fact            _landingHeadingFact;
166
    Fact            _landingAltitudeFact;
167
    Fact            _glideSlopeFact;
168 169
    Fact            _stopTakingPhotosFact;
    Fact            _stopTakingVideoFact;
170
    Fact            _valueSetIsDistanceFact;
171

172

173 174 175 176
    static const char* _jsonLoiterCoordinateKey;
    static const char* _jsonLoiterRadiusKey;
    static const char* _jsonLoiterClockwiseKey;
    static const char* _jsonLandingCoordinateKey;
177 178
    static const char* _jsonValueSetIsDistanceKey;
    static const char* _jsonAltitudesAreRelativeKey;
179 180
    static const char* _jsonStopTakingPhotosKey;
    static const char* _jsonStopTakingVideoKey;
181 182

    // Only in older file formats
183
    static const char* _jsonLandingAltitudeRelativeKey;
184
    static const char* _jsonLoiterAltitudeRelativeKey;
185
    static const char* _jsonFallRateKey;
186 187

    friend FWLandingPatternTest;
188 189 190
};

#endif