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

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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<CVPilotRulesReader> m_vPilotReader; //!< used vPilot model reader
QScopedPointer<CVPilotRulesReader> m_vPilotReader; //!< used vPilot model reader
BlackMisc::Simulation::CAircraftModelList m_mappingModels; //!< models
};
} // namespace
} // namespace

View File

@@ -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

View File

@@ -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 <QObject>
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