mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 19:25:49 +08:00
refs #614, changed matcher so caches can be used
* provider for cached models * removed unused dummy * renamed getDatastoreModels
This commit is contained in:
@@ -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,13 +36,15 @@ 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:/Temp/SimObjects"),
|
{
|
||||||
QStringLiteral("C:/Flight Simulator 9/Aircraft")
|
QStringLiteral("P:/FlightSimulatorX (MSI)/SimObjects"),
|
||||||
}, streamOut, streamIn);
|
QStringLiteral("P:/Temp/SimObjects"),
|
||||||
|
QStringLiteral("C:/Flight Simulator 9/Aircraft")
|
||||||
|
}, streamOut, streamIn);
|
||||||
|
|
||||||
CAircraftCfgParser cfgParser(CSimulatorInfo(CSimulatorInfo::FSX), fsxDir);
|
CAircraftCfgParser cfgParser(CSimulatorInfo(CSimulatorInfo::FSX), fsxDir);
|
||||||
if (!cfgParser.changeRootDirectory(fsxDir))
|
if (!cfgParser.changeRootDirectory(fsxDir))
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user