refs #837 Don't misuse coordinate height as ground elevation, use a separate member instead.

This commit is contained in:
Mathew Sutcliffe
2016-12-14 21:44:54 +00:00
parent b252673928
commit 544a1cca45
5 changed files with 38 additions and 33 deletions

View File

@@ -800,12 +800,13 @@ namespace BlackCore
// if altered in underlying classes, this change needs to be reverted // if altered in underlying classes, this change needs to be reverted
CAircraftSituation situation( CAircraftSituation situation(
callsign, callsign,
CCoordinateGeodetic(position->latitude, position->longitude), // geodetic height -> null CCoordinateGeodetic(position->latitude, position->longitude),
CAltitude(position->altitudePressure, CAltitude::MeanSeaLevel, CLengthUnit::ft()), CAltitude(position->altitudePressure, CAltitude::MeanSeaLevel, CLengthUnit::ft()),
CHeading(position->heading, CHeading::True, CAngleUnit::deg()), CHeading(position->heading, CHeading::True, CAngleUnit::deg()),
CAngle(position->pitch, CAngleUnit::deg()), CAngle(position->pitch, CAngleUnit::deg()),
CAngle(position->bank, 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.setCurrentUtcTime();
situation.setTimeOffsetMs(6000); situation.setTimeOffsetMs(6000);
@@ -882,8 +883,8 @@ namespace BlackCore
CHeading(position->heading, CHeading::True, CAngleUnit::deg()), CHeading(position->heading, CHeading::True, CAngleUnit::deg()),
CAngle(position->pitch, CAngleUnit::deg()), CAngle(position->pitch, CAngleUnit::deg()),
CAngle(position->bank, CAngleUnit::deg()), CAngle(position->bank, CAngleUnit::deg()),
// There is no speed information in a interim packet CSpeed(0.0, nullptr), // There is no speed information in a interim packet
CSpeed(0.0, CSpeedUnit::kts()) CAltitude({ 0, nullptr }, CAltitude::MeanSeaLevel)
); );
situation.setCurrentUtcTime(); situation.setCurrentUtcTime();
situation.setTimeOffsetMs(2000); situation.setTimeOffsetMs(2000);

View File

@@ -24,14 +24,17 @@ namespace BlackMisc
{ {
namespace Aviation namespace Aviation
{ {
CAircraftSituation::CAircraftSituation(const CCoordinateGeodetic &position, const CAltitude &altitude, const CHeading &heading, const CAngle &pitch, const CAngle &bank, const CSpeed &gs) CAircraftSituation::CAircraftSituation()
: m_position(position), m_altitude(altitude), m_heading(heading), m_pitch(pitch), : m_groundElevation({ 0, nullptr }, CAltitude::MeanSeaLevel) {}
m_bank(bank), m_groundSpeed(gs) {}
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_correspondingCallsign(correspondingCallsign),
m_position(position), m_altitude(altitude), m_heading(heading), m_pitch(pitch), 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); m_correspondingCallsign.setTypeHint(CCallsign::Aircraft);
} }
@@ -43,6 +46,7 @@ namespace BlackMisc
s.append(" bank: ").append(this->m_bank.toQString(i18n)); s.append(" bank: ").append(this->m_bank.toQString(i18n));
s.append(" pitch: ").append(this->m_pitch.toQString(i18n)); s.append(" pitch: ").append(this->m_pitch.toQString(i18n));
s.append(" gs: ").append(this->m_groundSpeed.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(" heading: ").append(this->m_heading.toQString(i18n));
s.append(" timestamp: ").append(this->getFormattedUtcTimestampDhms()); s.append(" timestamp: ").append(this->getFormattedUtcTimestampDhms());
return s; return s;
@@ -181,18 +185,17 @@ namespace BlackMisc
CLength CAircraftSituation::getHeightAboveGround() const CLength CAircraftSituation::getHeightAboveGround() const
{ {
static const CLength notAvialable(0, CLengthUnit::nullUnit());
if (this->m_altitude.getReferenceDatum() == CAltitude::AboveGround) if (this->m_altitude.getReferenceDatum() == CAltitude::AboveGround)
{ {
// we have a sure value // we have a sure value
return this->getAltitude(); return this->getAltitude();
} }
const CLength gh(geodeticHeight()); const CLength gh(getGroundElevation());
if (!gh.isNull() && !m_altitude.isNull()) if (!gh.isNull() && !m_altitude.isNull())
{ {
return m_altitude - gh; return m_altitude - gh;
} }
return notAvialable; return { 0, nullptr };
} }
void CAircraftSituation::setCallsign(const CCallsign &callsign) void CAircraftSituation::setCallsign(const CCallsign &callsign)

View File

@@ -58,14 +58,15 @@ namespace BlackMisc
}; };
//! Default constructor. //! Default constructor.
CAircraftSituation() {} CAircraftSituation();
//! Comprehensive constructor //! Comprehensive constructor
CAircraftSituation(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, CAircraftSituation(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude,
const BlackMisc::Aviation::CHeading &heading = {}, const BlackMisc::Aviation::CHeading &heading = {},
const BlackMisc::PhysicalQuantities::CAngle &pitch = {}, const BlackMisc::PhysicalQuantities::CAngle &pitch = {},
const BlackMisc::PhysicalQuantities::CAngle &bank = {}, 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 //! Comprehensive constructor
CAircraftSituation(const BlackMisc::Aviation::CCallsign &correspondingCallsign, CAircraftSituation(const BlackMisc::Aviation::CCallsign &correspondingCallsign,
@@ -73,7 +74,8 @@ namespace BlackMisc
const BlackMisc::Aviation::CHeading &heading = {}, const BlackMisc::Aviation::CHeading &heading = {},
const BlackMisc::PhysicalQuantities::CAngle &pitch = {}, const BlackMisc::PhysicalQuantities::CAngle &pitch = {},
const BlackMisc::PhysicalQuantities::CAngle &bank = {}, 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 //! \copydoc BlackMisc::Mixin::Index::propertyByIndex
CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const;
@@ -100,8 +102,11 @@ namespace BlackMisc
virtual bool isOnGroundGuessed() const; virtual bool isOnGroundGuessed() const;
//! \copydoc Geo::ICoordinateGeodetic::geodeticHeight //! \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
const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override { return this->m_position.geodeticHeight(); } {
static const BlackMisc::PhysicalQuantities::CLength gh { 0, nullptr };
return gh;
}
//! \copydoc Geo::ICoordinateGeodetic::normalVector //! \copydoc Geo::ICoordinateGeodetic::normalVector
virtual QVector3D normalVector() const override { return this->m_position.normalVector(); } virtual QVector3D normalVector() const override { return this->m_position.normalVector(); }
@@ -109,16 +114,13 @@ namespace BlackMisc
//! \copydoc Geo::ICoordinateGeodetic::normalVectorDouble //! \copydoc Geo::ICoordinateGeodetic::normalVectorDouble
virtual std::array<double, 3> normalVectorDouble() const override { return this->m_position.normalVectorDouble(); } virtual std::array<double, 3> normalVectorDouble() const override { return this->m_position.normalVectorDouble(); }
//! Elevation //! Elevation of the ground directly beneath
//! \sa geodeticHeight const BlackMisc::Aviation::CAltitude &getGroundElevation() const { return this->m_groundElevation; }
const BlackMisc::PhysicalQuantities::CLength getElevation() const { return this->geodeticHeight(); }
//! Elevation //! Elevation of the ground directly beneath
//! \sa setGeodeticHeight void setGroundElevation(const BlackMisc::Aviation::CAltitude &elevation) { this->m_groundElevation = elevation; }
void setElevation(const BlackMisc::PhysicalQuantities::CLength &elevation) { return this->m_position.setGeodeticHeight(elevation); }
//! Height above ground. //! Height above ground.
//! Do not confuse with elevation (=geodeticHeight) as in \sa geodeticHeight() / \sa getElevation()
BlackMisc::PhysicalQuantities::CLength getHeightAboveGround() const; BlackMisc::PhysicalQuantities::CLength getHeightAboveGround() const;
//! Get heading //! Get heading
@@ -183,6 +185,7 @@ namespace BlackMisc
BlackMisc::PhysicalQuantities::CAngle m_pitch; BlackMisc::PhysicalQuantities::CAngle m_pitch;
BlackMisc::PhysicalQuantities::CAngle m_bank; BlackMisc::PhysicalQuantities::CAngle m_bank;
BlackMisc::PhysicalQuantities::CSpeed m_groundSpeed; BlackMisc::PhysicalQuantities::CSpeed m_groundSpeed;
BlackMisc::Aviation::CAltitude m_groundElevation;
qint64 m_timeOffsetMs = 0; qint64 m_timeOffsetMs = 0;
bool m_isInterim = false; bool m_isInterim = false;
@@ -195,6 +198,7 @@ namespace BlackMisc
BLACK_METAMEMBER(pitch), BLACK_METAMEMBER(pitch),
BLACK_METAMEMBER(bank), BLACK_METAMEMBER(bank),
BLACK_METAMEMBER(groundSpeed), BLACK_METAMEMBER(groundSpeed),
BLACK_METAMEMBER(groundElevation),
BLACK_METAMEMBER(timestampMSecsSinceEpoch), BLACK_METAMEMBER(timestampMSecsSinceEpoch),
BLACK_METAMEMBER(timeOffsetMs), BLACK_METAMEMBER(timeOffsetMs),
BLACK_METAMEMBER(isInterim) BLACK_METAMEMBER(isInterim)

View File

@@ -195,7 +195,6 @@ namespace BlackMisc
virtual BlackMisc::Geo::CLongitude longitude() const override { return this->m_situation.longitude(); } virtual BlackMisc::Geo::CLongitude longitude() const override { return this->m_situation.longitude(); }
//! \copydoc BlackMisc::Geo::ICoordinateGeodetic::geodeticHeight //! \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(); } const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override { return this->m_situation.geodeticHeight(); }
//! \copydoc BlackMisc::Geo::ICoordinateGeodetic::normalVector //! \copydoc BlackMisc::Geo::ICoordinateGeodetic::normalVector
@@ -205,12 +204,10 @@ namespace BlackMisc
virtual std::array<double, 3> normalVectorDouble() const override { return this->m_situation.normalVectorDouble(); } virtual std::array<double, 3> normalVectorDouble() const override { return this->m_situation.normalVectorDouble(); }
//! Elevation //! Elevation
//! \sa geodeticHeight const BlackMisc::Aviation::CAltitude &getGroundElevation() const { return this->m_situation.getGroundElevation(); }
const BlackMisc::PhysicalQuantities::CLength getElevation() const { return this->geodeticHeight(); }
//! Elevation //! Elevation
//! \sa setGeodeticHeight void setGroundElevation(const BlackMisc::Aviation::CAltitude &elevation) { return this->m_situation.setGroundElevation(elevation); }
void setElevation(const BlackMisc::PhysicalQuantities::CLength &elevation) { return this->m_situation.setElevation(elevation); }
//! Get heading //! Get heading
const BlackMisc::Aviation::CHeading &getHeading() const { return this->m_situation.getHeading(); } const BlackMisc::Aviation::CHeading &getHeading() const { return this->m_situation.getHeading(); }

View File

@@ -69,7 +69,7 @@ namespace BlackCoreTest
CAircraftSituation s(getTestSituation(cs, i, ts, deltaT, offset)); CAircraftSituation s(getTestSituation(cs, i, ts, deltaT, offset));
// check height above ground // check height above ground
CLength hag = (s.getAltitude() - s.geodeticHeight()); CLength hag = (s.getAltitude() - s.getGroundElevation());
QVERIFY2(s.getHeightAboveGround() == hag, "Wrong elevation"); QVERIFY2(s.getHeightAboveGround() == hag, "Wrong elevation");
provider->insertNewSituation(s); provider->insertNewSituation(s);
} }
@@ -162,13 +162,13 @@ namespace BlackCoreTest
CAltitude a(number, CAltitude::MeanSeaLevel, CLengthUnit::m()); CAltitude a(number, CAltitude::MeanSeaLevel, CLengthUnit::m());
CLatitude lat(number, CAngleUnit::deg()); CLatitude lat(number, CAngleUnit::deg());
CLongitude lng(180.0 + number, CAngleUnit::deg()); CLongitude lng(180.0 + number, CAngleUnit::deg());
CLength height(0, CLengthUnit::m());
CHeading heading(number * 10, CHeading::True, CAngleUnit::deg()); CHeading heading(number * 10, CHeading::True, CAngleUnit::deg());
CAngle bank(number, CAngleUnit::deg()); CAngle bank(number, CAngleUnit::deg());
CAngle pitch(number, CAngleUnit::deg()); CAngle pitch(number, CAngleUnit::deg());
CSpeed gs(number * 10, CSpeedUnit::km_h()); CSpeed gs(number * 10, CSpeedUnit::km_h());
CCoordinateGeodetic c(lat, lng, height); CAltitude gndElev({ 0, CLengthUnit::m() }, CAltitude::MeanSeaLevel);
CAircraftSituation s(callsign, c, a, heading, pitch, bank, gs); CCoordinateGeodetic c(lat, lng, {});
CAircraftSituation s(callsign, c, a, heading, pitch, bank, gs, gndElev);
s.setMSecsSinceEpoch(ts - deltaT * number); // values in past s.setMSecsSinceEpoch(ts - deltaT * number); // values in past
s.setTimeOffsetMs(offset); s.setTimeOffsetMs(offset);
return s; return s;