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