mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-21 12:55:31 +08:00
Ref T261, calculate scenery deviation and provide hint on which basis it is calculated
This commit is contained in:
committed by
Roland Winklmeier
parent
999803bc2e
commit
202b6b7c6a
@@ -92,6 +92,11 @@ namespace BlackMisc
|
|||||||
return this->guessedSceneryDeviation() - cg;
|
return this->guessedSceneryDeviation() - cg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CAircraftSituationChange::hasSceneryDeviation() const
|
||||||
|
{
|
||||||
|
return !m_guessedSceneryDeviation.isNull();
|
||||||
|
}
|
||||||
|
|
||||||
QString CAircraftSituationChange::convertToQString(bool i18n) const
|
QString CAircraftSituationChange::convertToQString(bool i18n) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(i18n);
|
Q_UNUSED(i18n);
|
||||||
@@ -108,9 +113,9 @@ namespace BlackMisc
|
|||||||
QStringLiteral(" | accelerating.: ") % boolToYesNo(this->isConstAccelerating()) % QStringLiteral(" decelarating: ") % boolToYesNo(this->isConstDecelarating()) %
|
QStringLiteral(" | accelerating.: ") % boolToYesNo(this->isConstAccelerating()) % QStringLiteral(" decelarating: ") % boolToYesNo(this->isConstDecelarating()) %
|
||||||
QStringLiteral(" | rotate up: ") % boolToYesNo(this->isRotatingUp()) %
|
QStringLiteral(" | rotate up: ") % boolToYesNo(this->isRotatingUp()) %
|
||||||
QStringLiteral(" | push back: ") % boolToYesNo(this->containsPushBack()) %
|
QStringLiteral(" | push back: ") % boolToYesNo(this->containsPushBack()) %
|
||||||
QStringLiteral(" | scenery delta: ") % m_guessedSceneryDeviation.valueRoundedWithUnit(1) %
|
QStringLiteral(" | scenery delta: ") % m_guessedSceneryDeviation.valueRoundedWithUnit(1) % QStringLiteral(" [") % this->getGuessedSceneryDeviationAsString() %
|
||||||
QStringLiteral(" | alt.delta: ") % m_altAglMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_altAglStdDev.valueRoundedWithUnit(1) %
|
QStringLiteral("] | AGL delta: ") % m_altAglMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_altAglStdDev.valueRoundedWithUnit(1) %
|
||||||
QStringLiteral(" | std.dev: pitch ") % m_pitchMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_pitchStdDev.valueRoundedWithUnit(1) %
|
QStringLiteral(" | std.dev/mean: pitch ") % m_pitchMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_pitchStdDev.valueRoundedWithUnit(1) %
|
||||||
QStringLiteral(" gs ") % m_gsMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_gsStdDev.valueRoundedWithUnit(1) %
|
QStringLiteral(" gs ") % m_gsMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_gsStdDev.valueRoundedWithUnit(1) %
|
||||||
QStringLiteral(" alt. ") % m_altMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_altStdDev.valueRoundedWithUnit(1) %
|
QStringLiteral(" alt. ") % m_altMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_altStdDev.valueRoundedWithUnit(1) %
|
||||||
QStringLiteral(" elv. ") % m_elvMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_elvStdDev.valueRoundedWithUnit(1);
|
QStringLiteral(" elv. ") % m_elvMean.valueRoundedWithUnit(1) % QStringLiteral("/") % m_elvStdDev.valueRoundedWithUnit(1);
|
||||||
@@ -164,21 +169,13 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
if (situations.isEmpty()) { return false; }
|
if (situations.isEmpty()) { return false; }
|
||||||
|
|
||||||
const QList<double> gsValues = situations.groundSpeedValues(CSpeedUnit::kts());
|
const QPair<CSpeed, CSpeed> gsStdDevMean = situations.groundSpeedStandardDeviationAndMean();
|
||||||
if (gsValues.size() == situations.size())
|
m_gsStdDev = gsStdDevMean.first;
|
||||||
{
|
m_gsMean = gsStdDevMean.second;
|
||||||
const QPair<double, double> gsKts = CMathUtils::standardDeviationAndMean(gsValues);
|
|
||||||
m_gsStdDev = CSpeed(gsKts.first, CSpeedUnit::kts());
|
|
||||||
m_gsMean = CSpeed(gsKts.second, CSpeedUnit::kts());
|
|
||||||
}
|
|
||||||
|
|
||||||
const QList<double> pitchValues = situations.pitchValues(CAngleUnit::deg());
|
const QPair<CAngle, CAngle> pitchStdDevMean = situations.pitchStandardDeviationAndMean();
|
||||||
if (gsValues.size() == situations.size())
|
m_pitchStdDev = pitchStdDevMean.first;
|
||||||
{
|
m_pitchMean = pitchStdDevMean.second;
|
||||||
const QPair<double, double> pitchDeg = CMathUtils::standardDeviationAndMean(pitchValues);
|
|
||||||
m_pitchStdDev = CAngle(pitchDeg.first, CAngleUnit::deg());
|
|
||||||
m_pitchMean = CAngle(pitchDeg.second, CAngleUnit::deg());
|
|
||||||
}
|
|
||||||
|
|
||||||
const QList<double> altValues = situations.altitudeValues(CLengthUnit::ft());
|
const QList<double> altValues = situations.altitudeValues(CLengthUnit::ft());
|
||||||
if (altValues.size() == situations.size())
|
if (altValues.size() == situations.size())
|
||||||
@@ -207,7 +204,7 @@ namespace BlackMisc
|
|||||||
m_altAglStdDev = CLength(deltaFt.first, CLengthUnit::ft());
|
m_altAglStdDev = CLength(deltaFt.first, CLengthUnit::ft());
|
||||||
m_altAglMean = CLength(deltaFt.second, CLengthUnit::ft());
|
m_altAglMean = CLength(deltaFt.second, CLengthUnit::ft());
|
||||||
|
|
||||||
this->guessSceneryDeviation();
|
this->guessSceneryDeviation(situations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -219,7 +216,25 @@ namespace BlackMisc
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftSituationChange::guessSceneryDeviation()
|
const QString &CAircraftSituationChange::guessedSceneryDeviationToString(GuessedSceneryDeviation hint)
|
||||||
|
{
|
||||||
|
static const QString noInfo("no info");
|
||||||
|
static const QString completeOg("complete og");
|
||||||
|
static const QString wasOg("was og");
|
||||||
|
static const QString someOg("some og");
|
||||||
|
|
||||||
|
switch (hint)
|
||||||
|
{
|
||||||
|
case AllOnGround: return completeOg;
|
||||||
|
case WasOnGround: return wasOg;
|
||||||
|
case SomeSituationsOnGround: return someOg;
|
||||||
|
case NoDeviationInfo:
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return noInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAircraftSituationChange::guessSceneryDeviation(const CAircraftSituationList &situations)
|
||||||
{
|
{
|
||||||
m_guessedSceneryDeviation = CLength::null();
|
m_guessedSceneryDeviation = CLength::null();
|
||||||
if (m_altAglStdDev.isNull()) { return; }
|
if (m_altAglStdDev.isNull()) { return; }
|
||||||
@@ -228,15 +243,23 @@ namespace BlackMisc
|
|||||||
// only for a small deviation we can calculate scenery differemce
|
// only for a small deviation we can calculate scenery differemce
|
||||||
static const CLength maxDeviation(2, CLengthUnit::ft());
|
static const CLength maxDeviation(2, CLengthUnit::ft());
|
||||||
|
|
||||||
// Only on ground
|
// On ground or was on ground
|
||||||
if (this->wasConstOnGround())
|
if (this->wasConstOnGround())
|
||||||
{
|
{
|
||||||
if (m_altAglStdDev > maxDeviation) { return; }
|
if (m_altAglStdDev > maxDeviation) { return; }
|
||||||
m_guessedSceneryDeviation = m_altAglMean;
|
m_guessedSceneryDeviation = m_altAglMean;
|
||||||
|
this->setSceneryDeviationHint(this->isConstOnGround() ? AllOnGround : WasOnGround);
|
||||||
}
|
}
|
||||||
else if (this->wasConstOnGround())
|
else
|
||||||
{
|
{
|
||||||
|
const CAircraftSituationList situationsOg = situations.findOnGroundWithElevation(CAircraftSituation::OnGround);
|
||||||
|
if (situationsOg.size() >= 2)
|
||||||
|
{
|
||||||
|
const QPair<CAltitude, CAltitude> altAgl = situationsOg.altitudeAglStandardDeviationAndMean();
|
||||||
|
if (altAgl.first > maxDeviation) { return; } // deviation
|
||||||
|
m_guessedSceneryDeviation = altAgl.second; // AGL mean;
|
||||||
|
this->setSceneryDeviationHint(SomeSituationsOnGround);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -53,6 +53,15 @@ namespace BlackMisc
|
|||||||
IndexContainsPushBack
|
IndexContainsPushBack
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Hint about the guessed scenery deviation
|
||||||
|
enum GuessedSceneryDeviation
|
||||||
|
{
|
||||||
|
NoDeviationInfo,
|
||||||
|
AllOnGround, //!< based on all situations on ground
|
||||||
|
WasOnGround, //!< was on ground except last situation
|
||||||
|
SomeSituationsOnGround //!< some situations on ground
|
||||||
|
};
|
||||||
|
|
||||||
//! Default constructor.
|
//! Default constructor.
|
||||||
CAircraftSituationChange();
|
CAircraftSituationChange();
|
||||||
|
|
||||||
@@ -111,16 +120,16 @@ namespace BlackMisc
|
|||||||
//! \note distance is without CG, so on ground it can also be used to calculate
|
//! \note distance is without CG, so on ground it can also be used to calculate
|
||||||
QPair<PhysicalQuantities::CLength, PhysicalQuantities::CLength> getAltAglStdDevAndMean() const { return QPair<PhysicalQuantities::CLength, PhysicalQuantities::CLength>(m_altAglStdDev, m_altAglMean); }
|
QPair<PhysicalQuantities::CLength, PhysicalQuantities::CLength> getAltAglStdDevAndMean() const { return QPair<PhysicalQuantities::CLength, PhysicalQuantities::CLength>(m_altAglStdDev, m_altAglMean); }
|
||||||
|
|
||||||
//! Altitude values
|
//! \copydoc BlackMisc::Aviation::CAircraftSituationList::altitudeStandardDeviationAndMean
|
||||||
QPair<CAltitude, CAltitude> getAltitudeStdDevAndMean() const { return QPair<CAltitude, CAltitude>(m_altStdDev, m_altMean); }
|
QPair<CAltitude, CAltitude> getAltitudeStdDevAndMean() const { return QPair<CAltitude, CAltitude>(m_altStdDev, m_altMean); }
|
||||||
|
|
||||||
//! Elevation values
|
//! \copydoc BlackMisc::Aviation::CAircraftSituationList::elevationStandardDeviationAndMean
|
||||||
QPair<CAltitude, CAltitude> getElevationStdDevAndMean() const { return QPair<CAltitude, CAltitude>(m_elvStdDev, m_elvMean); }
|
QPair<CAltitude, CAltitude> getElevationStdDevAndMean() const { return QPair<CAltitude, CAltitude>(m_elvStdDev, m_elvMean); }
|
||||||
|
|
||||||
//! Ground speed values
|
//! \copydoc BlackMisc::Aviation::CAircraftSituationList::groundSpeedStandardDeviationAndMean
|
||||||
QPair<PhysicalQuantities::CSpeed, PhysicalQuantities::CSpeed> getGroundSpeedStdDevAndMean() const { return QPair<PhysicalQuantities::CSpeed, PhysicalQuantities::CSpeed>(m_gsStdDev, m_gsMean); }
|
QPair<PhysicalQuantities::CSpeed, PhysicalQuantities::CSpeed> getGroundSpeedStdDevAndMean() const { return QPair<PhysicalQuantities::CSpeed, PhysicalQuantities::CSpeed>(m_gsStdDev, m_gsMean); }
|
||||||
|
|
||||||
//! Pitch values
|
//! \copydoc BlackMisc::Aviation::CAircraftSituationList::pitchStandardDeviationAndMean
|
||||||
QPair<PhysicalQuantities::CAngle, PhysicalQuantities::CAngle> getPitchStdDevAndMean() const { return QPair<PhysicalQuantities::CAngle, PhysicalQuantities::CAngle>(m_pitchStdDev, m_pitchMean); }
|
QPair<PhysicalQuantities::CAngle, PhysicalQuantities::CAngle> getPitchStdDevAndMean() const { return QPair<PhysicalQuantities::CAngle, PhysicalQuantities::CAngle>(m_pitchStdDev, m_pitchMean); }
|
||||||
|
|
||||||
//! Scnenery deviation (if it can be calculated, otherwise PhysicalQuantities::CLength::null)
|
//! Scnenery deviation (if it can be calculated, otherwise PhysicalQuantities::CLength::null)
|
||||||
@@ -130,6 +139,15 @@ namespace BlackMisc
|
|||||||
//! Get scenery deviation under consideration of CG
|
//! Get scenery deviation under consideration of CG
|
||||||
PhysicalQuantities::CLength getGuessedSceneryDeviation(const PhysicalQuantities::CLength &cg) const;
|
PhysicalQuantities::CLength getGuessedSceneryDeviation(const PhysicalQuantities::CLength &cg) const;
|
||||||
|
|
||||||
|
//! Scenery deviation hint
|
||||||
|
GuessedSceneryDeviation getSceneryDeviationHint() const { return static_cast<GuessedSceneryDeviation>(m_guessedSceneryDeviationHint); }
|
||||||
|
|
||||||
|
//! Scenery deviation hint hint as string
|
||||||
|
const QString &getGuessedSceneryDeviationAsString() const { return guessedSceneryDeviationToString(this->getSceneryDeviationHint()); }
|
||||||
|
|
||||||
|
//! Scenery deviation available?
|
||||||
|
bool hasSceneryDeviation() const;
|
||||||
|
|
||||||
//! \copydoc Mixin::String::toQString
|
//! \copydoc Mixin::String::toQString
|
||||||
QString convertToQString(bool i18n = false) const;
|
QString convertToQString(bool i18n = false) const;
|
||||||
|
|
||||||
@@ -145,9 +163,15 @@ namespace BlackMisc
|
|||||||
//! NULL object
|
//! NULL object
|
||||||
static const CAircraftSituationChange &null();
|
static const CAircraftSituationChange &null();
|
||||||
|
|
||||||
|
//! The enum as string
|
||||||
|
static const QString &guessedSceneryDeviationToString(GuessedSceneryDeviation hint);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
//! Scenery deviation hint
|
||||||
|
void setSceneryDeviationHint(GuessedSceneryDeviation hint) { m_guessedSceneryDeviationHint = static_cast<int>(hint); }
|
||||||
|
|
||||||
//! Guess scenery deviation
|
//! Guess scenery deviation
|
||||||
void guessSceneryDeviation();
|
void guessSceneryDeviation(const CAircraftSituationList &situations);
|
||||||
|
|
||||||
int m_situationsCount = -1;
|
int m_situationsCount = -1;
|
||||||
CCallsign m_correspondingCallsign;
|
CCallsign m_correspondingCallsign;
|
||||||
@@ -167,6 +191,7 @@ namespace BlackMisc
|
|||||||
bool m_constAccelerating = false;
|
bool m_constAccelerating = false;
|
||||||
bool m_constDecelerating = false;
|
bool m_constDecelerating = false;
|
||||||
bool m_containsPushBack = false;
|
bool m_containsPushBack = false;
|
||||||
|
int m_guessedSceneryDeviationHint = static_cast<int>(NoDeviationInfo);
|
||||||
CAltitude m_altStdDev = CAltitude::null();
|
CAltitude m_altStdDev = CAltitude::null();
|
||||||
CAltitude m_altMean = CAltitude::null();
|
CAltitude m_altMean = CAltitude::null();
|
||||||
CAltitude m_elvStdDev = CAltitude::null();
|
CAltitude m_elvStdDev = CAltitude::null();
|
||||||
@@ -202,6 +227,7 @@ namespace BlackMisc
|
|||||||
BLACK_METAMEMBER(pitchStdDev),
|
BLACK_METAMEMBER(pitchStdDev),
|
||||||
BLACK_METAMEMBER(pitchMean),
|
BLACK_METAMEMBER(pitchMean),
|
||||||
BLACK_METAMEMBER(guessedSceneryDeviation),
|
BLACK_METAMEMBER(guessedSceneryDeviation),
|
||||||
|
BLACK_METAMEMBER(guessedSceneryDeviationHint),
|
||||||
BLACK_METAMEMBER(timestampMSecsSinceEpoch),
|
BLACK_METAMEMBER(timestampMSecsSinceEpoch),
|
||||||
BLACK_METAMEMBER(oldestTimestampMSecsSinceEpoch),
|
BLACK_METAMEMBER(oldestTimestampMSecsSinceEpoch),
|
||||||
BLACK_METAMEMBER(oldestAdjustedTimestampMSecsSinceEpoch),
|
BLACK_METAMEMBER(oldestAdjustedTimestampMSecsSinceEpoch),
|
||||||
@@ -212,5 +238,6 @@ namespace BlackMisc
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituationChange)
|
Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituationChange)
|
||||||
|
Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituationChange::GuessedSceneryDeviation)
|
||||||
|
|
||||||
#endif // guard
|
#endif // guard
|
||||||
|
|||||||
Reference in New Issue
Block a user