From bb34beed266f674a5521663a2d03c9c705de80a4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 22 Mar 2018 16:49:29 +0100 Subject: [PATCH] Ref T259, Ref T243 misc. smaller improvements of simulator environment provider --- .../simulationenvironmentprovider.cpp | 39 +++++++++++++++---- .../simulationenvironmentprovider.h | 13 +++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 944ddb0da..2853b1683 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -17,15 +17,20 @@ namespace BlackMisc { namespace Simulation { - bool ISimulationEnvironmentProvider::rememberGroundElevation(const ICoordinateGeodetic &elevationCoordinate, const PhysicalQuantities::CLength &epsilon) + bool ISimulationEnvironmentProvider::rememberGroundElevation(const ICoordinateGeodetic &elevationCoordinate, const CLength &epsilon) { { QReadLocker l(&m_lockElvCoordinates); - if (m_elvCoordinates.containsObjectInRange(elevationCoordinate, epsilon)) { return false; } + if (m_elvCoordinates.containsObjectInRange(elevationCoordinate, minRange(epsilon))) { return false; } } { + // we keep latest at fron + // * we assume we find them faster + // * and need the more frequently (the recent ones) QWriteLocker l(&m_lockElvCoordinates); - m_elvCoordinates.push_back(elevationCoordinate); + if (m_elvCoordinates.size() > MaxElevations) { m_elvCoordinates.pop_back(); } + m_elvCoordinates.push_front(elevationCoordinate); + } return true; } @@ -40,13 +45,14 @@ namespace BlackMisc { if (cs.isEmpty()) { return false; } const bool remove = cg.isNull(); - QWriteLocker l(&m_lockCG); if (remove) { + QWriteLocker l(&m_lockCG); m_cgs.remove(cs); } else { + QWriteLocker l(&m_lockCG); m_cgs[cs] = cg; } return true; @@ -58,6 +64,13 @@ namespace BlackMisc return m_cgs.remove(cs); } + CLength ISimulationEnvironmentProvider::minRange(const CLength &range) + { + return (range < CElevationPlane::singlePointRadius()) ? + CElevationPlane::singlePointRadius() : + range; + } + CCoordinateGeodeticList ISimulationEnvironmentProvider::getElevationCoordinates() const { QReadLocker l(&m_lockElvCoordinates); @@ -72,15 +85,17 @@ namespace BlackMisc coordinates.sortByEuclideanDistanceSquared(referenceCoordinate); coordinates.truncate(maxNumber); const int delta = size - coordinates.size(); - QWriteLocker l(&m_lockElvCoordinates); - m_elvCoordinates = coordinates; + { + QWriteLocker l(&m_lockElvCoordinates); + m_elvCoordinates = coordinates; + } return delta; } CElevationPlane ISimulationEnvironmentProvider::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const { - const CLength r = range < CElevationPlane::singlePointRadius() ? CElevationPlane::singlePointRadius() : range; - return this->getElevationCoordinates().findClosestWithinRange(reference, r); + const CCoordinateGeodetic coordinate = this->getElevationCoordinates().findClosestWithinRange(reference, minRange(range)); + return CElevationPlane(coordinate, reference); // plane with radis = distnace to reference } CSimulatorPluginInfo ISimulationEnvironmentProvider::getSimulatorPluginInfo() const @@ -109,10 +124,18 @@ namespace BlackMisc bool ISimulationEnvironmentProvider::hasCG(const Aviation::CCallsign &callsign) const { + if (callsign.isEmpty()) { return false; } QReadLocker l(&m_lockCG); return m_cgs.contains(callsign); } + bool ISimulationEnvironmentProvider::hasSameCG(const CLength &cg, const CCallsign &callsign) const + { + if (callsign.isEmpty()) { return false; } + QReadLocker l(&m_lockCG); + return m_cgs[callsign] == cg; + } + ISimulationEnvironmentProvider::ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo) : m_simulatorPluginInfo(pluginInfo) { } diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index 5ebc38aa7..297d5033a 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -52,29 +52,39 @@ namespace BlackMisc CAircraftModel getDefaultModel() const; //! Get CG per callsign, NULL if not found + //! \threadsafe PhysicalQuantities::CLength getCG(const Aviation::CCallsign &callsign) const; //! Has a CG? + //! \threadsafe bool hasCG(const Aviation::CCallsign &callsign) const; + //! Has the same CG? + //! \threadsafe + bool hasSameCG(const PhysicalQuantities::CLength &cg, const Aviation::CCallsign &callsign) const; + protected: //! Ctor ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo); //! New plugin info and default model //! \remark normally only used by emulated driver + //! \threadsafe void setNewPluginInfo(const CSimulatorPluginInfo &info, const CAircraftModel &defaultModel); //! Default model + //! \threadsafe void setDefaultModel(const CAircraftModel &defaultModel); //! Clear default model + //! \threadsafe void clearDefaultModel(); //! Clear elevations void clearElevations(); //! Clear CGs + //! \threadsafe void clearCGs(); //! Clear data @@ -102,6 +112,9 @@ namespace BlackMisc //! \threadsafe int removeCG(const Aviation::CCallsign &cs); + //! Min.range considered as single point + static PhysicalQuantities::CLength minRange(const PhysicalQuantities::CLength &range); + static constexpr int MaxElevations = 1000; //!< How many elevations we keep private: