diff --git a/src/blackcore/interpolator.h b/src/blackcore/interpolator.h index 496e2bfb4..abb403bfc 100644 --- a/src/blackcore/interpolator.h +++ b/src/blackcore/interpolator.h @@ -13,7 +13,7 @@ #define BLACKCORE_INTERPOLATOR_H #include "blackmisc/avaircraftsituation.h" -#include +#include "simulator.h" namespace BlackCore { @@ -21,26 +21,25 @@ namespace BlackCore class IInterpolator { public: - //! Default constructor - IInterpolator() {} //! Virtual destructor virtual ~IInterpolator() {} - //! Init object - virtual void initialize() = 0; + //! Has situations? + virtual bool hasEnoughAircraftSituations(const BlackMisc::Aviation::CCallsign &callsign) const + { + Q_ASSERT(m_provider); + //! \todo Interpolator, it would be more efficient to directly getting the values and decide then + return m_provider->renderedAircraftSituations().findBeforeNowMinusOffset(6000).findByCallsign(callsign).size() > 1; + } - //! Add new aircraft situation - virtual void addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0; + //! Current interpolated situation + virtual BlackMisc::Aviation::CAircraftSituation getCurrentInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign) const = 0; - //! Do we have enough situations to start calculating? - virtual bool hasEnoughAircraftSituations() const = 0; - - //! Get current aircraft situation - virtual BlackMisc::Aviation::CAircraftSituation getCurrentSituation() = 0; - - //! Get timestamp of the last received aircraft situation - virtual QDateTime getTimeOfLastReceivedSituation() const = 0; + protected: + //! Constructor + IInterpolator(BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *provider) : m_provider(provider) { Q_ASSERT(provider);} + BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *m_provider = nullptr; //!< access to provider }; } // namespace diff --git a/src/blackcore/interpolator_linear.cpp b/src/blackcore/interpolator_linear.cpp index 3a5511209..77db2ecb2 100644 --- a/src/blackcore/interpolator_linear.cpp +++ b/src/blackcore/interpolator_linear.cpp @@ -18,30 +18,11 @@ using namespace BlackMisc::Aviation; namespace BlackCore { - void CInterpolatorLinear::initialize() - { - - } - - void CInterpolatorLinear::addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) - { - m_aircraftSituationList.push_back(situation); - - // Delete packets older than 30 seconds - m_aircraftSituationList.removeBefore(QDateTime::currentDateTimeUtc().addSecs(-30)); - } - - bool CInterpolatorLinear::hasEnoughAircraftSituations() const + CAircraftSituation CInterpolatorLinear::getCurrentInterpolatedSituation(const CCallsign &callsign) const { QDateTime currentTime = QDateTime::currentDateTimeUtc().addSecs(-6); - return !m_aircraftSituationList.findBefore(currentTime).isEmpty() && m_aircraftSituationList.size() > 1; - } - - CAircraftSituation CInterpolatorLinear::getCurrentSituation() - { - QDateTime currentTime = QDateTime::currentDateTimeUtc().addSecs(-6); - CAircraftSituationList situationsBefore = m_aircraftSituationList.findBefore(currentTime); - CAircraftSituationList situationsAfter = m_aircraftSituationList.findAfter(currentTime); + CAircraftSituationList situationsBefore = renderedAircraftSituations().findBefore(currentTime).findByCallsign(callsign); + CAircraftSituationList situationsAfter = renderedAircraftSituations().findAfter(currentTime).findByCallsign(callsign); Q_ASSERT_X(!situationsBefore.isEmpty(), "CInterpolatorLinear::getCurrentSituation()", "List previous situations is empty!"); @@ -131,8 +112,4 @@ namespace BlackCore return currentSituation; } - QDateTime CInterpolatorLinear::getTimeOfLastReceivedSituation() const - { - return m_aircraftSituationList.back().getUtcTimestamp(); - } -} +} // namespace diff --git a/src/blackcore/interpolator_linear.h b/src/blackcore/interpolator_linear.h index f58b37242..ca9d640be 100644 --- a/src/blackcore/interpolator_linear.h +++ b/src/blackcore/interpolator_linear.h @@ -21,33 +21,18 @@ namespace BlackCore { //! \brief Linear interpolator, calculation inbetween positions - class CInterpolatorLinear : public IInterpolator + class CInterpolatorLinear : + public IInterpolator, + public BlackMisc::Simulation::CRenderedAircraftProviderSupportReadOnly { public: - //! \brief Default constructor - CInterpolatorLinear() {} - - //! \brief Virtual destructor - virtual ~CInterpolatorLinear() {} - - //! Init object - virtual void initialize() override; - - //! \copydoc IInterpolator::addSituation() - virtual void addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; - - //! \copydoc IInterpolator::hasEnoughAircraftSituations() - virtual bool hasEnoughAircraftSituations() const override; - - //! \copydoc IInterpolator::getCurrentSituation() - virtual BlackMisc::Aviation::CAircraftSituation getCurrentSituation() override; - - //! \copydoc IInterpolator::getTimeOfLastReceivedSituation() - virtual QDateTime getTimeOfLastReceivedSituation() const override; - - private: - BlackMisc::Aviation::CAircraftSituationList m_aircraftSituationList; + //! Constructor + CInterpolatorLinear(BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *provider) : + IInterpolator(provider), + BlackMisc::Simulation::CRenderedAircraftProviderSupportReadOnly(provider) {} + //! \copydoc IInterpolator::getCurrentInterpolatedSituation + virtual BlackMisc::Aviation::CAircraftSituation getCurrentInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign) const override; }; } // namespace BlackCore diff --git a/tests/blackcore/testinterpolator.cpp b/tests/blackcore/testinterpolator.cpp index 4dc9fc013..8dad6fad4 100644 --- a/tests/blackcore/testinterpolator.cpp +++ b/tests/blackcore/testinterpolator.cpp @@ -18,16 +18,7 @@ namespace BlackCoreTest */ void CTestInterpolator::interpolatorBasics() { - IInterpolator *interpolator = new CInterpolatorLinear(); - QVERIFY2(!interpolator->hasEnoughAircraftSituations(), "Interpolator cannot have enough situations. They should be 0!"); - - CAircraftSituation situation; - interpolator->addAircraftSituation(situation); - QTest::qSleep(6100); - situation.setAltitude(CAltitude(500, CAltitude::MeanSeaLevel, CLengthUnit::ft())); - interpolator->addAircraftSituation(situation); - - QVERIFY2(interpolator->hasEnoughAircraftSituations(), "Interpolator should have enough situations!"); + //! \todo what would we test here? } } // namespace