12 , _coord1AMSLAlt (amslCoord1Alt)
13 , _coord2AMSLAlt (amslCoord2Alt)
14 , _queryTerrainData (queryTerrainData)
15 , _segmentType (segmentType)
17 _delayedTerrainPathQueryTimer.setSingleShot(
true);
18 _delayedTerrainPathQueryTimer.setInterval(200);
19 _delayedTerrainPathQueryTimer.callOnTimeout(
this, &FlightPathSegment::_sendTerrainPathQuery);
20 _updateTotalDistance();
22 qCDebug(FlightPathSegmentLog) <<
this <<
"new" << coord1 << coord2 << amslCoord1Alt << amslCoord2Alt << _totalDistance;
24 _sendTerrainPathQuery();
29 if (_coord1 != coordinate) {
32 _delayedTerrainPathQueryTimer.start();
33 _updateTotalDistance();
39 if (_coord2 != coordinate) {
42 _delayedTerrainPathQueryTimer.start();
43 _updateTotalDistance();
52 _updateTerrainCollision();
61 _updateTerrainCollision();
73void FlightPathSegment::_sendTerrainPathQuery(
void)
75 if (_queryTerrainData && _coord1.isValid() && _coord2.isValid()) {
76 qCDebug(FlightPathSegmentLog) <<
this <<
"_sendTerrainPathQuery";
78 if (_currentTerrainPathQuery) {
81 _currentTerrainPathQuery =
nullptr;
85 _amslTerrainHeights.clear();
87 _finalDistanceBetween = 0;
94 _currentTerrainPathQuery->
requestData(_coord1, _coord2);
98void FlightPathSegment::_terrainDataReceived(
bool success,
const TerrainPathHeightInfo& pathHeightInfo)
100 qCDebug(FlightPathSegmentLog) <<
this <<
"_terrainDataReceived" << success << pathHeightInfo.
heights.count();
111 _amslTerrainHeights.clear();
112 for (
const double& amslTerrainHeight: pathHeightInfo.heights) {
113 _amslTerrainHeights.append(amslTerrainHeight);
118 _currentTerrainPathQuery->deleteLater();
119 _currentTerrainPathQuery =
nullptr;
121 _updateTerrainCollision();
124void FlightPathSegment::_updateTotalDistance(
void)
126 double newTotalDistance = 0;
127 if (_coord1.isValid() && _coord2.isValid()) {
128 newTotalDistance = _coord1.distanceTo(_coord2);
132 _totalDistance = newTotalDistance;
137void FlightPathSegment::_updateTerrainCollision(
void)
139 bool newTerrainCollision =
false;
142 double slope = (_coord2AMSLAlt - _coord1AMSLAlt) / _totalDistance;
143 double yIntercept = _coord1AMSLAlt;
146 for (
int i=0; i<_amslTerrainHeights.count(); i++) {
147 bool ignoreCollision =
false;
149 ignoreCollision =
true;
150 }
else if (_segmentType ==
SegmentTypeLand && x > _totalDistance - _collisionIgnoreMeters) {
151 ignoreCollision =
true;
154 if (!ignoreCollision) {
155 double y = _amslTerrainHeights[i].value<
double>();
156 if (y > (slope * x) + yIntercept) {
157 newTerrainCollision =
true;
162 if (i == _amslTerrainHeights.count() - 2) {
163 x += _finalDistanceBetween;
165 x += _distanceBetween;
170 qCDebug(FlightPathSegmentLog) <<
this <<
"_updateTerrainCollision new:old" << newTerrainCollision << _terrainCollision;
172 if (newTerrainCollision != _terrainCollision) {
173 _terrainCollision = newTerrainCollision;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void terrainCollisionChanged(bool terrainCollision)
void totalDistanceChanged(double totalDistance)
void setCoordinate2(const QGeoCoordinate &coordinate)
void coord2AMSLAltChanged(void)
void finalDistanceBetweenChanged(double finalDistanceBetween)
@ SegmentTypeTerrainFrame
void coordinate1Changed(QGeoCoordinate coordinate)
void coord1AMSLAltChanged(void)
void setSpecialVisual(bool specialVisual)
void amslTerrainHeightsChanged(void)
bool specialVisual(void) const
void specialVisualChanged(bool specialVisual)
void coordinate2Changed(QGeoCoordinate coordinate)
void setCoord2AMSLAlt(double alt)
void distanceBetweenChanged(double distanceBetween)
void setCoord1AMSLAlt(double alt)
void setCoordinate1(const QGeoCoordinate &coordinate)
void terrainDataReceived(bool success, const TerrainPathQuery::PathHeightInfo_t &pathHeightInfo)
Signalled when terrain data comes back from server.
void requestData(const QGeoCoordinate &fromCoord, const QGeoCoordinate &toCoord)
bool fuzzyCompare(double value1, double value2)
Returns true if the two values are equal or close. Correctly handles 0 and NaN values.
double finalDistanceBetween
Distance between final two height values.
QList< double > heights
Terrain heights along path.
double distanceBetween
Distance between each height value.