Ref T275, use extrapolate for new situations in airspace monitor and provider

This commit is contained in:
Klaus Basan
2018-06-17 00:38:39 +02:00
parent c24e1d9c16
commit 746024becd
2 changed files with 25 additions and 18 deletions

View File

@@ -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?

View File

@@ -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");