diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index 3c4e6b228..b69f389ec 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -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(nullptr)) - .error(u"SimConnect error: MSFS transponder data definitions %1") - << hr; - } - return hr; - } - DataDefinitionRemoteAircraftPartsWithoutLights::DataDefinitionRemoteAircraftPartsWithoutLights() { this->resetToInvalid(); diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index e2992fa8f..a47a5b1df 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -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 diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index e130562a6..f03d126a3 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -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 diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h index 5cb1976eb..d9c21f7a1 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h @@ -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); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index aef52bc5d..ac8257110 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -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(&pObjData->dwData); @@ -260,13 +260,6 @@ namespace swift::simplugin::fsxcommon simulatorFsxP3D->reverseLookupAndUpdateOwnAircraftModel(model); break; } - case CSimConnectDefinitions::RequestMSFSTransponder: - { - const DataDefinitionMSFSTransponderMode *transponderMode = - reinterpret_cast(&pObjData->dwData); - simulatorFsxP3D->updateMSFSTransponderMode(*transponderMode); - break; - } default: { const DWORD objectId = pObjData->dwObjectID; diff --git a/src/plugins/simulator/msfs/simulatormsfs.cpp b/src/plugins/simulator/msfs/simulatormsfs.cpp index 4bd3d6897..004f48a08 100644 --- a/src/plugins/simulator/msfs/simulatormsfs.cpp +++ b/src/plugins/simulator/msfs/simulatormsfs.cpp @@ -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; } diff --git a/src/plugins/simulator/msfs/simulatormsfs.h b/src/plugins/simulator/msfs/simulatormsfs.h index 1f78a2d64..9e7c2da6e 100644 --- a/src/plugins/simulator/msfs/simulatormsfs.h +++ b/src/plugins/simulator/msfs/simulatormsfs.h @@ -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