Ref T668, CG override per "dot" command

This commit is contained in:
Klaus Basan
2019-05-16 14:38:41 +02:00
parent da8e504d67
commit d8729cea1e
4 changed files with 58 additions and 5 deletions

View File

@@ -548,6 +548,19 @@ namespace BlackCore
return true; 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 // driver specific cmd line arguments
return this->parseDetails(parser); 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->setMaxElevationsRemembered(aircraftCount * 3); // at least 3 elevations per aircraft, even better as not all are requesting elevations
this->rememberGroundElevation(callsign, elevation); 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 // 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()); m_autoPublishing.insert(modelString, this->getSimulatorInfo());
} }
} }

View File

@@ -258,6 +258,7 @@ namespace BlackCore
//! \addtogroup swiftdotcommands //! \addtogroup swiftdotcommands
//! @{ //! @{
//! <pre> //! <pre>
//! .drv cg modelstring set overridden CG for model string BlackCore::ISimulator
//! .drv unload unload plugin BlackCore::ISimulator //! .drv unload unload plugin BlackCore::ISimulator
//! .drv limit number limit the number of updates BlackCore::ISimulator //! .drv limit number limit the number of updates BlackCore::ISimulator
//! .drv logint callsign log interpolator for callsign BlackCore::ISimulator //! .drv logint callsign log interpolator for callsign BlackCore::ISimulator
@@ -269,7 +270,6 @@ namespace BlackCore
//! .drv aircraft readd callsign re-add (add again) aircraft 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 readd all re-add all aircraft BlackCore::ISimulator
//! .drv aircraft rm callsign remove 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
//! </pre> //! </pre>
//! @} //! @}

View File

@@ -85,10 +85,37 @@ namespace BlackMisc
if (modelString.isEmpty()) { return false; } if (modelString.isEmpty()) { return false; }
QWriteLocker l(&m_lockCG); QWriteLocker l(&m_lockCG);
if (!m_enableCG) { return false; } if (!m_enableCG) { return false; }
if (cg.isNull())
{
m_cgsPerModel.remove(modelString.toUpper());
return false;
}
m_cgsPerModel[modelString.toUpper()] = cg; m_cgsPerModel[modelString.toUpper()] = cg;
return true; 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) int ISimulationEnvironmentProvider::removeCG(const CCallsign &cs)
{ {
QWriteLocker l(&m_lockCG); QWriteLocker l(&m_lockCG);
@@ -258,6 +285,7 @@ namespace BlackMisc
if (modelString.isEmpty()) { return CLength::null(); } if (modelString.isEmpty()) { return CLength::null(); }
const QString ms = modelString.toUpper(); const QString ms = modelString.toUpper();
QReadLocker l(&m_lockCG); 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 || !m_cgsPerModel.contains(ms)) { return CLength::null(); }
return m_cgsPerModel.value(ms); return m_cgsPerModel.value(ms);
} }

View File

@@ -204,6 +204,15 @@ namespace BlackMisc
//! \threadsafe //! \threadsafe
bool insertCGForModelString(const PhysicalQuantities::CLength &cg, const QString &modelString); 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 //! Remove a CG
//! \threadsafe //! \threadsafe
int removeCG(const Aviation::CCallsign &cs); int removeCG(const Aviation::CCallsign &cs);
@@ -222,6 +231,7 @@ namespace BlackMisc
Aviation::CTimestampPerCallsign m_pendingElevationRequests; //!< pending elevation requests for aircraft callsign Aviation::CTimestampPerCallsign m_pendingElevationRequests; //!< pending elevation requests for aircraft callsign
Aviation::CLengthPerCallsign m_cgsPerCallsign; //!< CGs per callsign Aviation::CLengthPerCallsign m_cgsPerCallsign; //!< CGs per callsign
QHash<QString, PhysicalQuantities::CLength> m_cgsPerModel; //!< CGs per model string QHash<QString, PhysicalQuantities::CLength> m_cgsPerModel; //!< CGs per model string
QHash<QString, PhysicalQuantities::CLength> m_cgsPerModelOverridden; //!< CGs per model string manually forced
qint64 m_statsMaxElevRequestTimeMs = -1; qint64 m_statsMaxElevRequestTimeMs = -1;
qint64 m_statsCurrentElevRequestTimeMs = -1; qint64 m_statsCurrentElevRequestTimeMs = -1;