mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-23 07:15:35 +08:00
refs #369, revised interpolator, removed addAircraftSituation
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user