SimpleMissionItem.h 10.5 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
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

10 11 12 13

#ifndef SimpleMissionItem_H
#define SimpleMissionItem_H

14
#include "VisualMissionItem.h"
15
#include "MissionItem.h"
16
#include "MissionCommandTree.h"
17
#include "CameraSection.h"
18
#include "SpeedSection.h"
19
#include "QGroundControlQmlGlobal.h"
20

21 22
/// A SimpleMissionItem is used to represent a single MissionItem to the ui.
class SimpleMissionItem : public VisualMissionItem
23 24 25 26
{
    Q_OBJECT
    
public:
27
    SimpleMissionItem(PlanMasterController* masterController, bool flyView, bool forLoad, QObject* parent);
28
    SimpleMissionItem(PlanMasterController* masterController, bool flyView, const MissionItem& missionItem, QObject* parent);
29

30 31 32 33 34
    ~SimpleMissionItem();

    Q_PROPERTY(QString          category                READ category                                           NOTIFY commandChanged)
    Q_PROPERTY(bool             friendlyEditAllowed     READ friendlyEditAllowed                                NOTIFY friendlyEditAllowedChanged)
    Q_PROPERTY(bool             rawEdit                 READ rawEdit                WRITE setRawEdit            NOTIFY rawEditChanged)              ///< true: raw item editing with all params
35 36
    Q_PROPERTY(bool             specifiesAltitude       READ specifiesAltitude                                  NOTIFY commandChanged)
    Q_PROPERTY(Fact*            altitude                READ altitude                                           CONSTANT)                           ///< Altitude as specified by altitudeMode. Not necessarily true mission item altitude
37
    Q_PROPERTY(QGroundControlQmlGlobal::AltitudeMode altitudeMode READ altitudeMode WRITE setAltitudeMode       NOTIFY altitudeModeChanged)
38
    Q_PROPERTY(Fact*            amslAltAboveTerrain     READ amslAltAboveTerrain                                CONSTANT)                           ///< Actual AMSL altitude for item if altitudeMode == AltitudeAboveTerrain
39
    Q_PROPERTY(int              command                 READ command                WRITE setCommand            NOTIFY commandChanged)
40

41
    /// Optional sections
42
    Q_PROPERTY(QObject*         speedSection            READ speedSection                                       NOTIFY speedSectionChanged)
43 44
    Q_PROPERTY(QObject*         cameraSection           READ cameraSection                                      NOTIFY cameraSectionChanged)

45
    // These properties are used to display the editing ui
46 47 48
    Q_PROPERTY(QmlObjectListModel*  comboboxFacts   READ comboboxFacts  CONSTANT)
    Q_PROPERTY(QmlObjectListModel*  textFieldFacts  READ textFieldFacts CONSTANT)
    Q_PROPERTY(QmlObjectListModel*  nanFacts        READ nanFacts       CONSTANT)
49

50 51 52
    /// This should be called before changing the command. It is needed if the command changes
    /// from an item which does not include a coordinate to an item which requires a coordinate.
    /// It uses this value to set that new coordinate.
DonLakeFlyer's avatar
DonLakeFlyer committed
53
    Q_INVOKABLE void setMapCenterHintForCommandChange(QGeoCoordinate mapCenter) { _mapCenterHint = mapCenter; }
54

55 56 57 58
    /// Scans the loaded items for additional section settings
    ///     @param visualItems List of all visual items
    ///     @param scanIndex Index to start scanning from
    ///     @param vehicle Vehicle associated with this mission
59
    /// @return true: section found, scanIndex updated
60
    bool scanForSections(QmlObjectListModel* visualItems, int scanIndex, PlanMasterController* masterController);
61

62 63 64
    // Property accesors
    
    QString         category            (void) const;
65 66
    int             command             (void) const { return _missionItem._commandFact.cookedValue().toInt(); }
    MAV_CMD         mavCommand          (void) const { return static_cast<MAV_CMD>(command()); }
67 68
    bool            friendlyEditAllowed (void) const;
    bool            rawEdit             (void) const;
69
    bool            specifiesAltitude   (void) const;
70
    QGroundControlQmlGlobal::AltitudeMode altitudeMode(void) const { return _altitudeMode; }
71 72 73
    Fact*           altitude            (void) { return &_altitudeFact; }
    Fact*           amslAltAboveTerrain (void) { return &_amslAltAboveTerrainFact; }

74
    CameraSection*  cameraSection       (void) { return _cameraSection; }
75
    SpeedSection*   speedSection        (void) { return _speedSection; }
76

77 78 79
    QmlObjectListModel* textFieldFacts  (void) { return &_textFieldFacts; }
    QmlObjectListModel* nanFacts        (void) { return &_nanFacts; }
    QmlObjectListModel* comboboxFacts   (void) { return &_comboboxFacts; }
80 81

    void setRawEdit(bool rawEdit);
82
    void setAltitudeMode(QGroundControlQmlGlobal::AltitudeMode altitudeMode);
83 84 85
    
    void setCommandByIndex(int index);

86
    void setCommand(int command);
87 88 89 90 91 92

    void setAltDifference   (double altDifference);
    void setAltPercent      (double altPercent);
    void setAzimuth         (double azimuth);
    void setDistance        (double distance);

93 94
    virtual bool load(QTextStream &loadStream);
    virtual bool load(const QJsonObject& json, int sequenceNumber, QString& errorString);
95 96

    MissionItem& missionItem(void) { return _missionItem; }
97
    const MissionItem& missionItem(void) const { return _missionItem; }
98 99

    // Overrides from VisualMissionItem
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
    bool            dirty                       (void) const override { return _dirty; }
    bool            isSimpleItem                (void) const final { return true; }
    bool            isStandaloneCoordinate      (void) const final;
    bool            isLandCommand               (void) const final;
    bool            specifiesCoordinate         (void) const final;
    bool            specifiesAltitudeOnly       (void) const final;
    QString         commandDescription          (void) const final;
    QString         commandName                 (void) const final;
    QString         abbreviation                (void) const final;
    QGeoCoordinate  coordinate                  (void) const final;
    QGeoCoordinate  exitCoordinate              (void) const final { return coordinate(); }
    double          amslEntryAlt                (void) const final;
    double          amslExitAlt                 (void) const final { return amslEntryAlt(); }
    int             sequenceNumber              (void) const final { return _missionItem.sequenceNumber(); }
    double          specifiedFlightSpeed        (void) override;
    double          specifiedGimbalYaw          (void) override;
    double          specifiedGimbalPitch        (void) override;
    double          specifiedVehicleYaw         (void) override;
    QString         mapVisualQML                (void) const override { return QStringLiteral("SimpleItemMapVisual.qml"); }
    void            appendMissionItems          (QList<MissionItem*>& items, QObject* missionItemParent) final;
    void            applyNewAltitude            (double newAltitude) final;
    void            setMissionFlightStatus      (MissionController::MissionFlightStatus_t& missionFlightStatus) final;
    ReadyForSaveState readyForSaveState         (void) const final;
    double          additionalTimeDelay         (void) const final;
    bool            exitCoordinateSameAsEntry   (void) const final { return true; }
125 126

    void setDirty           (bool dirty) final;
127
    void setCoordinate      (const QGeoCoordinate& coordinate) override;
128
    void setSequenceNumber  (int sequenceNumber) final;
129 130
    int  lastSequenceNumber (void) const final;
    void save               (QJsonArray&  missionItems) final;
131 132 133 134 135 136

signals:
    void commandChanged             (int command);
    void friendlyEditAllowedChanged (bool friendlyEditAllowed);
    void headingDegreesChanged      (double heading);
    void rawEditChanged             (bool rawEdit);
137
    void cameraSectionChanged       (QObject* cameraSection);
138
    void speedSectionChanged        (QObject* cameraSection);
139
    void altitudeModeChanged        (void);
140

141
private slots:
142 143 144 145 146 147 148 149 150 151 152 153
    void _setDirty                          (void);
    void _sectionDirtyChanged               (bool dirty);
    void _sendCommandChanged                (void);
    void _sendCoordinateChanged             (void);
    void _sendFriendlyEditAllowedChanged    (void);
    void _altitudeChanged                   (void);
    void _altitudeModeChanged               (void);
    void _terrainAltChanged                 (void);
    void _updateLastSequenceNumber          (void);
    void _rebuildFacts                      (void);
    void _rebuildTextFieldFacts             (void);
    void _possibleAdditionalTimeDelayChanged(void);
154
    void _setDefaultsForCommand             (void);
155
    void _possibleVehicleYawChanged         (void);
156

157
private:
158 159
    void _connectSignals        (void);
    void _setupMetaData         (void);
160
    void _updateOptionalSections(void);
161 162
    void _rebuildNaNFacts       (void);
    void _rebuildComboBoxFacts  (void);
163

164
    MissionItem     _missionItem;
165 166 167
    bool            _rawEdit =                  false;
    bool            _dirty =                    false;
    bool            _ignoreDirtyChangeSignals = false;
168
    QGeoCoordinate  _mapCenterHint;
169 170
    SpeedSection*   _speedSection =             nullptr;
    CameraSection*  _cameraSection =             nullptr;
171

172 173
    MissionCommandTree* _commandTree = nullptr;
    bool _syncingHeadingDegreesAndParam4 = false;   ///< true: already in a sync signal, prevents signal loop
174

175 176
    Fact                _supportedCommandFact;

177
    QGroundControlQmlGlobal::AltitudeMode   _altitudeMode = QGroundControlQmlGlobal::AltitudeModeRelative;
178 179
    Fact                                    _altitudeFact;
    Fact                                    _amslAltAboveTerrainFact;
180 181 182 183

    QmlObjectListModel  _textFieldFacts;
    QmlObjectListModel  _nanFacts;
    QmlObjectListModel  _comboboxFacts;
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
    
    static FactMetaData*    _altitudeMetaData;
    static FactMetaData*    _commandMetaData;
    static FactMetaData*    _defaultParamMetaData;
    static FactMetaData*    _frameMetaData;
    static FactMetaData*    _latitudeMetaData;
    static FactMetaData*    _longitudeMetaData;

    FactMetaData    _param1MetaData;
    FactMetaData    _param2MetaData;
    FactMetaData    _param3MetaData;
    FactMetaData    _param4MetaData;
    FactMetaData    _param5MetaData;
    FactMetaData    _param6MetaData;
    FactMetaData    _param7MetaData;

200 201 202
    static const char* _jsonAltitudeModeKey;
    static const char* _jsonAltitudeKey;
    static const char* _jsonAMSLAltAboveTerrainKey;
203 204 205
};

#endif