mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-21 04:45:31 +08:00
refs #438, allow to stop and reinit parser/matcher
* plugin changes, mapper/parser will be stopped. make sure worker is properly shutdown * restarted FS/FSX. Allow to reset mapper/parser data from store
This commit is contained in:
@@ -49,9 +49,9 @@ namespace BlackMisc
|
|||||||
bool ok;
|
bool ok;
|
||||||
auto aircraftCfgEntriesList = parseImpl(rootDirectory, excludedDirectories, &ok);
|
auto aircraftCfgEntriesList = parseImpl(rootDirectory, excludedDirectories, &ok);
|
||||||
if (!ok) { return; }
|
if (!ok) { return; }
|
||||||
bool c = QMetaObject::invokeMethod(this, "ps_updateCfgEntriesList",
|
bool c = QMetaObject::invokeMethod(this, "updateCfgEntriesList",
|
||||||
Q_ARG(BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList, aircraftCfgEntriesList));
|
Q_ARG(BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList, aircraftCfgEntriesList));
|
||||||
Q_ASSERT_X(c, Q_FUNC_INFO, "Cannot invoke ps_updateCfgEntriesList");
|
Q_ASSERT_X(c, Q_FUNC_INFO, "Cannot invoke updateCfgEntriesList");
|
||||||
Q_UNUSED(c);
|
Q_UNUSED(c);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ namespace BlackMisc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftCfgParser::ps_updateCfgEntriesList(const CAircraftCfgEntriesList &cfgEntriesList)
|
void CAircraftCfgParser::updateCfgEntriesList(const CAircraftCfgEntriesList &cfgEntriesList)
|
||||||
{
|
{
|
||||||
m_parsedCfgEntriesList = cfgEntriesList;
|
m_parsedCfgEntriesList = cfgEntriesList;
|
||||||
emit parsingFinished(true);
|
emit parsingFinished(true);
|
||||||
|
|||||||
@@ -66,12 +66,15 @@ namespace BlackMisc
|
|||||||
//! Get parsed aircraft cfg entries list
|
//! Get parsed aircraft cfg entries list
|
||||||
CAircraftCfgEntriesList getAircraftCfgEntriesList() const { return m_parsedCfgEntriesList; }
|
CAircraftCfgEntriesList getAircraftCfgEntriesList() const { return m_parsedCfgEntriesList; }
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
//! Parsed or injected entires
|
||||||
|
void updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
//! Parsing is finished
|
//! Parsing is finished
|
||||||
void parsingFinished(bool success);
|
void parsingFinished(bool success);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void ps_updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList);
|
|
||||||
CAircraftCfgEntriesList parseImpl(const QString &directory, const QStringList &excludeDirectories, bool *ok);
|
CAircraftCfgEntriesList parseImpl(const QString &directory, const QStringList &excludeDirectories, bool *ok);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "blackmisc/logmessage.h"
|
#include "blackmisc/logmessage.h"
|
||||||
#include "blackmisc/worker.h"
|
#include "blackmisc/worker.h"
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
using namespace BlackMisc;
|
using namespace BlackMisc;
|
||||||
using namespace BlackMisc::Simulation;
|
using namespace BlackMisc::Simulation;
|
||||||
@@ -31,12 +32,13 @@ namespace BlackMisc
|
|||||||
|
|
||||||
CAircraftMatcher::~CAircraftMatcher()
|
CAircraftMatcher::~CAircraftMatcher()
|
||||||
{
|
{
|
||||||
gracefulShutdown();
|
cancelInit();
|
||||||
|
if (this->m_initWorker) { this->m_initWorker->waitForFinished(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftMatcher::init()
|
void CAircraftMatcher::init()
|
||||||
{
|
{
|
||||||
if (m_initWorker) { return; }
|
if (m_initState != NotInitialized) { return; }
|
||||||
m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMatcher::initImpl", [this]()
|
m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMatcher::initImpl", [this]()
|
||||||
{
|
{
|
||||||
initImpl();
|
initImpl();
|
||||||
@@ -45,7 +47,7 @@ namespace BlackMisc
|
|||||||
|
|
||||||
bool CAircraftMatcher::isInitialized() const
|
bool CAircraftMatcher::isInitialized() const
|
||||||
{
|
{
|
||||||
return m_initialized;
|
return m_initState == InitFinished;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftMatcher::setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings)
|
void CAircraftMatcher::setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings)
|
||||||
@@ -122,16 +124,10 @@ namespace BlackMisc
|
|||||||
return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings());
|
return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftMatcher::gracefulShutdown()
|
void CAircraftMatcher::cancelInit()
|
||||||
{
|
{
|
||||||
// when running, force re-init
|
// when running, force re-init
|
||||||
this->m_initInProgress = false;
|
this->m_initState = NotInitialized;
|
||||||
this->m_initialized = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAircraftMatcher::markUninitialized()
|
|
||||||
{
|
|
||||||
this->m_initialized = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const CAircraftModel &CAircraftMatcher::getDefaultModel()
|
const CAircraftModel &CAircraftMatcher::getDefaultModel()
|
||||||
@@ -144,11 +140,16 @@ namespace BlackMisc
|
|||||||
m_defaultModel = defaultModel;
|
m_defaultModel = defaultModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CAircraftMatcher::ps_setModelMappingRules(const CAircraftMappingList &mappings)
|
||||||
|
{
|
||||||
|
m_modelMappings = mappings;
|
||||||
|
}
|
||||||
|
|
||||||
void CAircraftMatcher::initImpl()
|
void CAircraftMatcher::initImpl()
|
||||||
{
|
{
|
||||||
if (m_initialized) { return; }
|
InitState e = NotInitialized;
|
||||||
if (m_initInProgress) { return; }
|
InitState d = InitInProgress;
|
||||||
m_initInProgress = true;
|
if (!m_initState.compare_exchange_weak(e, d)) { return; }
|
||||||
|
|
||||||
// sync
|
// sync
|
||||||
this->synchronize();
|
this->synchronize();
|
||||||
@@ -156,9 +157,8 @@ namespace BlackMisc
|
|||||||
|
|
||||||
// finish
|
// finish
|
||||||
CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelMappings.size()
|
CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelMappings.size()
|
||||||
<< m_installedModels.size();
|
<< m_installedModels.size();
|
||||||
m_initInProgress = false;
|
m_initState = InitFinished;
|
||||||
m_initialized = true;
|
|
||||||
emit initializationFinished();
|
emit initializationFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,6 +231,7 @@ namespace BlackMisc
|
|||||||
CAircraftMappingList newList;
|
CAircraftMappingList newList;
|
||||||
for (const CAircraftMapping &mapping : m_modelMappings)
|
for (const CAircraftMapping &mapping : m_modelMappings)
|
||||||
{
|
{
|
||||||
|
if (this->m_initState != InitInProgress) { return 0; } // canceled
|
||||||
QString modelString = mapping.getModel().getModelString();
|
QString modelString = mapping.getModel().getModelString();
|
||||||
if (modelString.isEmpty()) { continue; }
|
if (modelString.isEmpty()) { continue; }
|
||||||
if (modelNames.contains(modelString, cs))
|
if (modelNames.contains(modelString, cs))
|
||||||
|
|||||||
@@ -68,9 +68,15 @@ namespace BlackMisc
|
|||||||
//! Init completed?
|
//! Init completed?
|
||||||
bool isInitialized() const;
|
bool isInitialized() const;
|
||||||
|
|
||||||
|
//! Get all models
|
||||||
|
const CAircraftModelList &getInstalledModelsList() const { return m_installedModels; }
|
||||||
|
|
||||||
//! Set the list of installed models
|
//! Set the list of installed models
|
||||||
void setInstalledModels(const CAircraftModelList &models) { m_installedModels = models; }
|
void setInstalledModels(const CAircraftModelList &models) { m_installedModels = models; }
|
||||||
|
|
||||||
|
//! Number of models
|
||||||
|
int countInstalledModels() const { return m_installedModels.size(); }
|
||||||
|
|
||||||
//! Set the model mapping provider. The CAircraftMatcher will move the object and take over ownership
|
//! Set the model mapping provider. The CAircraftMatcher will move the object and take over ownership
|
||||||
void setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings);
|
void setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings);
|
||||||
|
|
||||||
@@ -96,10 +102,7 @@ namespace BlackMisc
|
|||||||
int synchronize();
|
int synchronize();
|
||||||
|
|
||||||
//! Shutdown
|
//! Shutdown
|
||||||
void gracefulShutdown();
|
void cancelInit();
|
||||||
|
|
||||||
//! To force reload
|
|
||||||
void markUninitialized();
|
|
||||||
|
|
||||||
//! default model
|
//! default model
|
||||||
const BlackMisc::Simulation::CAircraftModel &getDefaultModel();
|
const BlackMisc::Simulation::CAircraftModel &getDefaultModel();
|
||||||
@@ -108,13 +111,17 @@ namespace BlackMisc
|
|||||||
void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel);
|
void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
//! Set the mapping rules
|
||||||
void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings)
|
void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings);
|
||||||
{
|
|
||||||
m_modelMappings = mappings;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
//! Init state
|
||||||
|
enum InitState
|
||||||
|
{
|
||||||
|
NotInitialized,
|
||||||
|
InitInProgress,
|
||||||
|
InitFinished
|
||||||
|
};
|
||||||
|
|
||||||
void initImpl();
|
void initImpl();
|
||||||
void initMappings();
|
void initMappings();
|
||||||
@@ -130,9 +137,8 @@ namespace BlackMisc
|
|||||||
void reverseLookupIcaoData(BlackMisc::Simulation::CAircraftModel &model);
|
void reverseLookupIcaoData(BlackMisc::Simulation::CAircraftModel &model);
|
||||||
|
|
||||||
std::unique_ptr<BlackMisc::Simulation::IModelMappingsProvider> m_mappingsProvider; //!< Provides all mapping definitions
|
std::unique_ptr<BlackMisc::Simulation::IModelMappingsProvider> m_mappingsProvider; //!< Provides all mapping definitions
|
||||||
std::atomic<bool> m_initialized = { false };
|
std::atomic<InitState> m_initState = NotInitialized;
|
||||||
std::atomic<bool> m_initInProgress = { false };
|
QPointer<BlackMisc::CWorker> m_initWorker;
|
||||||
BlackMisc::CWorker *m_initWorker = { nullptr };
|
|
||||||
MatchingMode m_matchingMode = ModelMatching;
|
MatchingMode m_matchingMode = ModelMatching;
|
||||||
CAircraftModelList m_installedModels;
|
CAircraftModelList m_installedModels;
|
||||||
BlackMisc::Network::CAircraftMappingList m_modelMappings;
|
BlackMisc::Network::CAircraftMappingList m_modelMappings;
|
||||||
|
|||||||
@@ -43,20 +43,20 @@ namespace BlackSimPlugin
|
|||||||
auto modelMappingsProvider = std::unique_ptr<IModelMappingsProvider> { BlackMisc::make_unique<CModelMappingsProviderVPilot>(true) };
|
auto modelMappingsProvider = std::unique_ptr<IModelMappingsProvider> { BlackMisc::make_unique<CModelMappingsProviderVPilot>(true) };
|
||||||
m_modelMatcher.setModelMappingProvider(std::move(modelMappingsProvider));
|
m_modelMatcher.setModelMappingProvider(std::move(modelMappingsProvider));
|
||||||
|
|
||||||
|
connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished);
|
||||||
CVariant aircraftCfg = getPluginData(this, "aircraft_cfg");
|
CVariant aircraftCfg = getPluginData(this, "aircraft_cfg");
|
||||||
if (aircraftCfg.isValid())
|
if (aircraftCfg.isValid())
|
||||||
{
|
{
|
||||||
m_modelMatcher.setInstalledModels(aircraftCfg.value<CAircraftCfgEntriesList>().toAircraftModelList());
|
// will behave like parsing was finished
|
||||||
m_modelMatcher.init();
|
m_aircraftCfgParser.updateCfgEntriesList(aircraftCfg.value<CAircraftCfgEntriesList>());
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// reading from settings would go here
|
|
||||||
//
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished);
|
m_aircraftCfgParser.parse(CAircraftCfgParser::ModeAsync);
|
||||||
m_aircraftCfgParser.parse();
|
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
// reading from cache / settings would go here
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
CSimulatorFsCommon::~CSimulatorFsCommon() { }
|
CSimulatorFsCommon::~CSimulatorFsCommon() { }
|
||||||
@@ -135,7 +135,7 @@ namespace BlackSimPlugin
|
|||||||
|
|
||||||
CAircraftModelList CSimulatorFsCommon::getInstalledModels() const
|
CAircraftModelList CSimulatorFsCommon::getInstalledModels() const
|
||||||
{
|
{
|
||||||
return m_aircraftCfgParser.getAircraftCfgEntriesList().toAircraftModelList();
|
return m_modelMatcher.getInstalledModelsList();
|
||||||
}
|
}
|
||||||
|
|
||||||
CAircraftIcaoData CSimulatorFsCommon::getIcaoForModelString(const QString &modelString) const
|
CAircraftIcaoData CSimulatorFsCommon::getIcaoForModelString(const QString &modelString) const
|
||||||
@@ -215,6 +215,7 @@ namespace BlackSimPlugin
|
|||||||
void CSimulatorFsCommon::unload()
|
void CSimulatorFsCommon::unload()
|
||||||
{
|
{
|
||||||
this->m_aircraftCfgParser.cancelParsing();
|
this->m_aircraftCfgParser.cancelParsing();
|
||||||
|
this->m_modelMatcher.cancelInit();
|
||||||
CSimulatorCommon::unload();
|
CSimulatorCommon::unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user