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
#include "blackmisc/avaircraftsituation.h"
#include <QDateTime>
#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

View File

@@ -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

View File

@@ -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

View File

@@ -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