Browse Source

Turn internal errors (elevation == -1) into failed query to prevent bogus elevation from reaching upper layers.

QGC4.4
Don Gagne 7 years ago
parent
commit
480da6fc69
  1. 51
      src/Terrain/TerrainQuery.cc
  2. 6
      src/Terrain/TerrainQuery.h

51
src/Terrain/TerrainQuery.cc

@ -338,17 +338,24 @@ 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) {
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); terrainQueryInterface->_signalCoordinateHeights(coordinates.count() == altitudes.count(), altitudes);
} }
}
} }
void TerrainTileManager::addPathQuery(TerrainOfflineAirMapQuery* terrainQueryInterface, const QGeoCoordinate &startPoint, const QGeoCoordinate &endPoint) void TerrainTileManager::addPathQuery(TerrainOfflineAirMapQuery* terrainQueryInterface, const QGeoCoordinate &startPoint, const QGeoCoordinate &endPoint)
@ -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) {
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); 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>
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,15 +499,30 @@ 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) {
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); requestInfo.terrainQueryInterface->_signalCoordinateHeights(requestInfo.coordinates.count() == altitudes.count(), altitudes);
}
} else if (requestInfo.queryMode == QueryMode::QueryModePath) { } else if (requestInfo.queryMode == QueryMode::QueryModePath) {
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); requestInfo.terrainQueryInterface->_signalPathHeights(requestInfo.coordinates.count() == altitudes.count(), requestInfo.latStep, requestInfo.lonStep, altitudes);
} }
}
_requestQueue.removeAt(i); _requestQueue.removeAt(i);
} }
} }

6
src/Terrain/TerrainQuery.h

@ -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;

Loading…
Cancel
Save