diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 5d8234ca1d8c94776169abfaa3a7b95ab4409267..b093c3f58acc82e934cbb2104249a54ee7e7dcd9 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -493,6 +493,7 @@ void MissionController::removeAll(void) { if (_visualItems) { _deinitAllVisualItems(); + _visualItems->clearAndDeleteContents(); _visualItems->deleteLater(); _settingsItem = NULL; _visualItems = new QmlObjectListModel(this); diff --git a/src/MissionManager/SurveyMissionItem.h b/src/MissionManager/SurveyMissionItem.h index 315008a932d495c4fd78ba477f7bce75bf264e72..d2096ea1fe2d3a86b4bbacd0c3e575ca05d15492 100644 --- a/src/MissionManager/SurveyMissionItem.h +++ b/src/MissionManager/SurveyMissionItem.h @@ -296,7 +296,7 @@ private: static const char* _jsonFixedValueIsAltitudeKey; static const char* _jsonRefly90DegreesKey; - static const int _hoverAndCaptureDelaySeconds = 1; + static const int _hoverAndCaptureDelaySeconds = 2; }; #endif diff --git a/src/QGC.cc b/src/QGC.cc index 812099ab6a0e0ffd2a76bfa96f2c758d9b787159..dcfa7e2d52a6064334d6bd2938a047b46889de4e 100644 --- a/src/QGC.cc +++ b/src/QGC.cc @@ -61,14 +61,14 @@ double limitAngleToPMPId(double angle) { while (angle < -M_PI) { - angle += M_PI; + angle += 2.0f * M_PI; } } else if (angle > M_PI) { while (angle > M_PI) { - angle -= M_PI; + angle -= 2.0f * M_PI; } } } diff --git a/src/Terrain.cc b/src/Terrain.cc index 43367fe32cabbe123d3eebc1a2e4fb78d66265ae..cd2480cf9c53a4a0512514f05f9909b191fc37f7 100644 --- a/src/Terrain.cc +++ b/src/Terrain.cc @@ -33,6 +33,8 @@ TerrainBatchManager::TerrainBatchManager(void) void TerrainBatchManager::addQuery(ElevationProvider* elevationProvider, const QList& coordinates) { if (coordinates.length() > 0) { + qCDebug(ElevationProviderLog) << "addQuery: elevationProvider:coordinates.count" << elevationProvider << coordinates.count(); + connect(elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); QueuedRequestInfo_t queuedRequestInfo = { elevationProvider, coordinates }; _requestQueue.append(queuedRequestInfo); if (!_batchTimer.isActive()) { @@ -43,7 +45,7 @@ void TerrainBatchManager::addQuery(ElevationProvider* elevationProvider, const Q void TerrainBatchManager::_sendNextBatch(void) { - qCDebug(ElevationProviderLog) << "_sendNextBatch _state:_requestQueue.count" << (int)_state << _requestQueue.count(); + qCDebug(ElevationProviderLog) << "_sendNextBatch _state:_requestQueue.count:_sentRequests.count" << _stateToString(_state) << _requestQueue.count() << _sentRequests.count(); if (_state != State::Idle) { // Waiting for last download the complete, wait some more @@ -60,7 +62,7 @@ void TerrainBatchManager::_sendNextBatch(void) // Convert coordinates to point strings for json query QString points; foreach (const QueuedRequestInfo_t& requestInfo, _requestQueue) { - SentRequestInfo_t sentRequestInfo = { requestInfo.elevationProvider, requestInfo.coordinates.count() }; + SentRequestInfo_t sentRequestInfo = { requestInfo.elevationProvider, false, requestInfo.coordinates.count() }; qCDebug(ElevationProviderLog) << "Building request: coordinate count" << requestInfo.coordinates.count(); _sentRequests.append(sentRequestInfo); @@ -100,20 +102,23 @@ void TerrainBatchManager::_batchFailed(void) QList noAltitudes; foreach (const SentRequestInfo_t& sentRequestInfo, _sentRequests) { - sentRequestInfo.elevationProvider->_signalTerrainData(false, noAltitudes); + if (!sentRequestInfo.providerDestroyed) { + disconnect(sentRequestInfo.elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); + sentRequestInfo.elevationProvider->_signalTerrainData(false, noAltitudes); + } } _sentRequests.clear(); } void TerrainBatchManager::_requestFinished() { - qCDebug(ElevationProviderLog) << "_requestFinished"; QNetworkReply* reply = qobject_cast(QObject::sender()); _state = State::Idle; // When an error occurs we still end up here if (reply->error() != QNetworkReply::NoError) { + qCDebug(ElevationProviderLog) << "_requestFinished error:" << reply->error(); _batchFailed(); reply->deleteLater(); return; @@ -124,6 +129,7 @@ void TerrainBatchManager::_requestFinished() QJsonParseError parseError; QJsonDocument responseJson = QJsonDocument::fromJson(responseBytes, &parseError); if (parseError.error != QJsonParseError::NoError) { + qCDebug(ElevationProviderLog) << "_requestFinished unable to parse json:" << parseError.errorString(); _batchFailed(); reply->deleteLater(); return; @@ -132,6 +138,7 @@ void TerrainBatchManager::_requestFinished() QJsonObject rootObject = responseJson.object(); QString status = rootObject["status"].toString(); if (status != "success") { + qCDebug(ElevationProviderLog) << "_requestFinished status != success:" << status; _batchFailed(); reply->deleteLater(); return; @@ -145,15 +152,56 @@ void TerrainBatchManager::_requestFinished() int currentIndex = 0; foreach (const SentRequestInfo_t& sentRequestInfo, _sentRequests) { - QList requestAltitudes = altitudes.mid(currentIndex, sentRequestInfo.cCoord); - sentRequestInfo.elevationProvider->_signalTerrainData(true, requestAltitudes); - currentIndex += sentRequestInfo.cCoord; + if (!sentRequestInfo.providerDestroyed) { + disconnect(sentRequestInfo.elevationProvider, &ElevationProvider::destroyed, this, &TerrainBatchManager::_elevationProviderDestroyed); + QList requestAltitudes = altitudes.mid(currentIndex, sentRequestInfo.cCoord); + sentRequestInfo.elevationProvider->_signalTerrainData(true, requestAltitudes); + currentIndex += sentRequestInfo.cCoord; + } } _sentRequests.clear(); reply->deleteLater(); } +void TerrainBatchManager::_elevationProviderDestroyed(QObject* elevationProvider) +{ + // Remove/Mark deleted objects queries from queues + + qCDebug(ElevationProviderLog) << "_elevationProviderDestroyed elevationProvider" << elevationProvider; + + int i = 0; + while (i < _requestQueue.count()) { + const QueuedRequestInfo_t& requestInfo = _requestQueue[i]; + if (requestInfo.elevationProvider == elevationProvider) { + qCDebug(ElevationProviderLog) << "Removing deleted provider from _requestQueue index:elevationProvider" << i << requestInfo.elevationProvider; + _requestQueue.removeAt(i); + } else { + i++; + } + } + + for (int i=0; i<_sentRequests.count(); i++) { + SentRequestInfo_t& sentRequestInfo = _sentRequests[i]; + if (sentRequestInfo.elevationProvider == elevationProvider) { + qCDebug(ElevationProviderLog) << "Zombieing deleted provider from _sentRequests index:elevatationProvider" << sentRequestInfo.elevationProvider; + sentRequestInfo.providerDestroyed = true; + } + } +} + +QString TerrainBatchManager::_stateToString(State state) +{ + switch (state) { + case State::Idle: + return QStringLiteral("Idle"); + case State::Downloading: + return QStringLiteral("Downloading"); + } + + return QStringLiteral("State unknown"); +} + ElevationProvider::ElevationProvider(QObject* parent) : QObject(parent) { @@ -161,7 +209,6 @@ ElevationProvider::ElevationProvider(QObject* parent) } void ElevationProvider::queryTerrainData(const QList& coordinates) { - qCDebug(ElevationProviderLog) << "queryTerrainData: coordinate count" << coordinates.count(); if (coordinates.length() == 0) { return; } diff --git a/src/Terrain.h b/src/Terrain.h index 549db64c7b7f22ee3aabcc681e05d559a4d25e3a..92f3f330a98574e3debf9661a1492d0958220e28 100644 --- a/src/Terrain.h +++ b/src/Terrain.h @@ -30,8 +30,9 @@ public: void addQuery(ElevationProvider* elevationProvider, const QList& coordinates); private slots: - void _sendNextBatch (void); - void _requestFinished (void); + void _sendNextBatch (void); + void _requestFinished (void); + void _elevationProviderDestroyed (QObject* elevationProvider); private: typedef struct { @@ -41,6 +42,7 @@ private: typedef struct { ElevationProvider* elevationProvider; + bool providerDestroyed; int cCoord; } SentRequestInfo_t; @@ -51,6 +53,7 @@ private: }; void _batchFailed(void); + QString _stateToString(State state); QList _requestQueue; QList _sentRequests;