Interpolate the dynamic offset time for aircraft situations

This commit is contained in:
Mat Sutcliffe
2022-01-13 19:25:31 +00:00
parent 6d66066d6a
commit efb6a3211d
2 changed files with 17 additions and 2 deletions

View File

@@ -1758,6 +1758,7 @@ namespace BlackCore::Fsd
qint64 CFSDClient::receivedPositionFixTsAndGetOffsetTime(const CCallsign &callsign, qint64 markerTs)
{
// \fixme This logic should be in a different class
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Need callsign");
if (markerTs < 0) { markerTs = QDateTime::currentMSecsSinceEpoch(); }
@@ -1775,13 +1776,25 @@ namespace BlackCore::Fsd
int count = 0;
const qint64 avgTimeMs = this->averageOffsetTimeMs(callsign, count, 3); // latest average
qint64 offsetTime = CFsdSetup::c_positionTimeOffsetMsec;
qint64 targetOffsetTime = CFsdSetup::c_positionTimeOffsetMsec;
if (avgTimeMs < CFsdSetup::c_minimumPositionTimeOffsetMsec && count >= 3)
{
offsetTime = CFsdSetup::c_minimumPositionTimeOffsetMsec;
targetOffsetTime = CFsdSetup::c_minimumPositionTimeOffsetMsec;
}
const qint64 previousInterpolatedOffsetTime = m_interpolatedOffsetTime.value(callsign, 0);
qint64 offsetDiff = 0;
if (targetOffsetTime < previousInterpolatedOffsetTime)
{
offsetDiff = std::max(targetOffsetTime - previousInterpolatedOffsetTime, diff / -c_offsetTimeInterpolationInverseRate);
}
else
{
offsetDiff = std::min(targetOffsetTime - previousInterpolatedOffsetTime, diff / c_offsetTimeInterpolationInverseRate);
}
qint64 offsetTime = previousInterpolatedOffsetTime + offsetDiff;
m_interpolatedOffsetTime.insert(callsign, offsetTime);
return m_additionalOffsetTime + offsetTime;
}

View File

@@ -500,6 +500,8 @@ namespace BlackCore::Fsd
QHash<BlackMisc::Aviation::CCallsign, PendingAtisQuery> m_pendingAtisQueries;
QHash<BlackMisc::Aviation::CCallsign, qint64> m_lastPositionUpdate;
QHash<BlackMisc::Aviation::CCallsign, QList<qint64>> m_lastOffsetTimes; //!< latest offset first
QHash<BlackMisc::Aviation::CCallsign, qint64> m_interpolatedOffsetTime;
static const int c_offsetTimeInterpolationInverseRate = 4;
BlackMisc::CSettingReadOnly<BlackCore::Vatsim::TRawFsdMessageSetting> m_fsdMessageSetting { this, &CFSDClient::fsdMessageSettingsChanged };
QFile m_rawFsdMessageLogFile;