refs #369, revised interpolator, removed addAircraftSituation

This commit is contained in:
Klaus Basan
2015-02-07 14:45:51 +01:00
parent 6aea013b23
commit 58b56ba2f3
4 changed files with 28 additions and 76 deletions

View File

@@ -13,7 +13,7 @@
#define BLACKCORE_INTERPOLATOR_H #define BLACKCORE_INTERPOLATOR_H
#include "blackmisc/avaircraftsituation.h" #include "blackmisc/avaircraftsituation.h"
#include <QDateTime> #include "simulator.h"
namespace BlackCore namespace BlackCore
{ {
@@ -21,26 +21,25 @@ namespace BlackCore
class IInterpolator class IInterpolator
{ {
public: public:
//! Default constructor
IInterpolator() {}
//! Virtual destructor //! Virtual destructor
virtual ~IInterpolator() {} virtual ~IInterpolator() {}
//! Init object //! Has situations?
virtual void initialize() = 0; 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 //! Current interpolated situation
virtual void addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0; virtual BlackMisc::Aviation::CAircraftSituation getCurrentInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign) const = 0;
//! Do we have enough situations to start calculating? protected:
virtual bool hasEnoughAircraftSituations() const = 0; //! Constructor
IInterpolator(BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *provider) : m_provider(provider) { Q_ASSERT(provider);}
//! Get current aircraft situation BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *m_provider = nullptr; //!< access to provider
virtual BlackMisc::Aviation::CAircraftSituation getCurrentSituation() = 0;
//! Get timestamp of the last received aircraft situation
virtual QDateTime getTimeOfLastReceivedSituation() const = 0;
}; };
} // namespace } // namespace

View File

@@ -18,30 +18,11 @@ using namespace BlackMisc::Aviation;
namespace BlackCore namespace BlackCore
{ {
void CInterpolatorLinear::initialize() CAircraftSituation CInterpolatorLinear::getCurrentInterpolatedSituation(const CCallsign &callsign) const
{
}
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
{ {
QDateTime currentTime = QDateTime::currentDateTimeUtc().addSecs(-6); QDateTime currentTime = QDateTime::currentDateTimeUtc().addSecs(-6);
return !m_aircraftSituationList.findBefore(currentTime).isEmpty() && m_aircraftSituationList.size() > 1; CAircraftSituationList situationsBefore = renderedAircraftSituations().findBefore(currentTime).findByCallsign(callsign);
} CAircraftSituationList situationsAfter = renderedAircraftSituations().findAfter(currentTime).findByCallsign(callsign);
CAircraftSituation CInterpolatorLinear::getCurrentSituation()
{
QDateTime currentTime = QDateTime::currentDateTimeUtc().addSecs(-6);
CAircraftSituationList situationsBefore = m_aircraftSituationList.findBefore(currentTime);
CAircraftSituationList situationsAfter = m_aircraftSituationList.findAfter(currentTime);
Q_ASSERT_X(!situationsBefore.isEmpty(), "CInterpolatorLinear::getCurrentSituation()", "List previous situations is empty!"); Q_ASSERT_X(!situationsBefore.isEmpty(), "CInterpolatorLinear::getCurrentSituation()", "List previous situations is empty!");
@@ -131,8 +112,4 @@ namespace BlackCore
return currentSituation; return currentSituation;
} }
QDateTime CInterpolatorLinear::getTimeOfLastReceivedSituation() const } // namespace
{
return m_aircraftSituationList.back().getUtcTimestamp();
}
}

View File

@@ -21,33 +21,18 @@
namespace BlackCore namespace BlackCore
{ {
//! \brief Linear interpolator, calculation inbetween positions //! \brief Linear interpolator, calculation inbetween positions
class CInterpolatorLinear : public IInterpolator class CInterpolatorLinear :
public IInterpolator,
public BlackMisc::Simulation::CRenderedAircraftProviderSupportReadOnly
{ {
public: public:
//! \brief Default constructor //! Constructor
CInterpolatorLinear() {} CInterpolatorLinear(BlackMisc::Simulation::IRenderedAircraftProviderReadOnly *provider) :
IInterpolator(provider),
//! \brief Virtual destructor BlackMisc::Simulation::CRenderedAircraftProviderSupportReadOnly(provider) {}
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;
//! \copydoc IInterpolator::getCurrentInterpolatedSituation
virtual BlackMisc::Aviation::CAircraftSituation getCurrentInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign) const override;
}; };
} // namespace BlackCore } // namespace BlackCore

View File

@@ -18,16 +18,7 @@ namespace BlackCoreTest
*/ */
void CTestInterpolator::interpolatorBasics() void CTestInterpolator::interpolatorBasics()
{ {
IInterpolator *interpolator = new CInterpolatorLinear(); //! \todo what would we test here?
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!");
} }
} // namespace } // namespace