diff --git a/src/blackcore/fsd/fsdclient.cpp b/src/blackcore/fsd/fsdclient.cpp index 4d7f366f5..8941b27ab 100644 --- a/src/blackcore/fsd/fsdclient.cpp +++ b/src/blackcore/fsd/fsdclient.cpp @@ -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; } diff --git a/src/blackcore/fsd/fsdclient.h b/src/blackcore/fsd/fsdclient.h index 3522d59d0..85ff81de8 100644 --- a/src/blackcore/fsd/fsdclient.h +++ b/src/blackcore/fsd/fsdclient.h @@ -500,6 +500,8 @@ namespace BlackCore::Fsd QHash m_pendingAtisQueries; QHash m_lastPositionUpdate; QHash> m_lastOffsetTimes; //!< latest offset first + QHash m_interpolatedOffsetTime; + static const int c_offsetTimeInterpolationInverseRate = 4; BlackMisc::CSettingReadOnly m_fsdMessageSetting { this, &CFSDClient::fsdMessageSettingsChanged }; QFile m_rawFsdMessageLogFile;