mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 10:55:32 +08:00
Ref T275, FSX/P3D obtain model string and CG when model is added and set it in the providers
This commit is contained in:
@@ -185,6 +185,7 @@ namespace BlackSimPlugin
|
|||||||
CLogMessage(static_cast<CSimConnectDefinitions *>(nullptr)).error("SimConnect error: initRemoteAircraftSimData DataRemoteAircraftGetPosition %1") << hr;
|
CLogMessage(static_cast<CSimConnectDefinitions *>(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 TYPE", NULL, SIMCONNECT_DATATYPE_STRING32);
|
||||||
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "ATC MODEL", 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);
|
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftModelData, "ATC ID", NULL, SIMCONNECT_DATATYPE_STRING32);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ namespace BlackSimPlugin
|
|||||||
//! Data struct of aircraft model data
|
//! Data struct of aircraft model data
|
||||||
struct DataDefinitionRemoteAircraftModel
|
struct DataDefinitionRemoteAircraftModel
|
||||||
{
|
{
|
||||||
|
double cgToGroundFt; //!< Static CG to ground (ft)
|
||||||
char atcType[32]; //!< type
|
char atcType[32]; //!< type
|
||||||
char atcModel[32]; //!< model
|
char atcModel[32]; //!< model
|
||||||
char atcId[32]; //!< id
|
char atcId[32]; //!< id
|
||||||
|
|||||||
@@ -618,6 +618,17 @@ namespace BlackSimPlugin
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSimulatorFsxCommon::triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftModel &remoteAircraftModel)
|
||||||
|
{
|
||||||
|
if (this->isShuttingDownOrDisconnected()) { return; }
|
||||||
|
QPointer<CSimulatorFsxCommon> myself(this);
|
||||||
|
QTimer::singleShot(0, this, [ = ]
|
||||||
|
{
|
||||||
|
if (!myself) { return; }
|
||||||
|
myself->updateRemoteAircraftFromSimulator(simObject, remoteAircraftModel);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData)
|
void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData)
|
||||||
{
|
{
|
||||||
if (this->isShuttingDownOrDisconnected()) { return; }
|
if (this->isShuttingDownOrDisconnected()) { return; }
|
||||||
@@ -649,10 +660,25 @@ namespace BlackSimPlugin
|
|||||||
{
|
{
|
||||||
CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt);
|
CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt);
|
||||||
elevation.setSinglePointRadius();
|
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)
|
void CSimulatorFsxCommon::updateProbeFromSimulator(const CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData)
|
||||||
{
|
{
|
||||||
const CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt, CElevationPlane::singlePointRadius());
|
const CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt, CElevationPlane::singlePointRadius());
|
||||||
|
|||||||
@@ -315,12 +315,19 @@ namespace BlackSimPlugin
|
|||||||
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
|
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
|
||||||
|
|
||||||
//! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously
|
//! 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);
|
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
|
//! Remote aircraft data sent from simulator
|
||||||
void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData);
|
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
|
//! Probe data sent from simulator
|
||||||
void updateProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData);
|
void updateProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData);
|
||||||
|
|
||||||
|
|||||||
@@ -204,8 +204,8 @@ namespace BlackSimPlugin
|
|||||||
success = simulatorFsxP3D->simulatorReportedObjectAdded(objectId); // trigger follow up actions
|
success = simulatorFsxP3D->simulatorReportedObjectAdded(objectId); // trigger follow up actions
|
||||||
if (!success)
|
if (!success)
|
||||||
{
|
{
|
||||||
const CSimConnectObject simObj = simulatorFsxP3D->getSimObjectForObjectId(objectId);
|
const CSimConnectObject simObject = simulatorFsxP3D->getSimObjectForObjectId(objectId);
|
||||||
const CSimulatedAircraft remoteAircraft(simObj.getAircraft());
|
const CSimulatedAircraft remoteAircraft(simObject.getAircraft());
|
||||||
const CStatusMessage msg = CStatusMessage(simulatorFsxP3D).error("Cannot add object %1, cs: '%2' model: '%3'") << objectId << remoteAircraft.getCallsignAsString() << remoteAircraft.getModelString();
|
const CStatusMessage msg = CStatusMessage(simulatorFsxP3D).error("Cannot add object %1, cs: '%2' model: '%3'") << objectId << remoteAircraft.getCallsignAsString() << remoteAircraft.getModelString();
|
||||||
CLogMessage::preformatted(msg);
|
CLogMessage::preformatted(msg);
|
||||||
emit simulatorFsxP3D->physicallyAddingRemoteModelFailed(remoteAircraft, msg);
|
emit simulatorFsxP3D->physicallyAddingRemoteModelFailed(remoteAircraft, msg);
|
||||||
@@ -276,12 +276,12 @@ namespace BlackSimPlugin
|
|||||||
} // position
|
} // position
|
||||||
else if (subRequest == CSimConnectDefinitions::SimObjectModel)
|
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<const DataDefinitionRemoteAircraftModel *>(&pObjData->dwData);
|
const DataDefinitionRemoteAircraftModel *remoteAircraftModel = reinterpret_cast<const DataDefinitionRemoteAircraftModel *>(&pObjData->dwData);
|
||||||
// extra check, but ids should be the same
|
// extra check, but ids should be the same
|
||||||
if (objectId == simObject.getObjectId())
|
if (objectId == simObject.getObjectId())
|
||||||
{
|
{
|
||||||
Q_UNUSED(remoteAircraftModel);
|
simulatorFsxP3D->triggerUpdateRemoteAircraftFromSimulator(simObject, *remoteAircraftModel);
|
||||||
}
|
}
|
||||||
} // model
|
} // model
|
||||||
else if (subRequest == CSimConnectDefinitions::SimObjectLights)
|
else if (subRequest == CSimConnectDefinitions::SimObjectLights)
|
||||||
|
|||||||
Reference in New Issue
Block a user