From 6d490e9a49ed811b8d2a414017f2e4d90185b348 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 10 Jun 2019 19:54:35 +0200 Subject: [PATCH] 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 --- src/blackcore/airspacemonitor.cpp | 15 +++- src/blackcore/context/contextnetworkimpl.cpp | 20 +++++ src/blackcore/context/contextnetworkimpl.h | 4 + .../context/contextsimulatorimpl.cpp | 2 +- src/blackcore/simulator.cpp | 18 +++-- src/blackcore/simulator.h | 4 +- .../components/interpolationlogdisplay.cpp | 2 +- src/blackmisc/simulation/interpolator.cpp | 2 +- .../simulation/remoteaircraftprovider.cpp | 31 +++++++- .../simulation/remoteaircraftprovider.h | 34 ++++++--- .../simulationenvironmentprovider.cpp | 76 ++++++++++++++----- .../simulationenvironmentprovider.h | 45 +++++++---- .../simulator/emulated/simulatoremulated.cpp | 6 +- .../simulator/emulated/simulatoremulated.h | 1 + 14 files changed, 196 insertions(+), 64 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 3e566fe53..b98061870 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -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 diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index a70e95b67..3955c93c9 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -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; } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 439133372..1ed8be458 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -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 connectRemoteAircraftProviderSignals( diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index b2d64450a..113228ab7 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -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()); diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 101fdec45..ee06da593 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -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 diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index b81aef66f..c434e3ea2 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -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? diff --git a/src/blackgui/components/interpolationlogdisplay.cpp b/src/blackgui/components/interpolationlogdisplay.cpp index c19c7d22a..5d9e0c7d2 100644 --- a/src/blackgui/components/interpolationlogdisplay.cpp +++ b/src/blackgui/components/interpolationlogdisplay.cpp @@ -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))); diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 59aa3b711..1e485a3e2 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -58,7 +58,7 @@ namespace BlackMisc template CLength CInterpolator::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; diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index f59c7c767..36c54a888 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -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; } diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index 67d6f946d..e7ec76a56 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -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 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; diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 4d7c1b630..83208c6b9 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -9,6 +9,7 @@ #include "simulationenvironmentprovider.h" #include +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 diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index baedfdfc0..8d6ead0dd 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -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 diff --git a/src/plugins/simulator/emulated/simulatoremulated.cpp b/src/plugins/simulator/emulated/simulatoremulated.cpp index dc4e1cf80..2c107dbb3 100644 --- a/src/plugins/simulator/emulated/simulatoremulated.cpp +++ b/src/plugins/simulator/emulated/simulatoremulated.cpp @@ -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 diff --git a/src/plugins/simulator/emulated/simulatoremulated.h b/src/plugins/simulator/emulated/simulatoremulated.h index 932e25ecd..cc293be90 100644 --- a/src/plugins/simulator/emulated/simulatoremulated.h +++ b/src/plugins/simulator/emulated/simulatoremulated.h @@ -170,6 +170,7 @@ namespace BlackSimPlugin QScopedPointer m_monitorWidget; //!< parent will be main window, so we need to destroy widget when destroyed BlackMisc::CConnectionGuard m_connectionGuard; //!< connected with provider BlackMisc::CSettingReadOnly m_pluginSettings { this, &CSimulatorEmulated::onSettingsChanged }; + BlackMisc::Simulation::Settings::CMultiSimulatorSettings m_multiSettings { this }; QMap m_interpolators; //!< interpolators per callsign };