From 0fa989c2f10be0130ca062a749d1f67b304ed3cc Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sat, 9 Feb 2019 13:51:25 +0100 Subject: [PATCH] Basic model loader implementation for FG --- src/blackmisc/blackmisc.pro | 2 + .../simulation/aircraftmodelloader.cpp | 8 +- .../aircraftmodelloaderflightgear.cpp | 96 +++++++++++++++++++ .../aircraftmodelloaderflightgear.h | 32 +++++++ 4 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp create mode 100644 src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro index 4daba41ca..1a26e3313 100644 --- a/src/blackmisc/blackmisc.pro +++ b/src/blackmisc/blackmisc.pro @@ -39,6 +39,7 @@ HEADERS += *.h \ $$PWD/simulation/*.h \ $$PWD/simulation/data/*.h \ $$PWD/simulation/settings/*.h \ + $$PWD/simulation/flightgear/*.h \ $$PWD/simulation/fscommon/*.h \ $$PWD/simulation/fsx/*.h \ $$PWD/simulation/xplane/*.h \ @@ -60,6 +61,7 @@ SOURCES += *.cpp \ $$PWD/simulation/*.cpp \ $$PWD/simulation/data/*.cpp \ $$PWD/simulation/settings/*.cpp \ + $$PWD/simulation/flightgear/*.cpp \ $$PWD/simulation/fscommon/*.cpp \ $$PWD/simulation/fsx/*.cpp \ $$PWD/simulation/xplane/*.cpp \ diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 9c4af6110..ae9aa4504 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -9,6 +9,7 @@ #include "blackmisc/simulation/aircraftmodelloader.h" #include "blackmisc/simulation/fscommon/aircraftcfgparser.h" #include "blackmisc/simulation/xplane/aircraftmodelloaderxplane.h" +#include "blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h" #include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/directoryutils.h" #include "blackmisc/compare.h" @@ -174,12 +175,7 @@ namespace BlackMisc { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Single simulator"); if (simulator.isXPlane()) { return new CAircraftModelLoaderXPlane(parent); } - if (simulator.isFG()) - { - //! \todo FG add real loader - IAircraftModelLoader *dummy = new CDummyModelLoader(simulator, parent); - return dummy; - } + if (simulator.isFG()) { return new BlackMisc::Simulation::Flightgear::AircraftModelLoaderFlightgear(parent); } return CAircraftCfgParser::createModelLoader(simulator, parent); } diff --git a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp new file mode 100644 index 000000000..07c9291cb --- /dev/null +++ b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp @@ -0,0 +1,96 @@ +#include "aircraftmodelloaderflightgear.h" +#include "blackmisc/simulation/aircraftmodel.h" +#include +namespace BlackMisc{ + namespace Simulation { + namespace Flightgear { + + bool AircraftModelLoaderFlightgear::isLoadingFinished() const + { + return !m_parserWorker || m_parserWorker->isFinished();; + } + + AircraftModelLoaderFlightgear::AircraftModelLoaderFlightgear(QObject *parent) : Simulation::IAircraftModelLoader (Simulation::CSimulatorInfo::fg(), parent) + { + std::cout << "Test"; + } + + void AircraftModelLoaderFlightgear::updateInstalledModels(const CAircraftModelList &models) + { + this->setModelsForSimulator(models, CSimulatorInfo::fg()); + const CStatusMessage m = CStatusMessage(this, CStatusMessage::SeverityInfo, u"XPlane updated '%1' models") << models.size(); + m_loadingMessages.push_back(m); + } + + Simulation::CAircraftModelList AircraftModelLoaderFlightgear::parseFlyableAirplaces(const QString &rootDirectory) + { + Simulation::CAircraftModelList installedModels; + + QDir searchPath(rootDirectory, fileFilterFlyable()); + QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); + + + while (aircraftIt.hasNext()) { + aircraftIt.next(); + //TODO Add possibility of exclude dir + Simulation::CAircraftModel model; + model.setAircraftIcaoCode(QString::fromStdString("A320")); + model.setDescription(QString::fromStdString("Description")); + model.setName(QString::fromStdString("ModelName")); + model.setModelType(CAircraftModel::TypeOwnSimulatorModel); + model.setSimulator(CSimulatorInfo::fg()); + model.setFileDetailsAndTimestamp(aircraftIt.fileInfo()); + model.setModelMode(CAircraftModel::Exclude); + + addUniqueModel(model,installedModels); + + } + + + + + return installedModels; + } + + const QString &AircraftModelLoaderFlightgear::fileFilterFlyable() + { + static const QString f("*-set.xml"); + return f; + } + + void AircraftModelLoaderFlightgear::addUniqueModel(const CAircraftModel &model, CAircraftModelList &models) + { + //TODO Add check + models.push_back(model); + } + + void AircraftModelLoaderFlightgear::startLoadingFromDisk(IAircraftModelLoader::LoadMode mode, const IAircraftModelLoader::ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories) + { + const CSimulatorInfo simulator = CSimulatorInfo::fg(); + const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator); + const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy + + if (m_parserWorker && !m_parserWorker->isFinished()){ return; } + emit this->diskLoadingStarted(simulator, mode); + + m_parserWorker = CWorker::fromTask(this, "CAircraftModelLoaderFlightgear::performParsing", + [this, modelDirs, excludedDirectoryPatterns, modelConsolidation]() + { + auto models = this->parseFlyableAirplaces("X:/Flightsim/Flightgear/2018.3/data/Aircraft"); + if (modelConsolidation) { modelConsolidation(models, true); } + return models; + }); + m_parserWorker->thenWithResult(this, [ = ](const auto & models) + { + this->updateInstalledModels(models); + m_loadingMessages.freezeOrder(); + emit this->loadingFinished(m_loadingMessages, simulator, ParsedData); + }); + } + + + } + } + +} + diff --git a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h new file mode 100644 index 000000000..76278ae16 --- /dev/null +++ b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h @@ -0,0 +1,32 @@ +#include "blackmisc/simulation/aircraftmodelloader.h" +#include + +namespace BlackMisc{ + namespace Simulation { + namespace Flightgear { + class AircraftModelLoaderFlightgear : public Simulation::IAircraftModelLoader{ + + + // IAircraftModelLoader interface + public: + bool isLoadingFinished() const; + AircraftModelLoaderFlightgear(QObject *parent = nullptr); + + //! Parsed or injected models + void updateInstalledModels(const CAircraftModelList &models); + + private: + Simulation::CAircraftModelList parseFlyableAirplaces(const QString &rootDirectory); + static const QString &fileFilterFlyable(); + void addUniqueModel(const CAircraftModel &model, CAircraftModelList &models); + QPointer m_parserWorker; + + protected: + void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories); + }; + } + } + + +} +