diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 5844c086c..538e8c1bd 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -10,7 +10,7 @@ #include "blackmisc/aviation/aircraftsituation.h" #include "blackmisc/aviation/aircraftpartslist.h" #include "blackmisc/geo/elevationplane.h" -#include "blackmisc/pq/physicalquantity.h" +#include "blackmisc/pq/length.h" #include "blackmisc/pq/units.h" #include "blackmisc/propertyindex.h" #include "blackmisc/comparefunctions.h" @@ -108,6 +108,18 @@ namespace BlackMisc return small; } + const CAircraftSituation &CAircraftSituation::null() + { + static const CAircraftSituation n; + return n; + } + + const CLength &CAircraftSituation::defaultCG() + { + static const CLength cg(2.5, CLengthUnit::m()); + return cg; + } + CVariant CAircraftSituation::propertyByIndex(const BlackMisc::CPropertyIndex &index) const { if (index.isMyself()) { return CVariant::from(*this); } @@ -412,7 +424,19 @@ namespace BlackMisc bool CAircraftSituation::canLikelySkipNearGroundInterpolation() const { + // those we can exclude + if (this->isOnGround() && this->hasInboundGroundInformation()) { return false; } + + // cases where we can skip + if (this->isNull()) { return true; } if (this->getGroundSpeed().value(CSpeedUnit::kts()) > 250) { return true; } + + if (this->hasGroundElevation()) + { + static const CLength threshold(400, CLengthUnit::m()); + const CLength a = this->getHeightAboveGround(); + if (!a.isNull() && a >= threshold) { return true; } // too high for ground + } return false; } diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index 1cf134da8..6f9bd17a9 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -327,6 +327,12 @@ namespace BlackMisc //! Delta distance, near to ground static const PhysicalQuantities::CLength &deltaNearGround(); + //! Null situation + static const CAircraftSituation &null(); + + //! A default CG if not other value is available + static const PhysicalQuantities::CLength &defaultCG(); + private: CCallsign m_correspondingCallsign; Geo::CCoordinateGeodetic m_position; //!< NULL position as default diff --git a/src/plugins/simulator/fsxcommon/simconnectobject.cpp b/src/plugins/simulator/fsxcommon/simconnectobject.cpp index 8a87e4c31..61b86e790 100644 --- a/src/plugins/simulator/fsxcommon/simconnectobject.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectobject.cpp @@ -146,6 +146,12 @@ namespace BlackSimPlugin return m_interpolator->getInterpolatedParts(currentTimeSinceEpoc, setup, partsStatus, log); } + const CAircraftSituation &CSimConnectObject::getLastInterpolatedSituation() const + { + if (!m_interpolator) { return CAircraftSituation::null(); } + return m_interpolator->getLastInterpolatedSituation(); + } + bool CSimConnectObjects::setSimConnectObjectIdForRequestId(DWORD requestId, DWORD objectId, bool resetSentParts) { // First check, if this request id belongs to us diff --git a/src/plugins/simulator/fsxcommon/simconnectobject.h b/src/plugins/simulator/fsxcommon/simconnectobject.h index f3340d3ef..f5f225515 100644 --- a/src/plugins/simulator/fsxcommon/simconnectobject.h +++ b/src/plugins/simulator/fsxcommon/simconnectobject.h @@ -161,6 +161,9 @@ namespace BlackSimPlugin const BlackMisc::Simulation::CInterpolationAndRenderingSetupPerCallsign &setup, BlackMisc::Simulation::CPartsStatus &partsStatus, bool log) const; + //! Last interpolated situation + const BlackMisc::Aviation::CAircraftSituation &getLastInterpolatedSituation() const; + //! Interpolator BlackMisc::Simulation::CInterpolatorMulti *getInterpolator() const { return m_interpolator.data(); } diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 6a3070a53..97b444892 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -485,6 +485,9 @@ namespace BlackSimPlugin } // CElevationPlane: deg, deg, feet + // we only remember near ground + if (simObject.getLastInterpolatedSituation().canLikelySkipNearGroundInterpolation()) { return; } + CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); elevation.setSinglePointRadius(); this->rememberElevationAndCG(simObject.getCallsign(), elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index ad4314ff8..654db4cfe 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -707,7 +707,7 @@ namespace BlackSimPlugin // update situation if (!xplaneAircraft.isSameAsSent(interpolatedSituation)) { - m_xplaneAircraftObjects[xplaneAircraft.getCallsign()].setPositionAsSent(interpolatedSituation); + m_xplaneAircraftObjects[xplaneAircraft.getCallsign()].setSituationAsSent(interpolatedSituation); m_trafficProxy->setPlanePosition(interpolatedSituation.getCallsign().asString(), interpolatedSituation.latitude().value(CAngleUnit::deg()), interpolatedSituation.longitude().value(CAngleUnit::deg()), @@ -784,8 +784,10 @@ namespace BlackSimPlugin void CSimulatorXPlane::updateRemoteAircraftFromSimulator(const QString &callsign, double latitudeDeg, double longitudeDeg, double elevationMeters, double modelVerticalOffsetMeters) { + // we skip if we are not near ground const CCallsign cs(callsign); if (!m_xplaneAircraftObjects.contains(cs)) { return; } + if (m_xplaneAircraftObjects[cs].getSituationAsSent().canLikelySkipNearGroundInterpolation()) { return; } CElevationPlane elevation(CLatitude(latitudeDeg, CAngleUnit::deg()), CLongitude(longitudeDeg, CAngleUnit::deg()), CAltitude(elevationMeters, CLengthUnit::m())); elevation.setSinglePointRadius(); diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index 5e065ab7c..f42e80e50 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -165,7 +165,7 @@ namespace BlackSimPlugin CXSwiftBusWeatherProxy *m_weatherProxy { nullptr }; QTimer m_fastTimer; QTimer m_slowTimer; - BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft + BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft BlackMisc::CData m_modelSet { this }; // Driver Interpolation diff --git a/src/plugins/simulator/xplane/xplanempaircraft.cpp b/src/plugins/simulator/xplane/xplanempaircraft.cpp index 792ea3ebe..aed397c4a 100644 --- a/src/plugins/simulator/xplane/xplanempaircraft.cpp +++ b/src/plugins/simulator/xplane/xplanempaircraft.cpp @@ -32,7 +32,7 @@ namespace BlackSimPlugin bool CXPlaneMPAircraft::isSameAsSent(const CAircraftSituation &position) const { - return m_positionAsSent == position; + return m_situationAsSent == position; } void CXPlaneMPAircraft::toggleInterpolatorMode() diff --git a/src/plugins/simulator/xplane/xplanempaircraft.h b/src/plugins/simulator/xplane/xplanempaircraft.h index 937a8783a..86caf35c7 100644 --- a/src/plugins/simulator/xplane/xplanempaircraft.h +++ b/src/plugins/simulator/xplane/xplanempaircraft.h @@ -55,8 +55,11 @@ namespace BlackSimPlugin //! Parts as sent to simulator void setPartsAsSent(const BlackMisc::Aviation::CAircraftParts &parts) { m_partsAsSent = parts; } + //! Situation as sent to simulator + const BlackMisc::Aviation::CAircraftSituation &getSituationAsSent() const { return m_situationAsSent; } + //! Position as sent - void setPositionAsSent(const BlackMisc::Aviation::CAircraftSituation &position) { m_positionAsSent = position; } + void setSituationAsSent(const BlackMisc::Aviation::CAircraftSituation &position) { m_situationAsSent = position; } //! Same as sent bool isSameAsSent(const BlackMisc::Aviation::CAircraftSituation &position) const; @@ -94,7 +97,7 @@ namespace BlackSimPlugin private: BlackMisc::Simulation::CSimulatedAircraft m_aircraft; //!< corresponding aircraft QSharedPointer m_interpolator; //!< shared pointer because CSimConnectObject can be copied - BlackMisc::Aviation::CAircraftSituation m_positionAsSent; + BlackMisc::Aviation::CAircraftSituation m_situationAsSent; BlackMisc::Aviation::CAircraftParts m_partsAsSent; };