QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FlightPathSegment.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QObject>
4#include <QtCore/QTimer>
5#include <QtPositioning/QGeoCoordinate>
6#include <QtQmlIntegration/QtQmlIntegration>
7
9
11
12// Important Note: The altitudes in the coordinates must be AMSL
13class FlightPathSegment : public QObject
14{
15 Q_OBJECT
16 QML_ELEMENT
17 QML_UNCREATABLE("")
18public:
20 SegmentTypeTakeoff, // Takeoff segments ignore the first part of the segment for terrain collisions
21 SegmentTypeGeneric, // Generic segments take into account the entire segment for terrain collisions
22 SegmentTypeLand, // Land segments ignore the last part of the segment for terrain collisions
23 SegmentTypeTerrainFrame, // Flight path in between the two coords follows terrain
24 };
25 Q_ENUM(SegmentType)
26
27 FlightPathSegment(SegmentType segmentType, const QGeoCoordinate& coord1, double coord1AMSLAlt, const QGeoCoordinate& coord2, double coord2AMSLAlt, bool queryTerrainData, QObject* parent);
28
29 Q_PROPERTY(QGeoCoordinate coordinate1 MEMBER _coord1 NOTIFY coordinate1Changed)
30 Q_PROPERTY(QGeoCoordinate coordinate2 MEMBER _coord2 NOTIFY coordinate2Changed)
31 Q_PROPERTY(double coord1AMSLAlt MEMBER _coord1AMSLAlt NOTIFY coord1AMSLAltChanged)
32 Q_PROPERTY(double coord2AMSLAlt MEMBER _coord2AMSLAlt NOTIFY coord2AMSLAltChanged)
33 Q_PROPERTY(bool specialVisual READ specialVisual WRITE setSpecialVisual NOTIFY specialVisualChanged)
34 Q_PROPERTY(QVariantList amslTerrainHeights MEMBER _amslTerrainHeights NOTIFY amslTerrainHeightsChanged)
35 Q_PROPERTY(double distanceBetween MEMBER _distanceBetween NOTIFY distanceBetweenChanged)
36 Q_PROPERTY(double finalDistanceBetween MEMBER _finalDistanceBetween NOTIFY finalDistanceBetweenChanged)
37 Q_PROPERTY(double totalDistance MEMBER _totalDistance NOTIFY totalDistanceChanged)
38 Q_PROPERTY(bool terrainCollision MEMBER _terrainCollision NOTIFY terrainCollisionChanged)
39 Q_PROPERTY(SegmentType segmentType MEMBER _segmentType CONSTANT)
40
41 QGeoCoordinate coordinate1 (void) const { return _coord1; }
42 QGeoCoordinate coordinate2 (void) const { return _coord2; }
43 double coord1AMSLAlt (void) const { return _coord1AMSLAlt; }
44 double coord2AMSLAlt (void) const { return _coord2AMSLAlt; }
45 const QVariantList& amslTerrainHeights (void) const { return _amslTerrainHeights; }
46 double distanceBetween (void) const { return _distanceBetween; }
47 double finalDistanceBetween(void) const { return _finalDistanceBetween; }
48 double totalDistance (void) const { return _totalDistance; }
49 bool specialVisual (void) const { return _specialVisual; }
50 bool terrainCollision (void) const { return _terrainCollision; }
51 SegmentType segmentType (void) const { return _segmentType; }
52
54
55public slots:
56 void setCoordinate1 (const QGeoCoordinate& coordinate);
57 void setCoordinate2 (const QGeoCoordinate& coordinate);
58 void setCoord1AMSLAlt (double alt);
59 void setCoord2AMSLAlt (double alt);
60
61signals:
62 void coordinate1Changed (QGeoCoordinate coordinate);
63 void coordinate2Changed (QGeoCoordinate coordinate);
72
73private slots:
74 void _sendTerrainPathQuery (void);
75 void _terrainDataReceived (bool success, const TerrainPathHeightInfo& pathHeightInfo);
76 void _updateTotalDistance (void);
77 void _updateTerrainCollision (void);
78
79private:
80 QGeoCoordinate _coord1;
81 QGeoCoordinate _coord2;
82 double _coord1AMSLAlt = qQNaN();
83 double _coord2AMSLAlt = qQNaN();
84 bool _queryTerrainData;
85 bool _terrainCollision = false;
86 bool _specialVisual = false;
87 QTimer _delayedTerrainPathQueryTimer;
88 TerrainPathQuery* _currentTerrainPathQuery = nullptr;
89 QVariantList _amslTerrainHeights;
90 double _distanceBetween = 0;
91 double _finalDistanceBetween = 0;
92 double _totalDistance = 0;
93 SegmentType _segmentType = SegmentTypeGeneric;
94
95 static constexpr double _collisionIgnoreMeters = 10; // Distance to ignore for takeoff/land segments
96};
void terrainCollisionChanged(bool terrainCollision)
double distanceBetween(void) const
void totalDistanceChanged(double totalDistance)
void setCoordinate2(const QGeoCoordinate &coordinate)
void coord2AMSLAltChanged(void)
void finalDistanceBetweenChanged(double finalDistanceBetween)
QGeoCoordinate coordinate2(void) const
void coordinate1Changed(QGeoCoordinate coordinate)
SegmentType segmentType(void) const
void coord1AMSLAltChanged(void)
const QVariantList & amslTerrainHeights(void) const
void setSpecialVisual(bool specialVisual)
void amslTerrainHeightsChanged(void)
bool specialVisual(void) const
void specialVisualChanged(bool specialVisual)
void coordinate2Changed(QGeoCoordinate coordinate)
void setCoord2AMSLAlt(double alt)
double finalDistanceBetween(void) const
void distanceBetweenChanged(double distanceBetween)
void setCoord1AMSLAlt(double alt)
bool terrainCollision(void) const
double totalDistance(void) const
void setCoordinate1(const QGeoCoordinate &coordinate)
QGeoCoordinate coordinate1(void) const
double coord2AMSLAlt(void) const
double coord1AMSLAlt(void) const