mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-05 17:35:34 +08:00
Ref T268, elevation handling improvements
* utility functions * made storeAircraftSituation virtual and return Aviation::CAircraftSituation * coordinate toQString in deg/rad
This commit is contained in:
@@ -148,13 +148,11 @@ namespace BlackMisc
|
||||
static const QString interpolated("interpolated");
|
||||
static const QString extrapolated("extrapolated");
|
||||
static const QString avg("average");
|
||||
static const QString otherSituations("other situations");
|
||||
|
||||
switch (details)
|
||||
{
|
||||
case NoElevationInfo: return noDetails;
|
||||
case FromProvider: return provider;
|
||||
case FromOtherSituations: return otherSituations;
|
||||
case SituationChange: return change;
|
||||
case FromCache: return cache;
|
||||
case Test: return test;
|
||||
@@ -394,13 +392,16 @@ namespace BlackMisc
|
||||
return this->isPositionNull();
|
||||
}
|
||||
|
||||
bool CAircraftSituation::isBetterInfo(CAircraftSituation::GndElevationInfo info, bool transferred) const
|
||||
bool CAircraftSituation::isThisElevationInfoBetter(CAircraftSituation::GndElevationInfo info, bool transferred) const
|
||||
{
|
||||
if (!transferred && info == FromProvider) { return true; } // always override with latest value from provider
|
||||
if (info == NoElevationInfo || info == Test) { return false; }
|
||||
const int i = static_cast<int>(info);
|
||||
if (i > m_onGroundDetails) { return true; }
|
||||
if (i == m_onGroundDetails) { return !transferred; } // transferred elevations are not better
|
||||
if (i > m_elvInfo) { return true; }
|
||||
if (i == m_elvInfo)
|
||||
{
|
||||
if (m_isElvInfoTransferred == transferred) { return false; } // not better (equal)
|
||||
return !transferred; // if not transferred it is better
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -678,7 +679,7 @@ namespace BlackMisc
|
||||
QString CAircraftSituation::getGroundElevationInfoAsString() const
|
||||
{
|
||||
return m_isElvInfoTransferred ?
|
||||
gndElevationInfoToString(this->getGroundElevationInfo()) % QStringLiteral(" - tx") :
|
||||
QStringLiteral("tx: ") % gndElevationInfoToString(this->getGroundElevationInfo()) :
|
||||
gndElevationInfoToString(this->getGroundElevationInfo());
|
||||
}
|
||||
|
||||
@@ -810,7 +811,7 @@ namespace BlackMisc
|
||||
if (elevationPlane.isNull()) { return false; }
|
||||
const CLength distance = this->calculateGreatCircleDistance(elevationPlane);
|
||||
if (distance > elevationPlane.getRadiusOrMinimumRadius()) { return false; }
|
||||
if (m_groundElevationPlane.isNull() || this->isBetterInfo(info, transferred))
|
||||
if (m_groundElevationPlane.isNull() || this->isThisElevationInfoBetter(info, transferred))
|
||||
{
|
||||
// better values
|
||||
this->setGroundElevation(elevationPlane, info, transferred);
|
||||
|
||||
@@ -120,7 +120,6 @@ namespace BlackMisc
|
||||
Test, //!< unit test
|
||||
SituationChange, //!< from BlackMisc::Aviation::CAircraftSituationChange
|
||||
Extrapolated, //!< extrapolated ("guessing")
|
||||
FromOtherSituations, //!< transferred from other situations ("sibling situations" same callsign)
|
||||
Average, //!< average value of "nearby" situation CAircraftSituationList::averageElevationOfNonMovingAircraft
|
||||
Interpolated, //!< interpolated between 2 elevations
|
||||
FromCache, //!< from cache
|
||||
@@ -174,8 +173,8 @@ namespace BlackMisc
|
||||
//! Null situation
|
||||
virtual bool isNull() const override;
|
||||
|
||||
//! Is better info (more accurate)?
|
||||
bool isBetterInfo(GndElevationInfo info, bool transferred) const;
|
||||
//! Is given info better (more accurate)?
|
||||
bool isThisElevationInfoBetter(GndElevationInfo info, bool transferred) const;
|
||||
|
||||
//! Equal pitch, bank heading
|
||||
//! \sa Geo::ICoordinateGeodetic::equalNormalVectorDouble
|
||||
|
||||
@@ -347,10 +347,10 @@ namespace BlackMisc
|
||||
return found;
|
||||
}
|
||||
|
||||
CElevationPlane CAircraftSituationList::findCLosestElevationWithinRange(const ICoordinateGeodetic &coordinate, const CLength &range) const
|
||||
CAircraftSituation CAircraftSituationList::findCLosestElevationWithinRange(const ICoordinateGeodetic &coordinate, const CLength &range) const
|
||||
{
|
||||
CLength r = range.isNull() || range < CElevationPlane::singlePointRadius() ? CElevationPlane::singlePointRadius() : range;
|
||||
CElevationPlane ep = CElevationPlane::null();
|
||||
CAircraftSituation situationWithElevation = CAircraftSituation::null();
|
||||
|
||||
CLength bestDistance = CLength::null();
|
||||
for (const CAircraftSituation &s : *this)
|
||||
@@ -360,11 +360,11 @@ namespace BlackMisc
|
||||
if (distance > r) { continue; }
|
||||
if (bestDistance.isNull() || bestDistance > distance)
|
||||
{
|
||||
ep = s.getGroundElevationPlane();
|
||||
situationWithElevation = s;
|
||||
bestDistance = distance;
|
||||
}
|
||||
}
|
||||
return ep;
|
||||
return situationWithElevation;
|
||||
}
|
||||
|
||||
int CAircraftSituationList::setOnGround(CAircraftSituation::IsOnGround og)
|
||||
|
||||
@@ -136,7 +136,7 @@ namespace BlackMisc
|
||||
CAircraftSituationList findOnGroundWithElevation(CAircraftSituation::IsOnGround og) const;
|
||||
|
||||
//! CLosest elevation within given range
|
||||
Geo::CElevationPlane findCLosestElevationWithinRange(const Geo::ICoordinateGeodetic &coordinate, const PhysicalQuantities::CLength &range = Geo::CElevationPlane::singlePointRadius()) const;
|
||||
CAircraftSituation findCLosestElevationWithinRange(const Geo::ICoordinateGeodetic &coordinate, const PhysicalQuantities::CLength &range = Geo::CElevationPlane::singlePointRadius()) const;
|
||||
|
||||
//! Set on ground
|
||||
int setOnGround(CAircraftSituation::IsOnGround og);
|
||||
|
||||
Reference in New Issue
Block a user