From 2a86378f79fb5d21104e31f225879230900752b2 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 30 Apr 2018 00:40:02 +0200 Subject: [PATCH] Ref T261, calculate scenery deviation --- .../aviation/aircraftsituationchange.cpp | 63 ++++++++++++++----- .../aviation/aircraftsituationchange.h | 12 ++++ 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/blackmisc/aviation/aircraftsituationchange.cpp b/src/blackmisc/aviation/aircraftsituationchange.cpp index 973ed6ff6..f4f7a4715 100644 --- a/src/blackmisc/aviation/aircraftsituationchange.cpp +++ b/src/blackmisc/aviation/aircraftsituationchange.cpp @@ -85,6 +85,13 @@ namespace BlackMisc } } + CLength CAircraftSituationChange::getGuessedSceneryDeviation(const CLength &cg) const + { + if (cg.isNull()) { return this->guessedSceneryDeviation(); } + if (this->guessedSceneryDeviation().isNull()) { return CLength::null(); } + return this->guessedSceneryDeviation() - cg; + } + QString CAircraftSituationChange::convertToQString(bool i18n) const { Q_UNUSED(i18n); @@ -101,6 +108,7 @@ namespace BlackMisc QStringLiteral(" | accelerating.: ") % boolToYesNo(this->isConstAccelerating()) % QStringLiteral(" decelarating: ") % boolToYesNo(this->isConstDecelarating()) % QStringLiteral(" | rotate up: ") % boolToYesNo(this->isRotatingUp()) % QStringLiteral(" | push back: ") % boolToYesNo(this->containsPushBack()) % + QStringLiteral(" | scenery delta: ") % m_guessedSceneryDeviation.valueRoundedWithUnit(1) % QStringLiteral(" | alt.delta: ") % m_altAglMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_altAglStdDev.valueRoundedWithUnit(1) % QStringLiteral(" | std.dev: pitch ") % m_pitchMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_pitchStdDev.valueRoundedWithUnit(1) % QStringLiteral(" gs ") % m_gsMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_gsStdDev.valueRoundedWithUnit(1) % @@ -156,6 +164,22 @@ namespace BlackMisc { if (situations.isEmpty()) { return false; } + const QList gsValues = situations.groundSpeedValues(CSpeedUnit::kts()); + if (gsValues.size() == situations.size()) + { + const QPair gsKts = CMathUtils::standardDeviationAndMean(gsValues); + m_gsStdDev = CSpeed(gsKts.first, CSpeedUnit::kts()); + m_gsMean = CSpeed(gsKts.second, CSpeedUnit::kts()); + } + + const QList pitchValues = situations.pitchValues(CAngleUnit::deg()); + if (gsValues.size() == situations.size()) + { + const QPair pitchDeg = CMathUtils::standardDeviationAndMean(pitchValues); + m_pitchStdDev = CAngle(pitchDeg.first, CAngleUnit::deg()); + m_pitchMean = CAngle(pitchDeg.second, CAngleUnit::deg()); + } + const QList altValues = situations.altitudeValues(CLengthUnit::ft()); if (altValues.size() == situations.size()) { @@ -182,24 +206,10 @@ namespace BlackMisc const QPair deltaFt = CMathUtils::standardDeviationAndMean(altElvDeltas); m_altAglStdDev = CLength(deltaFt.first, CLengthUnit::ft()); m_altAglMean = CLength(deltaFt.second, CLengthUnit::ft()); + + this->guessSceneryDeviation(); } } - - const QList gsValues = situations.groundSpeedValues(CSpeedUnit::kts()); - if (gsValues.size() == situations.size()) - { - const QPair gsKts = CMathUtils::standardDeviationAndMean(gsValues); - m_gsStdDev = CSpeed(gsKts.first, CSpeedUnit::kts()); - m_gsMean = CSpeed(gsKts.second, CSpeedUnit::kts()); - } - - const QList pitchValues = situations.pitchValues(CAngleUnit::deg()); - if (gsValues.size() == situations.size()) - { - const QPair pitchDeg = CMathUtils::standardDeviationAndMean(pitchValues); - m_pitchStdDev = CAngle(pitchDeg.first, CAngleUnit::deg()); - m_pitchMean = CAngle(pitchDeg.second, CAngleUnit::deg()); - } return true; } @@ -208,5 +218,26 @@ namespace BlackMisc static const CAircraftSituationChange null; return null; } + + void CAircraftSituationChange::guessSceneryDeviation() + { + m_guessedSceneryDeviation = CLength::null(); + if (m_altAglStdDev.isNull()) { return; } + if (m_altAglMean.isNull()) { return; } + + // only for a small deviation we can calculate scenery differemce + static const CLength maxDeviation(2, CLengthUnit::ft()); + + // Only on ground + if (this->wasConstOnGround()) + { + if (m_altAglStdDev > maxDeviation) { return; } + m_guessedSceneryDeviation = m_altAglMean; + } + else if (this->wasConstOnGround()) + { + + } + } } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircraftsituationchange.h b/src/blackmisc/aviation/aircraftsituationchange.h index 096d713fd..76d76c283 100644 --- a/src/blackmisc/aviation/aircraftsituationchange.h +++ b/src/blackmisc/aviation/aircraftsituationchange.h @@ -123,6 +123,13 @@ namespace BlackMisc //! Pitch values QPair getPitchStdDevAndMean() const { return QPair(m_pitchStdDev, m_pitchMean); } + //! Scnenery deviation (if it can be calculated, otherwise PhysicalQuantities::CLength::null) + //! This is without CG, so substract CG to get deviation + const PhysicalQuantities::CLength &guessedSceneryDeviation() const { return m_guessedSceneryDeviation; } + + //! Get scenery deviation under consideration of CG + PhysicalQuantities::CLength getGuessedSceneryDeviation(const PhysicalQuantities::CLength &cg) const; + //! \copydoc Mixin::String::toQString QString convertToQString(bool i18n = false) const; @@ -139,6 +146,9 @@ namespace BlackMisc static const CAircraftSituationChange &null(); private: + //! Guess scenery deviation + void guessSceneryDeviation(); + int m_situationsCount = -1; CCallsign m_correspondingCallsign; // latest -> m_timestampMSecsSinceEpoch @@ -167,6 +177,7 @@ namespace BlackMisc PhysicalQuantities::CAngle m_pitchMean = PhysicalQuantities::CAngle::null(); PhysicalQuantities::CLength m_altAglStdDev = PhysicalQuantities::CLength::null(); PhysicalQuantities::CLength m_altAglMean = PhysicalQuantities::CLength::null(); + PhysicalQuantities::CLength m_guessedSceneryDeviation = PhysicalQuantities::CLength::null(); BLACK_METACLASS( CAircraftSituationChange, @@ -190,6 +201,7 @@ namespace BlackMisc BLACK_METAMEMBER(altAglMean), BLACK_METAMEMBER(pitchStdDev), BLACK_METAMEMBER(pitchMean), + BLACK_METAMEMBER(guessedSceneryDeviation), BLACK_METAMEMBER(timestampMSecsSinceEpoch), BLACK_METAMEMBER(oldestTimestampMSecsSinceEpoch), BLACK_METAMEMBER(oldestAdjustedTimestampMSecsSinceEpoch),