diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index bffb1526e..a41079f42 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -954,7 +954,7 @@ namespace BlackCore // so far we have requested it, but we set it upfront either by // a) average value from other plane in the vicinity or // b) by extrapolating - const CElevationPlane averagePlane = this->averageElevationOfNonMovingAircraft(situation, CElevationPlane::minorAirportRadius()); + const CElevationPlane averagePlane = this->averageElevationOfNonMovingAircraft(situation, CElevationPlane::majorAirportRadius(), 2); if (!averagePlane.isNull()) { correctedSituation.setGroundElevation(averagePlane, CAircraftSituation::Average); diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index d67700672..7039197e1 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -127,6 +127,12 @@ namespace BlackCore return m_airspace->latestRemoteAircraftSituations(); } + CAircraftSituationList CContextNetwork::latestOnGroundProviderElevations() const + { + Q_ASSERT(m_airspace); + return m_airspace->latestOnGroundProviderElevations(); + } + CAircraftPartsList CContextNetwork::remoteAircraftParts(const CCallsign &callsign) const { Q_ASSERT(m_airspace); diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 68c3c0dee..dbf4fb1af 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -94,6 +94,7 @@ namespace BlackCore virtual BlackMisc::Aviation::CAircraftSituationList remoteAircraftSituations(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual BlackMisc::Aviation::CAircraftSituation remoteAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, int index) const override; virtual BlackMisc::Aviation::CAircraftSituationList latestRemoteAircraftSituations() const override; + virtual BlackMisc::Aviation::CAircraftSituationList latestOnGroundProviderElevations() const override; virtual int remoteAircraftSituationsCount(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual BlackMisc::Aviation::CAircraftPartsList remoteAircraftParts(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual int remoteAircraftPartsCount(const BlackMisc::Aviation::CCallsign &callsign) const override; diff --git a/src/blackmisc/aviation/aircraftsituationlist.cpp b/src/blackmisc/aviation/aircraftsituationlist.cpp index 2b7ae16b1..f34e3b7e3 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.cpp +++ b/src/blackmisc/aviation/aircraftsituationlist.cpp @@ -540,6 +540,7 @@ namespace BlackMisc if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed QList valuesInFt; + int count = 0; for (const CAircraftSituation &situation : *this) { if (situation.getGroundElevationInfo() != CAircraftSituation::FromProvider) { continue; } @@ -548,8 +549,11 @@ namespace BlackMisc if (!situation.isWithinRange(reference, range)) { continue; } const double elvFt = situation.getGroundElevationPlane().getAltitude().value(CLengthUnit::ft()); valuesInFt.push_back(elvFt); + count++; + if (count > 5 && valuesInFt.size() > 3 * minValues) { break; } } - if (valuesInFt.size() < minValues) { return CElevationPlane::null(); } + + if (count < minValues) { return CElevationPlane::null(); } static const double MaxDevFt = CAircraftSituationChange::allowedAltitudeDeviation().value(CLengthUnit::ft()); const QPair elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt); diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index 17437f4e5..05778e69d 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -85,6 +85,14 @@ namespace BlackMisc return CAircraftSituationList(situations); } + CAircraftSituationList CRemoteAircraftProvider::latestOnGroundProviderElevations() const + { + QReadLocker l(&m_lockSituations); + const QList situations(m_latestOnGroundProviderElevation.values()); + l.unlock(); + return CAircraftSituationList(situations); + } + int CRemoteAircraftProvider::remoteAircraftSituationsCount(const CCallsign &callsign) const { QReadLocker l(&m_lockSituations); @@ -162,6 +170,7 @@ namespace BlackMisc QWriteLocker l(&m_lockSituations); m_situationsByCallsign.clear(); m_latestSituationByCallsign.clear(); + m_latestOnGroundProviderElevation.clear(); m_situationsAdded = 0; m_situationsLastModified.clear(); m_testOffset.clear(); @@ -466,9 +475,15 @@ namespace BlackMisc { QWriteLocker l(&m_lockSituations); CAircraftSituationList &situations = m_situationsByCallsign[callsign]; + if (situations.isEmpty()) { return 0; } updated = situations.setGroundElevationCheckedAndGuessGround(elevation, info, model, &change); if (updated < 1) { return 0; } m_situationsLastModified[callsign] = ts; + const CAircraftSituation latest = situations.front(); + if (info == CAircraftSituation::FromProvider && latest.isOnGround()) + { + m_latestOnGroundProviderElevation[callsign] = latest; + } } // update change @@ -629,7 +644,7 @@ namespace BlackMisc CElevationPlane CRemoteAircraftProvider::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const { - const CAircraftSituationList situations = this->latestRemoteAircraftSituations(); + const CAircraftSituationList situations = this->latestOnGroundProviderElevations(); return situations.averageElevationOfNonMovingAircraft(reference, range, minValues); } @@ -691,8 +706,19 @@ 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_latestSituationByCallsign.remove(callsign); m_situationsLastModified.remove(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_latestSituationByCallsign.remove(callsign); + m_latestOnGroundProviderElevation.remove(callsign); + m_situationsLastModified.remove(callsign); + } { QWriteLocker l4(&m_lockPartsHistory); m_aircraftPartsMessages.remove(callsign); } bool removedCallsign = false; { @@ -769,6 +795,12 @@ namespace BlackMisc return this->provider()->latestRemoteAircraftSituations(); } + CAircraftSituationList CRemoteAircraftAware::latestOnGroundProviderElevations() const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->latestOnGroundProviderElevations(); + } + CAircraftSituationChangeList CRemoteAircraftAware::remoteAircraftSituationChanges(const CCallsign &callsign) const { Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index 2b23611d1..a8b7a9a35 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -101,6 +101,10 @@ namespace BlackMisc //! \threadsafe virtual Aviation::CAircraftSituationList latestRemoteAircraftSituations() const = 0; + //! Latest aircraft situation "on ground" having a provider elevation + //! \threadsafe + virtual Aviation::CAircraftSituationList latestOnGroundProviderElevations() const = 0; + //! Number of remote aircraft situations for callsign //! \remark latest situations first //! \threadsafe @@ -266,6 +270,7 @@ namespace BlackMisc 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 Aviation::CAircraftSituationList latestOnGroundProviderElevations() 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; @@ -406,11 +411,12 @@ namespace BlackMisc //! \threadsafe void storeChange(const Aviation::CAircraftSituationChange &change); - 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 + 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::CAircraftSituationPerCallsign m_latestOnGroundProviderElevation; //!< situation on ground with elevation from provider + 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 int m_partsAdded = 0; //!< total number of parts added, thread safe access required @@ -470,6 +476,9 @@ namespace BlackMisc //! \copydoc IRemoteAircraftProvider::latestRemoteAircraftSituations Aviation::CAircraftSituationList latestRemoteAircraftSituations() const; + //! \copydoc IRemoteAircraftProvider::latestOnGroundProviderElevations + Aviation::CAircraftSituationList latestOnGroundProviderElevations() const; + //! \copydoc IRemoteAircraftProvider::remoteAircraftSituationsCount int remoteAircraftSituationsCount(const Aviation::CCallsign &callsign) const;