diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 8091520d6..383fa96e2 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -1100,6 +1100,39 @@ namespace BlackCore // can be overridden } + bool ISimulator::updateOwnSituationAndGroundElevation(const CAircraftSituation &situation) + { + const bool updated = this->updateOwnSituation(situation); + + // do not use every situation, but every deltaMs and only on ground + constexpr qint64 deltaMs = 5000; + if (situation.isOnGround() && situation.getTimeDifferenceAbsMs(m_lastRecordedGndElevationMs) > deltaMs) + { + m_lastRecordedGndElevationMs = situation.getMSecsSinceEpoch(); + const CSimulatorSettings settings = m_multiSettings.getSettings(this->getSimulatorInfo()); + if (settings.isRecordOwnAircraftGnd()) + { + const CSimulatedAircraft ownAircraft = this->getOwnAircraft(); + CAltitude elevation = situation.getGroundElevation(); + if (elevation.isNull()) + { + const CLength cg = ownAircraft.getModel().getCG(); + elevation = (cg.isNull() || situation.getAltitude().isNull()) ? CAltitude::null() : (situation.getAltitude().withOffset(cg * -1.0)); + } + + if (!elevation.isNull()) + { + const CCallsign cs = situation.hasCallsign() ? situation.getCallsign() : ownAircraft.getCallsign(); + const CLength radius = settings.getRecordedGndRadius().isNull() ? CElevationPlane::singlePointRadius() : settings.getRecordedGndRadius(); + const CElevationPlane ep(situation, radius); + const bool remembered = this->rememberGroundElevation(cs, ep, radius); + Q_UNUSED(remembered); // false means it was already in that cache, or something else is wrong + } + } + } + return updated; + } + CAircraftModelList ISimulator::getModelSet() const { const CSimulatorInfo simulator = this->getSimulatorInfo(); diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 2b1185c8f..9b3b01ea5 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -431,6 +431,7 @@ namespace BlackCore virtual int physicallyRemoveAllRemoteAircraft(); //! Set elevation and CG in the providers and for auto publishing + //! \sa ISimulator::updateOwnSituationAndGroundElevation void rememberElevationAndSimulatorCG(const BlackMisc::Aviation::CCallsign &callsign, const QString &modelString, const BlackMisc::Geo::CElevationPlane &elevation, const BlackMisc::PhysicalQuantities::CLength &simulatorCG); //! Emit the combined status @@ -535,6 +536,9 @@ namespace BlackCore //! Own model has been changed virtual void onOwnModelChanged(const BlackMisc::Simulation::CAircraftModel &newModel); + //! Update own aircraft position and if suitable use it to update ground elevation + bool updateOwnSituationAndGroundElevation(const BlackMisc::Aviation::CAircraftSituation &situation); + //! Get the model set BlackMisc::Simulation::CAircraftModelList getModelSet() const; @@ -554,6 +558,7 @@ namespace BlackCore qint64 m_statsUpdateAircraftTimeTotalMs = 0; //!< statistics total update time qint64 m_statsCurrentUpdateTimeMs = 0; //!< statistics current update time qint64 m_statsMaxUpdateTimeMs = 0; //!< statistics max.update time + qint64 m_lastRecordedGndElevationMs = 0; //!< when gnd.elevation was last modified qint64 m_statsLastUpdateAircraftRequestedMs = 0; //!< when was the last aircraft update requested qint64 m_statsUpdateAircraftRequestedDeltaMs = 0; //!< delta time between 2 aircraft updates diff --git a/src/blackmisc/timestampbased.h b/src/blackmisc/timestampbased.h index 966487da9..86640603c 100644 --- a/src/blackmisc/timestampbased.h +++ b/src/blackmisc/timestampbased.h @@ -48,6 +48,9 @@ namespace BlackMisc //! Time difference in ms qint64 getTimeDifferenceMs(qint64 compareTime) const { return compareTime - this->getMSecsSinceEpoch(); } + //! Time difference in ms + qint64 getTimeDifferenceAbsMs(qint64 compareTime) const { return qAbs(compareTime - this->getMSecsSinceEpoch()); } + //! Time difference to now qint64 getTimeDifferenceToNowMs() const { return this->getTimeDifferenceMs(QDateTime::currentMSecsSinceEpoch()); } diff --git a/src/plugins/simulator/emulated/simulatoremulated.cpp b/src/plugins/simulator/emulated/simulatoremulated.cpp index 2c107dbb3..bc0f2fd09 100644 --- a/src/plugins/simulator/emulated/simulatoremulated.cpp +++ b/src/plugins/simulator/emulated/simulatoremulated.cpp @@ -251,7 +251,7 @@ namespace BlackSimPlugin } } - return this->updateOwnSituation(situation); + return this->updateOwnSituationAndGroundElevation(situation); } bool CSimulatorEmulated::changeInternalParts(const CAircraftParts &parts) diff --git a/src/plugins/simulator/flightgear/simulatorflightgear.cpp b/src/plugins/simulator/flightgear/simulatorflightgear.cpp index 75398424e..12deb7482 100644 --- a/src/plugins/simulator/flightgear/simulatorflightgear.cpp +++ b/src/plugins/simulator/flightgear/simulatorflightgear.cpp @@ -195,7 +195,7 @@ namespace BlackSimPlugin // Updates // Do not update ICAO codes, as this overrides reverse lookups // updateOwnIcaoCodes(m_flightgearData.aircraftIcaoCode, CAirlineIcaoCode()); - this->updateOwnSituation(situation); + this->updateOwnSituationAndGroundElevation(situation); // defaults CSimulatedAircraft myAircraft(getOwnAircraft()); diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index 77caeb655..11e868c5b 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -381,7 +381,7 @@ namespace BlackSimPlugin } const CAircraftSituation aircraftSituation = simDataOwnAircraft.getSituation(); - this->updateOwnSituation(aircraftSituation); + this->updateOwnSituationAndGroundElevation(aircraftSituation); if (m_isWeatherActivated) { diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index b1c8834a2..d8e554095 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -678,7 +678,7 @@ namespace BlackSimPlugin ts); // set values - this->updateOwnSituation(aircraftSituation); + this->updateOwnSituationAndGroundElevation(aircraftSituation); this->updateOwnParts(parts); // When I change cockpit values in the sim (from GUI to simulator, not originating from simulator) diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 4e456516c..adffcd59d 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -230,7 +230,7 @@ namespace BlackSimPlugin // Updates // Do not update ICAO codes, as this overrides reverse lookups // updateOwnIcaoCodes(m_xplaneData.aircraftIcaoCode, CAirlineIcaoCode()); - this->updateOwn(situation); + this->updateOwnSituationAndGroundElevation(situation); // defaults CSimulatedAircraft myAircraft(getOwnAircraft());