From d8729cea1edbacf36d81008b4c2e5eaf44a84e08 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 16 May 2019 14:38:41 +0200 Subject: [PATCH] Ref T668, CG override per "dot" command --- src/blackcore/simulator.cpp | 21 ++++++++++++-- src/blackcore/simulator.h | 4 +-- .../simulationenvironmentprovider.cpp | 28 +++++++++++++++++++ .../simulationenvironmentprovider.h | 10 +++++++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 18f511ced..723d986c9 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -548,6 +548,19 @@ namespace BlackCore return true; } + // CG override + if (part1 == QStringView(u"cg") && parser.hasPart(3)) + { + const QString ms = parser.part(3).toUpper(); + CLength cg; + cg.parseFromString(parser.part(2), CPqString::SeparatorBestGuess); + if (!ms.isEmpty()) + { + CLogMessage(this).info(u"Setting CG for '%1': %2") << ms << cg.valueRoundedWithUnit(); + this->insertCGForModelStringOverridden(cg, ms); + } + } + // driver specific cmd line arguments return this->parseDetails(parser); } @@ -824,12 +837,14 @@ namespace BlackCore this->setMaxElevationsRemembered(aircraftCount * 3); // at least 3 elevations per aircraft, even better as not all are requesting elevations this->rememberGroundElevation(callsign, elevation); } - if (!cg.isNull() && !this->hasSameCG(cg, callsign)) + + const CLength cgO = this->overriddenCGorDefault(cg, modelString); + if (!cgO.isNull() && !this->hasSameCG(cgO, callsign)) { - this->insertCG(cg, modelString, callsign); // per model string and CG + this->insertCG(cgO, modelString, callsign); // per model string and CG // here we know we have a valid model and CG - m_autoPublishing.insert(modelString, cg); + m_autoPublishing.insert(modelString, cg); // still using CG here, not the overridden value m_autoPublishing.insert(modelString, this->getSimulatorInfo()); } } diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 548143387..b81aef66f 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -258,6 +258,7 @@ namespace BlackCore //! \addtogroup swiftdotcommands //! @{ //!
+        //! .drv cg modelstring            set overridden CG for model string      BlackCore::ISimulator
         //! .drv unload                    unload plugin                           BlackCore::ISimulator
         //! .drv limit number              limit the number of updates             BlackCore::ISimulator
         //! .drv logint callsign           log interpolator for callsign           BlackCore::ISimulator
@@ -269,8 +270,7 @@ namespace BlackCore
         //! .drv aircraft readd callsign   re-add (add again) aircraft             BlackCore::ISimulator
         //! .drv aircraft readd all        re-add all aircraft                     BlackCore::ISimulator
         //! .drv aircraft rm callsign      remove aircraft                         BlackCore::ISimulator
-        //! .drv    unload                 unload driver                           BlackCore::ISimulator
-        //! .drv    fsuipc      on|off     enable/disable FSUIPC (if applicable)   BlackSimPlugin::FsCommon::CSimulatorFsCommon
+        //! .drv fsuipc   on|off           enable/disable FSUIPC (if applicable)   BlackSimPlugin::FsCommon::CSimulatorFsCommon
         //! 
//! @} //! Parse command line for simulator drivers, derived classes can add specific parsing by overriding ISimulator::parseDetails diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index d29d0c5be..4d7c1b630 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -85,10 +85,37 @@ namespace BlackMisc if (modelString.isEmpty()) { return false; } QWriteLocker l(&m_lockCG); if (!m_enableCG) { return false; } + if (cg.isNull()) + { + m_cgsPerModel.remove(modelString.toUpper()); + return false; + } + m_cgsPerModel[modelString.toUpper()] = cg; return true; } + bool ISimulationEnvironmentProvider::insertCGForModelStringOverridden(const CLength &cg, const QString &modelString) + { + if (modelString.isEmpty()) { return false; } + QWriteLocker l(&m_lockCG); + if (cg.isNull()) + { + m_cgsPerModelOverridden.remove(modelString.toUpper()); + return false; + } + m_cgsPerModelOverridden[modelString.toUpper()] = cg; + return true; + } + + CLength ISimulationEnvironmentProvider::overriddenCGorDefault(const CLength &cg, const QString &modelString) const + { + if (modelString.isEmpty()) { return cg; } + QReadLocker l(&m_lockCG); + if (!m_cgsPerModelOverridden.contains(modelString.toUpper())) { return cg; } + return m_cgsPerModelOverridden[modelString.toUpper()]; + } + int ISimulationEnvironmentProvider::removeCG(const CCallsign &cs) { QWriteLocker l(&m_lockCG); @@ -258,6 +285,7 @@ namespace BlackMisc if (modelString.isEmpty()) { return CLength::null(); } const QString ms = modelString.toUpper(); QReadLocker l(&m_lockCG); + if (m_cgsPerModelOverridden.contains(ms)) { return m_cgsPerModelOverridden.value(ms); } if (!m_enableCG || !m_cgsPerModel.contains(ms)) { return CLength::null(); } return m_cgsPerModel.value(ms); } diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index 8a33f5d55..baedfdfc0 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -204,6 +204,15 @@ namespace BlackMisc //! \threadsafe bool insertCGForModelString(const PhysicalQuantities::CLength &cg, const QString &modelString); + //! Insert or replace a CG (overridden mode) + //! \remark passing a NULL value will remove the CG + //! \threadsafe + bool insertCGForModelStringOverridden(const PhysicalQuantities::CLength &cg, const QString &modelString); + + //! Return the overridden CG value or the given default CG value + //! \threadsafe + PhysicalQuantities::CLength overriddenCGorDefault(const PhysicalQuantities::CLength &cg, const QString &modelString) const; + //! Remove a CG //! \threadsafe int removeCG(const Aviation::CCallsign &cs); @@ -222,6 +231,7 @@ namespace BlackMisc Aviation::CTimestampPerCallsign m_pendingElevationRequests; //!< pending elevation requests for aircraft callsign Aviation::CLengthPerCallsign m_cgsPerCallsign; //!< CGs per callsign QHash m_cgsPerModel; //!< CGs per model string + QHash m_cgsPerModelOverridden; //!< CGs per model string manually forced qint64 m_statsMaxElevRequestTimeMs = -1; qint64 m_statsCurrentElevRequestTimeMs = -1;