Ref T275, new function to estimate ground elevation and some provider functions

* added "averageElevationOfNonMovingAircraft". Idea: aircraft in the vicinity not moving or on ground likely have the same airport elevation
* added "isWithinRange"
* added "latestRemoteAircraftSituations" / "remoteAircraftSituation" in provider
This commit is contained in:
Klaus Basan
2018-06-18 03:21:15 +02:00
parent d864789890
commit 2625c3fb6b
11 changed files with 183 additions and 42 deletions

View File

@@ -35,12 +35,11 @@ namespace BlackMisc
CSimulatedAircraftList CRemoteAircraftProvider::getAircraftInRange() const
{
QList<CSimulatedAircraft> aircraft;
{
QReadLocker l(&m_lockAircraft);
aircraft = m_aircraftInRange.values();
}
return aircraft;
QReadLocker l(&m_lockAircraft);
const QList<CSimulatedAircraft> aircraft = m_aircraftInRange.values();
l.unlock();
return CSimulatedAircraftList(aircraft);
}
CCallsignSet CRemoteAircraftProvider::getAircraftInRangeCallsigns() const
@@ -71,6 +70,21 @@ namespace BlackMisc
return m_situationsByCallsign[callsign];
}
CAircraftSituation CRemoteAircraftProvider::remoteAircraftSituation(const CCallsign &callsign, int index) const
{
CAircraftSituationList situations = this->remoteAircraftSituations(callsign);
if (index < 0 || index >= situations.size()) { return CAircraftSituation::null(); }
return situations[index];
}
CAircraftSituationList CRemoteAircraftProvider::latestRemoteAircraftSituations() const
{
QReadLocker l(&m_lockSituations);
const QList<CAircraftSituation> situations(m_latestSituationByCallsign.values());
l.unlock();
return CAircraftSituationList(situations);
}
int CRemoteAircraftProvider::remoteAircraftSituationsCount(const CCallsign &callsign) const
{
QReadLocker l(&m_lockSituations);
@@ -147,6 +161,7 @@ namespace BlackMisc
{
QWriteLocker l(&m_lockSituations);
m_situationsByCallsign.clear();
m_latestSituationByCallsign.clear();
m_situationsAdded = 0;
m_situationsLastModified.clear();
m_testOffset.clear();
@@ -244,6 +259,7 @@ namespace BlackMisc
newSituationsList.setOnGroundDetails(situation.getOnGroundDetails());
}
}
m_latestSituationByCallsign[cs] = situationCorrected;
// check sort order
if (CBuildConfig::isLocalDeveloperDebugBuild())
@@ -611,6 +627,12 @@ namespace BlackMisc
return m_partsLastModified.value(callsign, -1);
}
CElevationPlane CRemoteAircraftProvider::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
{
const CAircraftSituationList situations = this->latestRemoteAircraftSituations();
return situations.averageElevationOfNonMovingAircraft(reference, range, minValues);
}
bool CRemoteAircraftProvider::testAddAltitudeOffset(const CCallsign &callsign, const CLength &offset)
{
const bool remove = offset.isNull() || offset.isZeroEpsilonConsidered();
@@ -670,7 +692,7 @@ namespace BlackMisc
bool CRemoteAircraftProvider::removeAircraft(const CCallsign &callsign)
{
{ QWriteLocker l1(&m_lockParts); m_partsByCallsign.remove(callsign); m_aircraftWithParts.remove(callsign); m_partsLastModified.remove(callsign); }
{ QWriteLocker l2(&m_lockSituations); m_situationsByCallsign.remove(callsign); m_situationsLastModified.remove(callsign); }
{ QWriteLocker l2(&m_lockSituations); m_situationsByCallsign.remove(callsign); m_latestSituationByCallsign.remove(callsign); m_situationsLastModified.remove(callsign); }
{ QWriteLocker l4(&m_lockPartsHistory); m_aircraftPartsMessages.remove(callsign); }
bool removedCallsign = false;
{
@@ -735,6 +757,18 @@ namespace BlackMisc
return this->provider()->remoteAircraftSituations(callsign);
}
CAircraftSituation CRemoteAircraftAware::remoteAircraftSituation(const CCallsign &callsign, int index) const
{
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
return this->provider()->remoteAircraftSituation(callsign, index);
}
CAircraftSituationList CRemoteAircraftAware::latestRemoteAircraftSituations() const
{
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
return this->provider()->latestRemoteAircraftSituations();
}
CAircraftSituationChangeList CRemoteAircraftAware::remoteAircraftSituationChanges(const CCallsign &callsign) const
{
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
@@ -819,6 +853,12 @@ namespace BlackMisc
return this->provider()->partsLastModified(callsign);
}
CElevationPlane CRemoteAircraftAware::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
{
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
return this->provider()->averageElevationOfNonMovingAircraft(reference, range, minValues);
}
bool CRemoteAircraftAware::isRemoteAircraftSupportingParts(const CCallsign &callsign) const
{
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");

View File

@@ -51,6 +51,9 @@ namespace BlackMisc
static constexpr int MaxPartsAgePerCallsignSecs = 60; //!< How many seconds to keep parts for interpolation
static constexpr int DefaultOffsetTimeMs = 6000; //!< \fixme copied from CNetworkVatlib::c_positionTimeOffsetMsec
//! Destructor
virtual ~IRemoteAircraftProvider() {}
//! All remote aircraft
//! \threadsafe
virtual CSimulatedAircraftList getAircraftInRange() const = 0;
@@ -87,6 +90,17 @@ namespace BlackMisc
//! \threadsafe
virtual Aviation::CAircraftSituationList remoteAircraftSituations(const Aviation::CCallsign &callsign) const = 0;
//! Rendered aircraft situations (per callsign and index)
//! \remark if situation does not exist, an NULL situation is returned
//! \param callsign
//! \param index 0..latest, 1..next older, ...
//! \threadsafe
virtual Aviation::CAircraftSituation remoteAircraftSituation(const Aviation::CCallsign &callsign, int index) const = 0;
//! Latest aircraft situation for all callsigns
//! \threadsafe
virtual Aviation::CAircraftSituationList latestRemoteAircraftSituations() const = 0;
//! Number of remote aircraft situations for callsign
//! \remark latest situations first
//! \threadsafe
@@ -197,8 +211,9 @@ namespace BlackMisc
//! \threadsafe
virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const = 0;
//! Destructor
virtual ~IRemoteAircraftProvider() {}
//! \copydoc BlackMisc::Aviation::CAircraftSituationList::averageElevationOfNonMovingAircraft
//! \threadsafe
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const = 0;
//! Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly.
//! In order to disconnect a list of connections is provided, which have to be disconnected manually.
@@ -249,6 +264,8 @@ namespace BlackMisc
virtual bool isAircraftInRange(const Aviation::CCallsign &callsign) const override;
virtual bool isVtolAircraft(const Aviation::CCallsign &callsign) const override;
virtual Aviation::CAircraftSituationList remoteAircraftSituations(const Aviation::CCallsign &callsign) const override;
virtual Aviation::CAircraftSituation remoteAircraftSituation(const Aviation::CCallsign &callsign, int index) const override;
virtual Aviation::CAircraftSituationList latestRemoteAircraftSituations() const override;
virtual int remoteAircraftSituationsCount(const Aviation::CCallsign &callsign) const override;
virtual Aviation::CAircraftPartsList remoteAircraftParts(const Aviation::CCallsign &callsign) const override;
virtual int remoteAircraftPartsCount(const Aviation::CCallsign &callsign) const override;
@@ -272,6 +289,7 @@ namespace BlackMisc
virtual int aircraftPartsAdded() const override;
virtual qint64 situationsLastModified(const Aviation::CCallsign &callsign) const override;
virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const override;
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const override;
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
QObject *receiver,
std::function<void(const Aviation::CAircraftSituation &)> addedSituationSlot,
@@ -388,8 +406,9 @@ namespace BlackMisc
//! \threadsafe
void storeChange(const Aviation::CAircraftSituationChange &change);
Aviation::CAircraftSituationListPerCallsign m_situationsByCallsign; //!< situations, for performance reasons per callsign, thread safe access required
Aviation::CAircraftPartsListPerCallsign m_partsByCallsign; //!< parts, for performance reasons per callsign, thread safe access required
Aviation::CAircraftSituationListPerCallsign m_situationsByCallsign; //!< situations, for performance reasons per callsign, thread safe access required
Aviation::CAircraftSituationPerCallsign m_latestSituationByCallsign; //!< latest situations, for performance reasons per callsign, thread safe access required
Aviation::CAircraftPartsListPerCallsign m_partsByCallsign; //!< parts, for performance reasons per callsign, thread safe access required
Aviation::CAircraftSituationChangeListPerCallsign m_changesByCallsign; //!< changes, for performance reasons per callsign, thread safe access required
Aviation::CCallsignSet m_aircraftWithParts; //!< aircraft supporting parts, thread safe access required
int m_situationsAdded = 0; //!< total number of situations added, thread safe access required
@@ -445,6 +464,12 @@ namespace BlackMisc
//! \copydoc IRemoteAircraftProvider::remoteAircraftSituations
Aviation::CAircraftSituationList remoteAircraftSituations(const Aviation::CCallsign &callsign) const;
//! \copydoc IRemoteAircraftProvider::remoteAircraftSituation
Aviation::CAircraftSituation remoteAircraftSituation(const Aviation::CCallsign &callsign, int index) const;
//! \copydoc IRemoteAircraftProvider::latestRemoteAircraftSituations
Aviation::CAircraftSituationList latestRemoteAircraftSituations() const;
//! \copydoc IRemoteAircraftProvider::remoteAircraftSituationsCount
int remoteAircraftSituationsCount(const Aviation::CCallsign &callsign) const;
@@ -496,6 +521,9 @@ namespace BlackMisc
//! \copydoc IRemoteAircraftProvider::partsLastModified
qint64 partsLastModified(const Aviation::CCallsign &callsign) const;
//! \copydoc IRemoteAircraftProvider::averageElevationOfNonMovingAircraft
Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const;
//! Set remote aircraft provider
void setRemoteAircraftProvider(IRemoteAircraftProvider *remoteAircraftProvider) { this->setProvider(remoteAircraftProvider); }