From 88098dddf76194e9a69333cb817ff1273bb545be Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 18 Jul 2018 01:48:16 +0200 Subject: [PATCH] Ref T268, allow to log loopback situations * those are situations reported back from simulator * and can be logged --- src/blackcore/simulator.cpp | 28 +++++++++++++++++++ src/blackcore/simulator.h | 13 +++++++++ .../fsxcommon/simulatorfsxcommon.cpp | 9 +++--- .../simulator/xplane/simulatorxplane.cpp | 9 +++++- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 98ba379c0..07ca3b6ea 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -196,9 +196,32 @@ namespace BlackCore m_lastSentParts.remove(callsign); m_lastSentSituations.remove(callsign); m_clampedLogMsg.remove(callsign); + m_loopbackSituations.clear(); this->removeInterpolationSetupPerCallsign(callsign); } + bool ISimulator::addLoopbackSituation(const CAircraftSituation &situation) + { + const CCallsign cs = situation.getCallsign(); + if (!this->isLogCallsign(cs)) { return false; } + CAircraftSituationList &situations = m_loopbackSituations[cs]; + situations.push_frontKeepLatestAdjustedFirst(situation, true, 10); + return true; + } + + bool ISimulator::addLoopbackSituation(const CCallsign &callsign, const CElevationPlane &elevationPlane, const CLength &cg) + { + if (!this->isLogCallsign(callsign)) { return false; } + CAircraftSituation situation(callsign, elevationPlane); + situation.setGroundElevation(elevationPlane, CAircraftSituation::FromProvider); + situation.setCG(cg); + situation.setCurrentUtcTime(); + situation.setTimeOffsetMs(0); + CAircraftSituationList &situations = m_loopbackSituations[callsign]; + situations.push_frontKeepLatestAdjustedFirst(situation, true, 10); + return true; + } + void ISimulator::reset() { this->clearAllRemoteAircraftData(); @@ -749,6 +772,11 @@ namespace BlackCore return true; } + CAircraftSituationList ISimulator::getLoopbackSituations(const CCallsign &callsign) const + { + return m_loopbackSituations.value(callsign); + } + CAirportList ISimulator::getAirportsInRange() const { // default implementation diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index a1f1d37a6..15ae18fad 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -29,6 +29,7 @@ #include "blackmisc/aviation/callsignset.h" #include "blackmisc/network/clientprovider.h" #include "blackmisc/weather/weathergridprovider.h" +#include "blackmisc/geo/elevationplane.h" #include "blackmisc/pq/length.h" #include "blackmisc/pq/time.h" #include "blackmisc/statusmessage.h" @@ -267,6 +268,9 @@ namespace BlackCore //! Time between two update requests qint64 getStatisticsAircraftUpdatedRequestedDeltaMs() const { return m_statsUpdateAircraftRequestedDeltaMs; } + //! The traced loopback situations + BlackMisc::Aviation::CAircraftSituationList getLoopbackSituations(const BlackMisc::Aviation::CCallsign &callsign) const; + //! Access to logger const BlackMisc::Simulation::CInterpolationLogger &interpolationLogger() const { return m_interpolationLogger; } @@ -401,6 +405,12 @@ namespace BlackCore //! Clear the related data as statistics etc. virtual void clearData(const BlackMisc::Aviation::CCallsign &callsign); + //! Add a loopback situation if logging is enabled + bool addLoopbackSituation(const BlackMisc::Aviation::CAircraftSituation &situation); + + //! Add a loopback situation if logging is enabled + bool addLoopbackSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Geo::CElevationPlane &elevationPlane, const BlackMisc::PhysicalQuantities::CLength &cg); + //! Full reset of state //! \remark reset as it was unloaded without unloading //! \sa ISimulator::clearAllRemoteAircraftData @@ -495,6 +505,9 @@ namespace BlackCore // some optional functionality which can be used by the simulators as needed BlackMisc::Simulation::CSimulatedAircraftList m_addAgainAircraftWhenRemoved; //!< add this model again when removed, normally used to change model + // loopback situations, situations which are received from simulator for remote aircraft + BlackMisc::Aviation::CAircraftSituationListPerCallsign m_loopbackSituations; //!< traced loopback situations + // limit the update aircraft to a maximum per second BlackMisc::CTokenBucket m_limitUpdateAircraftBucket { 5, 100, 5 }; //!< means 50 per second bool m_limitUpdateAircraft = false; //!< limit the update frequency by using BlackMisc::CTokenBucket diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 7eb2ff3dc..af8ed45d6 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -296,7 +296,7 @@ namespace BlackSimPlugin else { this->triggerAutoTraceSendId(); - const CStatusMessage msg = CStatusMessage(this).error("Can not request AI position: '%1'") << callsign.asString(); + const CStatusMessage msg = CStatusMessage(this).error("Cannot request AI position: '%1'") << callsign.asString(); CLogMessage::preformatted(msg); } return hr == S_OK; @@ -659,9 +659,10 @@ namespace BlackSimPlugin // we only remember near ground if (remoteAircraftData.aboveGroundFt() < 250) { - CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); - elevation.setSinglePointRadius(); - this->rememberElevationAndCG(cs, simObject.getAircraftModelString(), elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); + const CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt, CElevationPlane::singlePointRadius()); + const CLength cg(remoteAircraftData.cgToGroundFt, CLengthUnit::ft()); + this->rememberElevationAndCG(cs, simObject.getAircraftModelString(), elevation, cg); + this->addLoopbackSituation(cs, elevation, cg); } } diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 1aac7f980..bf0b825fb 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -860,16 +860,23 @@ namespace BlackSimPlugin Q_ASSERT_X(verticalOffsetsMeters.size() == size, Q_FUNC_INFO, "Wrong CG"); } + const CCallsignSet logCallsigns = this->getLogCallsigns(); for (int i = 0; i < size; i++) { const CCallsign cs(callsigns[i]); if (!m_xplaneAircraftObjects.contains(cs)) { continue; } - const CXPlaneMPAircraft xpAircraft = m_xplaneAircraftObjects[cs]; + const CAltitude elevationAlt(elevationsMeters[i], CLengthUnit::m(), CLengthUnit::ft()); const CElevationPlane elevation(CLatitude(latitudesDeg[i], CAngleUnit::deg()), CLongitude(longitudesDeg[i], CAngleUnit::deg()), elevationAlt, CElevationPlane::singlePointRadius()); const CLength cg(verticalOffsetsMeters[i], CLengthUnit::m(), CLengthUnit::ft()); this->rememberElevationAndCG(cs, xpAircraft.getAircraftModelString(), elevation, cg); + + // loopback + if (logCallsigns.contains(cs)) + { + this->addLoopbackSituation(cs, elevation, cg); + } } }