Ref T681, preparations to use CG from DB

* renamed to "getSimulatorCG" ...
* pass simulator settings to sim.env.provider to decide what CG to use
* store DB CG and init it when aircraft is added
* style
This commit is contained in:
Klaus Basan
2019-06-10 19:54:35 +02:00
committed by Mat Sutcliffe
parent 33c3ee68f1
commit 6d490e9a49
14 changed files with 196 additions and 64 deletions

View File

@@ -885,12 +885,21 @@ namespace BlackCore
newAircraft.setRendered(false); // reset rendering
newAircraft.calculcateAndUpdateRelativeDistanceAndBearing(this->getOwnAircraftPosition()); // distance from myself
Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "No web services");
if (this->getConnectedServer().getEcosystem() == CEcosystem::vatsim())
{
sApp->getWebDataServices()->updateWithVatsimDataFileData(newAircraft);
}
return CRemoteAircraftProvider::addNewAircraftInRange(newAircraft);
const bool added = CRemoteAircraftProvider::addNewAircraftInRange(newAircraft);
if (added && aircraft.hasModelString())
{
// most likely I could take the CG at this time from aircraft
// to make sure it is really the DB value i query again
const CAircraftModel model = sApp->getWebDataServices()->getModelForModelString(aircraft.getModelString());
const CLength cg = model.hasValidDbKey() ? model.getCG() : CLength::null();
this->rememberCGFromDB(cg, aircraft.getModelString());
this->rememberCGFromDB(cg, aircraft.getCallsign());
}
return added;
}
void CAirspaceMonitor::asyncAddNewAircraftInRange(const CSimulatedAircraftList &aircraft, bool readyForModelMatching)
@@ -1184,7 +1193,7 @@ namespace BlackCore
}
// CG from provider
const CLength cg = this->getCG(callsign); // always x-check against simulator to override guessed values and reflect changed CGs
const CLength cg = this->getSimulatorCG(callsign); // always x-check against simulator to override guessed values and reflect changed CGs
if (!cg.isNull()) { correctedSituation.setCG(cg); }
// store corrected situation

View File

@@ -970,6 +970,26 @@ namespace BlackCore
m_airspace->updateMarkAllAsNotRendered();
}
CLength CContextNetwork::getCGFromDB(const CCallsign &callsign) const
{
return m_airspace->getCGFromDB(callsign);
}
CLength CContextNetwork::getCGFromDB(const QString &modelString) const
{
return m_airspace->getCGFromDB(modelString);
}
void CContextNetwork::rememberCGFromDB(const CLength &cgFromDB, const CCallsign &callsign)
{
m_airspace->rememberCGFromDB(cgFromDB, callsign);
}
void CContextNetwork::rememberCGFromDB(const CLength &cgFromDB, const QString &modelString)
{
m_airspace->rememberCGFromDB(cgFromDB, modelString);
}
int CContextNetwork::reInitializeAllAircraft()
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }

View File

@@ -109,6 +109,10 @@ namespace BlackCore
virtual int updateMultipleAircraftEnabled(const BlackMisc::Aviation::CCallsignSet &callsigns, bool enabled) override;
virtual int updateAircraftGroundElevation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Geo::CElevationPlane &elevation, BlackMisc::Aviation::CAircraftSituation::GndElevationInfo info) override;
virtual void updateMarkAllAsNotRendered() override;
virtual BlackMisc::PhysicalQuantities::CLength getCGFromDB(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual BlackMisc::PhysicalQuantities::CLength getCGFromDB(const QString &modelString) const override;
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const BlackMisc::Aviation::CCallsign &callsign) override;
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const QString &modelString) override;
virtual BlackMisc::Simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override;
virtual BlackMisc::Geo::CElevationPlane averageElevationOfNonMovingAircraft(const BlackMisc::Aviation::CAircraftSituation &reference, const BlackMisc::PhysicalQuantities::CLength &range, int minValues = 1) const override;
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(

View File

@@ -638,7 +638,7 @@ namespace BlackCore
CStatusMessageList *pMatchingMessages = m_logMatchingMessages > 0 ? &matchingMessages : nullptr;
CAircraftModel aircraftModel = m_aircraftMatcher.getClosestMatch(remoteAircraft, whatToLog, pMatchingMessages, true);
Q_ASSERT_X(remoteAircraft.getCallsign() == aircraftModel.getCallsign(), Q_FUNC_INFO, "Mismatching callsigns");
const CLength cg = m_simulatorPlugin.second->getCGPerModelString(aircraftModel.getModelString());
const CLength cg = m_simulatorPlugin.second->getSimulatorCGPerModelString(aircraftModel.getModelString());
if (!cg.isNull()) { aircraftModel.setCG(cg); }
this->updateAircraftModel(callsign, aircraftModel, this->identifier());

View File

@@ -649,11 +649,11 @@ namespace BlackCore
}
ISimulator::ISimulator(const CSimulatorPluginInfo &pluginInfo,
IOwnAircraftProvider *ownAircraftProvider,
IRemoteAircraftProvider *remoteAircraftProvider,
IWeatherGridProvider *weatherGridProvider,
IClientProvider *clientProvider,
QObject *parent) :
IOwnAircraftProvider *ownAircraftProvider,
IRemoteAircraftProvider *remoteAircraftProvider,
IWeatherGridProvider *weatherGridProvider,
IClientProvider *clientProvider,
QObject *parent) :
QObject(parent),
COwnAircraftAware(ownAircraftProvider),
CRemoteAircraftAware(remoteAircraftProvider),
@@ -688,9 +688,11 @@ namespace BlackCore
connect(sApp->getWebDataServices(), &CWebDataServices::swiftDbAirportsRead, this, &ISimulator::onSwiftDbAirportsRead, Qt::QueuedConnection);
connect(sApp->getWebDataServices(), &CWebDataServices::swiftDbModelMatchingEntitiesRead, this, &ISimulator::onSwiftDbModelMatchingEntitiesRead, Qt::QueuedConnection);
}
connect(sApp, &CApplication::aboutToShutdown, this, &ISimulator::unload, Qt::QueuedConnection);
// provider
this->setNewPluginInfo(pluginInfo, m_multiSettings.getSettings(pluginInfo.getSimulatorInfo()));
// info data
m_simulatorInternals.setSimulatorName(this->getSimulatorName());
m_simulatorInternals.setSwiftPluginName(this->getSimulatorPluginInfo().toQString());
@@ -833,7 +835,7 @@ namespace BlackCore
m_simulatorInternals.setSimulatorInstallationDirectory(s.getSimulatorDirectoryOrDefault());
}
void ISimulator::rememberElevationAndCG(const CCallsign &callsign, const QString &modelString, const Geo::CElevationPlane &elevation, const CLength &cg)
void ISimulator::rememberElevationAndCG(const CCallsign &callsign, const QString &modelString, const CElevationPlane &elevation, const CLength &cg)
{
if (callsign.isEmpty()) { return; }
if (!elevation.isNull())
@@ -844,7 +846,7 @@ namespace BlackCore
}
const CLength cgO = this->overriddenCGorDefault(cg, modelString);
if (!cgO.isNull() && !this->hasSameCG(cgO, callsign))
if (!cgO.isNull() && !this->hasSameSimulatorCG(cgO, callsign))
{
this->insertCG(cgO, modelString, callsign); // per model string and CG

View File

@@ -195,7 +195,7 @@ namespace BlackCore
void reloadWeatherSettings();
//! Settings for current simulator
BlackMisc::Simulation::Settings::CSpecializedSimulatorSettings getSimulatorSettings() const { return m_settings.getSpecializedSettings(this->getSimulatorInfo()); }
BlackMisc::Simulation::Settings::CSpecializedSimulatorSettings getSimulatorSettings() const { return m_multiSettings.getSpecializedSettings(this->getSimulatorInfo()); }
//! Driver will be unloaded
virtual void unload();
@@ -574,7 +574,7 @@ namespace BlackCore
bool m_limitUpdateAircraft = false; //!< limit the update frequency by using BlackMisc::CTokenBucket
// general settings
BlackMisc::Simulation::Settings::CMultiSimulatorSettings m_settings { this }; //!< simulator settings for all simulators
BlackMisc::Simulation::Settings::CMultiSimulatorSettings m_multiSettings { this }; //!< simulator settings for all simulators
// weather
bool m_isWeatherActivated = false; //!< Is simulator weather activated?

View File

@@ -127,7 +127,7 @@ namespace BlackGui
}
else if (ui->tw_LogTabs->currentWidget() == ui->tb_DataFlow)
{
ui->le_CG->setText(m_airspaceMonitor->getCG(m_callsign).valueRoundedWithUnit(CLengthUnit::ft(), 1));
ui->le_CG->setText(m_airspaceMonitor->getSimulatorCG(m_callsign).valueRoundedWithUnit(CLengthUnit::ft(), 1));
ui->le_CG->home(false);
ui->le_Parts->setText(boolToYesNo(m_airspaceMonitor->isRemoteAircraftSupportingParts(m_callsign)));

View File

@@ -58,7 +58,7 @@ namespace BlackMisc
template<typename Derived>
CLength CInterpolator<Derived>::getAndFetchModelCG()
{
const CLength cg = this->getCG(m_callsign);
const CLength cg = this->getSimulatorCG(m_callsign); // simulation environment
m_model.setCG(cg);
m_model.setCallsign(m_callsign);
return cg;

View File

@@ -192,7 +192,11 @@ namespace BlackMisc
{ QWriteLocker l(&m_lockPartsHistory); m_aircraftPartsMessages.clear(); }
{ QWriteLocker l(&m_lockMessages); m_reverseLookupMessages.clear(); }
{ QWriteLocker l(&m_lockAircraft); m_aircraftInRange.clear(); }
{
QWriteLocker l(&m_lockAircraft);
m_aircraftInRange.clear();
m_dbCGPerCallsign.clear();
}
for (const CCallsign &cs : callsigns)
{
@@ -603,6 +607,30 @@ namespace BlackMisc
return true;
}
CLength CRemoteAircraftProvider::getCGFromDB(const CCallsign &callsign) const
{
QReadLocker l(&m_lockAircraft);
return m_dbCGPerCallsign.contains(callsign) ? m_dbCGPerCallsign[callsign] : CLength::null();
}
CLength CRemoteAircraftProvider::getCGFromDB(const QString &modelString) const
{
QReadLocker l(&m_lockAircraft);
return m_dbCGPerCallsign.contains(modelString) ? m_dbCGPerCallsign[modelString] : CLength::null();
}
void CRemoteAircraftProvider::rememberCGFromDB(const CLength &cgFromDB, const CCallsign &callsign)
{
QWriteLocker l(&m_lockAircraft);
m_dbCGPerCallsign[callsign] = cgFromDB;
}
void CRemoteAircraftProvider::rememberCGFromDB(const CLength &cgFromDB, const QString &modelString)
{
QWriteLocker l(&m_lockAircraft);
m_dbCGPerModelString[modelString] = cgFromDB;
}
void CRemoteAircraftProvider::updateMarkAllAsNotRendered()
{
const CCallsignSet callsigns = this->getAircraftInRangeCallsigns();
@@ -816,6 +844,7 @@ namespace BlackMisc
bool removedCallsign = false;
{
QWriteLocker l(&m_lockAircraft);
m_dbCGPerCallsign.remove(callsign);
const int c = m_aircraftInRange.remove(callsign);
removedCallsign = c > 0;
}

View File

@@ -50,7 +50,7 @@ namespace BlackMisc
static constexpr int MaxPartsAgePerCallsignSecs = 60; //!< How many seconds to keep parts for interpolation
//! Destructor
virtual ~IRemoteAircraftProvider();
virtual ~IRemoteAircraftProvider() override;
//! Copy constructor
IRemoteAircraftProvider(const IRemoteAircraftProvider &) = delete;
@@ -200,6 +200,14 @@ namespace BlackMisc
//! \threadsafe
virtual bool updateCGAndModelString(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg, const QString &modelString) = 0;
//! CG values from DB @{
//! \threadsafe
virtual PhysicalQuantities::CLength getCGFromDB(const Aviation::CCallsign &callsign) const = 0;
virtual PhysicalQuantities::CLength getCGFromDB(const QString &modelString) const = 0;
virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const Aviation::CCallsign &callsign) = 0;
virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const QString &modelString) = 0;
//! @}
//! Get reverse lookup meesages
//! \threadsafe
virtual CStatusMessageList getReverseLookupMessages(const Aviation::CCallsign &callsign) const = 0;
@@ -323,6 +331,10 @@ namespace BlackMisc
virtual int updateAircraftGroundElevation(const Aviation::CCallsign &callsign, const Geo::CElevationPlane &elevation, Aviation::CAircraftSituation::GndElevationInfo info) 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 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;
virtual void rememberCGFromDB(const PhysicalQuantities::CLength &cgFromDB, const QString &modelString) override;
virtual void updateMarkAllAsNotRendered() override;
virtual CStatusMessageList getAircraftPartsHistory(const Aviation::CCallsign &callsign) const override;
virtual bool isAircraftPartsHistoryEnabled() const override;
@@ -467,15 +479,17 @@ namespace BlackMisc
Aviation::CAircraftSituationChangeListPerCallsign m_changesByCallsign; //!< changes, for performance reasons per callsign, thread safe access required (same timestamps as corresponding situations)
Aviation::CCallsignSet m_aircraftWithParts; //!< aircraft supporting parts, thread safe access required
int m_situationsAdded = 0; //!< total number of situations added, thread safe access required
int m_partsAdded = 0; //!< total number of parts added, thread safe access required
int m_partsAdded = 0; //!< total number of parts added, thread safe access required
ReverseLookupLogging m_enableReverseLookupMsgs = RevLogSimplifiedInfo; //!< shall we log. information about the matching process
Simulation::CSimulatedAircraftPerCallsign m_aircraftInRange; //!< aircraft, thread safe access required
Aviation::CStatusMessageListPerCallsign m_reverseLookupMessages; //!< reverse lookup messages
Aviation::CStatusMessageListPerCallsign m_aircraftPartsMessages; //!< status messages for parts history
Aviation::CTimestampPerCallsign m_situationsLastModified; //!< when situations last modified
Aviation::CTimestampPerCallsign m_partsLastModified; //!< when parts last modified
Aviation::CLengthPerCallsign m_testOffset; //!< offsets
Simulation::CSimulatedAircraftPerCallsign m_aircraftInRange; //!< aircraft, thread safe access required
Aviation::CStatusMessageListPerCallsign m_reverseLookupMessages; //!< reverse lookup messages
Aviation::CStatusMessageListPerCallsign m_aircraftPartsMessages; //!< status messages for parts history
Aviation::CTimestampPerCallsign m_situationsLastModified; //!< when situations last modified
Aviation::CTimestampPerCallsign m_partsLastModified; //!< when parts last modified
Aviation::CLengthPerCallsign m_testOffset; //!< offsets
Aviation::CLengthPerCallsign m_dbCGPerCallsign; //!< DB CG per callsign
QHash<QString, PhysicalQuantities::CLength> m_dbCGPerModelString; //!< DB CG per model string
bool m_enableAircraftPartsHistory = true; //!< shall we keep a history of aircraft parts
@@ -483,7 +497,7 @@ namespace BlackMisc
mutable QReadWriteLock m_lockSituations; //!< lock for situations: m_situationsByCallsign
mutable QReadWriteLock m_lockParts; //!< lock for parts: m_partsByCallsign, m_aircraftSupportingParts
mutable QReadWriteLock m_lockChanges; //!< lock for changes: m_changesByCallsign
mutable QReadWriteLock m_lockAircraft; //!< lock aircraft: m_aircraftInRange
mutable QReadWriteLock m_lockAircraft; //!< lock aircraft: m_aircraftInRange, m_dbCGPerCallsign
mutable QReadWriteLock m_lockMessages; //!< lock for messages
mutable QReadWriteLock m_lockPartsHistory; //!< lock for aircraft parts
};
@@ -493,7 +507,7 @@ namespace BlackMisc
{
public:
//! Destructor
virtual ~CRemoteAircraftAware();
virtual ~CRemoteAircraftAware() override;
//! \copydoc IRemoteAircraftProvider::getAircraftInRange
CSimulatedAircraftList getAircraftInRange() const;

View File

@@ -9,6 +9,7 @@
#include "simulationenvironmentprovider.h"
#include <QStringBuilder>
using namespace BlackMisc::Simulation::Settings;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Geo;
using namespace BlackMisc::PhysicalQuantities;
@@ -116,7 +117,7 @@ namespace BlackMisc
return m_cgsPerModelOverridden[modelString.toUpper()];
}
int ISimulationEnvironmentProvider::removeCG(const CCallsign &cs)
int ISimulationEnvironmentProvider::removeSimulatorCG(const CCallsign &cs)
{
QWriteLocker l(&m_lockCG);
return m_cgsPerCallsign.remove(cs);
@@ -124,7 +125,7 @@ namespace BlackMisc
CLength ISimulationEnvironmentProvider::minRange(const CLength &range)
{
return (range < CElevationPlane::singlePointRadius()) ?
return (range.isNull() || range < CElevationPlane::singlePointRadius()) ?
CElevationPlane::singlePointRadius() :
range;
}
@@ -271,16 +272,25 @@ namespace BlackMisc
return m_defaultModel;
}
CLength ISimulationEnvironmentProvider::getCG(const Aviation::CCallsign &callsign) const
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(); }
return m_cgsPerCallsign.value(callsign);
}
CLength ISimulationEnvironmentProvider::getCGPerModelString(const QString &modelString) const
CLength ISimulationEnvironmentProvider::getSimulatorOrDbCG(const CCallsign &callsign, const CLength &dbCG) const
{
if (callsign.isEmpty()) { return CLength::null(); }
const CSimulatorSettings::CGSource source = m_settings.getCGSource();
if (source == CSimulatorSettings::CGFromDBOnly || (source == CSimulatorSettings::CGFromDBFirst && !dbCG.isNull())) { return dbCG; }
const CLength simCG = this->getSimulatorCG(callsign);
if (source == CSimulatorSettings::CGFromSimulatorOnly || (source == CSimulatorSettings::CGFromSimulatorFirst && !simCG.isNull())) { return simCG; }
return dbCG;
}
CLength ISimulationEnvironmentProvider::getSimulatorCGPerModelString(const QString &modelString) const
{
if (modelString.isEmpty()) { return CLength::null(); }
const QString ms = modelString.toUpper();
@@ -290,14 +300,29 @@ namespace BlackMisc
return m_cgsPerModel.value(ms);
}
bool ISimulationEnvironmentProvider::hasCG(const Aviation::CCallsign &callsign) const
CLength ISimulationEnvironmentProvider::getSimulatorOrDbCGPerModelString(const QString &modelString, const CLength &dbCG) const
{
if (modelString.isEmpty()) { return CLength::null(); }
const CSimulatorSettings::CGSource source = m_settings.getCGSource();
const QString ms = modelString.toUpper();
{
QReadLocker l(&m_lockCG);
if (m_cgsPerModelOverridden.contains(ms)) { return m_cgsPerModelOverridden.value(ms); }
}
if (source == CSimulatorSettings::CGFromDBOnly || (!dbCG.isNull() && source == CSimulatorSettings::CGFromDBFirst)) { return dbCG; }
const CLength simCG = this->getSimulatorCGPerModelString(modelString);
if (source == CSimulatorSettings::CGFromSimulatorOnly || (source == CSimulatorSettings::CGFromSimulatorFirst && simCG.isNull())) { return simCG; }
return dbCG;
}
bool ISimulationEnvironmentProvider::hasSimulatorCG(const Aviation::CCallsign &callsign) const
{
if (callsign.isEmpty()) { return false; }
QReadLocker l(&m_lockCG);
return m_enableCG && m_cgsPerCallsign.contains(callsign);
}
bool ISimulationEnvironmentProvider::hasSameCG(const CLength &cg, const CCallsign &callsign) const
bool ISimulationEnvironmentProvider::hasSameSimulatorCG(const CLength &cg, const CCallsign &callsign) const
{
if (callsign.isEmpty()) { return false; }
QReadLocker l(&m_lockCG);
@@ -326,11 +351,12 @@ namespace BlackMisc
m_elvFound = m_elvMissed = 0;
}
ISimulationEnvironmentProvider::ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo) : m_simulatorPluginInfo(pluginInfo)
ISimulationEnvironmentProvider::ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo) :
m_simulatorPluginInfo(pluginInfo)
{ }
ISimulationEnvironmentProvider::ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo, bool supportElevation, bool supportCG) :
m_simulatorPluginInfo(pluginInfo), m_enableElevation(supportElevation), m_enableCG(supportCG)
ISimulationEnvironmentProvider::ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo, const CSimulatorSettings &settings, bool supportElevation, bool supportCG) :
m_simulatorPluginInfo(pluginInfo), m_settings(settings), m_enableElevation(supportElevation), m_enableCG(supportCG)
{ }
bool ISimulationEnvironmentProvider::isCgProviderEnabled() const
@@ -363,15 +389,19 @@ namespace BlackMisc
setCgProviderEnabled(cgEnabled);
}
void ISimulationEnvironmentProvider::setNewPluginInfo(const CSimulatorPluginInfo &info, const CAircraftModel &defaultModel)
void ISimulationEnvironmentProvider::setNewPluginInfo(const CSimulatorPluginInfo &info, const CSimulatorSettings &settings, const CAircraftModel &defaultModel)
{
{
QWriteLocker l1(&m_lockSimInfo);
m_simulatorPluginInfo = info;
}
this->setNewPluginInfo(info, settings);
this->setDefaultModel(defaultModel);
}
void ISimulationEnvironmentProvider::setNewPluginInfo(const CSimulatorPluginInfo &info, const CSimulatorSettings &settings)
{
QWriteLocker l(&m_lockSimInfo);
m_simulatorPluginInfo = info;
m_settings = settings;
}
void ISimulationEnvironmentProvider::setSimulatorDetails(const QString &name, const QString &details, const QString &version)
{
QWriteLocker l(&m_lockSimInfo);
@@ -416,7 +446,7 @@ namespace BlackMisc
m_elvCoordinates.clear();
m_pendingElevationRequests.clear();
m_statsCurrentElevRequestTimeMs = -1;
m_statsMaxElevRequestTimeMs = -1;
m_statsMaxElevRequestTimeMs = -1;
m_elvFound = m_elvMissed = 0;
}
@@ -510,16 +540,22 @@ namespace BlackMisc
return this->provider()->getDefaultModel();
}
CLength CSimulationEnvironmentAware::getCG(const CCallsign &callsign) const
CLength CSimulationEnvironmentAware::getSimulatorCG(const CCallsign &callsign) const
{
if (!this->hasProvider()) { return CLength::null(); }
return this->provider()->getCG(callsign);
return this->provider()->getSimulatorCG(callsign);
}
bool CSimulationEnvironmentAware::hasCG(const CCallsign &callsign) const
CLength CSimulationEnvironmentAware::getSimulatorOrDbCG(const CCallsign &callsign, const CLength &dbCG) const
{
if (!this->hasProvider()) { return CLength::null(); }
return this->provider()->getSimulatorOrDbCG(callsign, dbCG);
}
bool CSimulationEnvironmentAware::hasSimulatorCG(const CCallsign &callsign) const
{
if (!this->hasProvider()) { return false; }
return this->provider()->hasCG(callsign);
return this->provider()->hasSimulatorCG(callsign);
}
} // namespace
} // namespace

View File

@@ -13,6 +13,7 @@
#include "simulatorplugininfo.h"
#include "aircraftmodel.h"
#include "blackmisc/simulation/settings/simulatorsettings.h"
#include "blackmisc/aviation/aircraftsituation.h"
#include "blackmisc/aviation/percallsign.h"
#include "blackmisc/geo/coordinategeodeticlist.h"
@@ -37,11 +38,11 @@ namespace BlackMisc
//! \threadsafe
Geo::CCoordinateGeodeticList getElevationCoordinates() const;
//! Find closest elevation
//! Find closest elevation (or return NULL)
//! \threadsafe
Geo::CElevationPlane findClosestElevationWithinRange(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const;
//! Find closest elevation
//! Find closest elevation or request elevation
//! \threadsafe
Geo::CElevationPlane findClosestElevationWithinRangeOrRequest(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, const Aviation::CCallsign &callsign);
@@ -87,19 +88,27 @@ namespace BlackMisc
//! Get CG per callsign, NULL if not found
//! \threadsafe
PhysicalQuantities::CLength getCG(const Aviation::CCallsign &callsign) const;
PhysicalQuantities::CLength getSimulatorCG(const Aviation::CCallsign &callsign) const;
//! Get CG per callsign, NULL if not found
//! \threadsafe
PhysicalQuantities::CLength getSimulatorOrDbCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &dbCG) const;
//! Get CG per model string, NULL if not found
//! \threadsafe
PhysicalQuantities::CLength getCGPerModelString(const QString &modelString) const;
PhysicalQuantities::CLength getSimulatorCGPerModelString(const QString &modelString) const;
//! Get CG per model string, NULL if not found
//! \threadsafe
PhysicalQuantities::CLength getSimulatorOrDbCGPerModelString(const QString &modelString, const PhysicalQuantities::CLength &dbCG) const;
//! Has a CG?
//! \threadsafe
bool hasCG(const Aviation::CCallsign &callsign) const;
bool hasSimulatorCG(const Aviation::CCallsign &callsign) const;
//! Has the same CG?
//! \threadsafe
bool hasSameCG(const PhysicalQuantities::CLength &cg, const Aviation::CCallsign &callsign) const;
bool hasSameSimulatorCG(const PhysicalQuantities::CLength &cg, const Aviation::CCallsign &callsign) const;
//! Set number of elevations kept
//! \threadsafe
@@ -118,7 +127,7 @@ namespace BlackMisc
ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo);
//! Ctor
ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo, bool supportElevation, bool supportCG);
ISimulationEnvironmentProvider(const CSimulatorPluginInfo &pluginInfo, const Settings::CSimulatorSettings &settings, bool supportElevation, bool supportCG);
//! Provider enabled
//! \threadsafe
@@ -137,7 +146,11 @@ namespace BlackMisc
//! New plugin info and default model
//! \remark normally only used by emulated driver
//! \threadsafe
void setNewPluginInfo(const CSimulatorPluginInfo &info, const CAircraftModel &defaultModel);
void setNewPluginInfo(const CSimulatorPluginInfo &info, const Settings::CSimulatorSettings &settings, const CAircraftModel &defaultModel);
//! New plugin info and default model
//! \threadsafe
void setNewPluginInfo(const CSimulatorPluginInfo &info, const Settings::CSimulatorSettings &settings);
//! Set version and simulator details from running simulator
//! \threadsafe
@@ -215,16 +228,17 @@ namespace BlackMisc
//! Remove a CG
//! \threadsafe
int removeCG(const Aviation::CCallsign &cs);
int removeSimulatorCG(const Aviation::CCallsign &cs);
//! Min.range considered as single point
static PhysicalQuantities::CLength minRange(const PhysicalQuantities::CLength &range);
private:
CSimulatorPluginInfo m_simulatorPluginInfo; //!< info object
Settings::CSimulatorSettings m_settings; //!< simulator settings
QString m_simulatorName; //!< name of simulator
QString m_simulatorDetails; //!< describes version etc.
QString m_simulatorVersion; //!< Simulator version
QString m_simulatorVersion; //!< simulator version
CAircraftModel m_defaultModel; //!< default model
int m_maxElevations = 100; //!< How many elevations we keep
Geo::CCoordinateGeodeticList m_elvCoordinates; //!< elevation cache
@@ -292,11 +306,14 @@ namespace BlackMisc
//! \copydoc ISimulationEnvironmentProvider::getDefaultModel
CAircraftModel getDefaultModel() const;
//! \copydoc ISimulationEnvironmentProvider::getCG
PhysicalQuantities::CLength getCG(const Aviation::CCallsign &callsign) const;
//! \copydoc ISimulationEnvironmentProvider::getSimulatorCG
PhysicalQuantities::CLength getSimulatorCG(const Aviation::CCallsign &callsign) const;
//! \copydoc ISimulationEnvironmentProvider::hasCG
bool hasCG(const Aviation::CCallsign &callsign) const;
//! \copydoc ISimulationEnvironmentProvider::getSimulatorOrDbCG
PhysicalQuantities::CLength getSimulatorOrDbCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &dbCG) const;
//! \copydoc ISimulationEnvironmentProvider::hasSimulatorCG
bool hasSimulatorCG(const Aviation::CCallsign &callsign) const;
protected:
//! Default constructor

View File

@@ -380,15 +380,15 @@ namespace BlackSimPlugin
if (plugin.isValid())
{
// ? restart driver, disconnect/reconnect
this->setNewPluginInfo(plugin, settings.getDefaultModel());
this->setNewPluginInfo(plugin, m_multiSettings.getSettings(simulator), settings.getDefaultModel());
}
else
{
// not all drivers are installed
// not all drivers are installed, like FS9/FSX on x64
CLogMessage(this).validationError(u"No valid plugin in emulated driver for '%1'") << simulator.toQString();
const QString sn = simulator.toQString(true);
const CSimulatorPluginInfo fakedPlugin = CSimulatorPluginInfo(simulator.toPluginIdentifier(), sn, sn, QStringLiteral("Emulated, but uninstalled '%1'").arg(sn), false);
this->setNewPluginInfo(fakedPlugin, settings.getDefaultModel());
this->setNewPluginInfo(fakedPlugin, m_multiSettings.getSettings(simulator), settings.getDefaultModel());
}
// update provider, own name, title

View File

@@ -170,6 +170,7 @@ namespace BlackSimPlugin
QScopedPointer<CSimulatorEmulatedMonitorDialog> m_monitorWidget; //!< parent will be main window, so we need to destroy widget when destroyed
BlackMisc::CConnectionGuard m_connectionGuard; //!< connected with provider
BlackMisc::CSettingReadOnly<BlackMisc::Simulation::Settings::TSwiftPlugin> m_pluginSettings { this, &CSimulatorEmulated::onSettingsChanged };
BlackMisc::Simulation::Settings::CMultiSimulatorSettings m_multiSettings { this };
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Simulation::CInterpolatorMultiWrapper> m_interpolators; //!< interpolators per callsign
};