diff --git a/src/blackcore/context/contextownaircraft.h b/src/blackcore/context/contextownaircraft.h index 8b7ff2469..2c992455a 100644 --- a/src/blackcore/context/contextownaircraft.h +++ b/src/blackcore/context/contextownaircraft.h @@ -108,7 +108,7 @@ namespace BlackCore //! Update position //! \note this is in \sa IContextOwnAircraft as we want to set test positions from the GUI / elsewhere - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0; + virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CAltitude &pressureAltitude) = 0; //! Update own cockpit virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const BlackMisc::CIdentifier &originator) = 0; diff --git a/src/blackcore/context/contextownaircraftempty.h b/src/blackcore/context/contextownaircraftempty.h index a3791e6af..77c7a3895 100644 --- a/src/blackcore/context/contextownaircraftempty.h +++ b/src/blackcore/context/contextownaircraftempty.h @@ -38,10 +38,11 @@ namespace BlackCore } //! \copydoc IContextOwnAircraft::updateOwnPosition - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override + virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CAltitude &pressureAltitude) override { Q_UNUSED(position); Q_UNUSED(altitude); + Q_UNUSED(pressureAltitude) logEmptyContextWarning(Q_FUNC_INFO); return false; } diff --git a/src/blackcore/context/contextownaircraftimpl.cpp b/src/blackcore/context/contextownaircraftimpl.cpp index 9fecf8fc7..0f6299555 100644 --- a/src/blackcore/context/contextownaircraftimpl.cpp +++ b/src/blackcore/context/contextownaircraftimpl.cpp @@ -212,7 +212,7 @@ namespace BlackCore return true; } - bool CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + bool CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const CAltitude &pressureAltitude) { if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude; } QWriteLocker l(&m_lockAircraft); @@ -224,6 +224,12 @@ namespace BlackCore changed = true; m_ownAircraft.setAltitude(altitude); } + + if (m_ownAircraft.getPressureAltitude() != pressureAltitude) + { + changed = true; + m_ownAircraft.setPressureAltitude(pressureAltitude); + } return changed; } diff --git a/src/blackcore/context/contextownaircraftimpl.h b/src/blackcore/context/contextownaircraftimpl.h index 5a8c860e8..b60cf38c9 100644 --- a/src/blackcore/context/contextownaircraftimpl.h +++ b/src/blackcore/context/contextownaircraftimpl.h @@ -120,7 +120,7 @@ namespace BlackCore virtual bool updateOwnIcaoCodes(const BlackMisc::Aviation::CAircraftIcaoCode &aircraftIcaoCode, const BlackMisc::Aviation::CAirlineIcaoCode &airlineIcaoCode) override; //! \copydoc IContextOwnAircraft::updateOwnPosition - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CAltitude &pressureAltitude) override; //! \copydoc IContextOwnAircraft::updateCockpit virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const BlackMisc::CIdentifier &originator) override; diff --git a/src/blackcore/context/contextownaircraftproxy.cpp b/src/blackcore/context/contextownaircraftproxy.cpp index e7ee0313d..cfd033677 100644 --- a/src/blackcore/context/contextownaircraftproxy.cpp +++ b/src/blackcore/context/contextownaircraftproxy.cpp @@ -75,9 +75,9 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1String("updateSelcal"), selcal, originator); } - bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const CAltitude &pressureAltitude) { - return this->m_dBusInterface->callDBusRet(QLatin1String("updateOwnPosition"), position, altitude); + return this->m_dBusInterface->callDBusRet(QLatin1String("updateOwnPosition"), position, altitude, pressureAltitude); } bool CContextOwnAircraftProxy::updateOwnCallsign(const CCallsign &callsign) diff --git a/src/blackcore/context/contextownaircraftproxy.h b/src/blackcore/context/contextownaircraftproxy.h index 75a31ba3a..e110964b5 100644 --- a/src/blackcore/context/contextownaircraftproxy.h +++ b/src/blackcore/context/contextownaircraftproxy.h @@ -64,7 +64,7 @@ namespace BlackCore //! \publicsection //! @{ virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CAltitude &pressureAltitude) override; virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const BlackMisc::CIdentifier &originator) override; virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, BlackMisc::Aviation::CComSystem::ComUnit comUnit, const BlackMisc::CIdentifier &originator) override; virtual bool updateOwnAircraftPilot(const BlackMisc::Network::CUser &pilot) override; diff --git a/src/blackcore/vatsim/networkvatlib.cpp b/src/blackcore/vatsim/networkvatlib.cpp index 02cf6ed81..11b03e984 100644 --- a/src/blackcore/vatsim/networkvatlib.cpp +++ b/src/blackcore/vatsim/networkvatlib.cpp @@ -204,8 +204,7 @@ namespace BlackCore { // Normal / Stealth mode VatPilotPosition pos; - //! \fixme we need to distinguish true and pressure altitude - pos.altitudePressure = myAircraft.getAltitude().value(CLengthUnit::ft()); + pos.altitudePressure = myAircraft.getPressureAltitude().value(CLengthUnit::ft()); pos.altitudeTrue = myAircraft.getAltitude().value(CLengthUnit::ft()); pos.heading = myAircraft.getHeading().value(CAngleUnit::deg()); pos.pitch = myAircraft.getPitch().value(CAngleUnit::deg()); diff --git a/src/blackgui/editors/situationform.cpp b/src/blackgui/editors/situationform.cpp index 805b75506..03dd42415 100644 --- a/src/blackgui/editors/situationform.cpp +++ b/src/blackgui/editors/situationform.cpp @@ -9,8 +9,10 @@ #include "situationform.h" #include "ui_situationform.h" +#include "blackmisc/pq/pressure.h" #include "blackmisc/pq/angle.h" #include "blackmisc/stringutils.h" +#include "blackmisc/logmessage.h" #include using namespace BlackMisc; @@ -29,14 +31,19 @@ namespace BlackGui ui->le_Bank->setValidator(new QDoubleValidator(-180.0 + CAngleUnit::deg().getEpsilon(), 180.0, 3, ui->le_Bank)); ui->le_Pitch->setValidator(new QDoubleValidator(-180.0 + CAngleUnit::deg().getEpsilon(), 180.0, 3, ui->le_Pitch)); + ui->le_Pressure->setValidator(new QDoubleValidator(980.0, 1046.0, 2, ui->le_Pressure)); connect(ui->hs_Bank, &QSlider::valueChanged, this, &CSituationForm::bankSliderChanged); connect(ui->hs_Pitch, &QSlider::valueChanged, this, &CSituationForm::pitchSliderChanged); + connect(ui->hs_Pressure, &QSlider::valueChanged, this, &CSituationForm::pressureSliderChanged); connect(ui->le_Bank, &QLineEdit::editingFinished, this, &CSituationForm::bankEntered); connect(ui->le_Pitch, &QLineEdit::editingFinished, this, &CSituationForm::pitchEntered); + connect(ui->le_Pressure, &QLineEdit::editingFinished, this, &CSituationForm::pressureEntered); connect(ui->tb_ResetBank, &QToolButton::clicked, this, &CSituationForm::resetBank); connect(ui->tb_ResetPitch, &QToolButton::clicked, this, &CSituationForm::resetPitch); + connect(ui->tb_ResetPressure, &QToolButton::clicked, this, &CSituationForm::resetPressure); connect(ui->pb_Set, &QPushButton::clicked, this, &CSituationForm::changeAircraftSituation); + connect(ui->pb_SetEnvironment, &QPushButton::clicked, this, &CSituationForm::changeAircraftSituation); connect(ui->comp_Coordinate, &CCoordinateForm::changeCoordinate, this, &CSituationForm::changeAircraftSituation); } @@ -50,9 +57,13 @@ namespace BlackGui CAircraftSituation CSituationForm::getSituation() const { - CAircraftSituation s(ui->comp_Coordinate->getCoordinate()); + const BlackMisc::Geo::CCoordinateGeodetic position = ui->comp_Coordinate->getCoordinate(); + CAircraftSituation s(position); s.setBank(this->getBankAngle()); s.setPitch(this->getPitchAngle()); + + CAltitude pressureAltitude(position.geodeticHeight().toPressureAltitude(this->getBarometricPressureMsl())); + s.setPressureAltitude(pressureAltitude); return s; } @@ -84,6 +95,20 @@ namespace BlackGui return CAngle::normalizeDegrees180(vd, RoundDigits); } + double CSituationForm::getBarometricPressureMslMillibar() const + { + const QString v(ui->le_Pressure->text().replace(',', '.')); + bool ok; + double vd = v.toDouble(&ok); + if (!ok) { vd = 1013.25; } + return vd; + } + + CPressure CSituationForm::getBarometricPressureMsl() const + { + return CPressure (getBarometricPressureMslMillibar(), CPressureUnit::mbar()); + } + void CSituationForm::setReadOnly(bool readonly) { ui->comp_Coordinate->setReadOnly(readonly); @@ -128,6 +153,13 @@ namespace BlackGui ui->le_Pitch->setText(QString::number(value)); } + void CSituationForm::pressureSliderChanged(int value) + { + const int pressure = qRound(this->getBarometricPressureMslMillibar()); + if (value == pressure) { return; } // avoid roundtrips + ui->le_Pressure->setText(QString::number(value)); + } + void CSituationForm::bankEntered() { const double ad = this->getBankAngleDegrees(); @@ -161,5 +193,22 @@ namespace BlackGui ui->le_Pitch->setText("0"); ui->hs_Pitch->setValue(0); } + + void CSituationForm::pressureEntered() + { + const double pd = this->getBarometricPressureMslMillibar(); + QString n = QString::number(pd, 'g', 4 + RoundDigits); + if (ui->le_Pressure->validator()) { dotToLocaleDecimalPoint(n); } + ui->le_Pressure->setText(n); + const int pi = qRound(pd); + if (pi == ui->hs_Pressure->value()) { return; } // avoid roundtrips + ui->hs_Pressure->setValue(pi); + } + + void CSituationForm::resetPressure() + { + ui->le_Pressure->setText("1013.00"); + ui->hs_Pressure->setValue(1013); + } } // ns } // ns diff --git a/src/blackgui/editors/situationform.h b/src/blackgui/editors/situationform.h index e53d9882b..56030ac81 100644 --- a/src/blackgui/editors/situationform.h +++ b/src/blackgui/editors/situationform.h @@ -74,12 +74,21 @@ namespace BlackGui //! Get pitch angle double getPitchAngleDegrees() const; + //! Get barometric pressure at mean sea level + BlackMisc::PhysicalQuantities::CPressure getBarometricPressureMsl() const; + + //! Get pressure at mean sea level + double getBarometricPressureMslMillibar() const; + void bankSliderChanged(int value); void pitchSliderChanged(int value); + void pressureSliderChanged(int value); void bankEntered(); void resetBank(); void pitchEntered(); void resetPitch(); + void pressureEntered(); + void resetPressure(); QScopedPointer ui; }; diff --git a/src/blackgui/editors/situationform.ui b/src/blackgui/editors/situationform.ui index f1813bb45..474db4fd1 100644 --- a/src/blackgui/editors/situationform.ui +++ b/src/blackgui/editors/situationform.ui @@ -6,8 +6,8 @@ 0 0 - 386 - 324 + 512 + 439 @@ -37,7 +37,7 @@ QFrame::Raised - + @@ -110,7 +110,7 @@ - + Qt::Vertical @@ -145,7 +145,7 @@ - + set @@ -183,6 +183,112 @@ + + + + Environment + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + Pressure MSL (980 - 1046 mbar) + + + false + + + + + + + 1013.00 + + + + + + + ... + + + + :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png + + + + + + + + 0 + 0 + + + + 980 + + + 1046 + + + 1 + + + 1013 + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksAbove + + + 1 + + + + + + + set + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 647b7b055..d5338a033 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -30,7 +30,10 @@ namespace BlackMisc CAircraftSituation::CAircraftSituation(const CCoordinateGeodetic &position, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CAltitude &groundElevation) : m_position(position), m_heading(heading), m_pitch(pitch), - m_bank(bank), m_groundSpeed(gs), m_groundElevation(groundElevation) {} + m_bank(bank), m_groundSpeed(gs), m_groundElevation(groundElevation) + { + m_pressureAltitude = position.geodeticHeight().toPressureAltitude(CPressure(1013.25, CPressureUnit::mbar())); + } CAircraftSituation::CAircraftSituation(const CCallsign &correspondingCallsign, const CCoordinateGeodetic &position, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CAltitude &groundElevation) : m_correspondingCallsign(correspondingCallsign), @@ -38,6 +41,7 @@ namespace BlackMisc m_bank(bank), m_groundSpeed(gs), m_groundElevation(groundElevation) { m_correspondingCallsign.setTypeHint(CCallsign::Aircraft); + m_pressureAltitude = position.geodeticHeight().toPressureAltitude(CPressure(1013.25, CPressureUnit::mbar())); } QString CAircraftSituation::convertToQString(bool i18n) const @@ -219,6 +223,12 @@ namespace BlackMisc return this->getGroundElevation(); } + void CAircraftSituation::setPressureAltitude(const CAltitude &altitude) + { + Q_ASSERT(altitude.getAltitudeType() == CAltitude::PressureAltitude); + m_pressureAltitude = altitude; + } + void CAircraftSituation::setCallsign(const CCallsign &callsign) { m_correspondingCallsign = callsign; diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index 1af33d3eb..a8a22b4fc 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -187,6 +187,12 @@ namespace BlackMisc //! Set altitude void setAltitude(const CAltitude &altitude) { m_position.setGeodeticHeight(altitude); } + //! Get pressure altitude + const CAltitude &getPressureAltitude() const { return m_pressureAltitude; } + + //! Set pressure altitude + void setPressureAltitude(const CAltitude &altitude); + //! Get pitch const PhysicalQuantities::CAngle &getPitch() const { return m_pitch; } @@ -238,6 +244,7 @@ namespace BlackMisc private: CCallsign m_correspondingCallsign; Geo::CCoordinateGeodetic m_position; + Aviation::CAltitude m_pressureAltitude { 0, nullptr }; CHeading m_heading; PhysicalQuantities::CAngle m_pitch; PhysicalQuantities::CAngle m_bank; @@ -252,6 +259,7 @@ namespace BlackMisc CAircraftSituation, BLACK_METAMEMBER(correspondingCallsign), BLACK_METAMEMBER(position), + BLACK_METAMEMBER(pressureAltitude), BLACK_METAMEMBER(heading), BLACK_METAMEMBER(pitch), BLACK_METAMEMBER(bank), diff --git a/src/blackmisc/aviation/altitude.cpp b/src/blackmisc/aviation/altitude.cpp index 982d1848e..8fcaf4e91 100644 --- a/src/blackmisc/aviation/altitude.cpp +++ b/src/blackmisc/aviation/altitude.cpp @@ -64,11 +64,11 @@ namespace BlackMisc void CAltitude::convertToPressureAltitude(const CPressure &seaLevelPressure) { if (m_altitudeType == PressureAltitude) { return; } - static const CPressure standardPressure(1013.25, CPressureUnit::mbar()); - const CPressure delta = (standardPressure - seaLevelPressure); - double deltaV = delta.value(CPressureUnit::mbar()); - deltaV *= 30.0; - addValueSameUnit(deltaV); + const CPressure deltaPressure = standardISASeaLevelPressure() - seaLevelPressure; + const double deltaPressureV = deltaPressure.value(CPressureUnit::mbar()); + const double deltaAltitudeV = deltaPressureV * 30.0; // 30.0 ft per mbar + CLength deltaAltitude(deltaAltitudeV, CLengthUnit::ft()); + *this += deltaAltitude; m_altitudeType = PressureAltitude; } diff --git a/src/blackmisc/simulation/simulatedaircraft.h b/src/blackmisc/simulation/simulatedaircraft.h index 1454b0dbd..61e588e45 100644 --- a/src/blackmisc/simulation/simulatedaircraft.h +++ b/src/blackmisc/simulation/simulatedaircraft.h @@ -185,6 +185,12 @@ namespace BlackMisc //! Set altitude void setAltitude(const BlackMisc::Aviation::CAltitude &altitude) { m_situation.setAltitude(altitude); } + //! Get pressure altitude + const BlackMisc::Aviation::CAltitude &getPressureAltitude() const { return m_situation.getPressureAltitude(); } + + //! Set pressure altitude + void setPressureAltitude(const BlackMisc::Aviation::CAltitude &altitude) { m_situation.setPressureAltitude(altitude); } + //! Get groundspeed const BlackMisc::PhysicalQuantities::CSpeed &getGroundSpeed() const { return m_situation.getGroundSpeed(); } diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index 55db61646..074d16b70 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -397,6 +397,7 @@ namespace BlackSimPlugin simDataOwnAircraft.getCom2System(), simDataOwnAircraft.getTransponder(), this->identifier()); + this->updateOwnSituation(simDataOwnAircraft.getSituation()); reverseLookupAndUpdateOwnAircraftModel(simDataOwnAircraft.getModelString()); } diff --git a/src/plugins/simulator/fscommon/fsuipcimpl.cpp b/src/plugins/simulator/fscommon/fsuipcimpl.cpp index f5057dfde..5bfea072c 100644 --- a/src/plugins/simulator/fscommon/fsuipcimpl.cpp +++ b/src/plugins/simulator/fscommon/fsuipcimpl.cpp @@ -267,6 +267,7 @@ namespace BlackSimPlugin qint8 xpdrModeSb3Raw = 0, xpdrIdentSb3Raw = 0; qint32 groundspeedRaw = 0, pitchRaw = 0, bankRaw = 0, headingRaw = 0; qint64 altitudeRaw = 0; + double pressureAltitudeRaw = 0; // 34B0 qint32 groundAltitudeRaw = 0; qint64 latitudeRaw = 0, longitudeRaw = 0; qint16 lightsRaw = 0; @@ -311,6 +312,7 @@ namespace BlackSimPlugin (situationN || FSUIPC_Read(0x0560, 8, &latitudeRaw, &dwResult)) && (situationN || FSUIPC_Read(0x0568, 8, &longitudeRaw, &dwResult)) && (situationN || FSUIPC_Read(0x0020, 4, &groundAltitudeRaw, &dwResult)) && + (situationN || FSUIPC_Read(0x34B0, 8, &pressureAltitudeRaw, &dwResult)) && // model name FSUIPC_Read(0x3d00, 256, &modelNameRaw, &dwResult) && @@ -402,11 +404,13 @@ namespace BlackSimPlugin CHeading heading = CHeading(headingRaw * angleCorrectionFactor, CHeading::True, CAngleUnit::deg()); CSpeed groundspeed(groundspeedRaw / 65536.0, CSpeedUnit::m_s()); CAltitude altitude(altitudeRaw / (65536.0 * 65536.0), CAltitude::MeanSeaLevel, CLengthUnit::m()); + CAltitude pressureAltitude(pressureAltitudeRaw, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m()); situation.setBank(bank); situation.setHeading(heading); situation.setPitch(pitch); situation.setGroundSpeed(groundspeed); situation.setAltitude(altitude); + situation.setPressureAltitude(pressureAltitude); aircraft.setSituation(situation); } // situation diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index 322cb4b14..0b751ceac 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -38,6 +38,7 @@ namespace BlackSimPlugin hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PLANE LONGITUDE", "Degrees"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PLANE ALTITUDE", "Feet"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PLANE ALT ABOVE GROUND", "Feet"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PRESSURE ALTITUDE", "Meters"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "STATIC CG TO GROUND", "Feet"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PLANE HEADING DEGREES TRUE", "Degrees"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "PLANE PITCH DEGREES", "Degrees"); @@ -65,6 +66,7 @@ namespace BlackSimPlugin hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "GENERAL ENG COMBUSTION:2", "Bool"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "GENERAL ENG COMBUSTION:3", "Bool"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "GENERAL ENG COMBUSTION:4", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraftTitle, "TITLE", NULL, SIMCONNECT_DATATYPE_STRING256); if (hr != S_OK) { diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index dbdc4521a..141e63b61 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -28,17 +28,18 @@ namespace BlackSimPlugin //! \sa SimConnect events http://msdn.microsoft.com/en-us/library/cc526980.aspx struct DataDefinitionOwnAircraft { - double latitude; //!< Latitude (deg) - double longitude; //!< Longitude (deg) - double altitude; //!< Altitude (ft) - double altitudeAGL; //!< Altitude above ground (ft) - double cgToGround; //!< Static CG to ground (ft) - double trueHeading; //!< True heading (deg) - double pitch; //!< Pitch (deg) - double bank; //!< Bank (deg) - double velocity; //!< Ground velocity - double elevation; //!< Elevation (ft) - double simOnGround; //!< Is aircraft on ground? + double latitude; //!< Latitude (deg) + double longitude; //!< Longitude (deg) + double altitude; //!< Altitude (ft) + double altitudeAGL; //!< Altitude above ground (ft) + double pressureAltitude; //!< Pressure altitude (m) + double cgToGround; //!< Static CG to ground (ft) + double trueHeading; //!< True heading (deg) + double pitch; //!< Pitch (deg) + double bank; //!< Bank (deg) + double velocity; //!< Ground velocity + double elevation; //!< Elevation (ft) + double simOnGround; //!< Is aircraft on ground? double lightStrobe; //!< Is strobe light on? double lightLanding; //!< Is landing light on? diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 9034da05e..1e76059f2 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -371,6 +371,7 @@ namespace BlackSimPlugin aircraftSituation.setGroundSpeed(CSpeed(simulatorOwnAircraft.velocity, CSpeedUnit::kts())); aircraftSituation.setGroundElevation(CAltitude(simulatorOwnAircraft.elevation, CAltitude::MeanSeaLevel, CLengthUnit::ft())); aircraftSituation.setAltitude(CAltitude(simulatorOwnAircraft.altitude, CAltitude::MeanSeaLevel, CLengthUnit::ft())); + aircraftSituation.setPressureAltitude(CAltitude(simulatorOwnAircraft.pressureAltitude, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m())); const CAircraftLights lights(simulatorOwnAircraft.lightStrobe, simulatorOwnAircraft.lightLanding, diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index d885cff2f..64318a040 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -179,7 +179,7 @@ namespace BlackSimPlugin { case CSimConnectDefinitions::RequestOwnAircraft: { - static_assert(sizeof(DataDefinitionOwnAircraft) == 30 * sizeof(double), "DataDefinitionOwnAircraft has an incorrect size."); + static_assert(sizeof(DataDefinitionOwnAircraft) == 31 * sizeof(double), "DataDefinitionOwnAircraft has an incorrect size."); const DataDefinitionOwnAircraft *ownAircaft = (DataDefinitionOwnAircraft *)&pObjData->dwData; simulatorFsxP3D->updateOwnAircraftFromSimulator(*ownAircaft); break; diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 10f3868e5..e108ca2cc 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -153,10 +153,15 @@ namespace BlackSimPlugin m_service->getTransponderModeAsync(&m_xplaneData.xpdrMode); m_service->getTransponderIdentAsync(&m_xplaneData.xpdrIdent); m_service->getAllWheelsOnGroundAsync(&m_xplaneData.onGroundAll); + m_service->getQNHAsync(&m_xplaneData.seaLeveLPressure); CAircraftSituation situation; situation.setPosition({ m_xplaneData.latitude, m_xplaneData.longitude, 0 }); + CAltitude altitude { m_xplaneData.altitude, CAltitude::MeanSeaLevel, CLengthUnit::m() }; situation.setAltitude({ m_xplaneData.altitude, CAltitude::MeanSeaLevel, CLengthUnit::m() }); + CPressure seaLevelPressure({ m_xplaneData.seaLeveLPressure, CPressureUnit::inHg() }); + CAltitude pressureAltitude(altitude.toPressureAltitude(seaLevelPressure)); + situation.setPressureAltitude(pressureAltitude); situation.setHeading({ m_xplaneData.trueHeading, CHeading::True, CAngleUnit::deg() }); situation.setPitch({ m_xplaneData.pitch, CAngleUnit::deg() }); situation.setBank({ m_xplaneData.roll, CAngleUnit::deg() }); diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index 5597500b6..3d60c8808 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -182,12 +182,13 @@ namespace BlackSimPlugin double gearReployRatio; QList enginesN1Percentage; double speedBrakeRatio; + double seaLeveLPressure; } m_xplaneData; void resetData() { m_xplaneData = { "", "", 0, 0, 0, 0, 0, 0, 0, false, 122800, 122800, 122800, 122800, 2000, 0, false, false, false, false, - false, false, 0, 0, {}, false + false, false, 0, 0, {}, 0.0, 0.0 }; } diff --git a/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp b/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp index 5c635d600..6c2982880 100644 --- a/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp @@ -376,6 +376,17 @@ namespace BlackSimPlugin } + double CXSwiftBusServiceProxy::getQNH() const + { + return m_dbusInterface->callDBusRet(QLatin1String("getQNH")); + } + + void CXSwiftBusServiceProxy::getQNHAsync(double *o_qnh) + { + m_dbusInterface->callDBusAsync(QLatin1String("getQNH"), setterCallback(o_qnh)); + } + + void CXSwiftBusServiceProxy::setCom1Active(int freq) { m_dbusInterface->callDBus(QLatin1String("setCom1Active"), freq); diff --git a/src/plugins/simulator/xplane/xswiftbusserviceproxy.h b/src/plugins/simulator/xplane/xswiftbusserviceproxy.h index 6b78d72d5..f954e1643 100644 --- a/src/plugins/simulator/xplane/xswiftbusserviceproxy.h +++ b/src/plugins/simulator/xplane/xswiftbusserviceproxy.h @@ -319,12 +319,17 @@ namespace BlackSimPlugin //! @} //! \copydoc XSwiftBus::CService::getTaxiLightsOn - //! @{ bool getTaxiLightsOn() const; void getTaxiLightsOnAsync(bool *o_taxiLightsOn); //! @} + //! \copydoc XSwiftBus::CService::getQNH + //! @{ + double getQNH() const; + void getQNHAsync(double *o_qnh); + //! @} + //! \copydoc XSwiftBus::CService::setCom1Active void setCom1Active(int freq); diff --git a/src/swiftguistandard/swiftguistd.h b/src/swiftguistandard/swiftguistd.h index 00c04590e..25bfa980a 100644 --- a/src/swiftguistandard/swiftguistd.h +++ b/src/swiftguistandard/swiftguistd.h @@ -148,7 +148,7 @@ private: //! \param wgsLatitude WGS latitude //! \param wgsLongitude WGS longitude //! \param altitude - void setTestPosition(const QString &wgsLatitude, const QString &wgsLongitude, const BlackMisc::Aviation::CAltitude &altitude); + void setTestPosition(const QString &wgsLatitude, const QString &wgsLongitude, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CAltitude &pressureAltitude); //! Is given main page selected? //! \param mainPage index to be checked diff --git a/src/swiftguistandard/swiftguistdaircraft.cpp b/src/swiftguistandard/swiftguistdaircraft.cpp index 22722117b..44d03bc6a 100644 --- a/src/swiftguistandard/swiftguistdaircraft.cpp +++ b/src/swiftguistandard/swiftguistdaircraft.cpp @@ -47,7 +47,7 @@ bool SwiftGuiStd::reloadOwnAircraft() return changed; } -void SwiftGuiStd::setTestPosition(const QString &wgsLatitude, const QString &wgsLongitude, const CAltitude &altitude) +void SwiftGuiStd::setTestPosition(const QString &wgsLatitude, const QString &wgsLongitude, const CAltitude &altitude, const CAltitude &pressureAltitude) { CCoordinateGeodetic coordinate( CLatitude::fromWgs84(wgsLatitude), @@ -56,5 +56,5 @@ void SwiftGuiStd::setTestPosition(const QString &wgsLatitude, const QString &wgs m_ownAircraft.setPosition(coordinate); m_ownAircraft.setAltitude(altitude); - sGui->getIContextOwnAircraft()->updateOwnPosition(coordinate, altitude); + sGui->getIContextOwnAircraft()->updateOwnPosition(coordinate, altitude, pressureAltitude); } diff --git a/src/swiftguistandard/swiftguistdmenus.cpp b/src/swiftguistandard/swiftguistdmenus.cpp index e94ca5808..a39e14d7b 100644 --- a/src/swiftguistandard/swiftguistdmenus.cpp +++ b/src/swiftguistandard/swiftguistdmenus.cpp @@ -37,23 +37,33 @@ void SwiftGuiStd::onMenuClicked() QObject *sender = QObject::sender(); if (sender == ui->menu_TestLocationsEDRY) { - this->setTestPosition("N 049° 18' 17", "E 008° 27' 05", CAltitude(312, CAltitude::MeanSeaLevel, CLengthUnit::ft())); + this->setTestPosition("N 049° 18' 17", "E 008° 27' 05", + CAltitude(312, CAltitude::MeanSeaLevel, CLengthUnit::ft()), + CAltitude(312, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::ft())); } else if (sender == ui->menu_TestLocationsEDNX) { - this->setTestPosition("N 048° 14′ 22", "E 011° 33′ 41", CAltitude(486, CAltitude::MeanSeaLevel, CLengthUnit::m())); + this->setTestPosition("N 048° 14′ 22", "E 011° 33′ 41", + CAltitude(486, CAltitude::MeanSeaLevel, CLengthUnit::m()), + CAltitude(486, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m())); } else if (sender == ui->menu_TestLocationsEDDM) { - this->setTestPosition("N 048° 21′ 14", "E 011° 47′ 10", CAltitude(448, CAltitude::MeanSeaLevel, CLengthUnit::m())); + this->setTestPosition("N 048° 21′ 14", "E 011° 47′ 10", + CAltitude(448, CAltitude::MeanSeaLevel, CLengthUnit::m()), + CAltitude(448, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m())); } else if (sender == ui->menu_TestLocationsEDDF) { - this->setTestPosition("N 50° 2′ 0", "E 8° 34′ 14", CAltitude(100, CAltitude::MeanSeaLevel, CLengthUnit::m())); + this->setTestPosition("N 50° 2′ 0", "E 8° 34′ 14", + CAltitude(100, CAltitude::MeanSeaLevel, CLengthUnit::m()), + CAltitude(100, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m())); } else if (sender == ui->menu_TestLocationsLOWW) { - this->setTestPosition("N 48° 7′ 6.3588", "E 16° 33′ 39.924", CAltitude(100, CAltitude::MeanSeaLevel, CLengthUnit::m())); + this->setTestPosition("N 48° 7′ 6.3588", "E 16° 33′ 39.924", + CAltitude(100, CAltitude::MeanSeaLevel, CLengthUnit::m()), + CAltitude(100, CAltitude::MeanSeaLevel, CAltitude::PressureAltitude, CLengthUnit::m())); } else if (sender == ui->menu_WindowFont) { diff --git a/src/xswiftbus/service.h b/src/xswiftbus/service.h index 8482ea984..98c9615c6 100644 --- a/src/xswiftbus/service.h +++ b/src/xswiftbus/service.h @@ -194,6 +194,9 @@ namespace XSwiftBus //! Get whether taxi lights are on bool getTaxiLightsOn() const { return m_taxiLightsOn.get(); } + //! Get barometric pressure at sea level in inches of mercury. + double getQNH() const { return m_qnhInhg.get(); } + //! Set the current COM1 active frequency in kHz void setCom1Active(int freq) { m_com1Active.set(freq / 10); } @@ -275,6 +278,7 @@ namespace XSwiftBus DataRef m_numberOfEngines; ArrayDataRef m_enginesN1Percentage; DataRef m_speedBrakeRatio; + DataRef m_qnhInhg; }; } diff --git a/tests/blackmisc/testaviation.cpp b/tests/blackmisc/testaviation.cpp index c061ad6d5..ba88495cc 100644 --- a/tests/blackmisc/testaviation.cpp +++ b/tests/blackmisc/testaviation.cpp @@ -203,6 +203,19 @@ namespace BlackMiscTest QVERIFY2(atc1 != atc3, "ATC stations shall not be equal"); } + void CTestAviation::altitude() + { + CAltitude altitude1(448, CAltitude::MeanSeaLevel, CLengthUnit::ft()); + CPressure seaLevelPressure1(1025, CPressureUnit::mbar()); + CAltitude pressureAltitude1 = altitude1.toPressureAltitude(seaLevelPressure1); + QCOMPARE(pressureAltitude1.value(CLengthUnit::ft()), 95.5); + + CAltitude altitude2(500, CAltitude::MeanSeaLevel, CLengthUnit::m()); + CPressure seaLevelPressure2(29.56, CPressureUnit::inHg()); + CAltitude pressureAltitude2 = altitude2.toPressureAltitude(seaLevelPressure2); + QCOMPARE(qRound(pressureAltitude2.value(CLengthUnit::m())), 612); + } + } // namespace //! \endcond diff --git a/tests/blackmisc/testaviation.h b/tests/blackmisc/testaviation.h index 467b3d925..2e9351517 100644 --- a/tests/blackmisc/testaviation.h +++ b/tests/blackmisc/testaviation.h @@ -47,6 +47,9 @@ namespace BlackMiscTest //! Testing copying and equality of objects void copyAndEqual(); + + //! CAltitude tests + void altitude(); }; } // namespace