From 51a90a9a71867509f73d1f125aa466957065f0ca Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 12 Jan 2018 13:29:00 +0100 Subject: [PATCH] Differentiate between true and pressure altitude Altitude can have different meanings in aviation. So far all our altitudes were true altitudes. But now we also require pressure altitude including a conversion method between the two. Maniphest Tasks: T223 --- src/blackmisc/aviation/altitude.cpp | 21 +++++++++++++++++++-- src/blackmisc/aviation/altitude.h | 25 ++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/blackmisc/aviation/altitude.cpp b/src/blackmisc/aviation/altitude.cpp index 72c92e3a0..982d1848e 100644 --- a/src/blackmisc/aviation/altitude.cpp +++ b/src/blackmisc/aviation/altitude.cpp @@ -16,8 +16,7 @@ #include #include -using BlackMisc::PhysicalQuantities::CLength; -using BlackMisc::PhysicalQuantities::CLengthUnit; +using namespace BlackMisc::PhysicalQuantities; namespace BlackMisc { @@ -62,6 +61,24 @@ namespace BlackMisc this->m_datum = MeanSeaLevel; } + 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); + m_altitudeType = PressureAltitude; + } + + CAltitude CAltitude::toPressureAltitude(const CPressure &seaLevelPressure) const + { + CAltitude other(*this); + other.convertToPressureAltitude(seaLevelPressure); + return other; + } + void CAltitude::parseFromString(const QString &value) { this->parseFromString(value, PhysicalQuantities::CPqString::SeparatorsCLocale); diff --git a/src/blackmisc/aviation/altitude.h b/src/blackmisc/aviation/altitude.h index e4bea24e2..61eeef597 100644 --- a/src/blackmisc/aviation/altitude.h +++ b/src/blackmisc/aviation/altitude.h @@ -21,6 +21,7 @@ #include "blackmisc/dictionary.h" #include "blackmisc/icon.h" #include "blackmisc/metaclass.h" +#include "blackmisc/pq/pressure.h" #include "blackmisc/propertyindexvariantmap.h" #include "blackmisc/stringutils.h" #include "blackmisc/variant.h" @@ -71,6 +72,13 @@ namespace BlackMisc FlightLevel //!< Flight level }; + //! Altitude type + enum AltitudeType + { + PressureAltitude, //!< Altitude above the standard datum plane + TrueAltitude //!< Height of the airplane above Mean Sea Level (MSL) + }; + //! \copydoc BlackMisc::Mixin::String::toQString QString convertToQString(bool i18n = false) const; @@ -80,6 +88,9 @@ namespace BlackMisc //! Constructor CAltitude(double value, ReferenceDatum datum, const PhysicalQuantities::CLengthUnit &unit) : CLength(value, unit), m_datum(datum) {} + //! Constructor + CAltitude(double value, ReferenceDatum datum, AltitudeType type, const PhysicalQuantities::CLengthUnit &unit) : CLength(value, unit), m_datum(datum), m_altitudeType(type) {} + //! Constructor, value as CAltitude::MeanSeaLevel CAltitude(double value, const PhysicalQuantities::CLengthUnit &unit) : CLength(value, unit), m_datum(MeanSeaLevel) {} @@ -107,6 +118,15 @@ namespace BlackMisc //! Flightlevel to MSL void toMeanSeaLevel(); + //! Current altitude type + AltitudeType getAltitudeType() const { return m_altitudeType; } + + //! Converts this to pressure altitude. Requires the current barometric pressure at MSL + void convertToPressureAltitude(const PhysicalQuantities::CPressure &seaLevelPressure); + + //! Returns the altitude converted to pressure altitude. Requires the current barometric pressure at MSL + CAltitude toPressureAltitude(const PhysicalQuantities::CPressure &seaLevelPressure) const; + //! Parse value from string void parseFromString(const QString &value); @@ -150,10 +170,12 @@ namespace BlackMisc private: ReferenceDatum m_datum; //!< MSL or AGL? + AltitudeType m_altitudeType = TrueAltitude; BLACK_METACLASS( CAltitude, - BLACK_METAMEMBER(datum) + BLACK_METAMEMBER(datum), + BLACK_METAMEMBER(altitudeType) ); }; } // ns @@ -161,5 +183,6 @@ namespace BlackMisc Q_DECLARE_METATYPE(BlackMisc::Aviation::CAltitude) Q_DECLARE_METATYPE(BlackMisc::Aviation::CAltitude::ReferenceDatum) +Q_DECLARE_METATYPE(BlackMisc::Aviation::CAltitude::AltitudeType) #endif // guard