Use new simvar to compensate for MSFS temperature effect on altitude

This commit is contained in:
Mat Sutcliffe
2022-10-30 20:23:12 +00:00
parent b3e312e1d3
commit 1e29100102
7 changed files with 32 additions and 3 deletions

View File

@@ -136,6 +136,8 @@ namespace BlackSimPlugin::FsxCommon
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "ROTATION VELOCITY BODY X", "Radians per second");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "ROTATION VELOCITY BODY Y", "Radians per second");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "ROTATION VELOCITY BODY Z", "Radians per second");
// FS2020
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "INDICATED ALTITUDE CALIBRATED", "Feet");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraftTitle, "TITLE", nullptr, SIMCONNECT_DATATYPE_STRING256);
if (isFailure(hr))

View File

@@ -77,6 +77,8 @@ namespace BlackSimPlugin::FsxCommon
double rotationVelocityBodyY; //!< Rotation Velocity Body Y
double rotationVelocityBodyZ; //!< Rotation Velocity Body Z
// 44
double altitudeCalibratedFt; //!< Altitude without temperature effect (ft, FS2020)
// 45
};
//! Data struct of aircraft position

View File

@@ -655,6 +655,11 @@ namespace BlackSimPlugin::FsxCommon
return true;
}
void CSimulatorFsxCommon::setTrueAltitude(CAircraftSituation &aircraftSituation, const DataDefinitionOwnAircraft &simulatorOwnAircraft)
{
aircraftSituation.setAltitude(CAltitude(simulatorOwnAircraft.altitudeFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()));
}
void CSimulatorFsxCommon::updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft)
{
const qint64 ts = QDateTime::currentMSecsSinceEpoch();
@@ -677,7 +682,7 @@ namespace BlackSimPlugin::FsxCommon
aircraftSituation.setHeading(CHeading(simulatorOwnAircraft.trueHeadingDeg, CHeading::True, CAngleUnit::deg()));
aircraftSituation.setGroundSpeed(CSpeed(simulatorOwnAircraft.velocity, CSpeedUnit::kts()));
aircraftSituation.setGroundElevation(CAltitude(simulatorOwnAircraft.elevationFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()), CAircraftSituation::FromProvider);
aircraftSituation.setAltitude(CAltitude(simulatorOwnAircraft.altitudeFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()));
setTrueAltitude(aircraftSituation, simulatorOwnAircraft);
aircraftSituation.setPressureAltitude(CAltitude(simulatorOwnAircraft.pressureAltitudeM, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m()));
// set on ground also in situation for consistency and future usage
// it is duplicated in parts
@@ -1998,7 +2003,13 @@ namespace BlackSimPlugin::FsxCommon
// update situation
if (forceUpdate || !this->isEqualLastSent(result.getInterpolatedSituation()))
{
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(result, sendGround);
// adjust altitude to compensate for FS2020 temperature effect
CAircraftSituation situation = result;
const CLength relativeAltitude = situation.geodeticHeight() - getOwnAircraftPosition().geodeticHeight();
const double altitudeDeltaWeight = 2 - qBound(3000.0, relativeAltitude.abs().value(CLengthUnit::ft()), 6000.0) / 3000;
situation.setAltitude({ situation.getAltitude() + m_altitudeDelta * altitudeDeltaWeight, situation.getAltitude().getReferenceDatum() });
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(situation, sendGround);
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(
m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,

View File

@@ -337,6 +337,8 @@ namespace BlackSimPlugin::FsxCommon
int m_addedProbes = 0; //!< added probes
QMap<DWORD, BlackMisc::Aviation::CCallsign> m_pendingProbeRequests; //!< pending elevation requests: requestId/aircraft callsign
BlackMisc::PhysicalQuantities::CLength m_altitudeDelta; //!< FS2020 effect of temperature on altitude
private:
//! Reason for adding an aircraft
enum AircraftAddMode
@@ -471,6 +473,9 @@ namespace BlackSimPlugin::FsxCommon
//! Probe data sent from simulator
void updateProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData);
//! Customization point for adjusting altitude to compensate for temperature effect
virtual void setTrueAltitude(BlackMisc::Aviation::CAircraftSituation &aircraftSituation, const BlackSimPlugin::FsxCommon::DataDefinitionOwnAircraft &simulatorOwnAircraft);
//! Called when data about our own aircraft are received
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);

View File

@@ -241,7 +241,7 @@ namespace BlackSimPlugin::FsxCommon
{
case CSimConnectDefinitions::RequestOwnAircraft:
{
static_assert(sizeof(DataDefinitionOwnAircraft) == 44 * sizeof(double), "DataDefinitionOwnAircraft has an incorrect size.");
static_assert(sizeof(DataDefinitionOwnAircraft) == 45 * sizeof(double), "DataDefinitionOwnAircraft has an incorrect size.");
const DataDefinitionOwnAircraft *ownAircaft = reinterpret_cast<const DataDefinitionOwnAircraft *>(&pObjData->dwData);
simulatorFsxP3D->updateOwnAircraftFromSimulator(*ownAircaft);
break;

View File

@@ -18,6 +18,7 @@ using namespace BlackMisc::Simulation;
using namespace BlackMisc::Simulation::FsCommon;
using namespace BlackMisc::Weather;
using namespace BlackCore;
using namespace BlackSimPlugin::FsxCommon;
namespace BlackSimPlugin::Msfs
{
@@ -49,6 +50,12 @@ namespace BlackSimPlugin::Msfs
#endif
}
void CSimulatorMsFs::setTrueAltitude(CAircraftSituation &aircraftSituation, const DataDefinitionOwnAircraft &simulatorOwnAircraft)
{
aircraftSituation.setAltitude(CAltitude(simulatorOwnAircraft.altitudeCalibratedFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()));
m_altitudeDelta = { simulatorOwnAircraft.altitudeFt - simulatorOwnAircraft.altitudeCalibratedFt, CLengthUnit::ft() };
}
void CSimulatorMsFsListener::startImpl()
{
#ifdef Q_OS_WIN64

View File

@@ -33,6 +33,8 @@ namespace BlackSimPlugin::Msfs
//! @{
virtual bool connectTo() override;
//! @}
virtual void setTrueAltitude(BlackMisc::Aviation::CAircraftSituation &aircraftSituation, const BlackSimPlugin::FsxCommon::DataDefinitionOwnAircraft &simulatorOwnAircraft) override;
};
//! Listener for MSFS