refactor(msfs): Request transponder data with OwnAircraftData

This commit is contained in:
Lars Toenning
2025-07-12 22:19:56 +02:00
parent 26fb4e659a
commit e0c4e79af0
7 changed files with 41 additions and 66 deletions

View File

@@ -81,7 +81,6 @@ namespace swift::simplugin::fsxcommon
hr += initRemoteAircraftSimDataSet(hSimConnect);
hr += initSimulatorEnvironment(hSimConnect);
hr += initSbDataArea(hSimConnect);
if (simInfo.isMSFS() || simInfo.isMSFS2024()) { hr += initMSFSTransponder(hSimConnect); }
return hr;
}
@@ -178,9 +177,13 @@ namespace swift::simplugin::fsxcommon
"ROTATION VELOCITY BODY Y", "Radians per second");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"ROTATION VELOCITY BODY Z", "Radians per second");
// FS2020
// MSFS 2020/2024 only
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"INDICATED ALTITUDE CALIBRATED", "Feet");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"TRANSPONDER STATE:1", "Enum");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"TRANSPONDER IDENT:1", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraftTitle, "TITLE",
nullptr, SIMCONNECT_DATATYPE_STRING256);
@@ -406,22 +409,6 @@ namespace swift::simplugin::fsxcommon
return hr;
}
HRESULT CSimConnectDefinitions::initMSFSTransponder(const HANDLE hSimConnect)
{
HRESULT hr = s_ok();
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS,
"TRANSPONDER STATE:1", "Enum");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS,
"TRANSPONDER IDENT:1", "Bool");
if (isFailure(hr))
{
CLogMessage(static_cast<CSimConnectDefinitions *>(nullptr))
.error(u"SimConnect error: MSFS transponder data definitions %1")
<< hr;
}
return hr;
}
DataDefinitionRemoteAircraftPartsWithoutLights::DataDefinitionRemoteAircraftPartsWithoutLights()
{
this->resetToInvalid();

View File

@@ -76,9 +76,9 @@ namespace swift::simplugin::fsxcommon
double rotationVelocityBodyX; //!< Rotation Velocity Body X
double rotationVelocityBodyY; //!< Rotation Velocity Body Y
double rotationVelocityBodyZ; //!< Rotation Velocity Body Z
// 44
double altitudeCalibratedFt; //!< Altitude without temperature effect (ft, FS2020)
// 45
double altitudeCalibratedFt; //!< Altitude without temperature effect (ft, MSFS)
double transponderMode; //!< transponder state (MSFS)
double ident; //!< ident (MSFS)
};
//! Data struct of aircraft position
@@ -249,13 +249,6 @@ namespace swift::simplugin::fsxcommon
QString toQString() const;
};
//! Data structure for MSFS transponder mode information
struct DataDefinitionMSFSTransponderMode
{
double transponderMode = 1; //!< transponder state simvar
double ident = 0; //!< ident
};
//! Client areas
enum ClientAreaId
{
@@ -279,7 +272,6 @@ namespace swift::simplugin::fsxcommon
DataRemoteAircraftModelData, //!< model data eventually used and reported back from simulator
DataRemoteAircraftSetData, //!< set model data such as airline
DataSimEnvironment,
DataTransponderModeMSFS,
DataClientAreaSb, //!< whole SB area, see http://squawkbox.ca/doc/sdk/fsuipc.php
DataClientAreaSbIdent, //!< SB ident single value 0x7b93/19
DataClientAreaSbStandby, //!< SB standby 0x7b91/17
@@ -293,7 +285,6 @@ namespace swift::simplugin::fsxcommon
RequestOwnAircraft,
RequestOwnAircraftTitle,
RequestSbData, //!< SB client area / XPDR mode
RequestMSFSTransponder, //!< MSFS XPDR mode/ident
RequestFacility,
RequestEndMarker //!< free request ids can start here
};
@@ -342,9 +333,6 @@ namespace swift::simplugin::fsxcommon
//! Initialize the SB data are
static HRESULT initSbDataArea(const HANDLE hSimConnect);
//! Initialize data definition for MSFS transponder
static HRESULT initMSFSTransponder(const HANDLE hSimConnect);
};
} // namespace swift::simplugin::fsxcommon

View File

@@ -528,7 +528,6 @@ namespace swift::simplugin::fsxcommon
SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED),
"Cannot request title", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
// TODO TZ use MSFS2024 FSUIPC?
if (!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS() &&
!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS2024())
{
@@ -542,15 +541,6 @@ namespace swift::simplugin::fsxcommon
SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED),
"Cannot request client data", Q_FUNC_INFO, "SimConnect_RequestClientData");
}
else
{
hr += this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestMSFSTransponder,
CSimConnectDefinitions::DataTransponderModeMSFS,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME,
SIMCONNECT_DATA_REQUEST_FLAG_CHANGED),
"Cannot request MSFS transponder data", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
}
if (isFailure(hr)) { return; }
this->emitSimulatorCombinedStatus(); // force sending status
@@ -693,6 +683,12 @@ namespace swift::simplugin::fsxcommon
CAltitude(simulatorOwnAircraft.altitudeFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()));
}
void CSimulatorFsxCommon::setTransponderMode(
swift::misc::aviation::CTransponder &transponder,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft)
{ /* Do not modify the transponder mode by default. Only MSFS allows to read it from SimVars */ }
void CSimulatorFsxCommon::updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft)
{
const qint64 ts = QDateTime::currentMSecsSinceEpoch();
@@ -832,12 +828,13 @@ namespace swift::simplugin::fsxcommon
CTransponder transponder(myAircraft.getTransponder());
transponder.setTransponderCode(qRound(simulatorOwnAircraft.transponderCode));
setTransponderMode(transponder, simulatorOwnAircraft);
m_simTransponder = transponder;
// if the simulator ever sends SELCAL, add it here.
// m_selcal SELCAL sync.would go here
const bool changedXpr = (myAircraft.getTransponderCode() != transponder.getTransponderCode());
const bool changedXpr = (myAircraft.getTransponder() != transponder);
if (changedCom1 || changedCom2 || changedXpr)
{
@@ -1009,17 +1006,6 @@ namespace swift::simplugin::fsxcommon
this->updateCockpit(myAircraft.getCom1System(), myAircraft.getCom2System(), myXpdr, this->identifier());
}
void CSimulatorFsxCommon::updateMSFSTransponderMode(const DataDefinitionMSFSTransponderMode transponderMode)
{
auto mode = CTransponder::StateIdent;
if (!transponderMode.ident)
{
qRound(transponderMode.transponderMode) >= 3 ? mode = CTransponder::ModeC :
mode = CTransponder::StateStandby;
}
this->updateTransponderMode(mode);
}
bool CSimulatorFsxCommon::simulatorReportedObjectAdded(DWORD objectId)
{
if (this->isShuttingDownOrDisconnected()) { return true; } // pretend everything is fine

View File

@@ -503,6 +503,11 @@ namespace swift::simplugin::fsxcommon
setTrueAltitude(swift::misc::aviation::CAircraftSituation &aircraftSituation,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft);
//! Customization point for changing the transponder mode
virtual void
setTransponderMode(swift::misc::aviation::CTransponder &transponder,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft);
//! Called when data about our own aircraft are received
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
@@ -514,9 +519,6 @@ namespace swift::simplugin::fsxcommon
//! \threadsafe
void updateTransponderMode(const misc::aviation::CTransponder::TransponderMode xpdrMode);
//! Update transponder mode from MSFS
void updateMSFSTransponderMode(const DataDefinitionMSFSTransponderMode transponderMode);
//! An AI aircraft was added in the simulator
bool simulatorReportedObjectAdded(DWORD objectId);

View File

@@ -245,7 +245,7 @@ namespace swift::simplugin::fsxcommon
{
case CSimConnectDefinitions::RequestOwnAircraft:
{
static_assert(sizeof(DataDefinitionOwnAircraft) == 45 * sizeof(double),
static_assert(sizeof(DataDefinitionOwnAircraft) == 47 * sizeof(double),
"DataDefinitionOwnAircraft has an incorrect size.");
const DataDefinitionOwnAircraft *ownAircaft =
reinterpret_cast<const DataDefinitionOwnAircraft *>(&pObjData->dwData);
@@ -260,13 +260,6 @@ namespace swift::simplugin::fsxcommon
simulatorFsxP3D->reverseLookupAndUpdateOwnAircraftModel(model);
break;
}
case CSimConnectDefinitions::RequestMSFSTransponder:
{
const DataDefinitionMSFSTransponderMode *transponderMode =
reinterpret_cast<const DataDefinitionMSFSTransponderMode *>(&pObjData->dwData);
simulatorFsxP3D->updateMSFSTransponderMode(*transponderMode);
break;
}
default:
{
const DWORD objectId = pObjData->dwObjectID;

View File

@@ -41,6 +41,20 @@ namespace swift::simplugin::msfs
CLengthUnit::ft() };
}
void CSimulatorMsFs::setTransponderMode(
swift::misc::aviation::CTransponder& transponder,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft& simulatorOwnAircraft)
{
auto mode = CTransponder::StateIdent;
if (!simulatorOwnAircraft.ident)
{
qRound(simulatorOwnAircraft.transponderMode) >= 3 ? mode = CTransponder::ModeC :
mode = CTransponder::StateStandby;
}
transponder.setTransponderMode(mode);
}
void CSimulatorMsFsListener::startImpl()
{
if (!loadAndResolveMSFSimConnect()) { return; }

View File

@@ -30,6 +30,11 @@ namespace swift::simplugin::msfs
virtual void
setTrueAltitude(swift::misc::aviation::CAircraftSituation &aircraftSituation,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft) override;
void
setTransponderMode(swift::misc::aviation::CTransponder &transponder,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft) override;
};
//! Listener for MSFS