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)
69 Q_PROPERTY(QString geoMapVisualQML READ geoMapVisualQML CONSTANT)
74 Q_PROPERTY(double missionGimbalYaw READ missionGimbalYaw NOTIFY missionGimbalYawChanged)
76 Q_PROPERTY(bool flyView READ flyView CONSTANT)
77 Q_PROPERTY(bool wizardMode READ wizardMode WRITE setWizardMode NOTIFY wizardModeChanged)
78 Q_PROPERTY(int previousVTOLMode MEMBER _previousVTOLMode NOTIFY previousVTOLModeChanged)
79
83 Q_PROPERTY(QmlObjectListModel* childItems READ childItems CONSTANT)
85
86 // The following properties are calculated/set by the MissionController recalc methods
87
88 Q_PROPERTY(double altDifference READ altDifference WRITE setAltDifference NOTIFY altDifferenceChanged)
89 Q_PROPERTY(double altPercent READ altPercent WRITE setAltPercent NOTIFY altPercentChanged)
90 Q_PROPERTY(double terrainPercent READ terrainPercent WRITE setTerrainPercent NOTIFY terrainPercentChanged)
92 Q_PROPERTY(double azimuth READ azimuth WRITE setAzimuth NOTIFY azimuthChanged)
93 Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged)
95
96 // Property accesors
97 bool homePosition (void) const { return _homePositionSpecialCase; }
98 double altDifference (void) const { return _altDifference; }
99 double altPercent (void) const { return _altPercent; }
100 double terrainPercent (void) const { return _terrainPercent; }
101 bool terrainCollision (void) const { return _terrainCollision; }
102 double azimuth (void) const { return _azimuth; }
103 double distance (void) const { return _distance; }
104 double distanceFromStart (void) const { return _distanceFromStart; }
105 bool isCurrentItem (void) const { return _isCurrentItem; }
106 bool hasCurrentChildItem (void) const { return _hasCurrentChildItem; }
107 double terrainAltitude (void) const { return _terrainAltitude; }
108 bool terrainQueryFailed (void) const { return _terrainQueryFailed; }
109 bool flyView (void) const { return _flyView; }
110 bool wizardMode (void) const { return _wizardMode; }
112
114
117 void setAltDifference (double altDifference);
118 void setAltPercent (double altPercent);
119 void setTerrainPercent (double terrainPercent);
121 void setAzimuth (double azimuth);
122 void setDistance (double distance);
124 void setWizardMode (bool wizardMode);
126
127 void setHomePositionSpecialCase (bool homePositionSpecialCase) { _homePositionSpecialCase = homePositionSpecialCase; }
128
132
134
135 // Pure virtuals which must be provides by derived classes
136
137 virtual bool dirty (void) const = 0;
138 virtual bool isSimpleItem (void) const = 0;
139 virtual bool isTakeoffItem (void) const { return false; }
140 virtual bool isLandCommand (void) const { return false; }
141 virtual bool isSurveyItem (void) const { return false; }
142 virtual bool isStandaloneCoordinate (void) const = 0;
143 virtual bool specifiesCoordinate (void) const = 0;
144 virtual bool specifiesAltitudeOnly (void) const = 0;
145 virtual QString commandDescription (void) const = 0;
146 virtual QString commandName (void) const = 0;
147 virtual QString abbreviation (void) const = 0;
148 virtual QGeoCoordinate coordinate (void) const = 0;
149 virtual QGeoCoordinate entryCoordinate (void) const = 0;
150 virtual QGeoCoordinate exitCoordinate (void) const = 0;
151 virtual double editableAlt (void) const = 0;
152 virtual double amslEntryAlt (void) const = 0;
153 virtual double amslExitAlt (void) const = 0;
154 virtual int sequenceNumber (void) const = 0;
155 virtual double specifiedFlightSpeed (void) = 0;
156 virtual double specifiedGimbalYaw (void) = 0;
157 virtual double specifiedGimbalPitch (void) = 0;
158 virtual double specifiedVehicleYaw (void) { return qQNaN(); }
159
160 //-- Default implementation returns an invalid bounding cube
161 virtual QGCGeoBoundingCube* boundingCube (void) { return &_boundingCube; }
162
165 virtual void setMissionFlightStatus(MissionFlightStatus_t& missionFlightStatus);
166
167 virtual bool exitCoordinateSameAsEntry (void) const = 0;
168
169 virtual void setDirty (bool dirty) = 0;
170 virtual void setCoordinate (const QGeoCoordinate& coordinate) = 0;
171 virtual void setSequenceNumber (int sequenceNumber) = 0;
172 virtual int lastSequenceNumber (void) const = 0;
173
175 virtual ReadyForSaveState readyForSaveState(void) const { return ReadyForSave; }
176
179 virtual void save(QJsonArray& missionItems) = 0;
180
182 virtual QString mapVisualQML(void) const = 0;
183
186 virtual QString geoMapVisualQML(void) const { return QString(); }
187
190 virtual bool terrainAltitudeRequiredInFlyView(void) const { return false; }
191
195 virtual void appendMissionItems(QList<MissionItem*>& items, QObject* missionItemParent) = 0;
196
198 virtual void applyNewAltitude(double newAltitude) = 0;
199
201 virtual double additionalTimeDelay(void) const = 0;
202
203 double missionGimbalYaw (void) const { return _missionGimbalYaw; }
204 double missionVehicleYaw (void) const { return _missionVehicleYaw; }
205 void setMissionVehicleYaw(double vehicleYaw);
206
207 static constexpr const char* jsonTypeKey = "type";
208 static constexpr const char* jsonTypeSimpleItemValue = "SimpleItem";
209 static constexpr const char* jsonTypeComplexItemValue = "ComplexItem";
210
211signals:
216 void azimuthChanged (double azimuth);
220 void coordinateChanged (const QGeoCoordinate& coordinate);
221 void entryCoordinateChanged (const QGeoCoordinate& entryCoordinate);
222 void exitCoordinateChanged (const QGeoCoordinate& exitCoordinate);
223 void dirtyChanged (bool dirty);
249 void amslEntryAltChanged (double alt);
250 void amslExitAltChanged (double alt);
253
255
256protected slots:
257 void _amslEntryAltChanged(void); // signals new amslEntryAlt value
258 void _amslExitAltChanged(void); // signals new amslExitAlt value
259
260protected:
261 bool _flyView = false;
262 bool _isCurrentItem = false;
264 bool _dirty = false;
266 bool _wizardMode = false;
267 double _terrainAltitude = qQNaN();
268 bool _terrainQueryFailed = false;
269 double _altDifference = 0;
270 double _altPercent = 0;
271 double _terrainPercent = qQNaN();
272 bool _terrainCollision = false;
273 double _azimuth = 0;
274 double _distance = 0;
276 QString _editorQml;
277 double _missionGimbalYaw = qQNaN();
278 double _missionVehicleYaw = qQNaN();
280
287
290
291protected:
293
294private slots:
295 void _updateTerrainAltitude (void);
296 void _reallyUpdateTerrainAltitude (void);
297 void _terrainDataReceived (bool success, QList<double> heights);
298
299private:
300 void _commonInit(void);
301
302 QTimer _updateTerrainTimer;
303 TerrainAtCoordinateQuery* _currentTerrainAtCoordinateQuery = nullptr;
304
305 double _lastLatTerrainQuery = 0;
306 double _lastLonTerrainQuery = 0;
307};
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 bool terrainAltitudeRequiredInFlyView(void) const
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 geoMapVisualQML(void) const
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