mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-30 05:51:23 +08:00
Ref T397, Ref T297 dynamic offset times
* calculate avaerage time * and use that to decide offset time
This commit is contained in:
@@ -1019,7 +1019,7 @@ namespace BlackCore
|
|||||||
CHeading(position->heading, CHeading::True, CAngleUnit::deg()),
|
CHeading(position->heading, CHeading::True, CAngleUnit::deg()),
|
||||||
CAngle(position->pitch, CAngleUnit::deg()),
|
CAngle(position->pitch, CAngleUnit::deg()),
|
||||||
CAngle(position->bank, CAngleUnit::deg()),
|
CAngle(position->bank, CAngleUnit::deg()),
|
||||||
CSpeed::null() // There is no speed information in a interim packet
|
CSpeed::null() // there is no speed information in an interim packet
|
||||||
);
|
);
|
||||||
|
|
||||||
// Ref T297, default offset time
|
// Ref T297, default offset time
|
||||||
@@ -1247,23 +1247,20 @@ namespace BlackCore
|
|||||||
const qint64 oldTs = m_lastPositionUpdate.value(callsign);
|
const qint64 oldTs = m_lastPositionUpdate.value(callsign);
|
||||||
m_lastPositionUpdate[callsign] = markerTs;
|
m_lastPositionUpdate[callsign] = markerTs;
|
||||||
|
|
||||||
// Ref T297,
|
// Ref T297, dynamic offsets
|
||||||
const qint64 diff = qAbs(markerTs - oldTs);
|
const qint64 diff = qAbs(markerTs - oldTs);
|
||||||
|
this->insertLatestOffsetTime(callsign, diff);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
static const qint64 minOffsetTime = CFsdSetup::c_interimPositionTimeOffsetMsec; // no longer needed with C++17
|
||||||
|
const qint64 avgTimeMs = this->averageOffsetTimeMs(callsign, count, 3); // latest average
|
||||||
qint64 offsetTime = CFsdSetup::c_positionTimeOffsetMsec;
|
qint64 offsetTime = CFsdSetup::c_positionTimeOffsetMsec;
|
||||||
static const qint64 thresholdMs = qRound(CFsdSetup::c_positionTimeOffsetMsec * 0.4);
|
|
||||||
if (oldTs > 0 && diff > 0)
|
if (avgTimeMs < minOffsetTime && count >= 3)
|
||||||
{
|
{
|
||||||
if (diff < CFsdSetup::c_interimPositionTimeOffsetMsec)
|
offsetTime = CFsdSetup::c_interimPositionTimeOffsetMsec;
|
||||||
{
|
|
||||||
offsetTime = CFsdSetup::c_interimPositionTimeOffsetMsec;
|
|
||||||
}
|
|
||||||
else if (diff < thresholdMs)
|
|
||||||
{
|
|
||||||
offsetTime = qRound(diff * 1.1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lastOffsetTime[callsign] = offsetTime;
|
|
||||||
return offsetTime;
|
return offsetTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1271,8 +1268,8 @@ namespace BlackCore
|
|||||||
{
|
{
|
||||||
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Need callsign");
|
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Need callsign");
|
||||||
|
|
||||||
if (!m_lastOffsetTime.contains(callsign)) { return CFsdSetup::c_positionTimeOffsetMsec; }
|
if (!m_lastOffsetTimes.contains(callsign) || m_lastOffsetTimes[callsign].isEmpty()) { return CFsdSetup::c_positionTimeOffsetMsec; }
|
||||||
return m_lastOffsetTime.value(callsign);
|
return m_lastOffsetTimes[callsign].front();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CNetworkVatlib::clearState()
|
void CNetworkVatlib::clearState()
|
||||||
@@ -1280,7 +1277,7 @@ namespace BlackCore
|
|||||||
m_textMessagesToConsolidate.clear();
|
m_textMessagesToConsolidate.clear();
|
||||||
m_pendingAtisQueries.clear();
|
m_pendingAtisQueries.clear();
|
||||||
m_lastPositionUpdate.clear();
|
m_lastPositionUpdate.clear();
|
||||||
m_lastOffsetTime.clear();
|
m_lastOffsetTimes.clear();
|
||||||
m_sentAircraftConfig = CAircraftParts::null();
|
m_sentAircraftConfig = CAircraftParts::null();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1290,7 +1287,35 @@ namespace BlackCore
|
|||||||
m_pendingAtisQueries.remove(callsign);
|
m_pendingAtisQueries.remove(callsign);
|
||||||
m_lastPositionUpdate.remove(callsign);
|
m_lastPositionUpdate.remove(callsign);
|
||||||
m_interimPositionReceivers.remove(callsign);
|
m_interimPositionReceivers.remove(callsign);
|
||||||
m_lastOffsetTime.remove(callsign);
|
m_lastOffsetTimes.remove(callsign);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNetworkVatlib::insertLatestOffsetTime(const CCallsign &callsign, qint64 offsetMs)
|
||||||
|
{
|
||||||
|
QList<qint64> &offsets = m_lastOffsetTimes[callsign];
|
||||||
|
offsets.push_front(offsetMs);
|
||||||
|
if (offsets.size() > MaxOffseTimes) { offsets.removeLast(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 CNetworkVatlib::averageOffsetTimeMs(const CCallsign &callsign, int &count, int maxLastValues) const
|
||||||
|
{
|
||||||
|
const QList<qint64> &offsets = m_lastOffsetTimes[callsign];
|
||||||
|
if (offsets.size() < 1) { return -1; }
|
||||||
|
qint64 sum = 0;
|
||||||
|
count = 0;
|
||||||
|
for (qint64 v : offsets)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
sum += v;
|
||||||
|
if (count > maxLastValues) { break; }
|
||||||
|
}
|
||||||
|
return qRound(static_cast<double>(sum) / count);
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 CNetworkVatlib::averageOffsetTimeMs(const CCallsign &callsign, int maxLastValues) const
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
return this->averageOffsetTimeMs(callsign, maxLastValues, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CNetworkVatlib::onInfoQueryRequestReceived(VatFsdClient *, const char *callsignString, VatClientQueryType type, const char *, void *cbvar)
|
void CNetworkVatlib::onInfoQueryRequestReceived(VatFsdClient *, const char *callsignString, VatClientQueryType type, const char *, void *cbvar)
|
||||||
|
|||||||
@@ -236,6 +236,15 @@ namespace BlackCore
|
|||||||
//! Clear state for callsign
|
//! Clear state for callsign
|
||||||
void clearState(const BlackMisc::Aviation::CCallsign &callsign);
|
void clearState(const BlackMisc::Aviation::CCallsign &callsign);
|
||||||
|
|
||||||
|
//! Insert as first value
|
||||||
|
void insertLatestOffsetTime(const BlackMisc::Aviation::CCallsign &callsign, qint64 offsetMs);
|
||||||
|
|
||||||
|
//! Average offset time in ms
|
||||||
|
qint64 averageOffsetTimeMs(const BlackMisc::Aviation::CCallsign &callsign, int &count, int maxLastValues = MaxOffseTimes) const;
|
||||||
|
|
||||||
|
//! Average offset time in ms
|
||||||
|
qint64 averageOffsetTimeMs(const BlackMisc::Aviation::CCallsign &callsign, int maxLastValues = MaxOffseTimes) const;
|
||||||
|
|
||||||
//! Deletion policy for QScopedPointer
|
//! Deletion policy for QScopedPointer
|
||||||
struct VatFsdClientDeleter
|
struct VatFsdClientDeleter
|
||||||
{
|
{
|
||||||
@@ -274,7 +283,9 @@ namespace BlackCore
|
|||||||
|
|
||||||
QHash<BlackMisc::Aviation::CCallsign, PendingAtisQuery> m_pendingAtisQueries;
|
QHash<BlackMisc::Aviation::CCallsign, PendingAtisQuery> m_pendingAtisQueries;
|
||||||
QHash<BlackMisc::Aviation::CCallsign, qint64> m_lastPositionUpdate;
|
QHash<BlackMisc::Aviation::CCallsign, qint64> m_lastPositionUpdate;
|
||||||
QHash<BlackMisc::Aviation::CCallsign, qint64> m_lastOffsetTime;
|
QHash<BlackMisc::Aviation::CCallsign, QList<qint64>> m_lastOffsetTimes; //!< latest offset first
|
||||||
|
|
||||||
|
static const int MaxOffseTimes = 6; //!< Max offset times kept
|
||||||
|
|
||||||
BlackMisc::CSettingReadOnly<BlackCore::Vatsim::TRawFsdMessageSetting> m_fsdMessageSetting { this, &CNetworkVatlib::fsdMessageSettingsChanged };
|
BlackMisc::CSettingReadOnly<BlackCore::Vatsim::TRawFsdMessageSetting> m_fsdMessageSetting { this, &CNetworkVatlib::fsdMessageSettingsChanged };
|
||||||
QFile m_rawFsdMessageLogFile;
|
QFile m_rawFsdMessageLogFile;
|
||||||
|
|||||||
Reference in New Issue
Block a user