From 2798d364358b79cc4d18deab9979b5b6e854590a Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 28 Jun 2018 01:31:31 +0200 Subject: [PATCH] Ref T275, FSX/P3D obtain model string and CG when model is added and set it in the providers --- .../fsxcommon/simconnectdatadefinition.cpp | 1 + .../fsxcommon/simconnectdatadefinition.h | 1 + .../fsxcommon/simulatorfsxcommon.cpp | 28 ++++++++++++++++++- .../simulator/fsxcommon/simulatorfsxcommon.h | 9 +++++- .../fsxcommon/simulatorfsxsimconnectproc.cpp | 8 +++--- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index 0cd24e530..b28586339 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -185,6 +185,7 @@ namespace BlackSimPlugin CLogMessage(static_cast(nullptr)).error("SimConnect error: initRemoteAircraftSimData DataRemoteAircraftGetPosition %1") << hr; } + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "STATIC CG TO GROUND", "Feet"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "ATC TYPE", NULL, SIMCONNECT_DATATYPE_STRING32); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "ATC MODEL", NULL, SIMCONNECT_DATATYPE_STRING32); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "ATC ID", NULL, SIMCONNECT_DATATYPE_STRING32); diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index be5c2550b..5ef50dfc4 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -75,6 +75,7 @@ namespace BlackSimPlugin //! Data struct of aircraft model data struct DataDefinitionRemoteAircraftModel { + double cgToGroundFt; //!< Static CG to ground (ft) char atcType[32]; //!< type char atcModel[32]; //!< model char atcId[32]; //!< id diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 9a6d0a5ce..512cf002f 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -618,6 +618,17 @@ namespace BlackSimPlugin }); } + void CSimulatorFsxCommon::triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftModel &remoteAircraftModel) + { + if (this->isShuttingDownOrDisconnected()) { return; } + QPointer myself(this); + QTimer::singleShot(0, this, [ = ] + { + if (!myself) { return; } + myself->updateRemoteAircraftFromSimulator(simObject, remoteAircraftModel); + }); + } + void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData) { if (this->isShuttingDownOrDisconnected()) { return; } @@ -649,10 +660,25 @@ namespace BlackSimPlugin { CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); elevation.setSinglePointRadius(); - this->rememberElevationAndCG(cs, elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); + this->rememberElevationAndCG(cs, simObject.getAircraftModelString(), elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); } } + void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftModel &remoteAircraftModel) + { + const CCallsign cs(simObject.getCallsign()); + if (!m_simConnectObjects.contains(cs)) { return; } // no longer existing + CSimConnectObject &so = m_simConnectObjects[cs]; + if (so.isPendingRemoved()) { return; } + + const QString modelString(remoteAircraftModel.title); + const CLength cg(remoteAircraftModel.cgToGroundFt, CLengthUnit::ft()); + so.setAircraftCG(cg); + so.setAircraftModelString(modelString); + this->insertCG(cg, modelString, cs); // env. provider + this->updateCGAndModelString(cs, cg, modelString); // remote aircraft provider + } + void CSimulatorFsxCommon::updateProbeFromSimulator(const CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData) { const CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt, CElevationPlane::singlePointRadius()); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h index 078a9c746..06297f81b 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h @@ -315,12 +315,19 @@ namespace BlackSimPlugin void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft); //! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously - //! \remark can help not to send SimConnect data in event loop + //! \remark do not to send SimConnect data in event loop void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData); + //! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously + //! \remark do not to send SimConnect data in event loop + void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftModel &remoteAircraftModel); + //! Remote aircraft data sent from simulator void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData); + //! Remote aircraft data sent from simulator + void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftModel &remoteAircraftModel); + //! Probe data sent from simulator void updateProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index 166cadd1b..24b47f5ec 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -204,8 +204,8 @@ namespace BlackSimPlugin success = simulatorFsxP3D->simulatorReportedObjectAdded(objectId); // trigger follow up actions if (!success) { - const CSimConnectObject simObj = simulatorFsxP3D->getSimObjectForObjectId(objectId); - const CSimulatedAircraft remoteAircraft(simObj.getAircraft()); + const CSimConnectObject simObject = simulatorFsxP3D->getSimObjectForObjectId(objectId); + const CSimulatedAircraft remoteAircraft(simObject.getAircraft()); const CStatusMessage msg = CStatusMessage(simulatorFsxP3D).error("Cannot add object %1, cs: '%2' model: '%3'") << objectId << remoteAircraft.getCallsignAsString() << remoteAircraft.getModelString(); CLogMessage::preformatted(msg); emit simulatorFsxP3D->physicallyAddingRemoteModelFailed(remoteAircraft, msg); @@ -276,12 +276,12 @@ namespace BlackSimPlugin } // position else if (subRequest == CSimConnectDefinitions::SimObjectModel) { - static_assert(sizeof(DataDefinitionRemoteAircraftModel) == 168 + 256, "DataDefinitionRemoteAircraftModel has an incorrect size."); + static_assert(sizeof(DataDefinitionRemoteAircraftModel) == sizeof(double) + 168 + 256, "DataDefinitionRemoteAircraftModel has an incorrect size."); const DataDefinitionRemoteAircraftModel *remoteAircraftModel = reinterpret_cast(&pObjData->dwData); // extra check, but ids should be the same if (objectId == simObject.getObjectId()) { - Q_UNUSED(remoteAircraftModel); + simulatorFsxP3D->triggerUpdateRemoteAircraftFromSimulator(simObject, *remoteAircraftModel); } } // model else if (subRequest == CSimConnectDefinitions::SimObjectLights)