mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-05 17:35:34 +08:00
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:
@@ -137,7 +137,7 @@ namespace BlackMisc
|
||||
|
||||
const QString &CAircraftSituation::gndElevationInfoToString(GndElevationInfo details)
|
||||
{
|
||||
static const QString no("no details");
|
||||
static const QString noDetails("no details");
|
||||
static const QString unknown("unknown");
|
||||
static const QString transferred("transferred");
|
||||
static const QString provider("provider");
|
||||
@@ -146,10 +146,11 @@ namespace BlackMisc
|
||||
static const QString test("test");
|
||||
static const QString interpolated("interpolated");
|
||||
static const QString extrapolated("extrapolated");
|
||||
static const QString avg("average");
|
||||
|
||||
switch (details)
|
||||
{
|
||||
case NoElevationInfo: return no;
|
||||
case NoElevationInfo: return noDetails;
|
||||
case TransferredElevation: return transferred;
|
||||
case FromProvider: return provider;
|
||||
case SituationChange: return change;
|
||||
@@ -157,6 +158,7 @@ namespace BlackMisc
|
||||
case Test: return test;
|
||||
case Interpolated: return interpolated;
|
||||
case Extrapolated: return extrapolated;
|
||||
case Average: return avg;
|
||||
default: break;
|
||||
}
|
||||
return unknown;
|
||||
|
||||
@@ -118,6 +118,7 @@ namespace BlackMisc
|
||||
TransferredElevation, //!< transferred from nearby situation
|
||||
Interpolated, //!< interpolated between 2 elevations
|
||||
Extrapolated, //!< extrapolated ("guessing")
|
||||
Average, //!< average value of "nearby" situation CAircraftSituationList::averageElevationOfNonMovingAircraft
|
||||
FromProvider, //!< from BlackMisc::Simulation::ISimulationEnvironmentProvider
|
||||
FromCache, //!< from cache
|
||||
SituationChange, //!< from BlackMisc::Aviation::CAircraftSituationChange
|
||||
|
||||
@@ -117,6 +117,7 @@ namespace BlackMisc
|
||||
bool CAircraftSituationList::extrapolateElevation(const CAircraftSituationChange &change)
|
||||
{
|
||||
if (this->size() < 3) { return false; }
|
||||
Q_ASSERT_X(m_tsAdjustedSortHint == CAircraftSituationList::AdjustedTimestampLatestFirst, Q_FUNC_INFO, "Need latest first");
|
||||
const CAircraftSituation old = (*this)[1];
|
||||
const CAircraftSituation older = (*this)[2];
|
||||
return this->front().extrapolateElevation(old, older, change);
|
||||
@@ -520,7 +521,7 @@ namespace BlackMisc
|
||||
return CAltitudePair(CAltitude(deltaFt.first, CAltitude::MeanSeaLevel, CAltitude::defaultUnit()), CAltitude(deltaFt.second, CAltitude::MeanSeaLevel, CAltitude::defaultUnit()));
|
||||
}
|
||||
|
||||
int CAircraftSituationList::transferElevationForward(const CLength radius)
|
||||
int CAircraftSituationList::transferElevationForward(const CLength &radius)
|
||||
{
|
||||
if (this->size() < 2) { return 0; }
|
||||
Q_ASSERT_X(m_tsAdjustedSortHint == CAircraftSituationList::AdjustedTimestampLatestFirst, Q_FUNC_INFO, "need latest first");
|
||||
@@ -533,5 +534,27 @@ namespace BlackMisc
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
CElevationPlane CAircraftSituationList::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
||||
{
|
||||
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
|
||||
|
||||
QList<double> valuesInFt;
|
||||
for (const CAircraftSituation &situation : *this)
|
||||
{
|
||||
if (situation.getGroundElevationInfo() != CAircraftSituation::FromProvider) { continue; }
|
||||
const bool canUse = !situation.isMoving() || (situation.isOnGroundFromNetwork() || situation.isOnGroundFromParts());
|
||||
if (!canUse) { continue; }
|
||||
if (!situation.isWithinRange(reference, range)) { continue; }
|
||||
const double elvFt = situation.getGroundElevationPlane().getAltitude().value(CLengthUnit::ft());
|
||||
valuesInFt.push_back(elvFt);
|
||||
}
|
||||
if (valuesInFt.size() < minValues) { return CElevationPlane::null(); }
|
||||
|
||||
static const double MaxDevFt = CAircraftSituationChange::allowedAltitudeDeviation().value(CLengthUnit::ft());
|
||||
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);
|
||||
if (elvStdDevMean.first > MaxDevFt) { return CElevationPlane::null(); }
|
||||
return CElevationPlane(reference, elvStdDevMean.second, CElevationPlane::singlePointRadius());
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -69,7 +69,7 @@ namespace BlackMisc
|
||||
//! Extrapolate ground flag into the future
|
||||
int extrapolateGroundFlag();
|
||||
|
||||
//! Extrapolates elevation into front element from 2nd and 3rd element
|
||||
//! Extrapolates elevation into front (first) element from 2nd and 3rd element
|
||||
//! \sa CAircraftSituation::extrapolateElevation
|
||||
//! \pre the list must be sorted latest first and containt at least 3 elements
|
||||
bool extrapolateElevation(const CAircraftSituationChange &change);
|
||||
@@ -190,7 +190,10 @@ namespace BlackMisc
|
||||
|
||||
//! Transfer elevations forward from older to newer
|
||||
//! \pre requires a list which is sorted "latest first"
|
||||
int transferElevationForward(const PhysicalQuantities::CLength radius = Geo::CElevationPlane::singlePointRadius());
|
||||
int transferElevationForward(const PhysicalQuantities::CLength &radius = Geo::CElevationPlane::singlePointRadius());
|
||||
|
||||
//! Average elevation for "nearby" aircraft "not moving" and having an elevation
|
||||
Geo::CElevationPlane averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const;
|
||||
};
|
||||
|
||||
//! Situation per callsign
|
||||
|
||||
@@ -38,16 +38,17 @@ namespace BlackMisc
|
||||
return CCoordinateGeodetic(lat, lon, geodeticHeight);
|
||||
}
|
||||
|
||||
PhysicalQuantities::CLength calculateGreatCircleDistance(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
|
||||
CLength calculateGreatCircleDistance(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
|
||||
{
|
||||
if (coordinate1.isNull() || coordinate2.isNull()) { return CLength::null(); }
|
||||
static const float earthRadiusMeters = 6371000.8f;
|
||||
const QVector3D v1 = coordinate1.normalVector();
|
||||
const QVector3D v2 = coordinate2.normalVector();
|
||||
const float d = earthRadiusMeters * std::atan2(QVector3D::crossProduct(v1, v2).length(), QVector3D::dotProduct(v1, v2));
|
||||
return { d, PhysicalQuantities::CLengthUnit::m() };
|
||||
return { d, CLengthUnit::m() };
|
||||
}
|
||||
|
||||
PhysicalQuantities::CAngle calculateBearing(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
|
||||
CAngle calculateBearing(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
|
||||
{
|
||||
static const QVector3D northPole { 0, 0, 1 };
|
||||
const QVector3D c1 = QVector3D::crossProduct(coordinate1.normalVector(), coordinate2.normalVector());
|
||||
@@ -56,7 +57,7 @@ namespace BlackMisc
|
||||
const float sinTheta = std::copysign(cross.length(), QVector3D::dotProduct(cross, coordinate1.normalVector()));
|
||||
const float cosTheta = QVector3D::dotProduct(c1, c2);
|
||||
const float theta = std::atan2(sinTheta, cosTheta);
|
||||
return { theta, PhysicalQuantities::CAngleUnit::rad() };
|
||||
return { theta, CAngleUnit::rad() };
|
||||
}
|
||||
|
||||
double calculateEuclideanDistance(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
|
||||
@@ -91,6 +92,14 @@ namespace BlackMisc
|
||||
return Geo::calculateGreatCircleDistance((*this), otherCoordinate);
|
||||
}
|
||||
|
||||
bool ICoordinateGeodetic::isWithinRange(const ICoordinateGeodetic &otherCoordinate, const CLength &range) const
|
||||
{
|
||||
if (range.isNull()) { return false; }
|
||||
const CLength distance = calculateGreatCircleDistance(otherCoordinate);
|
||||
if (distance.isNull()) { return false; }
|
||||
return distance <= range;
|
||||
}
|
||||
|
||||
CAngle ICoordinateGeodetic::calculateBearing(const ICoordinateGeodetic &otherCoordinate) const
|
||||
{
|
||||
return Geo::calculateBearing((*this), otherCoordinate);
|
||||
@@ -210,10 +219,10 @@ namespace BlackMisc
|
||||
{}
|
||||
|
||||
CCoordinateGeodetic::CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees) :
|
||||
CCoordinateGeodetic({ latitudeDegrees, PhysicalQuantities::CAngleUnit::deg() }, { longitudeDegrees, PhysicalQuantities::CAngleUnit::deg() }, { 0, nullptr }) {}
|
||||
CCoordinateGeodetic({ latitudeDegrees, CAngleUnit::deg() }, { longitudeDegrees, CAngleUnit::deg() }, { 0, nullptr }) {}
|
||||
|
||||
CCoordinateGeodetic::CCoordinateGeodetic(double latitudeDegrees, double longitudeDegrees, double heightFeet) :
|
||||
CCoordinateGeodetic({ latitudeDegrees, PhysicalQuantities::CAngleUnit::deg() }, { longitudeDegrees, PhysicalQuantities::CAngleUnit::deg() }, { heightFeet, PhysicalQuantities::CLengthUnit::ft() }) {}
|
||||
CCoordinateGeodetic({ latitudeDegrees, CAngleUnit::deg() }, { longitudeDegrees, CAngleUnit::deg() }, { heightFeet, CLengthUnit::ft() }) {}
|
||||
|
||||
CCoordinateGeodetic::CCoordinateGeodetic(const ICoordinateGeodetic &coordinate) :
|
||||
m_geodeticHeight(coordinate.geodeticHeight())
|
||||
@@ -223,13 +232,13 @@ namespace BlackMisc
|
||||
|
||||
CLatitude CCoordinateGeodetic::latitude() const
|
||||
{
|
||||
return { std::atan2(m_z, std::hypot(m_x, m_y)), PhysicalQuantities::CAngleUnit::rad() };
|
||||
return { std::atan2(m_z, std::hypot(m_x, m_y)), CAngleUnit::rad() };
|
||||
}
|
||||
|
||||
CLongitude CCoordinateGeodetic::longitude() const
|
||||
{
|
||||
// in mathematics atan2 of 0,0 is undefined, with IEEE floating-point atan2(0,0) is either 0 or ±180°
|
||||
return { std::atan2(m_y, m_x), PhysicalQuantities::CAngleUnit::rad() };
|
||||
return { std::atan2(m_y, m_x), CAngleUnit::rad() };
|
||||
}
|
||||
|
||||
QVector3D CCoordinateGeodetic::normalVector() const
|
||||
|
||||
@@ -111,6 +111,9 @@ namespace BlackMisc
|
||||
//! Great circle distance
|
||||
PhysicalQuantities::CLength calculateGreatCircleDistance(const ICoordinateGeodetic &otherCoordinate) const;
|
||||
|
||||
//! Object within range?
|
||||
bool isWithinRange(const ICoordinateGeodetic &otherCoordinate, const PhysicalQuantities::CLength &range) const;
|
||||
|
||||
//! Initial bearing
|
||||
PhysicalQuantities::CAngle calculateBearing(const ICoordinateGeodetic &otherCoordinate) const;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user