From 336fda23c9b5b91d7ba724404e8939940a944466 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 22 Jan 2017 11:18:33 +0100 Subject: [PATCH] refs #865, set on ground flag in interpolator --- src/blackmisc/simulation/interpolator.cpp | 42 +++++++++++++++++++ src/blackmisc/simulation/interpolator.h | 3 ++ .../simulation/interpolatorlinear.cpp | 7 ++++ 3 files changed, 52 insertions(+) diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 36d7eff05..471072338 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -115,6 +115,48 @@ namespace BlackMisc situation.setGroundElevation(elevation); } + void IInterpolator::setGroundFlagFromInterpolator(const CInterpolationHints &hints, double groundFactor, CAircraftSituation &situation) + { + // by interpolation + if (groundFactor >= 1.0) + { + situation.setOnGround(CAircraftSituation::OnGround, CAircraftSituation::OnGroundByInterpolation); + return; + } + if (groundFactor < 1.0 && groundFactor >= 0.0) + { + situation.setOnGround(CAircraftSituation::NotOnGround, CAircraftSituation::OnGroundByInterpolation); + return; + } + + // no value by factor, guess on elevation + const CLength heightAboveGround(situation.getHeightAboveGround()); + const CLength cgAboveGround(hints.getCGAboveGround()); + if (!heightAboveGround.isNull()) + { + const bool og = cgAboveGround.isNull() ? + heightAboveGround.value(CLengthUnit::m()) < 1.0 : + heightAboveGround <= cgAboveGround; + situation.setOnGround(og ? CAircraftSituation::OnGround : CAircraftSituation::NotOnGround, CAircraftSituation::OnGroundByElevation); + } + + // for VTOL aircraft we give up + if (hints.isVtolAircraft()) + { + situation.setOnGround(CAircraftSituation::OnGroundSituationUnknown, CAircraftSituation::OnGroundReliabilityNoSet); + return; + } + + // we guess on speed, pitch and bank by excluding situations + situation.setOnGround(CAircraftSituation::NotOnGround, CAircraftSituation::OnGroundByGuessing); + if (qAbs(situation.getPitch().value(CAngleUnit::deg())) > 10) { return; } + if (qAbs(situation.getBank().value(CAngleUnit::deg())) > 10) { return; } + if (situation.getGroundSpeed().value(CSpeedUnit::km_h()) > 50) { return; } + + // not sure, but this is a guess + situation.setOnGround(CAircraftSituation::OnGround, CAircraftSituation::OnGroundByGuessing); + } + bool IInterpolator::InterpolationStatus::allTrue() const { return m_interpolationSucceeded && m_changedPosition; diff --git a/src/blackmisc/simulation/interpolator.h b/src/blackmisc/simulation/interpolator.h index 7355eaf73..d033e9193 100644 --- a/src/blackmisc/simulation/interpolator.h +++ b/src/blackmisc/simulation/interpolator.h @@ -142,6 +142,9 @@ namespace BlackMisc //! Set the ground elevation from hints, if possible and not already set static void setGroundElevationFromHint(const CInterpolationHints &hints, BlackMisc::Aviation::CAircraftSituation &situation); + //! Set on ground flag + static void setGroundFlagFromInterpolator(const CInterpolationHints &hints, double groundFactor, BlackMisc::Aviation::CAircraftSituation &situation); + CInterpolationAndRenderingSetup m_setup; //!< allows to disable debug messages mutable QReadWriteLock m_lock; //!< lock interpolator }; diff --git a/src/blackmisc/simulation/interpolatorlinear.cpp b/src/blackmisc/simulation/interpolatorlinear.cpp index 5407556d1..5280cd25f 100644 --- a/src/blackmisc/simulation/interpolatorlinear.cpp +++ b/src/blackmisc/simulation/interpolatorlinear.cpp @@ -158,6 +158,13 @@ namespace BlackMisc oldAlt.getReferenceDatum())); } } + IInterpolator::setGroundFlagFromInterpolator(hints, groundFactor, currentSituation); + } + else + { + // guess ground flag + constexpr double NoGroundFactor = -1; + IInterpolator::setGroundFlagFromInterpolator(hints, NoGroundFactor, currentSituation); } if (!setup.isForcingFullInterpolation() && !hints.isVtolAircraft() && newVec == oldVec && oldAlt == newAlt)