From 2c55015d26c8cafa69ca7178d71985183de0ae38 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 18 Jun 2018 19:00:14 +0200 Subject: [PATCH] Ref T275, ctor and option to check if gnd elevation "is better" --- src/blackmisc/aviation/aircraftsituation.cpp | 9 ++++++++- src/blackmisc/aviation/aircraftsituation.h | 14 +++++++++----- src/blackmisc/geo/elevationplane.cpp | 4 ++++ src/blackmisc/geo/elevationplane.h | 3 +++ .../simulator/fsxcommon/simulatorfsxcommon.cpp | 3 +-- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 9177ed5c7..7ea85dac2 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -381,6 +381,13 @@ namespace BlackMisc return this->isPositionNull(); } + bool CAircraftSituation::isBetterInfo(CAircraftSituation::GndElevationInfo info) const + { + if (info == NoElevationInfo || info == Test) { return false; } + const int i = static_cast(info); + return i > m_onGroundDetails; + } + bool CAircraftSituation::equalPbh(const CAircraftSituation &other) const { return this->getPitch() == other.getPitch() && this->getBank() == other.getBank() && this->getHeading() == other.getHeading(); @@ -754,7 +761,7 @@ namespace BlackMisc if (elevationPlane.isNull()) { return false; } const CLength distance = this->calculateGreatCircleDistance(elevationPlane); if (distance > elevationPlane.getRadius()) { return false; } - if (m_groundElevationPlane.isNull() || distance < m_groundElevationPlane.getRadius()) + if (m_groundElevationPlane.isNull() || this->isBetterInfo(info)) { // better values this->setGroundElevation(elevationPlane, info); diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index 3dff45e54..ad0b3f321 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -114,15 +114,16 @@ namespace BlackMisc //! Where did we get elevation from? enum GndElevationInfo { + // best info (most accurate) last NoElevationInfo, - TransferredElevation, //!< transferred from nearby situation - Interpolated, //!< interpolated between 2 elevations + Test, //!< unit test + SituationChange, //!< from BlackMisc::Aviation::CAircraftSituationChange Extrapolated, //!< extrapolated ("guessing") Average, //!< average value of "nearby" situation CAircraftSituationList::averageElevationOfNonMovingAircraft - FromProvider, //!< from BlackMisc::Simulation::ISimulationEnvironmentProvider + Interpolated, //!< interpolated between 2 elevations + TransferredElevation, //!< transferred from nearby situation FromCache, //!< from cache - SituationChange, //!< from BlackMisc::Aviation::CAircraftSituationChange - Test //!< unit test + FromProvider //!< from BlackMisc::Simulation::ISimulationEnvironmentProvider }; //! Default constructor. @@ -172,6 +173,9 @@ namespace BlackMisc //! Null situation virtual bool isNull() const override; + //! Is better info (more accurate)? + bool isBetterInfo(GndElevationInfo info) const; + //! Equal pitch, bank heading //! \sa Geo::ICoordinateGeodetic::equalNormalVectorDouble bool equalPbh(const CAircraftSituation &other) const; diff --git a/src/blackmisc/geo/elevationplane.cpp b/src/blackmisc/geo/elevationplane.cpp index 00156195c..feb65a364 100644 --- a/src/blackmisc/geo/elevationplane.cpp +++ b/src/blackmisc/geo/elevationplane.cpp @@ -50,6 +50,10 @@ namespace BlackMisc this->setGeodeticHeight(CAltitude(altitudeMSLft, CAltitude::MeanSeaLevel, CLengthUnit::ft())); } + CElevationPlane::CElevationPlane(double latDeg, double lngDeg, double altitudeMSLft, const CLength &radius) : + CCoordinateGeodetic(latDeg, lngDeg, altitudeMSLft), m_radius(radius) + { } + void CElevationPlane::setRadiusOrMinimum(const CLength &radius) { m_radius = ((radius.isNull() || radius < CElevationPlane::singlePointRadius())) ? CElevationPlane::singlePointRadius() : radius; diff --git a/src/blackmisc/geo/elevationplane.h b/src/blackmisc/geo/elevationplane.h index 4abbea4d2..bc583ba56 100644 --- a/src/blackmisc/geo/elevationplane.h +++ b/src/blackmisc/geo/elevationplane.h @@ -45,6 +45,9 @@ namespace BlackMisc //! Plane at given coordinates with radius and altitude CElevationPlane(const ICoordinateGeodetic &coordinate, double altitudeMSLft, const PhysicalQuantities::CLength &radius); + //! Plane at given coordinates with radius and altitude + CElevationPlane(double latDeg, double lngDeg, double altitudeMSLft, const PhysicalQuantities::CLength &radius); + //! Constructors from CCoordinateGeodetic using CCoordinateGeodetic::CCoordinateGeodetic; diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 58c3a494b..fbf9f6241 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -625,8 +625,7 @@ namespace BlackSimPlugin void CSimulatorFsxCommon::updateProbeFromSimulator(const CCallsign &callsign, const DataDefinitionRemoteAircraftSimData &remoteAircraftData) { - CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); - elevation.setSinglePointRadius(); + const CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt, CElevationPlane::singlePointRadius()); this->callbackReceivedRequestedElevation(elevation, callsign); }