From 746024becd62c8605522dfb1c928c47915117519 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 17 Jun 2018 00:38:39 +0200 Subject: [PATCH] Ref T275, use extrapolate for new situations in airspace monitor and provider --- src/blackcore/airspacemonitor.cpp | 14 ++++++++- .../simulation/remoteaircraftprovider.cpp | 29 ++++++++----------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 1d1903472..dc7cc0275 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -943,10 +943,22 @@ namespace BlackCore CAircraftSituation correctedSituation(this->testAddAltitudeOffsetToSituation(situation)); if (!correctedSituation.hasGroundElevation() && !correctedSituation.canLikelySkipNearGroundInterpolation()) { - const CLength distance(correctedSituation.getDistancePerTime(250)); // distnacee per ms + // fetch from cache or request + const CLength distance(correctedSituation.getDistancePerTime250ms()); // distnacee per ms const CElevationPlane ep = this->findClosestElevationWithinRangeOrRequest(correctedSituation, distance, callsign); Q_ASSERT_X(ep.isNull() || !ep.getRadius().isNull(), Q_FUNC_INFO, "null radius"); correctedSituation.setGroundElevation(ep, CAircraftSituation::FromCache); + if (!correctedSituation.hasGroundElevation()) + { + // values before updating + const CAircraftSituationList oldSituations = this->remoteAircraftSituations(callsign); + const CAircraftSituationChangeList oldChanges = this->remoteAircraftSituationChanges(callsign); + if (oldSituations.size() > 1) + { + const bool extrapolated = correctedSituation.extrapolateElevation(oldSituations[0], oldSituations[1], oldChanges.frontOrDefault()); + Q_UNUSED(extrapolated); + } + } } // do we already have ground details? diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index 7fc8d513c..159b7d4cc 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -219,12 +219,14 @@ namespace BlackMisc } // list from new to old + CAircraftSituationList updatedSituations; // copy of updated situations { const qint64 ts = QDateTime::currentMSecsSinceEpoch(); QWriteLocker lock(&m_lockSituations); m_situationsAdded++; m_situationsLastModified[cs] = ts; CAircraftSituationList &newSituationsList = m_situationsByCallsign[cs]; + newSituationsList.setAdjustedSortHint(CAircraftSituationList::AdjustedTimestampLatestFirst); const int situations = newSituationsList.size(); if (situations < 1) { @@ -232,9 +234,9 @@ namespace BlackMisc } else { - newSituationsList.front().transferGroundElevation(situationCorrected); // transfer last situation elevation if possible newSituationsList.push_frontKeepLatestFirstAdjustOffset(situationCorrected, true, IRemoteAircraftProvider::MaxSituationsPerCallsign); newSituationsList.setAdjustedSortHint(CAircraftSituationList::AdjustedTimestampLatestFirst); + newSituationsList.transferElevationForward(); // transfer elevations // unify all inbound ground information if (situation.hasInboundGroundDetails()) @@ -249,25 +251,18 @@ namespace BlackMisc BLACK_VERIFY_X(newSituationsList.isSortedAdjustedLatestFirstWithoutNullPositions(), Q_FUNC_INFO, "wrong sort order"); BLACK_VERIFY_X(newSituationsList.size() <= IRemoteAircraftProvider::MaxSituationsPerCallsign, Q_FUNC_INFO, "Wrong size"); } - } // lock - CAircraftSituationList updatedSituations; // copy of updated situations - if (situation.hasInboundGroundDetails()) - { - QReadLocker lock(&m_lockSituations); + if (!situation.hasInboundGroundDetails()) + { + // first use a version without standard deviations to guess "on ground + const CAircraftSituationChange simpleChange(updatedSituations, situationCorrected.getCG(), aircraftModel.isVtol(), true, false); + + // guess GND + newSituationsList.front().guessOnGround(simpleChange, aircraftModel); + } updatedSituations = m_situationsByCallsign[cs]; - } - else - { - // first use a version without standard deviations to guess "on ground - const CAircraftSituationChange simpleChange(updatedSituations, situationCorrected.getCG(), aircraftModel.isVtol(), true, false); - // guess GND - QWriteLocker lock(&m_lockSituations); - CAircraftSituationList &fixedSituationList = m_situationsByCallsign[cs]; - fixedSituationList.front().guessOnGround(simpleChange, aircraftModel); - updatedSituations = fixedSituationList; - } + } // lock // calculate change AFTER gnd. was guessed Q_ASSERT_X(!updatedSituations.isEmpty(), Q_FUNC_INFO, "Missing situations");