diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 6b3b4b6c7..100e4c6f8 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -145,15 +145,17 @@ namespace BlackMisc BLACK_VERIFY_X(details, Q_FUNC_INFO, "Once gnd.from parts -> always gnd. from parts"); } - if (CBuildConfig::isLocalDeveloperDebugBuild()) + for (const CAircraftSituation &s : situations) { - for (const CAircraftSituation &s : situations) - { - if (!s.hasGroundElevation()) { continue; } - BLACK_VERIFY_X(!s.getGroundElevation().isZeroEpsilonConsidered(), Q_FUNC_INFO, "Suspicous 0 gnd. value"); - } + if (!s.hasGroundElevation()) { continue; } + BLACK_VERIFY_X(!s.getGroundElevation().isZeroEpsilonConsidered(), Q_FUNC_INFO, "Suspicous 0 gnd. value"); } + // check if middle situation is missing + if (latest.hasGroundElevation() && oldest.hasGroundElevation()) + { + BLACK_VERIFY_X(newer.hasGroundElevation(), Q_FUNC_INFO, "Middle ground elevation is missing"); + } // result return sorted && details; diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 2ae3b0e03..148e95ba7 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -9,12 +9,14 @@ #include "simulationenvironmentprovider.h" #include "blackmisc/aviation/aircraftsituationchange.h" +#include "blackmisc/logmessage.h" #include "blackmisc/verify.h" #include "blackconfig/buildconfig.h" #include using namespace BlackConfig; +using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::Geo; using namespace BlackMisc::PhysicalQuantities; @@ -38,8 +40,35 @@ namespace BlackMisc if (!m_enableElevation) { return false; } // check if we have already an elevation within range - if (m_elvCoordinatesGnd.containsObjectInRange(elevationCoordinate, minRange)) { return false; } - if (m_elvCoordinates.containsObjectInRange(elevationCoordinate, minRange)) { return false; } + CCoordinateGeodetic alreadyInRange = m_elvCoordinatesGnd.findFirstWithinRangeOrDefault(elevationCoordinate, minRange); + constexpr double maxDistFt = 30.0; + + if (!alreadyInRange.isNull()) + { + // found + const double distFt = qAbs(alreadyInRange.geodeticHeight().value(CLengthUnit::ft()) - elevationCoordinate.geodeticHeight().value(CLengthUnit::ft())); + if (distFt > maxDistFt) + { + // we such a huge distance to existing value + CLogMessage(this).debug(u"Suspicious gnd. elevation distance '%1': %2ft") << requestedForCallsign.asString() << distFt; + BLACK_VERIFY_X(!CBuildConfig::isLocalDeveloperDebugBuild(), Q_FUNC_INFO, "Suspicious gnd. elevation distance"); + } + return false; + } + + alreadyInRange = m_elvCoordinates.findFirstWithinRangeOrDefault(elevationCoordinate, minRange); + if (!alreadyInRange.isNull()) + { + // found + const double distFt = qAbs(alreadyInRange.geodeticHeight().value(CLengthUnit::ft()) - elevationCoordinate.geodeticHeight().value(CLengthUnit::ft())); + if (distFt > maxDistFt) + { + // we such a huge distance to existing value + CLogMessage(this).debug(u"Suspicious elevation distance '%1': %2ft") << requestedForCallsign.asString() << distFt; + BLACK_VERIFY_X(!CBuildConfig::isLocalDeveloperDebugBuild(), Q_FUNC_INFO, "Suspicious elevation distance"); + } + return false; + } } { @@ -54,10 +83,11 @@ namespace BlackMisc if (m_elvCoordinatesGnd.size() > m_maxElevationsGnd) { m_elvCoordinatesGnd.pop_back(); } m_elvCoordinatesGnd.push_front(elevationCoordinate); - if (CBuildConfig::isLocalDeveloperDebugBuild()) + const bool valid = !elevationCoordinate.geodeticHeight().isNull() && !elevationCoordinate.geodeticHeight().isZeroEpsilonConsidered(); + if (!valid) { - BLACK_VERIFY_X(!elevationCoordinate.geodeticHeight().isNull(), Q_FUNC_INFO, "NULL value"); - BLACK_VERIFY_X(!elevationCoordinate.geodeticHeight().isZeroEpsilonConsidered(), Q_FUNC_INFO, "Suspicous 0 value"); + BLACK_VERIFY_X(!CBuildConfig::isLocalDeveloperDebugBuild(), Q_FUNC_INFO, "Suspicious value"); + CLogMessage(this).debug(u"Suspicious gnd.cache value: %1") << elevationCoordinate.convertToQString(); } } else