From 851fbe165d30583b4e26e5875af7a9376a9e6468 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 25 Jan 2018 05:20:52 +0100 Subject: [PATCH] Ref T236, utility functions to set ground elevation --- src/blackmisc/aviation/aircraftsituation.cpp | 19 ++++++++++--- src/blackmisc/aviation/aircraftsituation.h | 6 ++++- .../aviation/aircraftsituationlist.cpp | 27 ++++++++++++++++++- .../aviation/aircraftsituationlist.h | 11 ++++++-- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 680c2f86d..d1a2eb340 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -8,6 +8,7 @@ */ #include "blackmisc/aviation/aircraftsituation.h" +#include "blackmisc/geo/elevationplane.h" #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/pq/units.h" #include "blackmisc/propertyindex.h" @@ -105,7 +106,7 @@ namespace BlackMisc case IndexLatitude: return this->latitude().propertyByIndex(index.copyFrontRemoved()); case IndexLongitude: return this->longitude().propertyByIndex(index.copyFrontRemoved()); case IndexAltitude: return this->getAltitude().propertyByIndex(index.copyFrontRemoved()); - case IndexHeading:return m_heading.propertyByIndex(index.copyFrontRemoved()); + case IndexHeading: return m_heading.propertyByIndex(index.copyFrontRemoved()); case IndexPitch: return m_pitch.propertyByIndex(index.copyFrontRemoved()); case IndexBank: return m_bank.propertyByIndex(index.copyFrontRemoved()); case IndexGroundSpeed: return m_groundSpeed.propertyByIndex(index.copyFrontRemoved()); @@ -198,11 +199,21 @@ namespace BlackMisc return !this->getGroundElevation().isNull(); } - void CAircraftSituation::setGroundElevationChecked(const CAltitude &elevation, bool ignoreNullValues, bool overrideExisting) + bool CAircraftSituation::setGroundElevationChecked(const CAltitude &elevation, bool ignoreNullValues, bool overrideExisting) { - if (ignoreNullValues && elevation.isNull()) { return; } - if (!overrideExisting && this->hasGroundElevation()) { return; } + if (ignoreNullValues && elevation.isNull()) { return false; } + if (!overrideExisting && this->hasGroundElevation()) { return false; } m_groundElevation = elevation; + return true; + } + + bool CAircraftSituation::setGroundElevationChecked(const CElevationPlane &elevationPlane, bool ignoreNullValues, bool overrideExisting) + { + if (ignoreNullValues && elevationPlane.isNull()) { return false; } + if (!overrideExisting && this->hasGroundElevation()) { return false; } + if (!elevationPlane.isWithinRange(*this)) { return false; } + m_groundElevation = elevationPlane.getAltitude(); + return true; } CLength CAircraftSituation::getHeightAboveGround() const diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index 8225c3e1d..caba56de9 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -36,6 +36,7 @@ namespace BlackMisc { + namespace Geo { class CElevationPlane; } namespace Aviation { //! Value object encapsulating information of an aircraft's situation @@ -171,7 +172,10 @@ namespace BlackMisc void setGroundElevation(const CAltitude &elevation) { m_groundElevation = elevation; } //! Set elevation of the ground directly beneath, but checked - void setGroundElevationChecked(const CAltitude &elevation, bool ignoreNullValues = true, bool overrideExisting = true); + bool setGroundElevationChecked(const CAltitude &elevation, bool ignoreNullValues = true, bool overrideExisting = true); + + //! Set elevation of the ground directly beneath, but checked + bool setGroundElevationChecked(const Geo::CElevationPlane &elevationPlane, bool ignoreNullValues = true, bool overrideExisting = true); //! Height above ground. PhysicalQuantities::CLength getHeightAboveGround() const; diff --git a/src/blackmisc/aviation/aircraftsituationlist.cpp b/src/blackmisc/aviation/aircraftsituationlist.cpp index 45a6c00fd..58477cc99 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.cpp +++ b/src/blackmisc/aviation/aircraftsituationlist.cpp @@ -9,16 +9,17 @@ #include "blackmisc/aviation/aircraftsituationlist.h" #include "blackmisc/aviation/aircraftsituation.h" +#include "blackmisc/geo/elevationplane.h" #include using namespace BlackMisc::PhysicalQuantities; +using namespace BlackMisc::Geo; namespace BlackMisc { namespace Aviation { - CAircraftSituationList::CAircraftSituationList() { } @@ -30,5 +31,29 @@ namespace BlackMisc CSequence(il) { } + int CAircraftSituationList::setGroundElevationChecked(const CElevationPlane &elevationPlane, bool ignoreNullValues, bool overrideExisting) + { + if (ignoreNullValues && elevationPlane.isNull()) { return 0; } + int c = 0; + for (CAircraftSituation &s : *this) + { + const bool set = s.setGroundElevationChecked(elevationPlane, ignoreNullValues, overrideExisting); + if (set) { c++; } + } + return c; + } + + int CAircraftSituationList::setGroundElevationChecked(const CElevationPlane &elevationPlane, qint64 newerThan, bool ignoreNullValues, bool overrideExisting) + { + if (ignoreNullValues && elevationPlane.isNull()) { return 0; } + int c = 0; + for (CAircraftSituation &s : *this) + { + if (s.getMSecsSinceEpoch() <= newerThan) { continue; } + const bool set = s.setGroundElevationChecked(elevationPlane, ignoreNullValues, overrideExisting); + if (set) { c++; } + } + return c; + } } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircraftsituationlist.h b/src/blackmisc/aviation/aircraftsituationlist.h index bdb0856e8..4aa136f8b 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.h +++ b/src/blackmisc/aviation/aircraftsituationlist.h @@ -14,6 +14,7 @@ #include "blackmisc/aviation/aircraftsituation.h" #include "blackmisc/aviation/callsignobjectlist.h" +#include "blackmisc/geo/elevationplane.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" #include "blackmisc/sequence.h" @@ -24,6 +25,7 @@ namespace BlackMisc { + namespace Geo { class CElevationPlane; } namespace Aviation { class CAircraftSituation; @@ -33,8 +35,7 @@ namespace BlackMisc public CSequence, public ITimestampObjectList, public ICallsignObjectList, - public BlackMisc::Mixin::MetaType - + public Mixin::MetaType { public: BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CAircraftSituationList) @@ -47,6 +48,12 @@ namespace BlackMisc //! Construct from initializer list. CAircraftSituationList(std::initializer_list il); + + //! Set ground elevation from elevation plane + int setGroundElevationChecked(const Geo::CElevationPlane &elevationPlane, bool ignoreNullValues = true, bool overrideExisting = true); + + //! Set ground elevation from elevation plane + int setGroundElevationChecked(const Geo::CElevationPlane &elevationPlane, qint64 newerThan, bool ignoreNullValues = true, bool overrideExisting = true); }; } // namespace } // namespace