From 45a5ce5a6a2c3ef385a8dcb7c16eb507166c1825 Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sat, 27 Nov 2021 14:49:29 +0100 Subject: [PATCH] Issue #131 Sync date when time-sync is enabled for FSX/P3D --- .../fsxcommon/simconnectdatadefinition.cpp | 4 ++- .../fsxcommon/simconnectdatadefinition.h | 6 ++-- .../fsxcommon/simulatorfsxcommon.cpp | 31 +++++++++---------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index 50bbf393c..0fb0b9353 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -229,7 +229,9 @@ namespace BlackSimPlugin::FsxCommon { HRESULT hr = s_ok(); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataSimEnvironment, "ZULU TIME", "", SIMCONNECT_DATATYPE_INT32); - hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataSimEnvironment, "LOCAL TIME", "", SIMCONNECT_DATATYPE_INT32); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataSimEnvironment, "ZULU YEAR", "", SIMCONNECT_DATATYPE_INT32); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataSimEnvironment, "ZULU MONTH OF YEAR", "", SIMCONNECT_DATATYPE_INT32); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataSimEnvironment, "ZULU DAY OF MONTH", "", SIMCONNECT_DATATYPE_INT32); if (isFailure(hr)) { CLogMessage(static_cast(nullptr)).error(u"SimConnect error: initSimulatorEnvironment %1") << hr; diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index e0091ccce..f595eea4a 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -191,8 +191,10 @@ namespace BlackSimPlugin::FsxCommon //! Data struct simulator environment struct DataDefinitionSimEnvironment { - qint32 zuluTimeSeconds; //!< Simulator zulu (GMT) ime in secs. - qint32 localTimeSeconds; //!< Simulator local time in secs. + qint32 zuluTimeSeconds; //!< Simulator zulu (GMT) time in secs. + qint32 zuluYear; //!< Simulator zulu (GMT) year. + qint32 zuluMonth; //!< Simulator zulu (GMT) month. + qint32 zuluDayOfMonth; //!< Simulator zulu (GMT) day of the month. }; //! The whole SB data area diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 7bb54a6ef..8377a9daf 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -2350,41 +2350,40 @@ namespace BlackSimPlugin::FsxCommon const int zh = simEnv->zuluTimeSeconds / 3600; const int zm = (simEnv->zuluTimeSeconds - (zh * 3600)) / 60; - const CTime zuluTimeSim(zh, zm); - // const int lh = simEnv->localTimeSeconds / 3600; - // const int lm = (simEnv->localTimeSeconds - (lh * 3600)) / 60; - // const CTime localTimeSim(lh, lm); - // Q_UNUSED(localTimeSim); + const QDateTime simDateTime({ simEnv->zuluYear, simEnv->zuluMonth, simEnv->zuluDayOfMonth }, { zh, zm }, Qt::UTC); - QDateTime myDateTime = QDateTime::currentDateTimeUtc(); + QDateTime currentDateTime = QDateTime::currentDateTimeUtc(); if (!m_syncTimeOffset.isZeroEpsilonConsidered()) { int offsetSeconds = m_syncTimeOffset.valueInteger(CTimeUnit::s()); - myDateTime = myDateTime.addSecs(offsetSeconds); + currentDateTime = currentDateTime.addSecs(offsetSeconds); } - const QTime myTime = myDateTime.time(); - const DWORD h = static_cast(myTime.hour()); - const DWORD m = static_cast(myTime.minute()); - const int targetMins = myTime.hour() * 60 + myTime.minute(); - const int simMins = zuluTimeSim.valueInteger(CTimeUnit::min()); - const int diffMins = qAbs(targetMins - simMins); - if (diffMins < 2) + + if (qAbs(simDateTime.secsTo(currentDateTime)) < 120) { // checked and no relevant difference m_syncTimeDeferredCounter = 10; // wait some time to check again return; } + + const DWORD h = static_cast(currentDateTime.time().hour()); + const DWORD m = static_cast(currentDateTime.time().minute()); + const DWORD y = static_cast(currentDateTime.date().year()); + const DWORD d = static_cast(currentDateTime.date().dayOfYear()); + const HRESULT hr1 = SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluHours, h, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); const HRESULT hr2 = SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluMinutes, m, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + const HRESULT hr3 = SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluYear, y, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + const HRESULT hr4 = SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluDay, d, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); - if (isFailure(hr1, hr2)) + if (isFailure(hr1, hr2, hr3, hr4)) { CLogMessage(this).warning(u"Sending time sync failed!"); } else { m_syncTimeDeferredCounter = 5; // allow some time to sync - CLogMessage(this).info(u"Synchronized time to UTC: '%1'") << myTime.toString(); + CLogMessage(this).info(u"Synchronized time to '%1' UTC") << currentDateTime.toString(); } }