/**************************************************************************** * * (c) 2017 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #pragma once #include "QGCLoggingCategory.h" #include #include #include #include Q_DECLARE_LOGGING_CATEGORY(ElevationProviderLog) class ElevationProvider; /// Used internally by ElevationProvider to batch requests together class TerrainBatchManager : public QObject { Q_OBJECT public: TerrainBatchManager(void); void addQuery(ElevationProvider* elevationProvider, const QList& coordinates); private slots: void _sendNextBatch (void); void _requestFinished (void); void _elevationProviderDestroyed (QObject* elevationProvider); private: typedef struct { ElevationProvider* elevationProvider; QList coordinates; } QueuedRequestInfo_t; typedef struct { ElevationProvider* elevationProvider; bool providerDestroyed; int cCoord; } SentRequestInfo_t; enum class State { Idle, Downloading, }; void _batchFailed(void); QString _stateToString(State state); QList _requestQueue; QList _sentRequests; State _state = State::Idle; QNetworkAccessManager _networkManager; const int _batchTimeout = 500; QTimer _batchTimer; }; /// NOTE: ElevationProvider is not thread safe. All instances/calls to ElevationProvider must be on main thread. class ElevationProvider : public QObject { Q_OBJECT public: ElevationProvider(QObject* parent = NULL); /// Async elevation query for a list of lon,lat coordinates. When the query is done, the terrainData() signal /// is emitted. /// @param coordinates to query void queryTerrainData(const QList& coordinates); // Internal method void _signalTerrainData(bool success, QList& altitudes); signals: void terrainData(bool success, QList altitudes); };