From 2999aebf37fe76e7ed87b08d7153ff60972ec095 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 5 Mar 2020 00:19:33 +0100 Subject: [PATCH] Ref T773, allow to update CG per model string * needed if CG is overridden by "dot command" * update all existing aircraft (in range) if changing CG per modelstring * made "overriddenCGorDefault" public so it can be checked if overridden * use overridden value in CContextSimulator::xCtxAddedRemoteAircraftReadyForModelMatching * allow to clear overridden values --- src/blackcore/context/contextnetworkimpl.cpp | 7 + src/blackcore/context/contextnetworkimpl.h | 1 + .../context/contextsimulatorimpl.cpp | 15 ++- src/blackcore/context/contextsimulatorimpl.h | 3 + src/blackcore/simulator.cpp | 57 ++++++-- src/blackcore/simulator.h | 26 ++-- .../simulation/remoteaircraftprovider.cpp | 23 ++++ .../simulation/remoteaircraftprovider.h | 8 ++ .../simulationenvironmentprovider.cpp | 124 ++++++++++++++++-- .../simulationenvironmentprovider.h | 31 ++++- 10 files changed, 252 insertions(+), 43 deletions(-) diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index 649518b8c..5611440b2 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -1109,6 +1109,13 @@ namespace BlackCore return c; } + CCallsignSet CContextNetwork::updateCGForModel(const QString &modelString, const CLength &cg) + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << modelString << cg.valueRoundedWithUnit(1); } + const CCallsignSet set = m_airspace->updateCGForModel(modelString, cg); + return set; + } + bool CContextNetwork::updateCGAndModelString(const CCallsign &callsign, const CLength &cg, const QString &modelString) { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << cg.valueRoundedWithUnit(1) << modelString; } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 789aef454..3f68de7af 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -178,6 +178,7 @@ namespace BlackCore virtual bool setAircraftEnabledFlag(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRendering) override; virtual int reInitializeAllAircraft() override; virtual bool updateCG(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &cg) override; + virtual BlackMisc::Aviation::CCallsignSet updateCGForModel(const QString &modelString, const BlackMisc::PhysicalQuantities::CLength &cg) override; virtual bool updateCGAndModelString(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &cg, const QString &modelString) override; virtual BlackMisc::Simulation::CSimulatedAircraftList getAircraftInRange() const override; virtual BlackMisc::Aviation::CCallsignSet getAircraftInRangeCallsigns() const override; diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index ded59715a..929fbc37e 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -124,6 +124,11 @@ namespace BlackCore return this; } + bool CContextSimulator::isSimulatorPluginAvailable() const + { + return m_simulatorPlugin.second && IContextSimulator::isSimulatorAvailable(); + } + CContextSimulator::~CContextSimulator() { this->gracefulShutdown(); @@ -525,7 +530,7 @@ namespace BlackCore Q_ASSERT(c); c = connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, this, &CContextSimulator::relayStatusMessageToSimulator); Q_ASSERT(c); - Q_UNUSED(c); + Q_UNUSED(c) // Once the simulator signaled it is ready to simulate, add all known aircraft m_initallyAddAircraft = true; @@ -603,7 +608,7 @@ namespace BlackCore { const bool s = QMetaObject::invokeMethod(listener, &ISimulatorListener::start, Qt::QueuedConnection); Q_ASSERT_X(s, Q_FUNC_INFO, "cannot invoke method"); - Q_UNUSED(s); + Q_UNUSED(s) } CLogMessage(this).info(u"Listening for simulator '%1'") << simulatorInfo.getIdentifier(); return true; @@ -658,7 +663,8 @@ namespace BlackCore void CContextSimulator::xCtxAddedRemoteAircraftReadyForModelMatching(const CSimulatedAircraft &remoteAircraft) { - if (!this->isSimulatorAvailable()) { return; } + if (!this->isSimulatorPluginAvailable()) { return; } + const CCallsign callsign = remoteAircraft.getCallsign(); BLACK_VERIFY_X(!callsign.isEmpty(), Q_FUNC_INFO, "Remote aircraft with empty callsign"); if (callsign.isEmpty()) { return; } @@ -692,6 +698,9 @@ namespace BlackCore break; // leave CG from model alone } + const CLength overriddenCG = m_simulatorPlugin.second->overriddenCGorDefault(CLength::null(), aircraftModel.getModelString()); + if (!overriddenCG.isNull()) { aircraftModel.setCG(overriddenCG); } + // model in provider this->updateAircraftModel(callsign, aircraftModel, this->identifier()); diff --git a/src/blackcore/context/contextsimulatorimpl.h b/src/blackcore/context/contextsimulatorimpl.h index 53a79cab2..a05c5797a 100644 --- a/src/blackcore/context/contextsimulatorimpl.h +++ b/src/blackcore/context/contextsimulatorimpl.h @@ -181,6 +181,9 @@ namespace BlackCore //! Register myself in DBus CContextSimulator *registerWithDBus(BlackMisc::CDBusServer *server); + //! Simulator plugin available? + bool isSimulatorPluginAvailable() const; + private: static constexpr int MatchingLogMaxModelSetSize = 250; //!< default value for switching matching log on static constexpr int MaxModelAddedFailoverTrials = 3; //!< if model cannot be added, try again max times diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 09bbb8134..31063b81c 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -487,7 +487,8 @@ namespace BlackCore { const CCallsign cs(parser.part(2)); const bool changed = this->setInterpolationMode(part1, cs); - CLogMessage(this).info(changed ? QStringLiteral("Changed interpolation mode for '%1'") + CLogMessage(this).info(changed + ? QStringLiteral("Changed interpolation mode for '%1'") : QStringLiteral("Unchanged interpolation mode for '%1'")) << cs.asString(); return true; } @@ -496,7 +497,8 @@ namespace BlackCore CInterpolationAndRenderingSetupGlobal setup = this->getInterpolationSetupGlobal(); const bool changed = setup.setInterpolatorMode(part1); if (changed) { this->setInterpolationSetupGlobal(setup); } - CLogMessage(this).info(changed ? QStringLiteral("Changed interpolation mode globally") + CLogMessage(this).info(changed + ? QStringLiteral("Changed interpolation mode globally") : QStringLiteral("Unchanged interpolation mode")); return true; } @@ -566,17 +568,47 @@ namespace BlackCore } // CG override - if (part1 == QStringView(u"cg") && parser.hasPart(3)) + if (part1 == QStringView(u"cg")) { - // ms can be a string like "B773 B773_RR SDM" - const QString ms = parser.partAndRemainingStringAfter(3).toUpper(); - CLength cg; - cg.parseFromString(parser.part(2), CPqString::SeparatorBestGuess); - if (!ms.isEmpty()) + if (parser.part(2).startsWith("clear", Qt::CaseInsensitive)) { - CLogMessage(this).info(u"Setting CG for '%1': %2") << ms << cg.valueRoundedWithUnit(); - this->insertCGForModelStringOverridden(cg, ms); + CLogMessage(this).info(u"Clear all overridden CGs"); + const CLengthPerCallsign cgsPerCallsign = this->clearCGOverrides(); + + // restore all CGs + for (const CCallsign &cs : this->getAircraftInRangeCallsigns()) + { + // reset CGs per callsign + const CLength cg = cgsPerCallsign.contains(cs) ? cgsPerCallsign[cs] : CLength::null(); + this->updateCG(cs, cg); + } + return true; } + + if (parser.hasPart(3)) + { + // ms can be a string like "B773 B773_RR SDM" + const QString ms = parser.partAndRemainingStringAfter(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(); + const bool set = this->insertCGForModelStringOverridden(cg, ms); + if (set) + { + const CCallsignSet callsigns = this->updateCGForModel(ms, cg); + if (!callsigns.isEmpty()) + { + this->insertCGOverridden(cg, callsigns); + CLogMessage(this).info(u"Setting CG for '%1': %2") << callsigns.getCallsignsAsString(true) << cg.valueRoundedWithUnit(); + } + return true; + + } // set + } // model string + + } // 3 parts } // driver specific cmd line arguments @@ -588,7 +620,7 @@ namespace BlackCore if (CSimpleCommandParser::registered("BlackCore::ISimulator")) { return; } CSimpleCommandParser::registerCommand({".drv", "alias: .driver .plugin"}); CSimpleCommandParser::registerCommand({".drv unload", "unload driver"}); - CSimpleCommandParser::registerCommand({".drv cg length modelstring", "override CG"}); + CSimpleCommandParser::registerCommand({".drv cg length clear|modelstr.", "override CG"}); CSimpleCommandParser::registerCommand({".drv limit number/secs.", "limit updates to number per second (0..off)"}); CSimpleCommandParser::registerCommand({".drv logint callsign", "log interpolator for callsign"}); CSimpleCommandParser::registerCommand({".drv logint off", "no log information for interpolator"}); @@ -884,9 +916,12 @@ namespace BlackCore const QString modelString = model.getModelString(); if (modelString.isEmpty()) { return; } + + // this value now is the simulator or overridden value const CLength cgOvr = this->overriddenCGorDefault(simulatorCG, modelString); if (!cgOvr.isNull() && !this->hasSameSimulatorCG(cgOvr, callsign)) { + // the value did change const CSimulatorSettings::CGSource source = this->getSimulatorSettings().getSimulatorSettings().getCGSource(); if (source != CSimulatorSettings::CGFromDBOnly) { diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 3496201c0..4f624dd31 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -285,19 +285,19 @@ namespace BlackCore //! \addtogroup swiftdotcommands //! @{ //!
-        //! .drv cg length 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
-        //! .drv logint off                no log information for interpolator     BlackCore::ISimulator
-        //! .drv logint write              write interpolator log to file          BlackCore::ISimulator
-        //! .drv logint clear              clear current log                       BlackCore::ISimulator
-        //! .drv pos callsign              shows current position in simulator     BlackCore::ISimulator
-        //! .drv spline|linear callsign    interpolator spline or linear           BlackCore::ISimulator
-        //! .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 fsuipc   on|off           enable/disable FSUIPC (if applicable)   BlackSimPlugin::FsCommon::CSimulatorFsCommon
+        //! .drv cg length clear|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
+        //! .drv logint off                   no log information for interpolator     BlackCore::ISimulator
+        //! .drv logint write                 write interpolator log to file          BlackCore::ISimulator
+        //! .drv logint clear                 clear current log                       BlackCore::ISimulator
+        //! .drv pos callsign                 shows current position in simulator     BlackCore::ISimulator
+        //! .drv spline|linear callsign       interpolator spline or linear           BlackCore::ISimulator
+        //! .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 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/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index bd5120ca3..d11d38e01 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -611,6 +611,23 @@ namespace BlackMisc return true; } + CCallsignSet CRemoteAircraftProvider::updateCGForModel(const QString &modelString, const CLength &cg) + { + CCallsignSet callsigns; + if (modelString.isEmpty()) { return callsigns; } + + QWriteLocker l(&m_lockAircraft); + for (CSimulatedAircraft &aircraft : m_aircraftInRange) + { + if (caseInsensitiveStringCompare(aircraft.getModelString(), modelString)) + { + aircraft.setCG(cg); + callsigns.push_back(aircraft.getCallsign()); + } + } + return callsigns; + } + CLength CRemoteAircraftProvider::getCGFromDB(const CCallsign &callsign) const { QReadLocker l(&m_lockAircraft); @@ -996,6 +1013,12 @@ namespace BlackMisc return this->provider()->updateCG(callsign, cg); } + CCallsignSet CRemoteAircraftAware::updateCGForModel(const QString &modelString, const CLength &cg) + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->updateCGForModel(modelString, cg); + } + bool CRemoteAircraftAware::updateCGAndModelString(const CCallsign &callsign, const CLength &cg, const QString &modelString) { Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index 71fdc7a52..22fb9631b 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -196,6 +196,10 @@ namespace BlackMisc //! \threadsafe virtual bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg) = 0; + //! Update the CG for this model string + //! \threadsafe + virtual Aviation::CCallsignSet updateCGForModel(const QString &modelString, const PhysicalQuantities::CLength &cg) = 0; + //! Update the CG and model string //! \threadsafe virtual bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString) = 0; @@ -332,6 +336,7 @@ namespace BlackMisc virtual int updateAircraftGroundElevation(const Aviation::CCallsign &callsign, const Geo::CElevationPlane &elevation, Aviation::CAircraftSituation::GndElevationInfo info, bool *setForOnGroundPosition) override; virtual bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg) override; virtual bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString) override; + virtual Aviation::CCallsignSet updateCGForModel(const QString &modelString, const PhysicalQuantities::CLength &cg) override; virtual PhysicalQuantities::CLength getCGFromDB(const Aviation::CCallsign &callsign) const override; virtual PhysicalQuantities::CLength getCGFromDB(const QString &modelString) const override; virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const Aviation::CCallsign &callsign) override; @@ -594,6 +599,9 @@ namespace BlackMisc //! \copydoc IRemoteAircraftProvider::updateCG bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg); + //! \copydoc IRemoteAircraftProvider::updateCGForModel + Aviation::CCallsignSet updateCGForModel(const QString &modelString, const PhysicalQuantities::CLength &cg); + //! \copydoc IRemoteAircraftProvider::updateCGAndModelString bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString); diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 24ebec0e1..bbea24c29 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -95,12 +95,72 @@ namespace BlackMisc bool ISimulationEnvironmentProvider::insertCG(const CLength &cg, const QString &modelString, const CCallsign &cs) { - bool ok = false; + bool stored = false; QWriteLocker l(&m_lockCG); if (!m_enableCG) { return false; } - if (!cs.isEmpty()) { m_cgsPerCallsign[cs] = cg; ok = true; } - if (!modelString.isEmpty()) { m_cgsPerModel[modelString.toUpper()] = cg; ok = true; } - return ok; + if (!cs.isEmpty()) + { + if (m_cgsPerCallsignOverridden.contains(cs)) + { + // only keep as overridden value + m_cgsPerCallsignOverridden[cs] = cg; + } + else + { + m_cgsPerCallsign[cs] = cg; stored = true; + } + } + if (!modelString.isEmpty()) + { + const QString ms = modelString.toUpper(); + if (m_cgsPerModelOverridden.contains(ms)) + { + // only keep as overridden value + m_cgsPerModelOverridden[ms] = cg; + } + else + { + m_cgsPerModel[ms] = cg; + stored = true; + } + } + return stored; + } + + bool ISimulationEnvironmentProvider::insertCGOverridden(const CLength &cg, const CCallsign &cs) + { + if (cs.isEmpty()) { return false; } + + QWriteLocker l(&m_lockCG); + if (!m_enableCG) { return false; } + if (cg.isNull()) + { + m_cgsPerCallsignOverridden.remove(cs); + return false; + } + + m_cgsPerCallsignOverridden[cs] = cg; + return true; + } + + bool ISimulationEnvironmentProvider::insertCGOverridden(const CLength &cg, const CCallsignSet &callsigns) + { + if (callsigns.isEmpty()) { return false; } + + QWriteLocker l(&m_lockCG); + if (!m_enableCG) { return false; } + for (const CCallsign &cs : callsigns) + { + if (cg.isNull()) + { + m_cgsPerCallsignOverridden.remove(cs); + } + else + { + m_cgsPerCallsignOverridden[cs] = cg; + } + } + return true; } bool ISimulationEnvironmentProvider::insertCGForModelString(const CLength &cg, const QString &modelString) @@ -132,17 +192,29 @@ namespace BlackMisc return true; } - CLength ISimulationEnvironmentProvider::overriddenCGorDefault(const CLength &cg, const QString &modelString) const + CLengthPerCallsign ISimulationEnvironmentProvider::clearCGOverrides() { - if (modelString.isEmpty()) { return cg; } + QWriteLocker l(&m_lockCG); + m_cgsPerModelOverridden.clear(); + m_cgsPerCallsignOverridden.clear(); + return m_cgsPerCallsign; // all remaining CGs + } + + CLength ISimulationEnvironmentProvider::overriddenCGorDefault(const CLength &defaultCG, const QString &modelString) const + { + if (modelString.isEmpty()) { return defaultCG; } + const QString ms = modelString.toUpper(); QReadLocker l(&m_lockCG); - if (!m_cgsPerModelOverridden.contains(modelString.toUpper())) { return cg; } - return m_cgsPerModelOverridden[modelString.toUpper()]; + if (!m_cgsPerModelOverridden.contains(ms)) { return defaultCG; } + return m_cgsPerModelOverridden[ms]; } int ISimulationEnvironmentProvider::removeSimulatorCG(const CCallsign &cs) { + if (cs.isEmpty()) { return 0; } + QWriteLocker l(&m_lockCG); + m_cgsPerCallsignOverridden.remove(cs); return m_cgsPerCallsign.remove(cs); } @@ -328,11 +400,28 @@ namespace BlackMisc return m_defaultModel; } + CLengthPerCallsign ISimulationEnvironmentProvider::getSimulatorCGsPerCallsign() const + { + QReadLocker l(&m_lockCG); + return m_cgsPerCallsign; + } + + QHash ISimulationEnvironmentProvider::getSimulatorCGsPerModelString() const + { + QReadLocker l(&m_lockCG); + return m_cgsPerModel; + } + CLength ISimulationEnvironmentProvider::getSimulatorCG(const Aviation::CCallsign &callsign) const { if (callsign.isEmpty()) { return CLength::null(); } QReadLocker l(&m_lockCG); - if (!m_enableCG || !m_cgsPerCallsign.contains(callsign)) { return CLength::null(); } + if (!m_enableCG) { return CLength::null(); } + if (m_cgsPerCallsignOverridden.contains(callsign)) + { + return m_cgsPerCallsignOverridden[callsign]; + } + if (!m_cgsPerCallsign.contains(callsign)) { return CLength::null(); } return m_cgsPerCallsign.value(callsign); } @@ -351,8 +440,12 @@ 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(); } + if (!m_enableCG) { return CLength::null(); } + if (m_cgsPerModelOverridden.contains(ms)) + { + return m_cgsPerModelOverridden.value(ms); + } + if (!m_cgsPerModel.contains(ms)) { return CLength::null(); } return m_cgsPerModel.value(ms); } @@ -375,13 +468,19 @@ namespace BlackMisc { if (callsign.isEmpty()) { return false; } QReadLocker l(&m_lockCG); - return m_enableCG && m_cgsPerCallsign.contains(callsign); + return m_enableCG && (m_cgsPerCallsign.contains(callsign) || m_cgsPerCallsignOverridden.contains(callsign)); } bool ISimulationEnvironmentProvider::hasSameSimulatorCG(const CLength &cg, const CCallsign &callsign) const { if (callsign.isEmpty()) { return false; } QReadLocker l(&m_lockCG); + if (m_cgsPerCallsignOverridden.contains(callsign)) + { + return m_cgsPerCallsignOverridden[callsign] == cg; + } + + // normal values if (!m_cgsPerCallsign.contains(callsign)) { return false; } return m_cgsPerCallsign[callsign] == cg; } @@ -565,6 +664,7 @@ namespace BlackMisc { QWriteLocker l(&m_lockCG); m_cgsPerCallsign.clear(); + m_cgsPerCallsignOverridden.clear(); // intentionally not cleaning CGs per model, as models will not change, callsign do! } diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index 71d4dd559..af04bc7ce 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -98,6 +98,14 @@ namespace BlackMisc //! \threadsafe CAircraftModel getDefaultModel() const; + //! All CGs per callsign + //! \threadsafe + Aviation::CLengthPerCallsign getSimulatorCGsPerCallsign() const; + + //! All CGs per modelstring + //! \threadsafe + QHash getSimulatorCGsPerModelString() const; + //! Get CG per callsign, NULL if not found //! \threadsafe PhysicalQuantities::CLength getSimulatorCG(const Aviation::CCallsign &callsign) const; @@ -114,6 +122,10 @@ namespace BlackMisc //! \threadsafe PhysicalQuantities::CLength getSimulatorOrDbCGPerModelString(const QString &modelString, const PhysicalQuantities::CLength &dbCG) const; + //! Return the overridden CG value or the given default CG value + //! \threadsafe + PhysicalQuantities::CLength overriddenCGorDefault(const PhysicalQuantities::CLength &defaultCG, const QString &modelString) const; + //! Has a CG? //! \threadsafe bool hasSimulatorCG(const Aviation::CCallsign &callsign) const; @@ -228,6 +240,16 @@ namespace BlackMisc //! \threadsafe bool insertCG(const PhysicalQuantities::CLength &cg, const QString &modelString, const Aviation::CCallsign &cs); + //! Insert or replace a CG + //! \remark passing a NULL value will remove the CG + //! \threadsafe + bool insertCGOverridden(const PhysicalQuantities::CLength &cg, const Aviation::CCallsign &cs); + + //! Insert or replace an overridden CG + //! \remark passing a NULL value will remove the CG + //! \threadsafe + bool insertCGOverridden(const PhysicalQuantities::CLength &cg, const Aviation::CCallsignSet &callsigns); + //! Insert or replace a CG //! \remark passing a NULL value will remove the CG //! \threadsafe @@ -238,11 +260,11 @@ namespace BlackMisc //! \threadsafe bool insertCGForModelStringOverridden(const PhysicalQuantities::CLength &cg, const QString &modelString); - //! Return the overridden CG value or the given default CG value + //! Clear all overridden values //! \threadsafe - PhysicalQuantities::CLength overriddenCGorDefault(const PhysicalQuantities::CLength &cg, const QString &modelString) const; + Aviation::CLengthPerCallsign clearCGOverrides(); - //! Remove a CG + //! Remove a CG for a given callsign //! \threadsafe int removeSimulatorCG(const Aviation::CCallsign &cs); @@ -265,8 +287,9 @@ namespace BlackMisc Aviation::CTimestampPerCallsign m_pendingElevationRequests; //!< pending elevation requests for aircraft callsign Aviation::CLengthPerCallsign m_cgsPerCallsign; //!< CGs per callsign + Aviation::CLengthPerCallsign m_cgsPerCallsignOverridden; //!< CGs per callsign overridden (manually forced) QHash m_cgsPerModel; //!< CGs per model string - QHash m_cgsPerModelOverridden; //!< CGs per model string manually forced + QHash m_cgsPerModelOverridden; //!< CGs per model string (manually forced) qint64 m_statsMaxElevRequestTimeMs = -1; qint64 m_statsCurrentElevRequestTimeMs = -1;