6#include "MAVLinkEnums.h"
15constexpr double kSetHomeTerrainAltMax = 10000.0;
16constexpr double kSetHomeTerrainAltMin = -500.0;
19constexpr int kAltQueryMinIntervalMs = 500;
20constexpr qreal kAltMinDistanceTraveled = 2.0;
21constexpr float kAltMinAltitudeChanged = 0.5f;
28 _altQueryTimer.restart();
33 if (!coord.isValid()) {
40 if (_doSetHomeQuery) {
42 this, &TerrainQueryCoordinator::_doSetHomeTerrainReceived);
43 _doSetHomeQuery =
nullptr;
46 _doSetHomeCoordinate = coord;
50 this, &TerrainQueryCoordinator::_doSetHomeTerrainReceived);
52 QList<QGeoCoordinate> rgCoord;
53 rgCoord.append(coord);
54 _doSetHomeQuery->requestData(rgCoord);
57void TerrainQueryCoordinator::_doSetHomeTerrainReceived(
bool success, QList<double> heights)
60 const double terrainAltitude = heights[0];
61 if (_doSetHomeCoordinate.isValid()
62 && terrainAltitude <= kSetHomeTerrainAltMax
63 && terrainAltitude >= kSetHomeTerrainAltMin) {
71 static_cast<float>(qQNaN()),
72 _doSetHomeCoordinate.latitude(),
73 _doSetHomeCoordinate.longitude(),
75 }
else if (_doSetHomeCoordinate.isValid()) {
76 qCDebug(TerrainQueryCoordinatorLog) <<
"_doSetHomeTerrainReceived: elevation data out of limits";
78 qCDebug(TerrainQueryCoordinatorLog) <<
"_doSetHomeTerrainReceived: cached home coordinate not valid";
81 QGC::showAppMessage(tr(
"Set Home failed, terrain data not available for selected coordinate"));
84 _doSetHomeQuery =
nullptr;
85 _doSetHomeCoordinate = QGeoCoordinate();
92 if (_altQueryTimer.elapsed() < kAltQueryMinIntervalMs) {
96 const QGeoCoordinate currentCoord = _vehicle->
coordinate();
97 if (!currentCoord.isValid()) {
104 if (_altLastCoord.isValid() && !qIsNaN(_altLastRelAlt)) {
105 if (_altLastCoord.distanceTo(currentCoord) < kAltMinDistanceTraveled
106 && std::fabs(currentRelAlt - _altLastRelAlt) < kAltMinAltitudeChanged) {
111 _altLastCoord = currentCoord;
112 _altLastRelAlt = currentRelAlt;
116 this, &TerrainQueryCoordinator::_altitudeAboveTerrainReceived);
122 this, &TerrainQueryCoordinator::_altitudeAboveTerrainReceived);
124 QList<QGeoCoordinate> rgCoord;
125 rgCoord.append(currentCoord);
126 _altQuery->requestData(rgCoord);
127 _altQueryTimer.restart();
130void TerrainQueryCoordinator::_altitudeAboveTerrainReceived(
bool success, QList<double> heights)
133 qCDebug(TerrainQueryCoordinatorLog) <<
"_altitudeAboveTerrainReceived: terrain data not available";
135 const double terrainAltitude = heights[0];
136 const double altitudeAboveTerrain = _vehicle->
altitudeAMSL()->
rawValue().toDouble() - terrainAltitude;
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void setRawValue(const QVariant &value)
QVariant rawValue() const
NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be o...
void terrainDataReceived(bool success, const QList< double > &heights)
void updateAltAboveTerrain()
void doSetHomeWithTerrain(const QGeoCoordinate &coord)
TerrainQueryCoordinator(Vehicle *vehicle)
Fact * altitudeRelative()
Fact * altitudeAboveTerr()
void sendMavCommand(int compId, MAV_CMD command, bool showError, float param1=0.0f, float param2=0.0f, float param3=0.0f, float param4=0.0f, float param5=0.0f, float param6=0.0f, float param7=0.0f)
int defaultComponentId() const
QGeoCoordinate coordinate()
void showAppMessage(const QString &message, const QString &title)
Modal application message. Queued if the UI isn't ready yet.