From 2f3e4fee1ede1809fa980b91b892ce5fd012143e Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Tue, 9 Jan 2024 22:14:14 +0100 Subject: [PATCH] refactor: Move PBH interpolator to inidivdual Interpolants This allows each interpolant to specify on its own which PBH interpolator should be used. Currently only the linear PBH interpolator is available, but another PBH interpolator will be added for velocity. This removes some protected data from the IInterpolator interface as well, which conforms to C++ Core Guideline C.113 ("Avoid protected data"). --- src/blackmisc/simulation/interpolant.h | 8 ++------ src/blackmisc/simulation/interpolator.cpp | 2 +- src/blackmisc/simulation/interpolatorlinear.cpp | 8 ++++---- src/blackmisc/simulation/interpolatorlinear.h | 3 +++ src/blackmisc/simulation/interpolatorspline.h | 3 +++ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/blackmisc/simulation/interpolant.h b/src/blackmisc/simulation/interpolant.h index 7df9233c4..09966e2e5 100644 --- a/src/blackmisc/simulation/interpolant.h +++ b/src/blackmisc/simulation/interpolant.h @@ -17,9 +17,6 @@ namespace BlackMisc::Simulation //! "Real time" representing the interpolated situation qint64 getInterpolatedTime() const { return m_interpolatedTime; } - //! Interpolator for pitch, bank, heading, groundspeed - const CInterpolatorPbh &pbh() const { return m_pbh; } - //! Situations available int getSituationsAvailable() const { return m_situationsAvailable; } @@ -37,17 +34,16 @@ namespace BlackMisc::Simulation protected: //! Default ctor - IInterpolant() {} + IInterpolant() = default; //! Constructor - IInterpolant(int situationsAvailable, const CInterpolatorPbh &pbh) : m_situationsAvailable(situationsAvailable), m_pbh(pbh) {} + explicit IInterpolant(int situationsAvailable) : m_situationsAvailable(situationsAvailable) {} //! Constructor IInterpolant(qint64 interpolatedTime, int situationsAvailable) : m_interpolatedTime(interpolatedTime), m_situationsAvailable(situationsAvailable) {} qint64 m_interpolatedTime = -1; //!< "Real time "of interpolated situation int m_situationsAvailable = 0; //!< used situations - CInterpolatorPbh m_pbh; //!< the used PBH interpolator bool m_valid = true; //!< valid? bool m_recalculated = false; //!< recalculated interpolant }; diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 708118d32..1343f5cd7 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -245,12 +245,12 @@ namespace BlackMisc::Simulation do { if (!isValidInterpolant) { break; } - const CInterpolatorPbh pbh = interpolant.pbh(); // init interpolated situation currentSituation = this->initInterpolatedSituation(pbh.getStartSituation(), pbh.getEndSituation()); // Pitch bank heading first, so follow up steps could use those values + const auto pbh = interpolant.pbh(); currentSituation.setHeading(pbh.getHeading()); currentSituation.setPitch(pbh.getPitch()); currentSituation.setBank(pbh.getBank()); diff --git a/src/blackmisc/simulation/interpolatorlinear.cpp b/src/blackmisc/simulation/interpolatorlinear.cpp index 31fbd0c46..df4f6c261 100644 --- a/src/blackmisc/simulation/interpolatorlinear.cpp +++ b/src/blackmisc/simulation/interpolatorlinear.cpp @@ -23,12 +23,12 @@ using namespace BlackMisc::Simulation; namespace BlackMisc::Simulation { - CInterpolatorLinear::CInterpolant::CInterpolant(const CAircraftSituation &startSituation) : IInterpolant(1, CInterpolatorPbh(0, startSituation, startSituation)), - m_startSituation(startSituation) + CInterpolatorLinear::CInterpolant::CInterpolant(const CAircraftSituation &startSituation) : IInterpolant(1), + m_startSituation(startSituation), m_pbh(0, startSituation, startSituation) {} - CInterpolatorLinear::CInterpolant::CInterpolant(const CAircraftSituation &startSituation, const CInterpolatorPbh &pbh) : IInterpolant(1, pbh), - m_startSituation(startSituation) + CInterpolatorLinear::CInterpolant::CInterpolant(const CAircraftSituation &startSituation, const CInterpolatorPbh &pbh) : IInterpolant(1), + m_startSituation(startSituation), m_pbh(pbh) {} CInterpolatorLinear::CInterpolant::CInterpolant(const CAircraftSituation &startSituation, const CAircraftSituation &endSituation, double timeFraction, qint64 interpolatedTime) : IInterpolant(interpolatedTime, 2), diff --git a/src/blackmisc/simulation/interpolatorlinear.h b/src/blackmisc/simulation/interpolatorlinear.h index ebc504f57..d2148fbc2 100644 --- a/src/blackmisc/simulation/interpolatorlinear.h +++ b/src/blackmisc/simulation/interpolatorlinear.h @@ -60,10 +60,13 @@ namespace BlackMisc //! End situation const Aviation::CAircraftSituation &getEndSituation() const { return m_endSituation; } + CInterpolatorPbh pbh() const { return m_pbh; } + private: Aviation::CAircraftSituation m_startSituation; Aviation::CAircraftSituation m_endSituation; double m_simulationTimeFraction = 0.0; //!< 0..1 + CInterpolatorPbh m_pbh; }; //! Get the interpolant for the given time point diff --git a/src/blackmisc/simulation/interpolatorspline.h b/src/blackmisc/simulation/interpolatorspline.h index c25690c8e..f86d3a217 100644 --- a/src/blackmisc/simulation/interpolatorspline.h +++ b/src/blackmisc/simulation/interpolatorspline.h @@ -77,10 +77,13 @@ namespace BlackMisc::Simulation //! \private UNIT tests/ASSERT only const PosArray &getPa() const { return m_pa; } + CInterpolatorPbh pbh() const { return m_pbh; } + private: PosArray m_pa; //!< current positions array, latest values last PhysicalQuantities::CLengthUnit m_altitudeUnit; qint64 m_currentTimeMsSinceEpoc { -1 }; + CInterpolatorPbh m_pbh; //!< the used PBH interpolator }; //! Strategy used by CInterpolator::getInterpolatedSituation