mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-13 15:45:42 +08:00
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
This commit is contained in:
committed by
Mat Sutcliffe
parent
93652ccd43
commit
2999aebf37
@@ -1109,6 +1109,13 @@ namespace BlackCore
|
|||||||
return c;
|
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)
|
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; }
|
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << cg.valueRoundedWithUnit(1) << modelString; }
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ namespace BlackCore
|
|||||||
virtual bool setAircraftEnabledFlag(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRendering) override;
|
virtual bool setAircraftEnabledFlag(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRendering) override;
|
||||||
virtual int reInitializeAllAircraft() override;
|
virtual int reInitializeAllAircraft() override;
|
||||||
virtual bool updateCG(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &cg) 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 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::Simulation::CSimulatedAircraftList getAircraftInRange() const override;
|
||||||
virtual BlackMisc::Aviation::CCallsignSet getAircraftInRangeCallsigns() const override;
|
virtual BlackMisc::Aviation::CCallsignSet getAircraftInRangeCallsigns() const override;
|
||||||
|
|||||||
@@ -124,6 +124,11 @@ namespace BlackCore
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CContextSimulator::isSimulatorPluginAvailable() const
|
||||||
|
{
|
||||||
|
return m_simulatorPlugin.second && IContextSimulator::isSimulatorAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
CContextSimulator::~CContextSimulator()
|
CContextSimulator::~CContextSimulator()
|
||||||
{
|
{
|
||||||
this->gracefulShutdown();
|
this->gracefulShutdown();
|
||||||
@@ -525,7 +530,7 @@ namespace BlackCore
|
|||||||
Q_ASSERT(c);
|
Q_ASSERT(c);
|
||||||
c = connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, this, &CContextSimulator::relayStatusMessageToSimulator);
|
c = connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, this, &CContextSimulator::relayStatusMessageToSimulator);
|
||||||
Q_ASSERT(c);
|
Q_ASSERT(c);
|
||||||
Q_UNUSED(c);
|
Q_UNUSED(c)
|
||||||
|
|
||||||
// Once the simulator signaled it is ready to simulate, add all known aircraft
|
// Once the simulator signaled it is ready to simulate, add all known aircraft
|
||||||
m_initallyAddAircraft = true;
|
m_initallyAddAircraft = true;
|
||||||
@@ -603,7 +608,7 @@ namespace BlackCore
|
|||||||
{
|
{
|
||||||
const bool s = QMetaObject::invokeMethod(listener, &ISimulatorListener::start, Qt::QueuedConnection);
|
const bool s = QMetaObject::invokeMethod(listener, &ISimulatorListener::start, Qt::QueuedConnection);
|
||||||
Q_ASSERT_X(s, Q_FUNC_INFO, "cannot invoke method");
|
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();
|
CLogMessage(this).info(u"Listening for simulator '%1'") << simulatorInfo.getIdentifier();
|
||||||
return true;
|
return true;
|
||||||
@@ -658,7 +663,8 @@ namespace BlackCore
|
|||||||
|
|
||||||
void CContextSimulator::xCtxAddedRemoteAircraftReadyForModelMatching(const CSimulatedAircraft &remoteAircraft)
|
void CContextSimulator::xCtxAddedRemoteAircraftReadyForModelMatching(const CSimulatedAircraft &remoteAircraft)
|
||||||
{
|
{
|
||||||
if (!this->isSimulatorAvailable()) { return; }
|
if (!this->isSimulatorPluginAvailable()) { return; }
|
||||||
|
|
||||||
const CCallsign callsign = remoteAircraft.getCallsign();
|
const CCallsign callsign = remoteAircraft.getCallsign();
|
||||||
BLACK_VERIFY_X(!callsign.isEmpty(), Q_FUNC_INFO, "Remote aircraft with empty callsign");
|
BLACK_VERIFY_X(!callsign.isEmpty(), Q_FUNC_INFO, "Remote aircraft with empty callsign");
|
||||||
if (callsign.isEmpty()) { return; }
|
if (callsign.isEmpty()) { return; }
|
||||||
@@ -692,6 +698,9 @@ namespace BlackCore
|
|||||||
break; // leave CG from model alone
|
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
|
// model in provider
|
||||||
this->updateAircraftModel(callsign, aircraftModel, this->identifier());
|
this->updateAircraftModel(callsign, aircraftModel, this->identifier());
|
||||||
|
|
||||||
|
|||||||
@@ -181,6 +181,9 @@ namespace BlackCore
|
|||||||
//! Register myself in DBus
|
//! Register myself in DBus
|
||||||
CContextSimulator *registerWithDBus(BlackMisc::CDBusServer *server);
|
CContextSimulator *registerWithDBus(BlackMisc::CDBusServer *server);
|
||||||
|
|
||||||
|
//! Simulator plugin available?
|
||||||
|
bool isSimulatorPluginAvailable() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int MatchingLogMaxModelSetSize = 250; //!< default value for switching matching log on
|
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 <n> times
|
static constexpr int MaxModelAddedFailoverTrials = 3; //!< if model cannot be added, try again max <n> times
|
||||||
|
|||||||
@@ -487,7 +487,8 @@ namespace BlackCore
|
|||||||
{
|
{
|
||||||
const CCallsign cs(parser.part(2));
|
const CCallsign cs(parser.part(2));
|
||||||
const bool changed = this->setInterpolationMode(part1, cs);
|
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();
|
: QStringLiteral("Unchanged interpolation mode for '%1'")) << cs.asString();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -496,7 +497,8 @@ namespace BlackCore
|
|||||||
CInterpolationAndRenderingSetupGlobal setup = this->getInterpolationSetupGlobal();
|
CInterpolationAndRenderingSetupGlobal setup = this->getInterpolationSetupGlobal();
|
||||||
const bool changed = setup.setInterpolatorMode(part1);
|
const bool changed = setup.setInterpolatorMode(part1);
|
||||||
if (changed) { this->setInterpolationSetupGlobal(setup); }
|
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"));
|
: QStringLiteral("Unchanged interpolation mode"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -566,17 +568,47 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CG override
|
// 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"
|
if (parser.part(2).startsWith("clear", Qt::CaseInsensitive))
|
||||||
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();
|
CLogMessage(this).info(u"Clear all overridden CGs");
|
||||||
this->insertCGForModelStringOverridden(cg, ms);
|
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
|
// driver specific cmd line arguments
|
||||||
@@ -588,7 +620,7 @@ namespace BlackCore
|
|||||||
if (CSimpleCommandParser::registered("BlackCore::ISimulator")) { return; }
|
if (CSimpleCommandParser::registered("BlackCore::ISimulator")) { return; }
|
||||||
CSimpleCommandParser::registerCommand({".drv", "alias: .driver .plugin"});
|
CSimpleCommandParser::registerCommand({".drv", "alias: .driver .plugin"});
|
||||||
CSimpleCommandParser::registerCommand({".drv unload", "unload driver"});
|
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 limit number/secs.", "limit updates to number per second (0..off)"});
|
||||||
CSimpleCommandParser::registerCommand({".drv logint callsign", "log interpolator for callsign"});
|
CSimpleCommandParser::registerCommand({".drv logint callsign", "log interpolator for callsign"});
|
||||||
CSimpleCommandParser::registerCommand({".drv logint off", "no log information for interpolator"});
|
CSimpleCommandParser::registerCommand({".drv logint off", "no log information for interpolator"});
|
||||||
@@ -884,9 +916,12 @@ namespace BlackCore
|
|||||||
|
|
||||||
const QString modelString = model.getModelString();
|
const QString modelString = model.getModelString();
|
||||||
if (modelString.isEmpty()) { return; }
|
if (modelString.isEmpty()) { return; }
|
||||||
|
|
||||||
|
// this value now is the simulator or overridden value
|
||||||
const CLength cgOvr = this->overriddenCGorDefault(simulatorCG, modelString);
|
const CLength cgOvr = this->overriddenCGorDefault(simulatorCG, modelString);
|
||||||
if (!cgOvr.isNull() && !this->hasSameSimulatorCG(cgOvr, callsign))
|
if (!cgOvr.isNull() && !this->hasSameSimulatorCG(cgOvr, callsign))
|
||||||
{
|
{
|
||||||
|
// the value did change
|
||||||
const CSimulatorSettings::CGSource source = this->getSimulatorSettings().getSimulatorSettings().getCGSource();
|
const CSimulatorSettings::CGSource source = this->getSimulatorSettings().getSimulatorSettings().getCGSource();
|
||||||
if (source != CSimulatorSettings::CGFromDBOnly)
|
if (source != CSimulatorSettings::CGFromDBOnly)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -285,19 +285,19 @@ namespace BlackCore
|
|||||||
//! \addtogroup swiftdotcommands
|
//! \addtogroup swiftdotcommands
|
||||||
//! @{
|
//! @{
|
||||||
//! <pre>
|
//! <pre>
|
||||||
//! .drv cg length modelstring set overridden CG for model string BlackCore::ISimulator
|
//! .drv cg length clear|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
|
||||||
//! .drv logint off no log information for interpolator BlackCore::ISimulator
|
//! .drv logint off no log information for interpolator BlackCore::ISimulator
|
||||||
//! .drv logint write write interpolator log to file BlackCore::ISimulator
|
//! .drv logint write write interpolator log to file BlackCore::ISimulator
|
||||||
//! .drv logint clear clear current log BlackCore::ISimulator
|
//! .drv logint clear clear current log BlackCore::ISimulator
|
||||||
//! .drv pos callsign shows current position in simulator BlackCore::ISimulator
|
//! .drv pos callsign shows current position in simulator BlackCore::ISimulator
|
||||||
//! .drv spline|linear callsign interpolator spline or linear 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 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 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>
|
||||||
//! @}
|
//! @}
|
||||||
//! Parse command line for simulator drivers, derived classes can add specific parsing by overriding ISimulator::parseDetails
|
//! Parse command line for simulator drivers, derived classes can add specific parsing by overriding ISimulator::parseDetails
|
||||||
|
|||||||
@@ -611,6 +611,23 @@ namespace BlackMisc
|
|||||||
return true;
|
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
|
CLength CRemoteAircraftProvider::getCGFromDB(const CCallsign &callsign) const
|
||||||
{
|
{
|
||||||
QReadLocker l(&m_lockAircraft);
|
QReadLocker l(&m_lockAircraft);
|
||||||
@@ -996,6 +1013,12 @@ namespace BlackMisc
|
|||||||
return this->provider()->updateCG(callsign, cg);
|
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)
|
bool CRemoteAircraftAware::updateCGAndModelString(const CCallsign &callsign, const CLength &cg, const QString &modelString)
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
|
Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available");
|
||||||
|
|||||||
@@ -196,6 +196,10 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
virtual bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg) = 0;
|
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
|
//! Update the CG and model string
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
virtual bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString) = 0;
|
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 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 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 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 Aviation::CCallsign &callsign) const override;
|
||||||
virtual PhysicalQuantities::CLength getCGFromDB(const QString &modelString) const override;
|
virtual PhysicalQuantities::CLength getCGFromDB(const QString &modelString) const override;
|
||||||
virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const Aviation::CCallsign &callsign) override;
|
virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const Aviation::CCallsign &callsign) override;
|
||||||
@@ -594,6 +599,9 @@ namespace BlackMisc
|
|||||||
//! \copydoc IRemoteAircraftProvider::updateCG
|
//! \copydoc IRemoteAircraftProvider::updateCG
|
||||||
bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg);
|
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
|
//! \copydoc IRemoteAircraftProvider::updateCGAndModelString
|
||||||
bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString);
|
bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString);
|
||||||
|
|
||||||
|
|||||||
@@ -95,12 +95,72 @@ namespace BlackMisc
|
|||||||
|
|
||||||
bool ISimulationEnvironmentProvider::insertCG(const CLength &cg, const QString &modelString, const CCallsign &cs)
|
bool ISimulationEnvironmentProvider::insertCG(const CLength &cg, const QString &modelString, const CCallsign &cs)
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool stored = false;
|
||||||
QWriteLocker l(&m_lockCG);
|
QWriteLocker l(&m_lockCG);
|
||||||
if (!m_enableCG) { return false; }
|
if (!m_enableCG) { return false; }
|
||||||
if (!cs.isEmpty()) { m_cgsPerCallsign[cs] = cg; ok = true; }
|
if (!cs.isEmpty())
|
||||||
if (!modelString.isEmpty()) { m_cgsPerModel[modelString.toUpper()] = cg; ok = true; }
|
{
|
||||||
return ok;
|
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)
|
bool ISimulationEnvironmentProvider::insertCGForModelString(const CLength &cg, const QString &modelString)
|
||||||
@@ -132,17 +192,29 @@ namespace BlackMisc
|
|||||||
return true;
|
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);
|
QReadLocker l(&m_lockCG);
|
||||||
if (!m_cgsPerModelOverridden.contains(modelString.toUpper())) { return cg; }
|
if (!m_cgsPerModelOverridden.contains(ms)) { return defaultCG; }
|
||||||
return m_cgsPerModelOverridden[modelString.toUpper()];
|
return m_cgsPerModelOverridden[ms];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ISimulationEnvironmentProvider::removeSimulatorCG(const CCallsign &cs)
|
int ISimulationEnvironmentProvider::removeSimulatorCG(const CCallsign &cs)
|
||||||
{
|
{
|
||||||
|
if (cs.isEmpty()) { return 0; }
|
||||||
|
|
||||||
QWriteLocker l(&m_lockCG);
|
QWriteLocker l(&m_lockCG);
|
||||||
|
m_cgsPerCallsignOverridden.remove(cs);
|
||||||
return m_cgsPerCallsign.remove(cs);
|
return m_cgsPerCallsign.remove(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,11 +400,28 @@ namespace BlackMisc
|
|||||||
return m_defaultModel;
|
return m_defaultModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CLengthPerCallsign ISimulationEnvironmentProvider::getSimulatorCGsPerCallsign() const
|
||||||
|
{
|
||||||
|
QReadLocker l(&m_lockCG);
|
||||||
|
return m_cgsPerCallsign;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<QString, CLength> ISimulationEnvironmentProvider::getSimulatorCGsPerModelString() const
|
||||||
|
{
|
||||||
|
QReadLocker l(&m_lockCG);
|
||||||
|
return m_cgsPerModel;
|
||||||
|
}
|
||||||
|
|
||||||
CLength ISimulationEnvironmentProvider::getSimulatorCG(const Aviation::CCallsign &callsign) const
|
CLength ISimulationEnvironmentProvider::getSimulatorCG(const Aviation::CCallsign &callsign) const
|
||||||
{
|
{
|
||||||
if (callsign.isEmpty()) { return CLength::null(); }
|
if (callsign.isEmpty()) { return CLength::null(); }
|
||||||
QReadLocker l(&m_lockCG);
|
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);
|
return m_cgsPerCallsign.value(callsign);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,8 +440,12 @@ 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) { return CLength::null(); }
|
||||||
if (!m_enableCG || !m_cgsPerModel.contains(ms)) { 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);
|
return m_cgsPerModel.value(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,13 +468,19 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
if (callsign.isEmpty()) { return false; }
|
if (callsign.isEmpty()) { return false; }
|
||||||
QReadLocker l(&m_lockCG);
|
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
|
bool ISimulationEnvironmentProvider::hasSameSimulatorCG(const CLength &cg, const CCallsign &callsign) const
|
||||||
{
|
{
|
||||||
if (callsign.isEmpty()) { return false; }
|
if (callsign.isEmpty()) { return false; }
|
||||||
QReadLocker l(&m_lockCG);
|
QReadLocker l(&m_lockCG);
|
||||||
|
if (m_cgsPerCallsignOverridden.contains(callsign))
|
||||||
|
{
|
||||||
|
return m_cgsPerCallsignOverridden[callsign] == cg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// normal values
|
||||||
if (!m_cgsPerCallsign.contains(callsign)) { return false; }
|
if (!m_cgsPerCallsign.contains(callsign)) { return false; }
|
||||||
return m_cgsPerCallsign[callsign] == cg;
|
return m_cgsPerCallsign[callsign] == cg;
|
||||||
}
|
}
|
||||||
@@ -565,6 +664,7 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
QWriteLocker l(&m_lockCG);
|
QWriteLocker l(&m_lockCG);
|
||||||
m_cgsPerCallsign.clear();
|
m_cgsPerCallsign.clear();
|
||||||
|
m_cgsPerCallsignOverridden.clear();
|
||||||
// intentionally not cleaning CGs per model, as models will not change, callsign do!
|
// intentionally not cleaning CGs per model, as models will not change, callsign do!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,14 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
CAircraftModel getDefaultModel() const;
|
CAircraftModel getDefaultModel() const;
|
||||||
|
|
||||||
|
//! All CGs per callsign
|
||||||
|
//! \threadsafe
|
||||||
|
Aviation::CLengthPerCallsign getSimulatorCGsPerCallsign() const;
|
||||||
|
|
||||||
|
//! All CGs per modelstring
|
||||||
|
//! \threadsafe
|
||||||
|
QHash<QString, PhysicalQuantities::CLength> getSimulatorCGsPerModelString() const;
|
||||||
|
|
||||||
//! Get CG per callsign, NULL if not found
|
//! Get CG per callsign, NULL if not found
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
PhysicalQuantities::CLength getSimulatorCG(const Aviation::CCallsign &callsign) const;
|
PhysicalQuantities::CLength getSimulatorCG(const Aviation::CCallsign &callsign) const;
|
||||||
@@ -114,6 +122,10 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
PhysicalQuantities::CLength getSimulatorOrDbCGPerModelString(const QString &modelString, const PhysicalQuantities::CLength &dbCG) const;
|
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?
|
//! Has a CG?
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
bool hasSimulatorCG(const Aviation::CCallsign &callsign) const;
|
bool hasSimulatorCG(const Aviation::CCallsign &callsign) const;
|
||||||
@@ -228,6 +240,16 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
bool insertCG(const PhysicalQuantities::CLength &cg, const QString &modelString, const Aviation::CCallsign &cs);
|
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
|
//! Insert or replace a CG
|
||||||
//! \remark passing a NULL value will remove the CG
|
//! \remark passing a NULL value will remove the CG
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
@@ -238,11 +260,11 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
bool insertCGForModelStringOverridden(const PhysicalQuantities::CLength &cg, const QString &modelString);
|
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
|
//! \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
|
//! \threadsafe
|
||||||
int removeSimulatorCG(const Aviation::CCallsign &cs);
|
int removeSimulatorCG(const Aviation::CCallsign &cs);
|
||||||
|
|
||||||
@@ -265,8 +287,9 @@ 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
|
||||||
|
Aviation::CLengthPerCallsign m_cgsPerCallsignOverridden; //!< CGs per callsign overridden (manually forced)
|
||||||
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
|
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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user