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