refs #614, changed matcher so caches can be used

* provider for cached models
* removed unused dummy
* renamed getDatastoreModels
This commit is contained in:
Klaus Basan
2016-03-30 01:08:47 +02:00
parent 94d9a1a780
commit c3355b1c9d
8 changed files with 69 additions and 104 deletions

View File

@@ -29,10 +29,6 @@ using namespace BlackMisc::Aviation;
namespace BlackSample namespace BlackSample
{ {
/*
* Samples
*/
void CSamplesModelMapping::samples(QTextStream &streamOut, QTextStream &streamIn) void CSamplesModelMapping::samples(QTextStream &streamOut, QTextStream &streamIn)
{ {
BlackMisc::registerMetadata(); BlackMisc::registerMetadata();
@@ -40,10 +36,12 @@ namespace BlackSample
std::unique_ptr<IModelMappingsProvider> cvm(new CModelMappingsProviderVPilot(true)); std::unique_ptr<IModelMappingsProvider> cvm(new CModelMappingsProviderVPilot(true));
bool s = cvm->read(); bool s = cvm->read();
streamOut << "directory: " << CVPilotRulesReader::standardMappingsDirectory() << endl; 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 // mapper with rule set, handing over ownership
QString fsxDir = CSampleUtils::selectDirectory({QStringLiteral("P:/FlightSimulatorX (MSI)/SimObjects"), QString fsxDir = CSampleUtils::selectDirectory(
{
QStringLiteral("P:/FlightSimulatorX (MSI)/SimObjects"),
QStringLiteral("P:/Temp/SimObjects"), QStringLiteral("P:/Temp/SimObjects"),
QStringLiteral("C:/Flight Simulator 9/Aircraft") QStringLiteral("C:/Flight Simulator 9/Aircraft")
}, streamOut, streamIn); }, streamOut, streamIn);
@@ -63,14 +61,9 @@ namespace BlackSample
// sync definitions, remove redundant ones // sync definitions, remove redundant ones
CAircraftMatcher matcher(CAircraftMatcher::AllModes); CAircraftMatcher matcher(CAircraftMatcher::AllModes);
matcher.setModelMappingProvider(std::move(cvm)); 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"); CAircraftIcaoCode icao("C172");
streamOut << "Searching for " << icao << endl; streamOut << "Searching for " << icao << endl;
streamOut << matcher.getDatastoreModels().findByIcaoDesignators(icao, CAirlineIcaoCode()) << endl; streamOut << matcher.getMatchingModels().findByIcaoDesignators(icao, CAirlineIcaoCode()) << endl;
} }
} // namespace } // namespace

View File

@@ -152,89 +152,42 @@ namespace BlackMisc
m_defaultModel.setModelType(CAircraftModel::TypeModelMatchingDefaultModel); 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() CAircraftModel CAircraftMatcher::matchModelsByIcaoData(const CSimulatedAircraft &remoteAircraft, QString &log) const
{
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 aircraftModel; CAircraftModel aircraftModel;
if (m_modelsFromDatastoreInstalled.isEmpty()) { return aircraftModel; } const CAircraftModelList models(this->m_models.read());
BlackMisc::Simulation::CAircraftModelList datastoreModels(m_modelsFromDatastoreInstalled.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), remoteAircraft.getAirlineIcaoCode())); BlackMisc::Simulation::CAircraftModelList mappingModels(
if (!datastoreModels.isEmpty()) 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); aircraftModel.setModelType(CAircraftModel::TypeModelMatching);
} }
return aircraftModel; 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 // Use an algorithm to find the best match
Q_UNUSED(remoteAircraft);
Q_UNUSED(log);
return CAircraftModel(); 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; } if (!this->m_logDetails || message.isEmpty()) { return; }
CAircraftModelList newList; const CCallsign callsign(remoteAircraft.getCallsign());
for (const CAircraftModel &modelDatastore : m_modelsFromDatastoreInstalled) CLogMessage(this).info(callsign.toQString(true) + ": " + message);
{
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();
} }
} }
} // namespace } // namespace

View File

@@ -27,7 +27,8 @@ namespace BlackMisc
{ {
namespace Simulation namespace Simulation
{ {
/*! Matcher for all models /*!
* Matcher for all models.
* \details Reads all the mapping rules and all the available flight simulator 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 ). * Then all rules for models not existing are eliminated ( \sa synchronize ).
* Thereafter all existing models and mappings can be obtained from here. * Thereafter all existing models and mappings can be obtained from here.
@@ -36,10 +37,6 @@ namespace BlackMisc
{ {
Q_OBJECT Q_OBJECT
signals:
//! Full init completed
void initializationFinished();
public: public:
//! Enabled matching mode flags //! Enabled matching mode flags
enum MatchingModeFlag enum MatchingModeFlag
@@ -84,7 +81,7 @@ namespace BlackMisc
CAircraftModel getClosestMatch(const CSimulatedAircraft &remoteAircraft); CAircraftModel getClosestMatch(const CSimulatedAircraft &remoteAircraft);
//! Get all mappings //! 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 //! Number of mapping definitions
int countMappingRules() const { return m_modelsFromDatastoreInstalled.size(); } int countMappingRules() const { return m_modelsFromDatastoreInstalled.size(); }
@@ -102,6 +99,10 @@ namespace BlackMisc
//! Set default model //! Set default model
void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel); void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel);
signals:
//! Full init completed
void initializationFinished();
private slots: private slots:
//! Set the datatstore models //! Set the datatstore models
void ps_setDatastoreModels(const CAircraftModelList &mappings); void ps_setDatastoreModels(const CAircraftModelList &mappings);

View File

@@ -34,11 +34,10 @@ namespace BlackMisc
bool success = this->m_vPilotReader->read(false); bool success = this->m_vPilotReader->read(false);
if (success) if (success)
{ {
this->m_datastoreModels = this->m_vPilotReader->getAsModels(); this->m_mappingModels = this->m_vPilotReader->getAsModels();
} }
return success; return success;
} }
} // namespace } // namespace
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -34,12 +34,16 @@ namespace BlackMisc
//! Destructor //! Destructor
virtual ~CModelMappingsProviderVPilot() {} virtual ~CModelMappingsProviderVPilot() {}
//! \copydoc IModelMappingsProvider::getMatchingModels
virtual CAircraftModelList getMatchingModels() const override { return this->m_mappingModels; }
public slots: public slots:
//! Load data //! Load data
virtual bool read() override; virtual bool read() override;
private: private:
QScopedPointer<CVPilotRulesReader> m_vPilotReader; //!< used vPilot model reader QScopedPointer<CVPilotRulesReader> m_vPilotReader; //!< used vPilot model reader
BlackMisc::Simulation::CAircraftModelList m_mappingModels; //!< models
}; };
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -18,9 +18,20 @@ namespace BlackMisc
{ {
IModelMappingsProvider::IModelMappingsProvider(QObject *parent) : QObject(parent) {} 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
} // namespace } // namespace

View File

@@ -13,7 +13,7 @@
#define BLACKMISC_SIMULATION_MODELMAPPINGS_H #define BLACKMISC_SIMULATION_MODELMAPPINGS_H
#include "blackmisc/blackmiscexport.h" #include "blackmisc/blackmiscexport.h"
#include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/data/modelcaches.h"
#include <QObject> #include <QObject>
namespace BlackMisc namespace BlackMisc
@@ -36,25 +36,29 @@ namespace BlackMisc
//! Load data //! Load data
virtual bool read() = 0; virtual bool read() = 0;
//! Get list //! Get list of models used
const CAircraftModelList &getDatastoreModels() const; virtual CAircraftModelList getMatchingModels() const = 0;
protected: protected:
BlackMisc::Simulation::CAircraftModelList m_datastoreModels; //!< models BlackMisc::Simulation::CAircraftModelList m_mappingModels; //!< models
}; };
//! Model mappings dummy //! Implementation of a provider based on the model set cache
class BLACKMISC_EXPORT CModelMappingsProviderDummy : public IModelMappingsProvider class BLACKMISC_EXPORT CachedModelSetProvider : public IModelMappingsProvider
{ {
public: public:
//! Constructor //! Constructor
CModelMappingsProviderDummy(QObject *parent = nullptr) : IModelMappingsProvider(parent) {} CachedModelSetProvider(const BlackMisc::Simulation::CSimulatorInfo &simulator, QObject *parent = nullptr);
//! Destructor //! \copydoc IModelMappingsProvider::getMatchingModels
virtual ~CModelMappingsProviderDummy() {} virtual CAircraftModelList getMatchingModels() const override;
//! Load data //! \copydoc IModelMappingsProvider::read
virtual bool read() override { return true; } virtual bool read() override;
private:
BlackMisc::Simulation::Data::CModelSetCaches m_modelSets { this };
BlackMisc::Simulation::CSimulatorInfo m_simulator;
}; };
} // ns } // ns
} // ns } // ns

View File

@@ -65,7 +65,7 @@ namespace BlackSimPlugin
m_fastTimer->start(100); m_fastTimer->start(100);
m_slowTimer->start(1000); m_slowTimer->start(1000);
m_modelMatcher.setModelMappingProvider(std::make_unique<CModelMappingsProviderDummy>()); m_modelMatcher.setModelMappingProvider(std::make_unique<CachedModelSetProvider>(CSimulatorInfo::XPLANE, this));
m_modelMatcher.setDefaultModel(CAircraftModel( m_modelMatcher.setDefaultModel(CAircraftModel(
"__XPFW_Jets/A320_a/A320_a_Austrian_Airlines.obj __XPFW_Jets/A320_a/A320_a_Austrian_Airlines.png", "__XPFW_Jets/A320_a/A320_a_Austrian_Airlines.obj __XPFW_Jets/A320_a/A320_a_Austrian_Airlines.png",
CAircraftModel::TypeModelMatchingDefaultModel, CAircraftModel::TypeModelMatchingDefaultModel,