mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 02:55:44 +08:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user