From 5f4f6806da412a519798cd82217ffe6866af9d32 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 11 Jul 2014 00:37:56 +0200 Subject: [PATCH] refs #289, added functionality in FSX plugin * data definitions * events * improved error handling: HRESULT values, exception output * sync time method --- .../fsx/simconnect_datadefinition.cpp | 63 ++++++++----- .../simulator/fsx/simconnect_datadefinition.h | 19 +++- src/plugins/simulator/fsx/simulator_fsx.cpp | 88 +++++++++++++++---- src/plugins/simulator/fsx/simulator_fsx.h | 37 +++++--- .../fsx/simulator_fsx_simconnectproc.cpp | 67 ++++++++++---- 5 files changed, 201 insertions(+), 73 deletions(-) diff --git a/src/plugins/simulator/fsx/simconnect_datadefinition.cpp b/src/plugins/simulator/fsx/simconnect_datadefinition.cpp index 2f2fe04a1..08bc389f1 100644 --- a/src/plugins/simulator/fsx/simconnect_datadefinition.cpp +++ b/src/plugins/simulator/fsx/simconnect_datadefinition.cpp @@ -10,50 +10,69 @@ namespace BlackSimPlugin namespace Fsx { - CSimConnectDataDefinition::CSimConnectDataDefinition() - { - } + CSimConnectDataDefinition::CSimConnectDataDefinition() { } HRESULT CSimConnectDataDefinition::initDataDefinitions(const HANDLE hSimConnect) { HRESULT hr = S_OK; - hr = initOwnAircraft(hSimConnect); - hr = initRemoteAircraftSituation(hSimConnect); - hr = initGearHandlePosition(hSimConnect); + hr += initOwnAircraft(hSimConnect); + hr += initRemoteAircraftSituation(hSimConnect); + hr += initGearHandlePosition(hSimConnect); + hr += initSimulatorEnvironment(hSimConnect); return hr; } HRESULT CSimConnectDataDefinition::initOwnAircraft(const HANDLE hSimConnect) { HRESULT hr = S_OK; - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Latitude", "Degrees"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Longitude", "Degrees"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Altitude", "Feet"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Heading Degrees True", "Degrees"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Pitch Degrees", "Degrees"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Bank Degrees", "Degrees"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "GROUND VELOCITY", "knots"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "SIM ON GROUND", "bool"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "TRANSPONDER CODE:1", NULL); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM ACTIVE FREQUENCY:1", "MHz"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM ACTIVE FREQUENCY:2", "MHz"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM STANDBY FREQUENCY:1", "MHz"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM STANDBY FREQUENCY:2", "MHz"); - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraftTitle, "TITLE", NULL, SIMCONNECT_DATATYPE_STRING256); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Latitude", "Degrees"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Longitude", "Degrees"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Altitude", "Feet"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Heading Degrees True", "Degrees"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Pitch Degrees", "Degrees"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Bank Degrees", "Degrees"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "GROUND VELOCITY", "knots"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "SIM ON GROUND", "bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "TRANSPONDER CODE:1", NULL); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM ACTIVE FREQUENCY:1", "MHz"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM ACTIVE FREQUENCY:2", "MHz"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM STANDBY FREQUENCY:1", "MHz"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM STANDBY FREQUENCY:2", "MHz"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraftTitle, "TITLE", NULL, SIMCONNECT_DATATYPE_STRING256); + if (hr != S_OK) { + qFatal("initOwnAircraft"); + } return hr; } HRESULT CSimConnectDataDefinition::initRemoteAircraftSituation(const HANDLE hSimConnect) { HRESULT hr = S_OK; - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataDefinitionRemoteAircraftSituation, "Initial Position", "", SIMCONNECT_DATATYPE_INITPOSITION); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataRemoteAircraftSituation, "Initial Position", "", SIMCONNECT_DATATYPE_INITPOSITION); + if (hr != S_OK) { + qFatal("initRemoteAircraftSituation"); + } return hr; } HRESULT CSimConnectDataDefinition::initGearHandlePosition(const HANDLE hSimConnect) { HRESULT hr = S_OK; - hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataDefinitionGearHandlePosition, "GEAR HANDLE POSITION", "BOOL", SIMCONNECT_DATATYPE_INT32); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataGearHandlePosition, "GEAR HANDLE POSITION", "BOOL", SIMCONNECT_DATATYPE_INT32); + if (hr != S_OK) { + qFatal("initGearHandlePosition"); + } + return hr; + } + + HRESULT CSimConnectDataDefinition::initSimulatorEnvironment(const HANDLE hSimConnect) + { + HRESULT hr = S_OK; + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataSimEnvironment, "ZULU TIME", "", SIMCONNECT_DATATYPE_INT32); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataSimEnvironment, "LOCAL TIME", "", SIMCONNECT_DATATYPE_INT32); + if (hr != S_OK) { + qFatal("initSimulatorEnvironment"); + } return hr; } } diff --git a/src/plugins/simulator/fsx/simconnect_datadefinition.h b/src/plugins/simulator/fsx/simconnect_datadefinition.h index bb647034c..cab1aeb85 100644 --- a/src/plugins/simulator/fsx/simconnect_datadefinition.h +++ b/src/plugins/simulator/fsx/simconnect_datadefinition.h @@ -56,6 +56,12 @@ namespace BlackSimPlugin qint32 gearHandlePosition; //!< Bool, 1 if gear handle is applied otherwise 0 }; + //! Data struct simulator environment + struct DataDefinitionSimEnvironment { + qint32 zuluTimeSeconds; //!< Simulator zulu (GMT) ime in secs. + qint32 localTimeSeconds; //!< Simulator local time in secs. + }; + //! Handles SimConnect data definitions class CSimConnectDataDefinition { @@ -66,8 +72,9 @@ namespace BlackSimPlugin { DataOwnAircraft, DataOwnAircraftTitle, - DataDefinitionRemoteAircraftSituation, - DataDefinitionGearHandlePosition + DataRemoteAircraftSituation, + DataGearHandlePosition, + DataSimEnvironment }; //! SimConnect request IDs @@ -75,7 +82,8 @@ namespace BlackSimPlugin { RequestOwnAircraft, RequestRemoveAircraft, - RequestOwnAircraftTitle + RequestOwnAircraftTitle, + RequestSimEnvironment }; //! Constructor @@ -84,6 +92,8 @@ namespace BlackSimPlugin //! Initialize all data definitions static HRESULT initDataDefinitions(const HANDLE hSimConnect); + private: + //! Initialize data definition for our own aircraft static HRESULT initOwnAircraft(const HANDLE hSimConnect); @@ -92,6 +102,9 @@ namespace BlackSimPlugin //! Initialize data definition for remote aircraft configuration static HRESULT initGearHandlePosition(const HANDLE hSimConnect); + + //! Initialize data definition for Simulator environment + static HRESULT initSimulatorEnvironment(const HANDLE hSimConnect); }; } } diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 7680ad2d9..fae1e6676 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -42,6 +42,7 @@ namespace BlackSimPlugin ISimulator(parent), m_isConnected(false), m_simRunning(false), + m_syncTime(false), m_hSimConnect(nullptr), m_nextObjID(1), m_simulatorInfo(CSimulatorInfo::FSX()), @@ -50,7 +51,7 @@ namespace BlackSimPlugin m_fsuipc(new CFsuipc()) { CFsxSimulatorSetup setup; - setup.init(); // this fetches important setting on local side + setup.init(); // this fetches important settings on local side this->m_simulatorInfo.setSimulatorSetup(setup.getSettings()); } @@ -69,7 +70,6 @@ namespace BlackSimPlugin return m_fsuipc->isConnected(); } - bool CSimulatorFsx::connectTo() { if (m_isConnected) return true; @@ -95,7 +95,7 @@ namespace BlackSimPlugin void CSimulatorFsx::asyncConnectTo() { - connect(&m_watcherConnect, SIGNAL(finished()), this, SLOT(connectToFinished())); + connect(&m_watcherConnect, SIGNAL(finished()), this, SLOT(ps_connectToFinished())); // simplified connect, timers and signals not in different thread auto asyncConnectFunc = [&]() -> bool @@ -286,8 +286,8 @@ namespace BlackSimPlugin void CSimulatorFsx::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) { - Q_UNUSED(enable); - Q_UNUSED(offset); + this->m_syncTime = enable; + this->m_syncTimeOffset = offset; } void CSimulatorFsx::onSimRunning() @@ -298,12 +298,16 @@ namespace BlackSimPlugin CSimConnectDataDefinition::DataOwnAircraft, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME); - SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::RequestOwnAircraftTitle, CSimConnectDataDefinition::DataOwnAircraftTitle, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED); + SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::RequestSimEnvironment, + CSimConnectDataDefinition::DataSimEnvironment, + SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, + SIMCONNECT_DATA_REQUEST_FLAG_CHANGED); + emit simulatorStarted(); } @@ -316,7 +320,7 @@ namespace BlackSimPlugin void CSimulatorFsx::onSimFrame() { - update(); + updateOtherAircrafts(); } void CSimulatorFsx::onSimExit() @@ -384,21 +388,21 @@ namespace BlackSimPlugin DataDefinitionGearHandlePosition gearHandle; gearHandle.gearHandlePosition = 1; - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataDefinitionGearHandlePosition, objectID, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(gearHandle), &gearHandle); + SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataGearHandlePosition, objectID, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(gearHandle), &gearHandle); } void CSimulatorFsx::timerEvent(QTimerEvent * /* event */) { - dispatch(); + ps_dispatch(); } - void CSimulatorFsx::dispatch() + void CSimulatorFsx::ps_dispatch() { SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this); if (this->m_fsuipc) this->m_fsuipc->process(); } - void CSimulatorFsx::connectToFinished() + void CSimulatorFsx::ps_connectToFinished() { if (m_watcherConnect.result()) { @@ -427,6 +431,10 @@ namespace BlackSimPlugin hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectAdded, "ObjectAdded"); hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectRemoved, "ObjectRemoved"); hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventFrame, "Frame"); + if (hr != S_OK) + { + qFatal("SimConnect_SubscribeToSystemEvent failed"); + } // Mapped events hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventFreezeLat, "FREEZE_LATITUDE_LONGITUDE_SET"); @@ -438,8 +446,21 @@ namespace BlackSimPlugin hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetCom2Standby, "COM2_STBY_RADIO_SET"); hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTransponderCode, "XPNDR_SET"); + hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluYear, "ZULU_YEAR_SET"); + hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluDay, "ZULU_DAY_SET"); + hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluHours, "ZULU_HOURS_SET"); + hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluMinutes, "ZULU_MINUTES_SET"); + if (hr != S_OK) + { + qFatal("SimConnect_MapClientEventToSimEvent failed"); + } + // facility - hr = SimConnect_SubscribeToFacilities(m_hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT, m_nextObjID++); + hr += SimConnect_SubscribeToFacilities(m_hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT, m_nextObjID++); + if (hr != S_OK) + { + qFatal("SimConnect_SubscribeToFacilities failed"); + } return hr; } @@ -448,7 +469,7 @@ namespace BlackSimPlugin return CSimConnectDataDefinition::initDataDefinitions(m_hSimConnect); } - void CSimulatorFsx::update() + void CSimulatorFsx::updateOtherAircrafts() { foreach(CSimConnectObject simObj, m_simConnectObjects) { @@ -481,13 +502,50 @@ namespace BlackSimPlugin if (simObj.getObjectId() != 0) { - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataDefinitionRemoteAircraftSituation, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(ddAircraftSituation), &ddAircraftSituation); + SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataRemoteAircraftSituation, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(ddAircraftSituation), &ddAircraftSituation); // With the following SimConnect call all aircrafts loose their red tag. No idea why though. - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataDefinitionGearHandlePosition, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionGearHandlePosition), &gearHandle); + SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataGearHandlePosition, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionGearHandlePosition), &gearHandle); } } } } + + void CSimulatorFsx::synchronizeTime(const CTime &zuluTimeSim, const CTime &localTimeSim) + { + if (!this->m_syncTime) return; + if (!this->isConnected()) return; + if (m_syncDeferredCounter > 0) + { + --m_syncDeferredCounter; + } + Q_UNUSED(localTimeSim); + + QDateTime myDateTime = QDateTime::currentDateTimeUtc(); + if (!this->m_syncTimeOffset.isZeroEpsilonConsidered()) + { + int offsetSeconds = this->m_syncTimeOffset.valueRounded(CTimeUnit::s(), 0); + myDateTime = myDateTime.addSecs(offsetSeconds); + } + QTime myTime = myDateTime.time(); + DWORD h = myTime.hour(); + DWORD m = myTime.minute(); + int targetMins = myTime.hour() * 60 + myTime.minute(); + int simMins = zuluTimeSim.valueRounded(CTimeUnit::min()); + int diffMins = qAbs(targetMins - simMins); + if (diffMins < 2) return; + HRESULT hr = S_OK; + hr += SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluHours, h, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + hr += SimConnect_TransmitClientEvent(m_hSimConnect, 0, EventSetTimeZuluMinutes, m, SIMCONNECT_GROUP_PRIORITY_STANDARD, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + + if (hr != S_OK) + { + qWarning() << "Sending time sync failed!"; + } + + m_syncDeferredCounter = 5; // allow some time to sync + QString msg = QString("Synchronized time to UTC: %1").arg(myTime.toString()); + this->sendStatusMessage(CStatusMessage::getInfoMessage(msg, CStatusMessage::TypeSimulator)); + } } } diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 4abbaf3ce..ea5349e07 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -64,7 +64,11 @@ namespace BlackSimPlugin EventSetCom1Standby, EventSetCom2Standby, EventSetTransponderCode, - EventTextMessage + EventTextMessage, + EventSetTimeZuluYear, + EventSetTimeZuluDay, + EventSetTimeZuluHours, + EventSetTimeZuluMinutes }; //! FSX Simulator Implementation @@ -121,8 +125,6 @@ namespace BlackSimPlugin //! \copydoc ISimulator::displayStatusMessage virtual void displayStatusMessage(const BlackMisc::CStatusMessage &message) const override; - //! \brief Called when simulat has been started - //! \copydoc ISimulator::getAircraftModel() virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override { return m_aircraftModel; } @@ -141,20 +143,20 @@ namespace BlackSimPlugin //! \copydoc ISimulator::isSimPaused virtual bool isSimPaused() const override { return m_simPaused; } - //! \brief Called when sim has started + //! Called when sim has started void onSimRunning(); - //! \brief Called when sim has stopped + //! Called when sim has stopped void onSimStopped(); - //! \brief Slot called every visual frame + //! Slot called every visual frame void onSimFrame(); //! Called when data about our own aircraft are received void updateOwnAircraftFromSim(DataDefinitionOwnAircraft simulatorOwnAircraft); /*! - * \brief Set ID of a SimConnect object + * Set ID of a SimConnect object * \param requestID * \param objectID */ @@ -173,10 +175,10 @@ namespace BlackSimPlugin private slots: //! Dispatch SimConnect messages - void dispatch(); + void ps_dispatch(); //! Called when asynchronous connection to Simconnect has finished - void connectToFinished(); + void ps_connectToFinished(); private: @@ -189,14 +191,21 @@ namespace BlackSimPlugin //! Initialize SimConnect data definitions HRESULT initDataDefinitions(); - //! Update what? - void update(); // TODO: @RW, please rename, update is meaningless: what is updated? + //! Update other aircrafts + void updateOtherAircrafts(); + + //! Sync time with user's computer + void synchronizeTime(const BlackMisc::PhysicalQuantities::CTime &zuluTimeSim, const BlackMisc::PhysicalQuantities::CTime &localTimeSim); static const int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again - bool m_isConnected; //!< Is simulator connected? - bool m_simRunning; //!< Simulator running? + bool m_isConnected = false; //!< Is simulator connected? + bool m_simRunning = false; //!< Simulator running? + bool m_simPaused = false; //!< Simulator paused? + bool m_syncTime = false; //!< Time synchronized? + int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time + BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; HANDLE m_hSimConnect; //!< Handle to SimConnect object - uint m_nextObjID; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities + uint m_nextObjID; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities QString simulatorDetails; BlackSim::CSimulatorInfo m_simulatorInfo; BlackMisc::Aviation::CAircraft m_ownAircraft; //!< Object representing our own aircraft from simulator diff --git a/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp b/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp index d43c4b8e4..d299d9d00 100644 --- a/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp @@ -25,7 +25,7 @@ namespace BlackSimPlugin { namespace Fsx { - void CALLBACK CSimulatorFsx::SimConnectProc(SIMCONNECT_RECV *pData, DWORD /* cbData */, void *pContext) + void CALLBACK CSimulatorFsx::SimConnectProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext) { CSimulatorFsx *simulatorFsx = static_cast(pContext); switch (pData->dwID) @@ -42,8 +42,11 @@ namespace BlackSimPlugin } case SIMCONNECT_RECV_ID_EXCEPTION: { - SIMCONNECT_RECV_EXCEPTION *event = (SIMCONNECT_RECV_EXCEPTION *)pData; - qDebug() << "Caught simConnect exception: " << CSimConnectUtilities::simConnectExceptionToString((SIMCONNECT_EXCEPTION)event->dwException); + SIMCONNECT_RECV_EXCEPTION *exception = (SIMCONNECT_RECV_EXCEPTION *)pData; + QString ex; + ex.sprintf("Exception=%d SendID=%d Index=%d cbData=%d", exception->dwException, exception->dwSendID, exception->dwIndex, cbData); + qDebug() << "Caught simConnect exception: " << CSimConnectUtilities::simConnectExceptionToString((SIMCONNECT_EXCEPTION)exception->dwException); + qDebug() << ex; break; } case SIMCONNECT_RECV_ID_QUIT: @@ -58,15 +61,18 @@ namespace BlackSimPlugin switch (event->uEventID) { case EventSimStatus: - if (event->dwData) { - simulatorFsx->onSimRunning(); + if (event->dwData) + { + simulatorFsx->onSimRunning(); + } + else + { + simulatorFsx->onSimStopped(); + } + break; } - else - { - simulatorFsx->onSimStopped(); - } - break; + } break; } @@ -89,6 +95,8 @@ namespace BlackSimPlugin case EventFrame: simulatorFsx->onSimFrame(); break; + default: + break; } break; } @@ -104,15 +112,34 @@ namespace BlackSimPlugin switch (pObjData->dwRequestID) { case CSimConnectDataDefinition::RequestOwnAircraft: - DataDefinitionOwnAircraft *ownAircaft; - ownAircaft = (DataDefinitionOwnAircraft *)&pObjData->dwData; - simulatorFsx->updateOwnAircraftFromSim(*ownAircaft); - break; + { + DataDefinitionOwnAircraft *ownAircaft; + ownAircaft = (DataDefinitionOwnAircraft *)&pObjData->dwData; + simulatorFsx->updateOwnAircraftFromSim(*ownAircaft); + break; + } case CSimConnectDataDefinition::RequestOwnAircraftTitle: - DataDefinitionOwnAircraftModel *dataDefinitionModel = (DataDefinitionOwnAircraftModel *) &pObjData->dwData; - CAircraftModel model; - model.setQueriedModelString(dataDefinitionModel->title); - simulatorFsx->setAircraftModel(model); + { + DataDefinitionOwnAircraftModel *dataDefinitionModel = (DataDefinitionOwnAircraftModel *) &pObjData->dwData; + CAircraftModel model; + model.setQueriedModelString(dataDefinitionModel->title); + simulatorFsx->setAircraftModel(model); + break; + } + case CSimConnectDataDefinition::RequestSimEnvironment: + { + DataDefinitionSimEnvironment *simEnv = (DataDefinitionSimEnvironment *) &pObjData->dwData; + qint32 zh = simEnv->zuluTimeSeconds / 3600; + qint32 zm = (simEnv->zuluTimeSeconds - (zh * 3600)) / 60; + CTime zulu(zh, zm); + qint32 lh = simEnv->localTimeSeconds / 3600; + qint32 lm = (simEnv->localTimeSeconds - (lh * 3600)) / 60; + CTime local(lh, lm); + simulatorFsx->synchronizeTime(zulu, local); + break; + } + default: + break; } break; } @@ -140,7 +167,9 @@ namespace BlackSimPlugin } break; } - } // switch + default: + break; + } // main switch } // method } }