Unverified Commit 2296ed0d authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #6233 from DonLakeFlyer/TerrainQueryInterface

Restructure for TerrainQueryInterface abstract base class
parents bf202aac 24f8cd47
...@@ -374,7 +374,7 @@ void TransectStyleComplexItem::_adjustTransectPointsForTerrain(void) ...@@ -374,7 +374,7 @@ void TransectStyleComplexItem::_adjustTransectPointsForTerrain(void)
bool surveyEdgeIndicator = transectPoint.altitude() == _surveyEdgeIndicator; bool surveyEdgeIndicator = transectPoint.altitude() == _surveyEdgeIndicator;
if (_followTerrain) { if (_followTerrain) {
transectPoint.setAltitude(_transectsPathHeightInfo[i].rgHeight[0] + altitude); transectPoint.setAltitude(_transectsPathHeightInfo[i].heights[0] + altitude);
} else { } else {
transectPoint.setAltitude(altitude); transectPoint.setAltitude(altitude);
} }
...@@ -390,7 +390,7 @@ void TransectStyleComplexItem::_adjustTransectPointsForTerrain(void) ...@@ -390,7 +390,7 @@ void TransectStyleComplexItem::_adjustTransectPointsForTerrain(void)
QGeoCoordinate transectPoint = _transectPoints.last().value<QGeoCoordinate>(); QGeoCoordinate transectPoint = _transectPoints.last().value<QGeoCoordinate>();
bool surveyEdgeIndicator = transectPoint.altitude() == _surveyEdgeIndicator; bool surveyEdgeIndicator = transectPoint.altitude() == _surveyEdgeIndicator;
if (_followTerrain){ if (_followTerrain){
transectPoint.setAltitude(_transectsPathHeightInfo.last().rgHeight.last() + altitude); transectPoint.setAltitude(_transectsPathHeightInfo.last().heights.last() + altitude);
} else { } else {
transectPoint.setAltitude(altitude); transectPoint.setAltitude(altitude);
} }
......
...@@ -180,10 +180,10 @@ void VisualMissionItem::_reallyUpdateTerrainAltitude(void) ...@@ -180,10 +180,10 @@ void VisualMissionItem::_reallyUpdateTerrainAltitude(void)
} }
} }
void VisualMissionItem::_terrainDataReceived(bool success, QList<float> altitudes) void VisualMissionItem::_terrainDataReceived(bool success, QList<double> heights)
{ {
if (success) { if (success) {
_terrainAltitude = altitudes[0]; _terrainAltitude = heights[0];
emit terrainAltitudeChanged(_terrainAltitude); emit terrainAltitudeChanged(_terrainAltitude);
sender()->deleteLater(); sender()->deleteLater();
} }
......
...@@ -211,7 +211,7 @@ protected: ...@@ -211,7 +211,7 @@ protected:
private slots: private slots:
void _updateTerrainAltitude (void); void _updateTerrainAltitude (void);
void _reallyUpdateTerrainAltitude (void); void _reallyUpdateTerrainAltitude (void);
void _terrainDataReceived (bool success, QList<float> altitudes); void _terrainDataReceived (bool success, QList<double> heights);
private: private:
QTimer _updateTerrainTimer; QTimer _updateTerrainTimer;
......
This diff is collapsed.
...@@ -21,31 +21,71 @@ Q_DECLARE_LOGGING_CATEGORY(TerrainQueryLog) ...@@ -21,31 +21,71 @@ Q_DECLARE_LOGGING_CATEGORY(TerrainQueryLog)
class TerrainAtCoordinateQuery; class TerrainAtCoordinateQuery;
// Base class for all terrain query objects /// Base class for offline/online terrain queries
class TerrainQuery : public QObject { class TerrainQueryInterface : public QObject
{
Q_OBJECT Q_OBJECT
public: public:
TerrainQuery(QObject* parent = NULL); TerrainQueryInterface(QObject* parent) : QObject(parent) { }
/// Request terrain heights for specified coodinates.
/// Signals: coordinateHeights when data is available
virtual void requestCoordinateHeights(const QList<QGeoCoordinate>& coordinates) = 0;
/// Requests terrain heights along the path specified by the two coordinates.
/// Signals: pathHeights
/// @param coordinates to query
virtual void requestPathHeights(const QGeoCoordinate& fromCoord, const QGeoCoordinate& toCoord) = 0;
/// Request terrain heights for the rectangular area specified.
/// Signals: carpetHeights when data is available
/// @param swCoord South-West bound of rectangular area to query
/// @param neCoord North-East bound of rectangular area to query
/// @param statsOnly true: Return only stats, no carpet data
virtual void requestCarpetHeights(const QGeoCoordinate& swCoord, const QGeoCoordinate& neCoord, bool statsOnly) = 0;
signals:
void coordinateHeights(bool success, QList<double> heights);
void pathHeights(bool success, double latStep, double lonStep, const QList<double>& heights);
void carpetHeights(bool success, double minHeight, double maxHeight, const QList<QList<double>>& carpet);
};
protected: /// AirMap online implementation of terrain queries
// Send a query to AirMap terrain servers. Data and errors are returned back from super class virtual implementations. class TerrainAirMapQuery : public TerrainQueryInterface {
// @param path Additional path to add to url Q_OBJECT
// @param urlQuery Query to send
void _sendQuery(const QString& path, const QUrlQuery& urlQuery); public:
TerrainAirMapQuery(QObject* parent = NULL);
// Called when the request to the server fails or succeeds // Overrides from TerrainQueryInterface
virtual void _terrainData(bool success, const QJsonValue& dataJsonValue) = 0; void requestCoordinateHeights(const QList<QGeoCoordinate>& coordinates) final;
void requestPathHeights(const QGeoCoordinate& fromCoord, const QGeoCoordinate& toCoord) final;
void requestCarpetHeights(const QGeoCoordinate& swCoord, const QGeoCoordinate& neCoord, bool statsOnly) final;
private slots: private slots:
void _requestFinished(void); void _requestFinished(void);
private: private:
QNetworkAccessManager _networkManager; void _sendQuery (const QString& path, const QUrlQuery& urlQuery);
void _requestFailed (void);
void _parseCoordinateData (const QJsonValue& coordinateJson);
void _parsePathData (const QJsonValue& pathJson);
void _parseCarpetData (const QJsonValue& carpetJson);
enum QueryMode {
QueryModeCoordinates,
QueryModePath,
QueryModeCarpet
};
QNetworkAccessManager _networkManager;
QueryMode _queryMode;
bool _carpetStatsOnly;
}; };
/// Used internally by TerrainAtCoordinateQuery to batch coordinate requests together /// Used internally by TerrainAtCoordinateQuery to batch coordinate requests together
class TerrainAtCoordinateBatchManager : public TerrainQuery { class TerrainAtCoordinateBatchManager : public QObject {
Q_OBJECT Q_OBJECT
public: public:
...@@ -53,13 +93,10 @@ public: ...@@ -53,13 +93,10 @@ public:
void addQuery(TerrainAtCoordinateQuery* terrainAtCoordinateQuery, const QList<QGeoCoordinate>& coordinates); void addQuery(TerrainAtCoordinateQuery* terrainAtCoordinateQuery, const QList<QGeoCoordinate>& coordinates);
protected:
// Overrides from TerrainQuery
void _terrainData(bool success, const QJsonValue& dataJsonValue) final;
private slots: private slots:
void _sendNextBatch (void); void _sendNextBatch (void);
void _queryObjectDestroyed (QObject* elevationProvider); void _queryObjectDestroyed (QObject* elevationProvider);
void _coordinateHeights (bool success, QList<double> heights);
private: private:
typedef struct { typedef struct {
...@@ -87,6 +124,7 @@ private: ...@@ -87,6 +124,7 @@ private:
State _state = State::Idle; State _state = State::Idle;
const int _batchTimeout = 500; const int _batchTimeout = 500;
QTimer _batchTimer; QTimer _batchTimer;
TerrainAirMapQuery _terrainQuery;
}; };
/// NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be on main thread. /// NOTE: TerrainAtCoordinateQuery is not thread safe. All instances/calls to ElevationProvider must be on main thread.
...@@ -102,13 +140,13 @@ public: ...@@ -102,13 +140,13 @@ public:
void requestData(const QList<QGeoCoordinate>& coordinates); void requestData(const QList<QGeoCoordinate>& coordinates);
// Internal method // Internal method
void _signalTerrainData(bool success, QList<float>& altitudes); void _signalTerrainData(bool success, QList<double>& heights);
signals: signals:
void terrainData(bool success, QList<float> altitudes); void terrainData(bool success, QList<double> heights);
}; };
class TerrainPathQuery : public TerrainQuery class TerrainPathQuery : public QObject
{ {
Q_OBJECT Q_OBJECT
...@@ -123,16 +161,18 @@ public: ...@@ -123,16 +161,18 @@ public:
typedef struct { typedef struct {
double latStep; ///< Amount of latitudinal distance between each returned height double latStep; ///< Amount of latitudinal distance between each returned height
double lonStep; ///< Amount of longitudinal distance between each returned height double lonStep; ///< Amount of longitudinal distance between each returned height
QList<double> rgHeight; ///< Terrain heights along path QList<double> heights; ///< Terrain heights along path
} PathHeightInfo_t; } PathHeightInfo_t;
signals: signals:
/// Signalled when terrain data comes back from server /// Signalled when terrain data comes back from server
void terrainData(bool success, const PathHeightInfo_t& pathHeightInfo); void terrainData(bool success, const PathHeightInfo_t& pathHeightInfo);
protected: private slots:
// Overrides from TerrainQuery void _pathHeights(bool success, double latStep, double lonStep, const QList<double>& heights);
void _terrainData(bool success, const QJsonValue& dataJsonValue) final;
private:
TerrainAirMapQuery _terrainQuery;
}; };
Q_DECLARE_METATYPE(TerrainPathQuery::PathHeightInfo_t) Q_DECLARE_METATYPE(TerrainPathQuery::PathHeightInfo_t)
...@@ -165,7 +205,7 @@ private: ...@@ -165,7 +205,7 @@ private:
}; };
class TerrainCarpetQuery : public TerrainQuery class TerrainCarpetQuery : public QObject
{ {
Q_OBJECT Q_OBJECT
...@@ -183,12 +223,7 @@ signals: ...@@ -183,12 +223,7 @@ signals:
/// Signalled when terrain data comes back from server /// Signalled when terrain data comes back from server
void terrainData(bool success, double minHeight, double maxHeight, const QList<QList<double>>& carpet); void terrainData(bool success, double minHeight, double maxHeight, const QList<QList<double>>& carpet);
protected:
// Overrides from TerrainQuery
void _terrainData(bool success, const QJsonValue& dataJsonValue) final;
private: private:
bool _statsOnly; TerrainAirMapQuery _terrainQuery;
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment