refs #289, added functionality in FSX plugin

* data definitions
* events
* improved error handling: HRESULT values, exception output
* sync time method
This commit is contained in:
Klaus Basan
2014-07-11 00:37:56 +02:00
parent 851bb70a68
commit 5f4f6806da
5 changed files with 201 additions and 73 deletions

View File

@@ -10,50 +10,69 @@ namespace BlackSimPlugin
namespace Fsx namespace Fsx
{ {
CSimConnectDataDefinition::CSimConnectDataDefinition() CSimConnectDataDefinition::CSimConnectDataDefinition() { }
{
}
HRESULT CSimConnectDataDefinition::initDataDefinitions(const HANDLE hSimConnect) HRESULT CSimConnectDataDefinition::initDataDefinitions(const HANDLE hSimConnect)
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
hr = initOwnAircraft(hSimConnect); hr += initOwnAircraft(hSimConnect);
hr = initRemoteAircraftSituation(hSimConnect); hr += initRemoteAircraftSituation(hSimConnect);
hr = initGearHandlePosition(hSimConnect); hr += initGearHandlePosition(hSimConnect);
hr += initSimulatorEnvironment(hSimConnect);
return hr; return hr;
} }
HRESULT CSimConnectDataDefinition::initOwnAircraft(const HANDLE hSimConnect) HRESULT CSimConnectDataDefinition::initOwnAircraft(const HANDLE hSimConnect)
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Latitude", "Degrees"); 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 Longitude", "Degrees");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Altitude", "Feet"); 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 Heading Degrees True", "Degrees");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "Plane Pitch Degrees", "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, "Plane Bank Degrees", "Degrees");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "GROUND VELOCITY", "knots"); 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, "SIM ON GROUND", "bool");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "TRANSPONDER CODE:1", NULL); 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:1", "MHz");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM ACTIVE FREQUENCY:2", "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:1", "MHz");
hr = SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDataDefinition::DataOwnAircraft, "COM STANDBY FREQUENCY:2", "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::DataOwnAircraftTitle, "TITLE", NULL, SIMCONNECT_DATATYPE_STRING256);
if (hr != S_OK) {
qFatal("initOwnAircraft");
}
return hr; return hr;
} }
HRESULT CSimConnectDataDefinition::initRemoteAircraftSituation(const HANDLE hSimConnect) HRESULT CSimConnectDataDefinition::initRemoteAircraftSituation(const HANDLE hSimConnect)
{ {
HRESULT hr = S_OK; 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; return hr;
} }
HRESULT CSimConnectDataDefinition::initGearHandlePosition(const HANDLE hSimConnect) HRESULT CSimConnectDataDefinition::initGearHandlePosition(const HANDLE hSimConnect)
{ {
HRESULT hr = S_OK; 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; return hr;
} }
} }

View File

@@ -56,6 +56,12 @@ namespace BlackSimPlugin
qint32 gearHandlePosition; //!< Bool, 1 if gear handle is applied otherwise 0 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 //! Handles SimConnect data definitions
class CSimConnectDataDefinition class CSimConnectDataDefinition
{ {
@@ -66,8 +72,9 @@ namespace BlackSimPlugin
{ {
DataOwnAircraft, DataOwnAircraft,
DataOwnAircraftTitle, DataOwnAircraftTitle,
DataDefinitionRemoteAircraftSituation, DataRemoteAircraftSituation,
DataDefinitionGearHandlePosition DataGearHandlePosition,
DataSimEnvironment
}; };
//! SimConnect request IDs //! SimConnect request IDs
@@ -75,7 +82,8 @@ namespace BlackSimPlugin
{ {
RequestOwnAircraft, RequestOwnAircraft,
RequestRemoveAircraft, RequestRemoveAircraft,
RequestOwnAircraftTitle RequestOwnAircraftTitle,
RequestSimEnvironment
}; };
//! Constructor //! Constructor
@@ -84,6 +92,8 @@ namespace BlackSimPlugin
//! Initialize all data definitions //! Initialize all data definitions
static HRESULT initDataDefinitions(const HANDLE hSimConnect); static HRESULT initDataDefinitions(const HANDLE hSimConnect);
private:
//! Initialize data definition for our own aircraft //! Initialize data definition for our own aircraft
static HRESULT initOwnAircraft(const HANDLE hSimConnect); static HRESULT initOwnAircraft(const HANDLE hSimConnect);
@@ -92,6 +102,9 @@ namespace BlackSimPlugin
//! Initialize data definition for remote aircraft configuration //! Initialize data definition for remote aircraft configuration
static HRESULT initGearHandlePosition(const HANDLE hSimConnect); static HRESULT initGearHandlePosition(const HANDLE hSimConnect);
//! Initialize data definition for Simulator environment
static HRESULT initSimulatorEnvironment(const HANDLE hSimConnect);
}; };
} }
} }

View File

@@ -42,6 +42,7 @@ namespace BlackSimPlugin
ISimulator(parent), ISimulator(parent),
m_isConnected(false), m_isConnected(false),
m_simRunning(false), m_simRunning(false),
m_syncTime(false),
m_hSimConnect(nullptr), m_hSimConnect(nullptr),
m_nextObjID(1), m_nextObjID(1),
m_simulatorInfo(CSimulatorInfo::FSX()), m_simulatorInfo(CSimulatorInfo::FSX()),
@@ -50,7 +51,7 @@ namespace BlackSimPlugin
m_fsuipc(new CFsuipc()) m_fsuipc(new CFsuipc())
{ {
CFsxSimulatorSetup setup; 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()); this->m_simulatorInfo.setSimulatorSetup(setup.getSettings());
} }
@@ -69,7 +70,6 @@ namespace BlackSimPlugin
return m_fsuipc->isConnected(); return m_fsuipc->isConnected();
} }
bool CSimulatorFsx::connectTo() bool CSimulatorFsx::connectTo()
{ {
if (m_isConnected) return true; if (m_isConnected) return true;
@@ -95,7 +95,7 @@ namespace BlackSimPlugin
void CSimulatorFsx::asyncConnectTo() 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 // simplified connect, timers and signals not in different thread
auto asyncConnectFunc = [&]() -> bool auto asyncConnectFunc = [&]() -> bool
@@ -286,8 +286,8 @@ namespace BlackSimPlugin
void CSimulatorFsx::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) void CSimulatorFsx::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset)
{ {
Q_UNUSED(enable); this->m_syncTime = enable;
Q_UNUSED(offset); this->m_syncTimeOffset = offset;
} }
void CSimulatorFsx::onSimRunning() void CSimulatorFsx::onSimRunning()
@@ -298,12 +298,16 @@ namespace BlackSimPlugin
CSimConnectDataDefinition::DataOwnAircraft, CSimConnectDataDefinition::DataOwnAircraft,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME); SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME);
SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::RequestOwnAircraftTitle, SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::RequestOwnAircraftTitle,
CSimConnectDataDefinition::DataOwnAircraftTitle, CSimConnectDataDefinition::DataOwnAircraftTitle,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND,
SIMCONNECT_DATA_REQUEST_FLAG_CHANGED); 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(); emit simulatorStarted();
} }
@@ -316,7 +320,7 @@ namespace BlackSimPlugin
void CSimulatorFsx::onSimFrame() void CSimulatorFsx::onSimFrame()
{ {
update(); updateOtherAircrafts();
} }
void CSimulatorFsx::onSimExit() void CSimulatorFsx::onSimExit()
@@ -384,21 +388,21 @@ namespace BlackSimPlugin
DataDefinitionGearHandlePosition gearHandle; DataDefinitionGearHandlePosition gearHandle;
gearHandle.gearHandlePosition = 1; 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 */) void CSimulatorFsx::timerEvent(QTimerEvent * /* event */)
{ {
dispatch(); ps_dispatch();
} }
void CSimulatorFsx::dispatch() void CSimulatorFsx::ps_dispatch()
{ {
SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this); SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this);
if (this->m_fsuipc) this->m_fsuipc->process(); if (this->m_fsuipc) this->m_fsuipc->process();
} }
void CSimulatorFsx::connectToFinished() void CSimulatorFsx::ps_connectToFinished()
{ {
if (m_watcherConnect.result()) if (m_watcherConnect.result())
{ {
@@ -427,6 +431,10 @@ namespace BlackSimPlugin
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectAdded, "ObjectAdded"); hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectAdded, "ObjectAdded");
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectRemoved, "ObjectRemoved"); hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventObjectRemoved, "ObjectRemoved");
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventFrame, "Frame"); hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EventFrame, "Frame");
if (hr != S_OK)
{
qFatal("SimConnect_SubscribeToSystemEvent failed");
}
// Mapped events // Mapped events
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventFreezeLat, "FREEZE_LATITUDE_LONGITUDE_SET"); 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, EventSetCom2Standby, "COM2_STBY_RADIO_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTransponderCode, "XPNDR_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 // 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; return hr;
} }
@@ -448,7 +469,7 @@ namespace BlackSimPlugin
return CSimConnectDataDefinition::initDataDefinitions(m_hSimConnect); return CSimConnectDataDefinition::initDataDefinitions(m_hSimConnect);
} }
void CSimulatorFsx::update() void CSimulatorFsx::updateOtherAircrafts()
{ {
foreach(CSimConnectObject simObj, m_simConnectObjects) foreach(CSimConnectObject simObj, m_simConnectObjects)
{ {
@@ -481,13 +502,50 @@ namespace BlackSimPlugin
if (simObj.getObjectId() != 0) 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. // 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));
}
} }
} }

View File

@@ -64,7 +64,11 @@ namespace BlackSimPlugin
EventSetCom1Standby, EventSetCom1Standby,
EventSetCom2Standby, EventSetCom2Standby,
EventSetTransponderCode, EventSetTransponderCode,
EventTextMessage EventTextMessage,
EventSetTimeZuluYear,
EventSetTimeZuluDay,
EventSetTimeZuluHours,
EventSetTimeZuluMinutes
}; };
//! FSX Simulator Implementation //! FSX Simulator Implementation
@@ -121,8 +125,6 @@ namespace BlackSimPlugin
//! \copydoc ISimulator::displayStatusMessage //! \copydoc ISimulator::displayStatusMessage
virtual void displayStatusMessage(const BlackMisc::CStatusMessage &message) const override; virtual void displayStatusMessage(const BlackMisc::CStatusMessage &message) const override;
//! \brief Called when simulat has been started
//! \copydoc ISimulator::getAircraftModel() //! \copydoc ISimulator::getAircraftModel()
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override { return m_aircraftModel; } virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override { return m_aircraftModel; }
@@ -141,20 +143,20 @@ namespace BlackSimPlugin
//! \copydoc ISimulator::isSimPaused //! \copydoc ISimulator::isSimPaused
virtual bool isSimPaused() const override { return m_simPaused; } virtual bool isSimPaused() const override { return m_simPaused; }
//! \brief Called when sim has started //! Called when sim has started
void onSimRunning(); void onSimRunning();
//! \brief Called when sim has stopped //! Called when sim has stopped
void onSimStopped(); void onSimStopped();
//! \brief Slot called every visual frame //! Slot called every visual frame
void onSimFrame(); void onSimFrame();
//! Called when data about our own aircraft are received //! Called when data about our own aircraft are received
void updateOwnAircraftFromSim(DataDefinitionOwnAircraft simulatorOwnAircraft); void updateOwnAircraftFromSim(DataDefinitionOwnAircraft simulatorOwnAircraft);
/*! /*!
* \brief Set ID of a SimConnect object * Set ID of a SimConnect object
* \param requestID * \param requestID
* \param objectID * \param objectID
*/ */
@@ -173,10 +175,10 @@ namespace BlackSimPlugin
private slots: private slots:
//! Dispatch SimConnect messages //! Dispatch SimConnect messages
void dispatch(); void ps_dispatch();
//! Called when asynchronous connection to Simconnect has finished //! Called when asynchronous connection to Simconnect has finished
void connectToFinished(); void ps_connectToFinished();
private: private:
@@ -189,14 +191,21 @@ namespace BlackSimPlugin
//! Initialize SimConnect data definitions //! Initialize SimConnect data definitions
HRESULT initDataDefinitions(); HRESULT initDataDefinitions();
//! Update what? //! Update other aircrafts
void update(); // TODO: @RW, please rename, update is meaningless: what is updated? 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 static const int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again
bool m_isConnected; //!< Is simulator connected? bool m_isConnected = false; //!< Is simulator connected?
bool m_simRunning; //!< Simulator running? 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 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; QString simulatorDetails;
BlackSim::CSimulatorInfo m_simulatorInfo; BlackSim::CSimulatorInfo m_simulatorInfo;
BlackMisc::Aviation::CAircraft m_ownAircraft; //!< Object representing our own aircraft from simulator BlackMisc::Aviation::CAircraft m_ownAircraft; //!< Object representing our own aircraft from simulator

View File

@@ -25,7 +25,7 @@ namespace BlackSimPlugin
{ {
namespace Fsx 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<CSimulatorFsx *>(pContext); CSimulatorFsx *simulatorFsx = static_cast<CSimulatorFsx *>(pContext);
switch (pData->dwID) switch (pData->dwID)
@@ -42,8 +42,11 @@ namespace BlackSimPlugin
} }
case SIMCONNECT_RECV_ID_EXCEPTION: case SIMCONNECT_RECV_ID_EXCEPTION:
{ {
SIMCONNECT_RECV_EXCEPTION *event = (SIMCONNECT_RECV_EXCEPTION *)pData; SIMCONNECT_RECV_EXCEPTION *exception = (SIMCONNECT_RECV_EXCEPTION *)pData;
qDebug() << "Caught simConnect exception: " << CSimConnectUtilities::simConnectExceptionToString((SIMCONNECT_EXCEPTION)event->dwException); 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; break;
} }
case SIMCONNECT_RECV_ID_QUIT: case SIMCONNECT_RECV_ID_QUIT:
@@ -58,15 +61,18 @@ namespace BlackSimPlugin
switch (event->uEventID) switch (event->uEventID)
{ {
case EventSimStatus: case EventSimStatus:
if (event->dwData)
{ {
simulatorFsx->onSimRunning(); if (event->dwData)
{
simulatorFsx->onSimRunning();
}
else
{
simulatorFsx->onSimStopped();
}
break;
} }
else
{
simulatorFsx->onSimStopped();
}
break;
} }
break; break;
} }
@@ -89,6 +95,8 @@ namespace BlackSimPlugin
case EventFrame: case EventFrame:
simulatorFsx->onSimFrame(); simulatorFsx->onSimFrame();
break; break;
default:
break;
} }
break; break;
} }
@@ -104,15 +112,34 @@ namespace BlackSimPlugin
switch (pObjData->dwRequestID) switch (pObjData->dwRequestID)
{ {
case CSimConnectDataDefinition::RequestOwnAircraft: case CSimConnectDataDefinition::RequestOwnAircraft:
DataDefinitionOwnAircraft *ownAircaft; {
ownAircaft = (DataDefinitionOwnAircraft *)&pObjData->dwData; DataDefinitionOwnAircraft *ownAircaft;
simulatorFsx->updateOwnAircraftFromSim(*ownAircaft); ownAircaft = (DataDefinitionOwnAircraft *)&pObjData->dwData;
break; simulatorFsx->updateOwnAircraftFromSim(*ownAircaft);
break;
}
case CSimConnectDataDefinition::RequestOwnAircraftTitle: case CSimConnectDataDefinition::RequestOwnAircraftTitle:
DataDefinitionOwnAircraftModel *dataDefinitionModel = (DataDefinitionOwnAircraftModel *) &pObjData->dwData; {
CAircraftModel model; DataDefinitionOwnAircraftModel *dataDefinitionModel = (DataDefinitionOwnAircraftModel *) &pObjData->dwData;
model.setQueriedModelString(dataDefinitionModel->title); CAircraftModel model;
simulatorFsx->setAircraftModel(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; break;
} }
@@ -140,7 +167,9 @@ namespace BlackSimPlugin
} }
break; break;
} }
} // switch default:
break;
} // main switch
} // method } // method
} }
} }