diff --git a/samples/blackmiscsim/samplesmodelmapping.cpp b/samples/blackmiscsim/samplesmodelmapping.cpp index cdfefc5c1..5b828e45f 100644 --- a/samples/blackmiscsim/samplesmodelmapping.cpp +++ b/samples/blackmiscsim/samplesmodelmapping.cpp @@ -29,10 +29,6 @@ using namespace BlackMisc::Aviation; namespace BlackSample { - - /* - * Samples - */ void CSamplesModelMapping::samples(QTextStream &streamOut, QTextStream &streamIn) { BlackMisc::registerMetadata(); @@ -40,13 +36,15 @@ namespace BlackSample std::unique_ptr cvm(new CModelMappingsProviderVPilot(true)); bool s = cvm->read(); streamOut << "directory: " << CVPilotRulesReader::standardMappingsDirectory() << endl; - streamOut << "loaded: " << BlackMisc::boolToYesNo(s) << " size: " << cvm->getDatastoreModels().size() << endl; + streamOut << "loaded: " << BlackMisc::boolToYesNo(s) << " size: " << cvm->getMatchingModels().size() << endl; // mapper with rule set, handing over ownership - QString fsxDir = CSampleUtils::selectDirectory({QStringLiteral("P:/FlightSimulatorX (MSI)/SimObjects"), - QStringLiteral("P:/Temp/SimObjects"), - QStringLiteral("C:/Flight Simulator 9/Aircraft") - }, streamOut, streamIn); + QString fsxDir = CSampleUtils::selectDirectory( + { + QStringLiteral("P:/FlightSimulatorX (MSI)/SimObjects"), + QStringLiteral("P:/Temp/SimObjects"), + QStringLiteral("C:/Flight Simulator 9/Aircraft") + }, streamOut, streamIn); CAircraftCfgParser cfgParser(CSimulatorInfo(CSimulatorInfo::FSX), fsxDir); if (!cfgParser.changeRootDirectory(fsxDir)) @@ -63,14 +61,9 @@ namespace BlackSample // sync definitions, remove redundant ones CAircraftMatcher matcher(CAircraftMatcher::AllModes); matcher.setModelMappingProvider(std::move(cvm)); - matcher.setInstalledModels(cfgParser.getAircraftCfgEntriesList().toAircraftModelList()); - streamOut << "Now synchronizing defintions: " << matcher.getDatastoreModels().size() << endl; - int afterSync = matcher.synchronize(); - streamOut << "After synchronizing definitions: " << afterSync << endl; CAircraftIcaoCode icao("C172"); streamOut << "Searching for " << icao << endl; - streamOut << matcher.getDatastoreModels().findByIcaoDesignators(icao, CAirlineIcaoCode()) << endl; + streamOut << matcher.getMatchingModels().findByIcaoDesignators(icao, CAirlineIcaoCode()) << endl; } - } // namespace diff --git a/src/blackmisc/simulation/aircraftmatcher.cpp b/src/blackmisc/simulation/aircraftmatcher.cpp index b4b68321e..5106eedbf 100644 --- a/src/blackmisc/simulation/aircraftmatcher.cpp +++ b/src/blackmisc/simulation/aircraftmatcher.cpp @@ -152,89 +152,42 @@ namespace BlackMisc m_defaultModel.setModelType(CAircraftModel::TypeModelMatchingDefaultModel); } - void CAircraftMatcher::ps_setDatastoreModels(const CAircraftModelList &mappings) + CAircraftModel CAircraftMatcher::matchByExactModelString(const CSimulatedAircraft &remoteAircraft) const { - m_modelsFromDatastoreInstalled = mappings; + const CAircraftModelList models(this->m_models.read()); + return models.findFirstByModelStringOrDefault(remoteAircraft.getModelString()); } - void CAircraftMatcher::initImpl() - { - InitState e = NotInitialized; - InitState d = InitInProgress; - if (!m_initState.compare_exchange_strong(e, d)) { return; } - - // sync - this->synchronize(); - CLogMessage(this).debug() << "Mapping definitions after sync" << m_modelsFromDatastoreInstalled.size(); - - // finish - CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelsFromDatastoreInstalled.size() - << m_installedModels.size(); - m_initState = InitFinished; - emit initializationFinished(); - } - - void CAircraftMatcher::initMappings() - { - Q_ASSERT(m_mappingsProvider); - int mappingsSize = m_mappingsProvider->getDatastoreModels().size(); - if (mappingsSize < 1) - { - m_mappingsProvider->read(); - m_modelsFromDatastoreInstalled = m_mappingsProvider->getDatastoreModels(); - mappingsSize = m_modelsFromDatastoreInstalled.size(); - if (mappingsSize < 1) - { - CLogMessage(this).error("Reading mapping rules failed or empty!"); - // Turn off the model mapping mode - m_matchingMode &= ~ModelMapping; - return; - } - } - m_modelsFromDatastoreInstalled = m_mappingsProvider->getDatastoreModels(); - CLogMessage(this).debug() << "Mapping definitions" << mappingsSize; - } - - CAircraftModel CAircraftMatcher::matchByExactModelName(const CSimulatedAircraft &remoteAircraft) - { - return this->m_installedModels.findFirstByModelStringOrDefault(remoteAircraft.getModelString()); - } - - CAircraftModel CAircraftMatcher::matchInstalledModelsByIcaoData(const CSimulatedAircraft &remoteAircraft) + CAircraftModel CAircraftMatcher::matchModelsByIcaoData(const CSimulatedAircraft &remoteAircraft, QString &log) const { CAircraftModel aircraftModel; - if (m_modelsFromDatastoreInstalled.isEmpty()) { return aircraftModel; } - BlackMisc::Simulation::CAircraftModelList datastoreModels(m_modelsFromDatastoreInstalled.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), remoteAircraft.getAirlineIcaoCode())); - if (!datastoreModels.isEmpty()) + const CAircraftModelList models(this->m_models.read()); + BlackMisc::Simulation::CAircraftModelList mappingModels( + models.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), remoteAircraft.getAirlineIcaoCode()) + ); + if (!mappingModels.isEmpty()) { - CAircraftModel aircraftModel(datastoreModels.front()); + log = "Found by ICAO " + remoteAircraft.getAircraftIcaoCode().getDesignator() + " " + remoteAircraft.getAircraftIcaoCode().getDesignator(); + log = log.trimmed(); + CAircraftModel aircraftModel(mappingModels.front()); aircraftModel.setModelType(CAircraftModel::TypeModelMatching); } return aircraftModel; } - CAircraftModel CAircraftMatcher::matchByAlgorithm(const CSimulatedAircraft & /** remoteAircraft **/) + CAircraftModel CAircraftMatcher::matchByFamily(const CSimulatedAircraft &remoteAircraft, QString &log) const { // Use an algorithm to find the best match + Q_UNUSED(remoteAircraft); + Q_UNUSED(log); return CAircraftModel(); } - int CAircraftMatcher::synchronizeWithExistingModels(const QStringList &modelNames, Qt::CaseSensitivity cs) + void CAircraftMatcher::logDetails(const CSimulatedAircraft &remoteAircraft, const QString &message) const { - if (modelNames.isEmpty() || m_modelsFromDatastoreInstalled.isEmpty()) { return 0; } - CAircraftModelList newList; - for (const CAircraftModel &modelDatastore : m_modelsFromDatastoreInstalled) - { - if (this->m_initState != InitInProgress) { return 0; } // canceled - QString modelString(modelDatastore.getModelString()); - if (modelString.isEmpty()) { continue; } - if (modelNames.contains(modelString, cs)) - { - newList.push_back(modelDatastore); - } - } - this->m_modelsFromDatastoreInstalled = newList; - return this->m_modelsFromDatastoreInstalled.size(); + if (!this->m_logDetails || message.isEmpty()) { return; } + const CCallsign callsign(remoteAircraft.getCallsign()); + CLogMessage(this).info(callsign.toQString(true) + ": " + message); } } } // namespace diff --git a/src/blackmisc/simulation/aircraftmatcher.h b/src/blackmisc/simulation/aircraftmatcher.h index d7a4b7d6a..9c40fad80 100644 --- a/src/blackmisc/simulation/aircraftmatcher.h +++ b/src/blackmisc/simulation/aircraftmatcher.h @@ -27,7 +27,8 @@ namespace BlackMisc { namespace Simulation { - /*! Matcher for all models + /*! + * Matcher for all models. * \details Reads all the mapping rules and all the available flight simulator models. * Then all rules for models not existing are eliminated ( \sa synchronize ). * Thereafter all existing models and mappings can be obtained from here. @@ -36,10 +37,6 @@ namespace BlackMisc { Q_OBJECT - signals: - //! Full init completed - void initializationFinished(); - public: //! Enabled matching mode flags enum MatchingModeFlag @@ -84,7 +81,7 @@ namespace BlackMisc CAircraftModel getClosestMatch(const CSimulatedAircraft &remoteAircraft); //! Get all mappings - const BlackMisc::Simulation::CAircraftModelList &getDatastoreModels() const { return m_mappingsProvider->getDatastoreModels(); } + BlackMisc::Simulation::CAircraftModelList getMappingModels() const { return m_mappingsProvider->getMappingModels(); } //! Number of mapping definitions int countMappingRules() const { return m_modelsFromDatastoreInstalled.size(); } @@ -102,6 +99,10 @@ namespace BlackMisc //! Set default model void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel); + signals: + //! Full init completed + void initializationFinished(); + private slots: //! Set the datatstore models void ps_setDatastoreModels(const CAircraftModelList &mappings); diff --git a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp index 9cad53ef9..e0952881f 100644 --- a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp +++ b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp @@ -34,11 +34,10 @@ namespace BlackMisc bool success = this->m_vPilotReader->read(false); if (success) { - this->m_datastoreModels = this->m_vPilotReader->getAsModels(); + this->m_mappingModels = this->m_vPilotReader->getAsModels(); } return success; } - } // namespace } // namespace } // namespace diff --git a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.h b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.h index 439ed753c..87e144810 100644 --- a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.h +++ b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.h @@ -34,12 +34,16 @@ namespace BlackMisc //! Destructor virtual ~CModelMappingsProviderVPilot() {} + //! \copydoc IModelMappingsProvider::getMatchingModels + virtual CAircraftModelList getMatchingModels() const override { return this->m_mappingModels; } + public slots: //! Load data virtual bool read() override; private: - QScopedPointer m_vPilotReader; //!< used vPilot model reader + QScopedPointer m_vPilotReader; //!< used vPilot model reader + BlackMisc::Simulation::CAircraftModelList m_mappingModels; //!< models }; } // namespace } // namespace diff --git a/src/blackmisc/simulation/modelmappingsprovider.cpp b/src/blackmisc/simulation/modelmappingsprovider.cpp index 2e4edb558..f0e6cadab 100644 --- a/src/blackmisc/simulation/modelmappingsprovider.cpp +++ b/src/blackmisc/simulation/modelmappingsprovider.cpp @@ -18,9 +18,20 @@ namespace BlackMisc { IModelMappingsProvider::IModelMappingsProvider(QObject *parent) : QObject(parent) {} - const CAircraftModelList &IModelMappingsProvider::getDatastoreModels() const + CachedModelSetProvider::CachedModelSetProvider(const CSimulatorInfo &simulator, QObject *parent) : + IModelMappingsProvider(parent), m_simulator(simulator) + { } + + CAircraftModelList CachedModelSetProvider::getMatchingModels() const { - return m_datastoreModels; + return this->m_modelSets.getModels(this->m_simulator); } + + bool CachedModelSetProvider::read() + { + this->m_modelSets.syncronize(this->m_simulator); + return true; + } + } // namespace } // namespace diff --git a/src/blackmisc/simulation/modelmappingsprovider.h b/src/blackmisc/simulation/modelmappingsprovider.h index 88bbaec59..12163d793 100644 --- a/src/blackmisc/simulation/modelmappingsprovider.h +++ b/src/blackmisc/simulation/modelmappingsprovider.h @@ -13,7 +13,7 @@ #define BLACKMISC_SIMULATION_MODELMAPPINGS_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/simulation/aircraftmodellist.h" +#include "blackmisc/simulation/data/modelcaches.h" #include namespace BlackMisc @@ -36,25 +36,29 @@ namespace BlackMisc //! Load data virtual bool read() = 0; - //! Get list - const CAircraftModelList &getDatastoreModels() const; + //! Get list of models used + virtual CAircraftModelList getMatchingModels() const = 0; protected: - BlackMisc::Simulation::CAircraftModelList m_datastoreModels; //!< models + BlackMisc::Simulation::CAircraftModelList m_mappingModels; //!< models }; - //! Model mappings dummy - class BLACKMISC_EXPORT CModelMappingsProviderDummy : public IModelMappingsProvider + //! Implementation of a provider based on the model set cache + class BLACKMISC_EXPORT CachedModelSetProvider : public IModelMappingsProvider { public: //! Constructor - CModelMappingsProviderDummy(QObject *parent = nullptr) : IModelMappingsProvider(parent) {} + CachedModelSetProvider(const BlackMisc::Simulation::CSimulatorInfo &simulator, QObject *parent = nullptr); - //! Destructor - virtual ~CModelMappingsProviderDummy() {} + //! \copydoc IModelMappingsProvider::getMatchingModels + virtual CAircraftModelList getMatchingModels() const override; - //! Load data - virtual bool read() override { return true; } + //! \copydoc IModelMappingsProvider::read + virtual bool read() override; + + private: + BlackMisc::Simulation::Data::CModelSetCaches m_modelSets { this }; + BlackMisc::Simulation::CSimulatorInfo m_simulator; }; } // ns } // ns diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 9030ca602..93556471e 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -65,7 +65,7 @@ namespace BlackSimPlugin m_fastTimer->start(100); m_slowTimer->start(1000); - m_modelMatcher.setModelMappingProvider(std::make_unique()); + m_modelMatcher.setModelMappingProvider(std::make_unique(CSimulatorInfo::XPLANE, this)); m_modelMatcher.setDefaultModel(CAircraftModel( "__XPFW_Jets/A320_a/A320_a_Austrian_Airlines.obj __XPFW_Jets/A320_a/A320_a_Austrian_Airlines.png", CAircraftModel::TypeModelMatchingDefaultModel,