From 544a1cca45d6ba266e2c90e9e43fb8d66f64da80 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Wed, 14 Dec 2016 21:44:54 +0000 Subject: [PATCH] refs #837 Don't misuse coordinate height as ground elevation, use a separate member instead. --- src/blackcore/vatsim/networkvatlib.cpp | 9 ++++--- src/blackmisc/aviation/aircraftsituation.cpp | 19 +++++++------ src/blackmisc/aviation/aircraftsituation.h | 28 +++++++++++--------- src/blackmisc/simulation/simulatedaircraft.h | 7 ++--- tests/blackcore/testinterpolator.cpp | 8 +++--- 5 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/blackcore/vatsim/networkvatlib.cpp b/src/blackcore/vatsim/networkvatlib.cpp index 1289d6f60..15a076c62 100644 --- a/src/blackcore/vatsim/networkvatlib.cpp +++ b/src/blackcore/vatsim/networkvatlib.cpp @@ -800,12 +800,13 @@ namespace BlackCore // if altered in underlying classes, this change needs to be reverted CAircraftSituation situation( callsign, - CCoordinateGeodetic(position->latitude, position->longitude), // geodetic height -> null + CCoordinateGeodetic(position->latitude, position->longitude), CAltitude(position->altitudePressure, CAltitude::MeanSeaLevel, CLengthUnit::ft()), CHeading(position->heading, CHeading::True, CAngleUnit::deg()), CAngle(position->pitch, CAngleUnit::deg()), CAngle(position->bank, CAngleUnit::deg()), - CSpeed(position->groundSpeed, CSpeedUnit::kts()) + CSpeed(position->groundSpeed, CSpeedUnit::kts()), + CAltitude({ 0, nullptr }, CAltitude::MeanSeaLevel) ); situation.setCurrentUtcTime(); situation.setTimeOffsetMs(6000); @@ -882,8 +883,8 @@ namespace BlackCore CHeading(position->heading, CHeading::True, CAngleUnit::deg()), CAngle(position->pitch, CAngleUnit::deg()), CAngle(position->bank, CAngleUnit::deg()), - // There is no speed information in a interim packet - CSpeed(0.0, CSpeedUnit::kts()) + CSpeed(0.0, nullptr), // There is no speed information in a interim packet + CAltitude({ 0, nullptr }, CAltitude::MeanSeaLevel) ); situation.setCurrentUtcTime(); situation.setTimeOffsetMs(2000); diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 853de7839..9ae9fc4d0 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -24,14 +24,17 @@ namespace BlackMisc { namespace Aviation { - CAircraftSituation::CAircraftSituation(const CCoordinateGeodetic &position, const CAltitude &altitude, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs) - : m_position(position), m_altitude(altitude), m_heading(heading), m_pitch(pitch), - m_bank(bank), m_groundSpeed(gs) {} + CAircraftSituation::CAircraftSituation() + : m_groundElevation({ 0, nullptr }, CAltitude::MeanSeaLevel) {} - CAircraftSituation::CAircraftSituation(const CCallsign &correspondingCallsign, const CCoordinateGeodetic &position, const CAltitude &altitude, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs) + CAircraftSituation::CAircraftSituation(const CCoordinateGeodetic &position, const CAltitude &altitude, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CAltitude &groundElevation) + : m_position(position), m_altitude(altitude), m_heading(heading), m_pitch(pitch), + m_bank(bank), m_groundSpeed(gs), m_groundElevation(groundElevation) {} + + CAircraftSituation::CAircraftSituation(const CCallsign &correspondingCallsign, const CCoordinateGeodetic &position, const CAltitude &altitude, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs, const CAltitude &groundElevation) : m_correspondingCallsign(correspondingCallsign), m_position(position), m_altitude(altitude), m_heading(heading), m_pitch(pitch), - m_bank(bank), m_groundSpeed(gs) + m_bank(bank), m_groundSpeed(gs), m_groundElevation(groundElevation) { m_correspondingCallsign.setTypeHint(CCallsign::Aircraft); } @@ -43,6 +46,7 @@ namespace BlackMisc s.append(" bank: ").append(this->m_bank.toQString(i18n)); s.append(" pitch: ").append(this->m_pitch.toQString(i18n)); s.append(" gs: ").append(this->m_groundSpeed.toQString(i18n)); + s.append(" elevation: ").append(this->m_groundElevation.toQString(i18n)); s.append(" heading: ").append(this->m_heading.toQString(i18n)); s.append(" timestamp: ").append(this->getFormattedUtcTimestampDhms()); return s; @@ -181,18 +185,17 @@ namespace BlackMisc CLength CAircraftSituation::getHeightAboveGround() const { - static const CLength notAvialable(0, CLengthUnit::nullUnit()); if (this->m_altitude.getReferenceDatum() == CAltitude::AboveGround) { // we have a sure value return this->getAltitude(); } - const CLength gh(geodeticHeight()); + const CLength gh(getGroundElevation()); if (!gh.isNull() && !m_altitude.isNull()) { return m_altitude - gh; } - return notAvialable; + return { 0, nullptr }; } void CAircraftSituation::setCallsign(const CCallsign &callsign) diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index d9f550041..6e303495c 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -58,14 +58,15 @@ namespace BlackMisc }; //! Default constructor. - CAircraftSituation() {} + CAircraftSituation(); //! Comprehensive constructor CAircraftSituation(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const BlackMisc::Aviation::CHeading &heading = {}, const BlackMisc::PhysicalQuantities::CAngle &pitch = {}, const BlackMisc::PhysicalQuantities::CAngle &bank = {}, - const BlackMisc::PhysicalQuantities::CSpeed &gs = {}); + const BlackMisc::PhysicalQuantities::CSpeed &gs = {}, + const BlackMisc::Aviation::CAltitude &groundElevation = { { 0, nullptr }, BlackMisc::Aviation::CAltitude::MeanSeaLevel }); //! Comprehensive constructor CAircraftSituation(const BlackMisc::Aviation::CCallsign &correspondingCallsign, @@ -73,7 +74,8 @@ namespace BlackMisc const BlackMisc::Aviation::CHeading &heading = {}, const BlackMisc::PhysicalQuantities::CAngle &pitch = {}, const BlackMisc::PhysicalQuantities::CAngle &bank = {}, - const BlackMisc::PhysicalQuantities::CSpeed &gs = {}); + const BlackMisc::PhysicalQuantities::CSpeed &gs = {}, + const BlackMisc::Aviation::CAltitude &groundElevation = { { 0, nullptr }, BlackMisc::Aviation::CAltitude::MeanSeaLevel }); //! \copydoc BlackMisc::Mixin::Index::propertyByIndex CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; @@ -100,8 +102,11 @@ namespace BlackMisc virtual bool isOnGroundGuessed() const; //! \copydoc Geo::ICoordinateGeodetic::geodeticHeight - //! \remarks this should be used for elevation as depicted here: http://en.wikipedia.org/wiki/Altitude#mediaviewer/File:Vertical_distances.svg - const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override { return this->m_position.geodeticHeight(); } + const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override + { + static const BlackMisc::PhysicalQuantities::CLength gh { 0, nullptr }; + return gh; + } //! \copydoc Geo::ICoordinateGeodetic::normalVector virtual QVector3D normalVector() const override { return this->m_position.normalVector(); } @@ -109,16 +114,13 @@ namespace BlackMisc //! \copydoc Geo::ICoordinateGeodetic::normalVectorDouble virtual std::array normalVectorDouble() const override { return this->m_position.normalVectorDouble(); } - //! Elevation - //! \sa geodeticHeight - const BlackMisc::PhysicalQuantities::CLength getElevation() const { return this->geodeticHeight(); } + //! Elevation of the ground directly beneath + const BlackMisc::Aviation::CAltitude &getGroundElevation() const { return this->m_groundElevation; } - //! Elevation - //! \sa setGeodeticHeight - void setElevation(const BlackMisc::PhysicalQuantities::CLength &elevation) { return this->m_position.setGeodeticHeight(elevation); } + //! Elevation of the ground directly beneath + void setGroundElevation(const BlackMisc::Aviation::CAltitude &elevation) { this->m_groundElevation = elevation; } //! Height above ground. - //! Do not confuse with elevation (=geodeticHeight) as in \sa geodeticHeight() / \sa getElevation() BlackMisc::PhysicalQuantities::CLength getHeightAboveGround() const; //! Get heading @@ -183,6 +185,7 @@ namespace BlackMisc BlackMisc::PhysicalQuantities::CAngle m_pitch; BlackMisc::PhysicalQuantities::CAngle m_bank; BlackMisc::PhysicalQuantities::CSpeed m_groundSpeed; + BlackMisc::Aviation::CAltitude m_groundElevation; qint64 m_timeOffsetMs = 0; bool m_isInterim = false; @@ -195,6 +198,7 @@ namespace BlackMisc BLACK_METAMEMBER(pitch), BLACK_METAMEMBER(bank), BLACK_METAMEMBER(groundSpeed), + BLACK_METAMEMBER(groundElevation), BLACK_METAMEMBER(timestampMSecsSinceEpoch), BLACK_METAMEMBER(timeOffsetMs), BLACK_METAMEMBER(isInterim) diff --git a/src/blackmisc/simulation/simulatedaircraft.h b/src/blackmisc/simulation/simulatedaircraft.h index 400b30cb8..1f154ef67 100644 --- a/src/blackmisc/simulation/simulatedaircraft.h +++ b/src/blackmisc/simulation/simulatedaircraft.h @@ -195,7 +195,6 @@ namespace BlackMisc virtual BlackMisc::Geo::CLongitude longitude() const override { return this->m_situation.longitude(); } //! \copydoc BlackMisc::Geo::ICoordinateGeodetic::geodeticHeight - //! \remarks this should be used for elevation as depicted here: http://en.wikipedia.org/wiki/Altitude#mediaviewer/File:Vertical_distances.svg const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override { return this->m_situation.geodeticHeight(); } //! \copydoc BlackMisc::Geo::ICoordinateGeodetic::normalVector @@ -205,12 +204,10 @@ namespace BlackMisc virtual std::array normalVectorDouble() const override { return this->m_situation.normalVectorDouble(); } //! Elevation - //! \sa geodeticHeight - const BlackMisc::PhysicalQuantities::CLength getElevation() const { return this->geodeticHeight(); } + const BlackMisc::Aviation::CAltitude &getGroundElevation() const { return this->m_situation.getGroundElevation(); } //! Elevation - //! \sa setGeodeticHeight - void setElevation(const BlackMisc::PhysicalQuantities::CLength &elevation) { return this->m_situation.setElevation(elevation); } + void setGroundElevation(const BlackMisc::Aviation::CAltitude &elevation) { return this->m_situation.setGroundElevation(elevation); } //! Get heading const BlackMisc::Aviation::CHeading &getHeading() const { return this->m_situation.getHeading(); } diff --git a/tests/blackcore/testinterpolator.cpp b/tests/blackcore/testinterpolator.cpp index b9f78209a..dd9ed2ff7 100644 --- a/tests/blackcore/testinterpolator.cpp +++ b/tests/blackcore/testinterpolator.cpp @@ -69,7 +69,7 @@ namespace BlackCoreTest CAircraftSituation s(getTestSituation(cs, i, ts, deltaT, offset)); // check height above ground - CLength hag = (s.getAltitude() - s.geodeticHeight()); + CLength hag = (s.getAltitude() - s.getGroundElevation()); QVERIFY2(s.getHeightAboveGround() == hag, "Wrong elevation"); provider->insertNewSituation(s); } @@ -162,13 +162,13 @@ namespace BlackCoreTest CAltitude a(number, CAltitude::MeanSeaLevel, CLengthUnit::m()); CLatitude lat(number, CAngleUnit::deg()); CLongitude lng(180.0 + number, CAngleUnit::deg()); - CLength height(0, CLengthUnit::m()); CHeading heading(number * 10, CHeading::True, CAngleUnit::deg()); CAngle bank(number, CAngleUnit::deg()); CAngle pitch(number, CAngleUnit::deg()); CSpeed gs(number * 10, CSpeedUnit::km_h()); - CCoordinateGeodetic c(lat, lng, height); - CAircraftSituation s(callsign, c, a, heading, pitch, bank, gs); + CAltitude gndElev({ 0, CLengthUnit::m() }, CAltitude::MeanSeaLevel); + CCoordinateGeodetic c(lat, lng, {}); + CAircraftSituation s(callsign, c, a, heading, pitch, bank, gs, gndElev); s.setMSecsSinceEpoch(ts - deltaT * number); // values in past s.setTimeOffsetMs(offset); return s;