mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 11:05:44 +08:00
Ref T275, use extrapolate for new situations in airspace monitor and provider
This commit is contained in:
@@ -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?
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user