diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index cf1991e49..346161338 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -50,6 +50,9 @@ namespace BlackCore //! \brief Connect to simulator virtual bool connectTo() = 0; + //! Connect asynchron to simulator + virtual void asyncConnectTo() = 0; + //! \brief Disconnect from simulator virtual bool disconnectFrom() = 0; diff --git a/src/plugins/simulator/fsx/plugin_fsx.pro b/src/plugins/simulator/fsx/plugin_fsx.pro index e532e327a..64e0562e2 100644 --- a/src/plugins/simulator/fsx/plugin_fsx.pro +++ b/src/plugins/simulator/fsx/plugin_fsx.pro @@ -1,7 +1,7 @@ include (../../../../config.pri) include (../../../../build.pri) -QT += core dbus gui network +QT += core dbus gui network concurrent TARGET = simulator_fsx TEMPLATE = lib diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 34826d100..4380e97b6 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -9,6 +9,7 @@ #include "blacksim/fsx/fsxsimulatorsetup.h" #include "blacksim/simulatorinfo.h" #include +#include using namespace BlackMisc::Aviation; using namespace BlackMisc::PhysicalQuantities; @@ -73,6 +74,21 @@ namespace BlackSimPlugin return true; } + void CSimulatorFsx::asyncConnectTo() + { + connect(&m_watcherConnect, SIGNAL(finished()), this, SLOT(connectToFinished())); + + auto asyncConnectFunc = [&]() -> bool + { + if (FAILED(SimConnect_Open(&m_hSimConnect, "BlackBox", nullptr, 0, 0, 0))) return false; + + return true; + }; + QFuture result = QtConcurrent::run( asyncConnectFunc ); + + m_watcherConnect.setFuture(result); + } + bool CSimulatorFsx::disconnectFrom() { if (!m_isConnected) @@ -327,6 +343,22 @@ namespace BlackSimPlugin SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this); } + void CSimulatorFsx::connectToFinished() + { + if( m_watcherConnect.result() ) + { + initSystemEvents(); + initDataDefinitions(); + m_simconnectTimerId = startTimer(50); + m_isConnected = true; + + emit statusChanged(Connected); + } + else + emit statusChanged(ConnectionFailed); + + } + HRESULT CSimulatorFsx::initSystemEvents() { HRESULT hr = S_OK; diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 31cf71c47..d857f7d98 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -15,6 +15,7 @@ #include #include #include +#include #ifndef NOMINMAX #define NOMINMAX @@ -82,6 +83,9 @@ namespace BlackSimPlugin //! \copydoc ISimulator::connectTo() virtual bool connectTo() override; + //! \copydoc ISimulator::asyncConnectTo() + virtual void asyncConnectTo() override; + //! \copydoc ISimulator::disconnectFrom() virtual bool disconnectFrom() override; @@ -134,6 +138,9 @@ namespace BlackSimPlugin //! \brief Dispatch SimConnect messages void dispatch(); + //! \brief Called when asynchronous connection to Simconnect has finished + void connectToFinished(); + private: struct SimConnectObject @@ -167,6 +174,8 @@ namespace BlackSimPlugin QHash m_simConnectObjects; int m_simconnectTimerId; + + QFutureWatcher m_watcherConnect; }; }