From 3c7eb6ea280570354846bfc75eefe6c75e7332d6 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 22 Jan 2017 11:17:29 +0100 Subject: [PATCH] refs #865, add onGround flag to aircraft situation --- src/blackmisc/aviation/aircraftsituation.cpp | 29 ++++--------- src/blackmisc/aviation/aircraftsituation.h | 42 ++++++++++++++++++- .../aviation/registermetadataaviation.cpp | 2 + 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 19b4699cf..a1b0781a4 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -157,29 +157,16 @@ namespace BlackMisc return 0; } - bool CAircraftSituation::isOnGroundGuessed(const CLength &cgAboveGround) const + bool CAircraftSituation::isOnGroundInfoAvailable() const { - const CLength heightAboveGround(this->getHeightAboveGround()); - if (!heightAboveGround.isNull()) - { - if (cgAboveGround.isNull()) - { - return heightAboveGround.value(CLengthUnit::m()) < 1.0; - } - else - { - return heightAboveGround <= cgAboveGround; - } - } + return this->isOnGround() != CAircraftSituation::OnGroundSituationUnknown && + this->getOnGroundReliability() != CAircraftSituation::OnGroundReliabilityNoSet; + } - // we guess on pitch and bank - if (qAbs(this->getPitch().value(CAngleUnit::deg())) > 10) { return false; } - if (qAbs(this->getBank().value(CAngleUnit::deg())) > 10) { return false; } - - if (this->getGroundSpeed().value(CSpeedUnit::km_h()) > 50) { return false; } - - // not sure, but this is a guess - return true; + void CAircraftSituation::setOnGround(CAircraftSituation::IsOnGround onGround, CAircraftSituation::OnGroundReliability reliability) + { + this->setOnGround(onGround); + this->setOnGroundReliabiliy(reliability); } bool CAircraftSituation::hasGroundElevation() const diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index 89088cb24..dcba6879e 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -58,6 +58,23 @@ namespace BlackMisc IndexCallsign }; + //! Is on ground? + enum IsOnGround + { + NotOnGround, + OnGround, + OnGroundSituationUnknown + }; + + //! Reliability of on ground information + enum OnGroundReliability + { + OnGroundByGuessing, + OnGroundByElevation, + OnGroundByInterpolation, + OnGroundReliabilityNoSet + }; + //! Default constructor. CAircraftSituation(); @@ -99,8 +116,23 @@ namespace BlackMisc //! \copydoc Geo::ICoordinateGeodetic::longitude() virtual BlackMisc::Geo::CLongitude longitude() const override { return this->m_position.longitude(); } - //! Guess if aircraft is "on ground" - bool isOnGroundGuessed(const BlackMisc::PhysicalQuantities::CLength &cgAboveGround = { 0, nullptr }) const; + //! On ground? + IsOnGround isOnGround() const { return static_cast(m_isOnGround); } + + //! On ground info available? + bool isOnGroundInfoAvailable() const; + + //! Set on ground + void setOnGround(CAircraftSituation::IsOnGround onGround) { m_isOnGround = static_cast(onGround); } + + //! Set on ground + void setOnGround(CAircraftSituation::IsOnGround onGround, CAircraftSituation::OnGroundReliability reliability); + + //! On ground reliability + OnGroundReliability getOnGroundReliability() const { return static_cast(m_onGroundReliability); } + + //! Reliability + void setOnGroundReliabiliy(CAircraftSituation::OnGroundReliability onGroundReliability) { m_onGroundReliability = static_cast(onGroundReliability); } //! \copydoc Geo::ICoordinateGeodetic::geodeticHeight const BlackMisc::Aviation::CAltitude &geodeticHeight() const override { return this->m_position.geodeticHeight(); } @@ -188,6 +220,8 @@ namespace BlackMisc BlackMisc::PhysicalQuantities::CAngle m_bank; BlackMisc::PhysicalQuantities::CSpeed m_groundSpeed; BlackMisc::Aviation::CAltitude m_groundElevation; + int m_isOnGround = static_cast(CAircraftSituation::OnGroundSituationUnknown); + int m_onGroundReliability = static_cast(CAircraftSituation::OnGroundReliabilityNoSet); qint64 m_timeOffsetMs = 0; bool m_isInterim = false; @@ -200,6 +234,8 @@ namespace BlackMisc BLACK_METAMEMBER(bank), BLACK_METAMEMBER(groundSpeed), BLACK_METAMEMBER(groundElevation), + BLACK_METAMEMBER(isOnGround), + BLACK_METAMEMBER(onGroundReliability), BLACK_METAMEMBER(timestampMSecsSinceEpoch), BLACK_METAMEMBER(timeOffsetMs), BLACK_METAMEMBER(isInterim) @@ -209,5 +245,7 @@ namespace BlackMisc } // namespace Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituation) +Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituation::IsOnGround) +Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftSituation::OnGroundReliability) #endif // guard diff --git a/src/blackmisc/aviation/registermetadataaviation.cpp b/src/blackmisc/aviation/registermetadataaviation.cpp index e7bb56371..d5272c328 100644 --- a/src/blackmisc/aviation/registermetadataaviation.cpp +++ b/src/blackmisc/aviation/registermetadataaviation.cpp @@ -25,6 +25,8 @@ namespace BlackMisc CAircraftParts::registerMetadata(); CAircraftPartsList::registerMetadata(); CAircraftSituation::registerMetadata(); + qRegisterMetaType(); + qRegisterMetaType(); CAircraftSituationList::registerMetadata(); CAirlineIcaoCode::registerMetadata(); CAirlineIcaoCodeList::registerMetadata();