mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-20 20:40:29 +08:00
refs #369, revised interpolator, removed addAircraftSituation
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user