mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-02 06:35:52 +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
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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<QString, CLength> 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!
|
||||
}
|
||||
|
||||
|
||||
@@ -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<QString, PhysicalQuantities::CLength> 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<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_statsCurrentElevRequestTimeMs = -1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user