mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 19:05:31 +08:00
refs #837 Don't misuse coordinate height as ground elevation, use a separate member instead.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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(); }
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user