From 6a5e59b76a84eeabc4a5f659933523a6803b849b Mon Sep 17 00:00:00 2001 From: Roland Rossgotterer Date: Tue, 12 Mar 2019 16:26:34 +0100 Subject: [PATCH] [FS9] Implement time synchronisation --- src/plugins/simulator/fs9/simulatorfs9.cpp | 21 +++++++++++++++++++ src/plugins/simulator/fs9/simulatorfs9.h | 3 +++ src/plugins/simulator/fscommon/fsuipc.h | 3 +++ .../simulator/fscommon/fsuipcdummy.cpp | 7 +++++++ src/plugins/simulator/fscommon/fsuipcimpl.cpp | 17 +++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index b12b29bd3..8f441b549 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -315,6 +315,7 @@ namespace BlackSimPlugin { updateOwnAircraftFromSimulator(fsuipcAircraft); } + synchronizeTime(); } } @@ -402,6 +403,26 @@ namespace BlackSimPlugin } } + void CSimulatorFs9::synchronizeTime() + { + if (!m_simTimeSynced) { return; } + if (!this->isConnected()) { return; } + if (!m_useFsuipc || !m_fsuipc) { return; } + if (!m_fsuipc->isOpened()) { return; } + + QDateTime myDateTime = QDateTime::currentDateTimeUtc(); + if (!m_syncTimeOffset.isZeroEpsilonConsidered()) + { + int offsetSeconds = m_syncTimeOffset.valueInteger(CTimeUnit::s()); + myDateTime = myDateTime.addSecs(offsetSeconds); + } + + const QTime myTime = myDateTime.time(); + const int h = myTime.hour(); + const int m = myTime.minute(); + m_fsuipc->setSimulatorTime(h, m); + } + void CSimulatorFs9::injectWeatherGrid(const Weather::CWeatherGrid &weatherGrid) { if (!m_useFsuipc || !m_fsuipc) { return; } diff --git a/src/plugins/simulator/fs9/simulatorfs9.h b/src/plugins/simulator/fs9/simulatorfs9.h index 86a8300ec..0e7535148 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.h +++ b/src/plugins/simulator/fs9/simulatorfs9.h @@ -100,6 +100,9 @@ namespace BlackSimPlugin //! Disconnect all clients void disconnectAllClients(); + //! Sync time with user's computer + void synchronizeTime(); + QHash> m_hashFs9Clients; QMetaObject::Connection m_connectionHostMessages; bool m_simConnected = false; //!< Is simulator connected? diff --git a/src/plugins/simulator/fscommon/fsuipc.h b/src/plugins/simulator/fscommon/fsuipc.h index c80a23df2..4a75bf352 100644 --- a/src/plugins/simulator/fscommon/fsuipc.h +++ b/src/plugins/simulator/fscommon/fsuipc.h @@ -53,6 +53,9 @@ namespace BlackSimPlugin //! Write weather grid to simulator bool write(const BlackMisc::Weather::CWeatherGrid &weatherGrid); + //! Set simulator time + bool setSimulatorTime(int hour, int minute); + //! Get the version QString getVersion() const; diff --git a/src/plugins/simulator/fscommon/fsuipcdummy.cpp b/src/plugins/simulator/fscommon/fsuipcdummy.cpp index 84990cbd2..7429e4fc3 100644 --- a/src/plugins/simulator/fscommon/fsuipcdummy.cpp +++ b/src/plugins/simulator/fscommon/fsuipcdummy.cpp @@ -66,6 +66,13 @@ namespace BlackSimPlugin return false; } + bool CFsuipc::setSimulatorTime(int hour, int minute) + { + Q_UNUSED(hour); + Q_UNUSED(minute); + return false; + } + QString CFsuipc::getVersion() const { return QStringLiteral("N/A"); diff --git a/src/plugins/simulator/fscommon/fsuipcimpl.cpp b/src/plugins/simulator/fscommon/fsuipcimpl.cpp index 726445e8f..24138bd63 100644 --- a/src/plugins/simulator/fscommon/fsuipcimpl.cpp +++ b/src/plugins/simulator/fscommon/fsuipcimpl.cpp @@ -330,6 +330,23 @@ namespace BlackSimPlugin return true; } + bool CFsuipc::setSimulatorTime(int hour, int minute) + { + Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "Open not threadsafe"); + if (!this->isOpened()) { return false; } + + // should be the same as writing via SimConnect data area + DWORD dwResult; + quint8 hourRaw = hour; + quint8 minuteRaw = minute; + + const bool ok = + FSUIPC_Write(0x023b, 1, &hourRaw, &dwResult) && + FSUIPC_Write(0x023c, 1, &minuteRaw, &dwResult); + if (ok) { FSUIPC_Process(&dwResult); } + return ok && dwResult == 0; + } + QString CFsuipc::getVersion() const { return m_fsuipcVersion;