Commit 480da6fc authored by Don Gagne's avatar Don Gagne

Turn internal errors (elevation == -1) into failed query to prevent bogus elevation from reaching upper layers.
parent 9b79fbeb
...@@ -338,16 +338,23 @@ void TerrainTileManager::addCoordinateQuery(TerrainOfflineAirMapQuery* terrainQu ...@@ -338,16 +338,23 @@ void TerrainTileManager::addCoordinateQuery(TerrainOfflineAirMapQuery* terrainQu
qCDebug(TerrainQueryLog) << "TerrainTileManager::addCoordinateQuery count" << coordinates.count(); qCDebug(TerrainQueryLog) << "TerrainTileManager::addCoordinateQuery count" << coordinates.count();
if (coordinates.length() > 0) { if (coordinates.length() > 0) {
bool error;
QList<double> altitudes; QList<double> altitudes;
if (!_getAltitudesForCoordinates(coordinates, altitudes)) { if (!_getAltitudesForCoordinates(coordinates, altitudes, error)) {
QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModeCoordinates, 0, 0, coordinates }; QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModeCoordinates, 0, 0, coordinates };
_requestQueue.append(queuedRequestInfo); _requestQueue.append(queuedRequestInfo);
return; return;
} }
qCDebug(TerrainQueryLog) << "All altitudes taken from cached data"; if (error) {
terrainQueryInterface->_signalCoordinateHeights(coordinates.count() == altitudes.count(), altitudes); QList<double> noAltitudes;
qCWarning(TerrainQueryLog) << "addCoordinateQuery: signalling failure due to internal error";
terrainQueryInterface->_signalCoordinateHeights(false, noAltitudes);
} else {
qCDebug(TerrainQueryLog) << "addCoordinateQuery: All altitudes taken from cached data";
terrainQueryInterface->_signalCoordinateHeights(coordinates.count() == altitudes.count(), altitudes);
}
} }
} }
...@@ -370,19 +377,28 @@ void TerrainTileManager::addPathQuery(TerrainOfflineAirMapQuery* terrainQueryInt ...@@ -370,19 +377,28 @@ void TerrainTileManager::addPathQuery(TerrainOfflineAirMapQuery* terrainQueryInt
qCDebug(TerrainQueryLog) << "TerrainTileManager::addPathQuery start:end:coordCount" << startPoint << endPoint << coordinates.count(); qCDebug(TerrainQueryLog) << "TerrainTileManager::addPathQuery start:end:coordCount" << startPoint << endPoint << coordinates.count();
bool error;
QList<double> altitudes; QList<double> altitudes;
if (!_getAltitudesForCoordinates(coordinates, altitudes)) { if (!_getAltitudesForCoordinates(coordinates, altitudes, error)) {
QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModePath, latStep, lonStep, coordinates }; QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModePath, latStep, lonStep, coordinates };
_requestQueue.append(queuedRequestInfo); _requestQueue.append(queuedRequestInfo);
return; return;
} }
qCDebug(TerrainQueryLog) << "All altitudes taken from cached data"; if (error) {
terrainQueryInterface->_signalPathHeights(coordinates.count() == altitudes.count(), latStep, lonStep, altitudes); QList<double> noAltitudes;
qCWarning(TerrainQueryLog) << "addPathQuery: signalling failure due to internal error";
terrainQueryInterface->_signalPathHeights(false, latStep, lonStep, noAltitudes);
} else {
qCDebug(TerrainQueryLog) << "addPathQuery: All altitudes taken from cached data";
terrainQueryInterface->_signalPathHeights(coordinates.count() == altitudes.count(), latStep, lonStep, altitudes);
}
} }
bool TerrainTileManager::_getAltitudesForCoordinates(const QList<QGeoCoordinate>& coordinates, QList<double>& altitudes) bool TerrainTileManager::_getAltitudesForCoordinates(const QList<QGeoCoordinate>& coordinates, QList<double>& altitudes, bool& error)
{ {
error = false;
foreach (const QGeoCoordinate& coordinate, coordinates) { foreach (const QGeoCoordinate& coordinate, coordinates) {
QString tileHash = _getTileHash(coordinate); QString tileHash = _getTileHash(coordinate);
_tilesMutex.lock(); _tilesMutex.lock();
...@@ -406,14 +422,20 @@ bool TerrainTileManager::_getAltitudesForCoordinates(const QList<QGeoCoordinate> ...@@ -406,14 +422,20 @@ bool TerrainTileManager::_getAltitudesForCoordinates(const QList<QGeoCoordinate>
return false; return false;
} else { } else {
if (_tiles[tileHash].isIn(coordinate)) { if (_tiles[tileHash].isIn(coordinate)) {
altitudes.push_back(_tiles[tileHash].elevation(coordinate)); double elevation = _tiles[tileHash].elevation(coordinate);
if (elevation < 0.0) {
error = true;
}
altitudes.push_back(elevation);
} else { } else {
qCWarning(TerrainQueryLog) << "Error: coordinate not in tile region"; qCWarning(TerrainQueryLog) << "Error: coordinate not in tile region";
altitudes.push_back(-1.0); altitudes.push_back(-1.0);
error = true;
} }
} }
_tilesMutex.unlock(); _tilesMutex.unlock();
} }
return true; return true;
} }
...@@ -477,14 +499,29 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N ...@@ -477,14 +499,29 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N
// now try to query the data again // now try to query the data again
for (int i = _requestQueue.count() - 1; i >= 0; i--) { for (int i = _requestQueue.count() - 1; i >= 0; i--) {
bool error;
QList<double> altitudes; QList<double> altitudes;
QueuedRequestInfo_t& requestInfo = _requestQueue[i]; QueuedRequestInfo_t& requestInfo = _requestQueue[i];
if (_getAltitudesForCoordinates(requestInfo.coordinates, altitudes)) { if (_getAltitudesForCoordinates(requestInfo.coordinates, altitudes, error)) {
if (requestInfo.queryMode == QueryMode::QueryModeCoordinates) { if (requestInfo.queryMode == QueryMode::QueryModeCoordinates) {
requestInfo.terrainQueryInterface->_signalCoordinateHeights(requestInfo.coordinates.count() == altitudes.count(), altitudes); if (error) {
QList<double> noAltitudes;
qCWarning(TerrainQueryLog) << "_terrainDone(coordinateQuery): signalling failure due to internal error";
requestInfo.terrainQueryInterface->_signalCoordinateHeights(false, noAltitudes);
} else {
qCDebug(TerrainQueryLog) << "_terrainDone(coordinateQuery): All altitudes taken from cached data";
requestInfo.terrainQueryInterface->_signalCoordinateHeights(requestInfo.coordinates.count() == altitudes.count(), altitudes);
}
} else if (requestInfo.queryMode == QueryMode::QueryModePath) { } else if (requestInfo.queryMode == QueryMode::QueryModePath) {
requestInfo.terrainQueryInterface->_signalPathHeights(requestInfo.coordinates.count() == altitudes.count(), requestInfo.latStep, requestInfo.lonStep, altitudes); if (error) {
QList<double> noAltitudes;
qCWarning(TerrainQueryLog) << "_terrainDone(coordinateQuery): signalling failure due to internal error";
requestInfo.terrainQueryInterface->_signalPathHeights(false, requestInfo.latStep, requestInfo.lonStep, noAltitudes);
} else {
qCDebug(TerrainQueryLog) << "_terrainDone(coordinateQuery): All altitudes taken from cached data";
requestInfo.terrainQueryInterface->_signalPathHeights(requestInfo.coordinates.count() == altitudes.count(), requestInfo.latStep, requestInfo.lonStep, altitudes);
}
} }
_requestQueue.removeAt(i); _requestQueue.removeAt(i);
} }
......
...@@ -140,9 +140,9 @@ private: ...@@ -140,9 +140,9 @@ private:
QList<QGeoCoordinate> coordinates; QList<QGeoCoordinate> coordinates;
} QueuedRequestInfo_t; } QueuedRequestInfo_t;
void _tileFailed(void); void _tileFailed (void);
bool _getAltitudesForCoordinates(const QList<QGeoCoordinate>& coordinates, QList<double>& altitudes); bool _getAltitudesForCoordinates (const QList<QGeoCoordinate>& coordinates, QList<double>& altitudes, bool& error);
QString _getTileHash(const QGeoCoordinate& coordinate); /// Method to create a unique string for each tile QString _getTileHash (const QGeoCoordinate& coordinate);
QList<QueuedRequestInfo_t> _requestQueue; QList<QueuedRequestInfo_t> _requestQueue;
State _state = State::Idle; State _state = State::Idle;
......
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