1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#ifndef MissionSettingsComplexItem_H
#define MissionSettingsComplexItem_H
#include "ComplexMissionItem.h"
#include "MissionItem.h"
#include "Fact.h"
#include "QGCLoggingCategory.h"
#include "CameraSection.h"
#include "SpeedSection.h"
Q_DECLARE_LOGGING_CATEGORY(MissionSettingsComplexItemLog)
class PlanMasterController;
class MissionSettingsItem : public ComplexMissionItem
{
Q_OBJECT
public:
MissionSettingsItem(PlanMasterController* masterController, bool flyView, QObject* parent);
Q_PROPERTY(Fact* plannedHomePositionAltitude READ plannedHomePositionAltitude CONSTANT)
Q_PROPERTY(QObject* cameraSection READ cameraSection CONSTANT)
Q_PROPERTY(QObject* speedSection READ speedSection CONSTANT)
Fact* plannedHomePositionAltitude (void) { return &_plannedHomePositionAltitudeFact; }
CameraSection* cameraSection (void) { return &_cameraSection; }
SpeedSection* speedSection (void) { return &_speedSection; }
/// Scans the loaded items for settings items
bool scanForMissionSettings(QmlObjectListModel* visualItems, int scanIndex);
/// Adds the optional mission end action to the list
/// @param items Mission items list to append to
/// @param seqNum Sequence number for new item
/// @param missionItemParent Parent for newly allocated MissionItems
/// @return true: Mission end action was added
bool addMissionEndAction(QList<MissionItem*>& items, int seqNum, QObject* missionItemParent);
/// Called to update home position coordinate when it comes from a connected vehicle
void setHomePositionFromVehicle(Vehicle* vehicle);
// Called to set the initial home position. Vehicle can still update home position after this.
void setInitialHomePosition(const QGeoCoordinate& coordinate);
// Called to set the initial home position specified by user. Vehicle will no longer affect home position.
void setInitialHomePositionFromUser(const QGeoCoordinate& coordinate);
// Overrides from ComplexMissionItem
QString patternName (void) const final { return QString(); }
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("SimpleItemMapVisual.qml"); }
bool isSingleItem (void) const final { return true; }
bool terrainCollision (void) const final { return false; }
// Overrides from VisualMissionItem
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 "Mission Start"; }
QString commandName (void) const final { return "Mission Start"; }
QString abbreviation (void) const final;
QGeoCoordinate coordinate (void) const final { return _plannedHomePositionCoordinate; } // Includes altitude
QGeoCoordinate exitCoordinate (void) const final { return _plannedHomePositionCoordinate; }
int sequenceNumber (void) const final { return _sequenceNumber; }
double specifiedGimbalYaw (void) final;
double specifiedGimbalPitch (void) final;
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double /*newAltitude*/) final { /* no action */ }
double specifiedFlightSpeed (void) final;
double additionalTimeDelay (void) const final { return 0; }
bool exitCoordinateSameAsEntry (void) const final { return true; }
void setDirty (bool dirty) final;
void setCoordinate (const QGeoCoordinate& coordinate) final; // Should only be called if the end user is moving
void setSequenceNumber (int sequenceNumber) final;
void save (QJsonArray& missionItems) final;
double amslEntryAlt (void) const final { return _plannedHomePositionCoordinate.altitude(); }
double amslExitAlt (void) const final { return amslEntryAlt(); }
double minAMSLAltitude (void) const final { return amslEntryAlt(); }
double maxAMSLAltitude (void) const final { return amslEntryAlt(); }
signals:
void specifyMissionFlightSpeedChanged (bool specifyMissionFlightSpeed);
private slots:
void _setDirtyAndUpdateLastSequenceNumber (void);
void _setDirty (void);
void _sectionDirtyChanged (bool dirty);
void _updateAltitudeInCoordinate (QVariant value);
void _setHomeAltFromTerrain (double terrainAltitude);
void _setCoordinateWorker (const QGeoCoordinate& coordinate);
void _updateHomePosition (const QGeoCoordinate& homePosition);
private:
Vehicle* _managerVehicle = nullptr;
QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitude
Fact _plannedHomePositionAltitudeFact;
int _sequenceNumber = 0;
bool _plannedHomePositionFromVehicle = false;
bool _plannedHomePositionMovedByUser = false;
CameraSection _cameraSection;
SpeedSection _speedSection;
static QMap<QString, FactMetaData*> _metaDataMap;
static const char* _plannedHomePositionAltitudeName;
};
#endif