Ref T275, Ref T280, avoid nan (not a number) values in PQs/elevation

This commit is contained in:
Klaus Basan
2018-06-20 00:53:12 +02:00
parent d99a7639e8
commit fc1a2bbb0f
5 changed files with 41 additions and 9 deletions

View File

@@ -14,6 +14,7 @@
#include "aircraftsituationchange.h"
#include "blackmisc/comparefunctions.h"
#include "blackmisc/stringutils.h"
#include "blackmisc/verify.h"
#include "blackconfig/buildconfig.h"
#include "QStringBuilder"
@@ -152,9 +153,16 @@ namespace BlackMisc
if (situation.hasGroundElevation())
{
const CLength aboveGnd = situation.getHeightAboveGround();
if (aboveGnd.isNull() || std::isnan(aboveGnd.value()))
{
BLACK_VERIFY_X(false, Q_FUNC_INFO, "above gnd.is null");
return parts;
}
const double nearGround1Ft = 300;
const double nearGround2Ft = isLikelyTakeOffOrClimbing ? 500 : 1000;
const double aGroundFt = situation.getHeightAboveGround().value(CLengthUnit::ft());
const double aGroundFt = aboveGnd.value(CLengthUnit::ft());
static const QString detailsInfo("above ground: %1ft near grounds: %2ft %3ft likely takeoff: %4 likely landing: %5");
if (details) { *details = detailsInfo.arg(aGroundFt).arg(nearGround1Ft).arg(nearGround2Ft).arg(boolToYesNo(isLikelyTakeOffOrClimbing), boolToYesNo(isLikelyLanding)); }
@@ -325,7 +333,7 @@ namespace BlackMisc
void CAircraftParts::guessParts(const CAircraftSituation &situation, const CAircraftSituationChange &change, const CAircraftModel &model)
{
*this = guessedParts(situation, change, model);
*this = CAircraftParts::guessedParts(situation, change, model);
}
} // namespace
} // namespace

View File

@@ -241,8 +241,12 @@ namespace BlackMisc
if (!situation.isNull())
{
const double distanceOldNewM = (distance.isNull() ? oldSituation.calculateGreatCircleDistance(newSituation) : distance).value(CLengthUnit::m());
const double distanceSituationNewM = situation.calculateGreatCircleDistance(newSituation).value(CLengthUnit::m());
if (distanceSituationNewM < 5.0) { return newSituation.getGroundElevationPlane(); }
const double distanceOldNewM = (distance.isNull() ? oldSituation.calculateGreatCircleDistance(newSituation) : distance).value(CLengthUnit::m());
if (distanceOldNewM < 5.0) { return oldSituation.getGroundElevationPlane(); }
const double distRatio = distanceSituationNewM / distanceOldNewM;
// very close to the situations we return tehir elevation
@@ -785,15 +789,30 @@ namespace BlackMisc
CLength CAircraftSituation::getHeightAboveGround() const
{
if (this->getAltitude().isNull()) { return { 0, nullptr }; }
if (this->getAltitude().isNull()) { return CLength::null(); }
if (this->getAltitude().getReferenceDatum() == CAltitude::AboveGround)
{
// we have a sure value explicitly set
return this->getAltitude();
}
const CLength gh(this->getGroundElevation());
if (gh.isNull()) { return { 0, nullptr }; }
return this->getAltitude() - gh;
if (gh.isNull()) { return CLength::null(); }
// sanity checks
if (std::isnan(gh.value()))
{
BLACK_VERIFY_X(false, Q_FUNC_INFO, "nan ground");
return CLength::null();
}
if (std::isnan(this->getAltitude().value()))
{
BLACK_VERIFY_X(false, Q_FUNC_INFO, "nan altitude");
return CLength::null();
}
const CLength ag = this->getAltitude() - gh;
return ag;
}
const CLengthUnit &CAircraftSituation::getAltitudeOrDefaultUnit() const