QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
VisualMissionItem.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QObject>
4#include <QtCore/QString>
5#include <QtPositioning/QGeoCoordinate>
6#include <QtQmlIntegration/QtQmlIntegration>
7
10#include "QGCMAVLinkTypes.h"
11#include "QmlObjectListModel.h"
12
15class MissionItem;
18class Vehicle;
19
20// Abstract base class for all Simple and Complex visual mission objects.
21class VisualMissionItem : public QObject
22{
23 Q_OBJECT
24 QML_ELEMENT
25 QML_UNCREATABLE("")
26 Q_MOC_INCLUDE("PlanMasterController.h")
27
28public:
31
33
35
41 Q_ENUM(ReadyForSaveState)
42
43 Q_PROPERTY(bool homePosition READ homePosition CONSTANT)
44 Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged)
45 Q_PROPERTY(double amslEntryAlt READ amslEntryAlt NOTIFY amslEntryAltChanged)
46 Q_PROPERTY(double terrainAltitude READ terrainAltitude NOTIFY terrainAltitudeChanged)
48 Q_PROPERTY(QGeoCoordinate entryCoordinate READ entryCoordinate NOTIFY entryCoordinateChanged)
49 Q_PROPERTY(QGeoCoordinate exitCoordinate READ exitCoordinate NOTIFY exitCoordinateChanged)
50 Q_PROPERTY(double amslExitAlt READ amslExitAlt NOTIFY amslExitAltChanged)
53 Q_PROPERTY(QString commandName READ commandName NOTIFY commandNameChanged)
54 Q_PROPERTY(QString abbreviation READ abbreviation NOTIFY abbreviationChanged)
55 Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged)
56 Q_PROPERTY(bool isCurrentItem READ isCurrentItem WRITE setIsCurrentItem NOTIFY isCurrentItemChanged)
63 Q_PROPERTY(bool isSimpleItem READ isSimpleItem NOTIFY isSimpleItemChanged)
64 Q_PROPERTY(bool isTakeoffItem READ isTakeoffItem NOTIFY isTakeoffItemChanged)
65 Q_PROPERTY(bool isLandCommand READ isLandCommand NOTIFY isLandCommandChanged)
66 Q_PROPERTY(bool isSurveyItem READ isSurveyItem )
67 Q_PROPERTY(QString editorQml MEMBER _editorQml CONSTANT)
68 Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT)
73 Q_PROPERTY(double missionGimbalYaw READ missionGimbalYaw NOTIFY missionGimbalYawChanged)
75 Q_PROPERTY(bool flyView READ flyView CONSTANT)
76 Q_PROPERTY(bool wizardMode READ wizardMode WRITE setWizardMode NOTIFY wizardModeChanged)
77 Q_PROPERTY(int previousVTOLMode MEMBER _previousVTOLMode NOTIFY previousVTOLModeChanged)
78
82 Q_PROPERTY(QmlObjectListModel* childItems READ childItems CONSTANT)
84
85 // The following properties are calculated/set by the MissionController recalc methods
86
87 Q_PROPERTY(double altDifference READ altDifference WRITE setAltDifference NOTIFY altDifferenceChanged)
88 Q_PROPERTY(double altPercent READ altPercent WRITE setAltPercent NOTIFY altPercentChanged)
89 Q_PROPERTY(double terrainPercent READ terrainPercent WRITE setTerrainPercent NOTIFY terrainPercentChanged)
91 Q_PROPERTY(double azimuth READ azimuth WRITE setAzimuth NOTIFY azimuthChanged)
92 Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged)
94
95 // Property accesors
96 bool homePosition (void) const { return _homePositionSpecialCase; }
97 double altDifference (void) const { return _altDifference; }
98 double altPercent (void) const { return _altPercent; }
99 double terrainPercent (void) const { return _terrainPercent; }
100 bool terrainCollision (void) const { return _terrainCollision; }
101 double azimuth (void) const { return _azimuth; }
102 double distance (void) const { return _distance; }
103 double distanceFromStart (void) const { return _distanceFromStart; }
104 bool isCurrentItem (void) const { return _isCurrentItem; }
105 bool hasCurrentChildItem (void) const { return _hasCurrentChildItem; }
106 double terrainAltitude (void) const { return _terrainAltitude; }
107 bool terrainQueryFailed (void) const { return _terrainQueryFailed; }
108 bool flyView (void) const { return _flyView; }
109 bool wizardMode (void) const { return _wizardMode; }
111
113
116 void setAltDifference (double altDifference);
117 void setAltPercent (double altPercent);
118 void setTerrainPercent (double terrainPercent);
120 void setAzimuth (double azimuth);
121 void setDistance (double distance);
123 void setWizardMode (bool wizardMode);
125
126 void setHomePositionSpecialCase (bool homePositionSpecialCase) { _homePositionSpecialCase = homePositionSpecialCase; }
127
131
133
134 // Pure virtuals which must be provides by derived classes
135
136 virtual bool dirty (void) const = 0;
137 virtual bool isSimpleItem (void) const = 0;
138 virtual bool isTakeoffItem (void) const { return false; }
139 virtual bool isLandCommand (void) const { return false; }
140 virtual bool isSurveyItem (void) const { return false; }
141 virtual bool isStandaloneCoordinate (void) const = 0;
142 virtual bool specifiesCoordinate (void) const = 0;
143 virtual bool specifiesAltitudeOnly (void) const = 0;
144 virtual QString commandDescription (void) const = 0;
145 virtual QString commandName (void) const = 0;
146 virtual QString abbreviation (void) const = 0;
147 virtual QGeoCoordinate coordinate (void) const = 0;
148 virtual QGeoCoordinate entryCoordinate (void) const = 0;
149 virtual QGeoCoordinate exitCoordinate (void) const = 0;
150 virtual double editableAlt (void) const = 0;
151 virtual double amslEntryAlt (void) const = 0;
152 virtual double amslExitAlt (void) const = 0;
153 virtual int sequenceNumber (void) const = 0;
154 virtual double specifiedFlightSpeed (void) = 0;
155 virtual double specifiedGimbalYaw (void) = 0;
156 virtual double specifiedGimbalPitch (void) = 0;
157 virtual double specifiedVehicleYaw (void) { return qQNaN(); }
158
159 //-- Default implementation returns an invalid bounding cube
160 virtual QGCGeoBoundingCube* boundingCube (void) { return &_boundingCube; }
161
164 virtual void setMissionFlightStatus(MissionFlightStatus_t& missionFlightStatus);
165
166 virtual bool exitCoordinateSameAsEntry (void) const = 0;
167
168 virtual void setDirty (bool dirty) = 0;
169 virtual void setCoordinate (const QGeoCoordinate& coordinate) = 0;
170 virtual void setSequenceNumber (int sequenceNumber) = 0;
171 virtual int lastSequenceNumber (void) const = 0;
172
174 virtual ReadyForSaveState readyForSaveState(void) const { return ReadyForSave; }
175
178 virtual void save(QJsonArray& missionItems) = 0;
179
181 virtual QString mapVisualQML(void) const = 0;
182
186 virtual void appendMissionItems(QList<MissionItem*>& items, QObject* missionItemParent) = 0;
187
189 virtual void applyNewAltitude(double newAltitude) = 0;
190
192 virtual double additionalTimeDelay(void) const = 0;
193
194 double missionGimbalYaw (void) const { return _missionGimbalYaw; }
195 double missionVehicleYaw (void) const { return _missionVehicleYaw; }
196 void setMissionVehicleYaw(double vehicleYaw);
197
198 static constexpr const char* jsonTypeKey = "type";
199 static constexpr const char* jsonTypeSimpleItemValue = "SimpleItem";
200 static constexpr const char* jsonTypeComplexItemValue = "ComplexItem";
201
202signals:
207 void azimuthChanged (double azimuth);
211 void coordinateChanged (const QGeoCoordinate& coordinate);
212 void entryCoordinateChanged (const QGeoCoordinate& entryCoordinate);
213 void exitCoordinateChanged (const QGeoCoordinate& exitCoordinate);
214 void dirtyChanged (bool dirty);
240 void amslEntryAltChanged (double alt);
241 void amslExitAltChanged (double alt);
244
246
247protected slots:
248 void _amslEntryAltChanged(void); // signals new amslEntryAlt value
249 void _amslExitAltChanged(void); // signals new amslExitAlt value
250
251protected:
252 bool _flyView = false;
253 bool _isCurrentItem = false;
255 bool _dirty = false;
257 bool _wizardMode = false;
258 double _terrainAltitude = qQNaN();
259 bool _terrainQueryFailed = false;
260 double _altDifference = 0;
261 double _altPercent = 0;
262 double _terrainPercent = qQNaN();
263 bool _terrainCollision = false;
264 double _azimuth = 0;
265 double _distance = 0;
267 QString _editorQml;
268 double _missionGimbalYaw = qQNaN();
269 double _missionVehicleYaw = qQNaN();
271
278
281
282protected:
284
285private slots:
286 void _updateTerrainAltitude (void);
287 void _reallyUpdateTerrainAltitude (void);
288 void _terrainDataReceived (bool success, QList<double> heights);
289
290private:
291 void _commonInit(void);
292
293 QTimer _updateTerrainTimer;
294 TerrainAtCoordinateQuery* _currentTerrainAtCoordinateQuery = nullptr;
295
296 double _lastLatTerrainQuery = 0;
297 double _lastLonTerrainQuery = 0;
298};
Master controller for mission, fence, rally.
NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be o...
virtual int lastSequenceNumber(void) const =0
virtual bool dirty(void) const =0
virtual QString abbreviation(void) const =0
void setIsCurrentItem(bool isCurrentItem)
void setDistanceFromStart(double distanceFromStart)
void setHasCurrentChildItem(bool hasCurrentChildItem)
PlanMasterController * _masterController
virtual QString mapVisualQML(void) const =0
void specifiedVehicleYawChanged(void)
virtual void setCoordinate(const QGeoCoordinate &coordinate)=0
VisualMissionItem * _parentItem
bool _homePositionSpecialCase
true: This item is being used as a ui home position indicator
void distanceChanged(double distance)
virtual int sequenceNumber(void) const =0
void _setBoundingCube(QGCGeoBoundingCube bc)
void setTerrainCollision(bool terrainCollision)
virtual void applyNewAltitude(double newAltitude)=0
Adjust the altitude of the item if appropriate to the new altitude.
void abbreviationChanged(void)
void setAltDifference(double altDifference)
void setMissionVehicleYaw(double vehicleYaw)
bool flyView(void) const
static constexpr const char * jsonTypeComplexItemValue
Item type is Complex Item.
virtual bool isTakeoffItem(void) const
virtual bool isStandaloneCoordinate(void) const =0
QmlObjectListModel _childItems
This is used to reference any subsequent mission items which do not specify a coordinate.
bool hasCurrentChildItem(void) const
void amslExitAltChanged(double alt)
double altDifference(void) const
QString _editorQml
Qml resource for editing item.
virtual double amslExitAlt(void) const =0
void setParentItem(VisualMissionItem *parentItem)
void terrainAltitudeChanged(double terrainAltitude)
void isCurrentItemChanged(bool isCurrentItem)
void terrainCollisionChanged(bool terrainCollision)
void azimuthChanged(double azimuth)
void setWizardMode(bool wizardMode)
void specifiesAltitudeOnlyChanged(void)
bool isCurrentItem(void) const
void lastSequenceNumberChanged(int sequenceNumber)
void commandNameChanged(void)
double _distanceFromStart
Flight path cumalative horizontal distance from home point to this item.
void entryCoordinateChanged(const QGeoCoordinate &entryCoordinate)
double altPercent(void) const
void specifiesCoordinateChanged(void)
bool terrainQueryFailed(void) const
void coordinateChanged(const QGeoCoordinate &coordinate)
QGCMAVLinkTypes::VehicleClass_t _previousVTOLMode
Generic == unknown.
void setSimpleFlighPathSegment(FlightPathSegment *segment)
virtual double specifiedGimbalPitch(void)=0
void readyForSaveStateChanged(void)
double terrainPercent(void) const
void specifiedFlightSpeedChanged(void)
void clearSimpleFlighPathSegment(void)
void currentVTOLModeChanged(void)
Signals that this item has changed the VTOL mode (MAV_CMD_DO_VTOL_TRANSITION)
void setDistance(double distance)
virtual void setSequenceNumber(int sequenceNumber)=0
virtual double specifiedGimbalYaw(void)=0
virtual double specifiedVehicleYaw(void)
virtual double specifiedFlightSpeed(void)=0
bool homePosition(void) const
< Flight path cumalative horizontal distance from home point to this item
double missionVehicleYaw(void) const
FlightPathSegment * simpleFlightPathSegment(void)
void commandDescriptionChanged(void)
void missionGimbalYawChanged(double missionGimbalYaw)
virtual double amslEntryAlt(void) const =0
void isSimpleItemChanged(bool isSimpleItem)
void setAltPercent(double altPercent)
virtual ReadyForSaveState readyForSaveState(void) const
MissionController * _missionController
void specifiedGimbalYawChanged(void)
double distance(void) const
void isStandaloneCoordinateChanged(void)
void altDifferenceChanged(double altDifference)
void amslEntryAltChanged(double alt)
void specifiedGimbalPitchChanged(void)
void setTerrainPercent(double terrainPercent)
double _terrainAltitude
Altitude of terrain at coordinate position, NaN for not known.
double _terrainPercent
Percent of terrain altitude for coordinate.
double _altDifference
Difference in altitude from previous waypoint.
void parentItemChanged(VisualMissionItem *parentItem)
double distanceFromStart(void) const
bool _wizardMode
true: Item editor is showing wizard completion panel
void exitCoordinateSameAsEntryChanged(bool exitCoordinateSameAsEntry)
static constexpr const char * jsonTypeKey
Json file attribute which specifies the item type.
void _amslEntryAltChanged(void)
void dirtyChanged(bool dirty)
virtual bool isSurveyItem(void) const
FlightPathSegment * _simpleFlightPathSegment
The simple item flight segment (if any) which starts with this visual item.
void isLandCommandChanged(void)
double missionGimbalYaw(void) const
bool wizardMode(void) const
void isTakeoffItemChanged(bool isTakeoffItem)
virtual QGeoCoordinate coordinate(void) const =0
void boundingCubeChanged(void)
bool _terrainQueryFailed
true: Last terrain query failed
virtual bool specifiesAltitudeOnly(void) const =0
void previousVTOLModeChanged(void)
virtual void appendMissionItems(QList< MissionItem * > &items, QObject *missionItemParent)=0
virtual QString commandName(void) const =0
virtual bool isLandCommand(void) const
static constexpr const char * jsonTypeSimpleItemValue
Item type is MISSION_ITEM.
virtual QGCGeoBoundingCube * boundingCube(void)
void sequenceNumberChanged(int sequenceNumber)
virtual void setDirty(bool dirty)=0
virtual bool isSimpleItem(void) const =0
double _distance
Distance to previous waypoint.
QmlObjectListModel * childItems(void)
virtual bool exitCoordinateSameAsEntry(void) const =0
virtual double additionalTimeDelay(void) const =0
virtual bool specifiesCoordinate(void) const =0
void exitCoordinateChanged(const QGeoCoordinate &exitCoordinate)
void setHomePositionSpecialCase(bool homePositionSpecialCase)
void setAzimuth(double azimuth)
QGCGeoBoundingCube _boundingCube
The bounding "cube" of this element.
void additionalTimeDelayChanged(void)
bool _terrainCollision
true: item collides with terrain
virtual QString commandDescription(void) const =0
const VisualMissionItem & operator=(const VisualMissionItem &other)
PlanMasterController * masterController(void)
void wizardModeChanged(bool wizardMode)
void hasCurrentChildItemChanged(bool hasCurrentChildItem)
void altPercentChanged(double altPercent)
double _altPercent
Percent of total altitude change in mission.
virtual void save(QJsonArray &missionItems)=0
virtual QGeoCoordinate exitCoordinate(void) const =0
virtual void setMissionFlightStatus(MissionFlightStatus_t &missionFlightStatus)
VisualMissionItem * parentItem(void)
double azimuth(void) const
virtual QGeoCoordinate entryCoordinate(void) const =0
bool terrainCollision(void) const
double terrainAltitude(void) const
void missionVehicleYawChanged(double missionVehicleYaw)
virtual double editableAlt(void) const =0
void terrainQueryFailedChanged(bool terrainQueryFailed)
double _azimuth
Azimuth to previous waypoint.
void terrainPercentChanged(double terrainPercent)
void distanceFromStartChanged(double distanceFromStart)
static constexpr VehicleClass_t VehicleClassGeneric