[feature][XPlane] Set own aircraft model string when own aircraft changes.

Summary:
Refactored parts of CAircraftModelLoaderXPlane::parseFlyableAirplanes into static method extractAcfProperties that can be called by xswiftbus.

Used extractAcfProperties in xswiftbus to provide the model string to the driver. Implemented CSimulatorXPlane::ps_emitOwnAircraftModelChanged.

Implements T74.

Reviewers: rwinklmeier

Reviewed By: rwinklmeier

Subscribers: jenkins

Tags: #swift_pilot_client

Differential Revision: https://dev.swift-project.org/D23
This commit is contained in:
Mathew Sutcliffe
2017-05-14 15:01:59 +01:00
parent 50b8fbe8fe
commit bc80fd3bd5
8 changed files with 91 additions and 62 deletions

View File

@@ -211,7 +211,7 @@ namespace BlackMisc
aircraftIt.next();
if (CFileUtils::isExcludedDirectory(aircraftIt.fileInfo(), excludeDirectories, Qt::CaseInsensitive)) { continue; }
CAircraftModel model;
CAircraftModel model = extractAcfProperties(aircraftIt.filePath(), aircraftIt.fileInfo());
model.setModelType(CAircraftModel::TypeOwnSimulatorModel);
model.setSimulator(this->getSimulator());
model.setFileName(aircraftIt.filePath());
@@ -219,54 +219,6 @@ namespace BlackMisc
model.setUtcTimestamp(lastModifiedTs);
model.setFileTimestamp(lastModifiedTs);
model.setModelMode(CAircraftModel::Exclude);
QFile file(aircraftIt.filePath());
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream ts(&file);
if (ts.readLine() == "I" && ts.readLine().contains("version") && ts.readLine() == "ACF")
{
while (!ts.atEnd())
{
const QString line = ts.readLine();
QVector<QStringRef> tokens = line.splitRef(' ', QString::SkipEmptyParts);
if (tokens.size() < 3 || tokens.at(0) != QLatin1String("P")) { continue; }
if (tokens.at(1) == QLatin1String("acf/_ICAO"))
{
const CAircraftIcaoCode icao(tokens.at(2).toString());
model.setAircraftIcaoCode(icao);
}
else if (tokens.at(1) == QLatin1String("acf/_descrip"))
{
const QString desc(line.mid(tokens.at(2).position()));
model.setDescription("[ACF] " % desc);
}
else if (tokens.at(1) == QLatin1String("acf/_name"))
{
const QString name(line.mid(tokens.at(2).position()));
model.setName(name);
}
else if (tokens.at(1) == QLatin1String("acf/_studio"))
{
const CDistributor dist({}, line.mid(tokens.at(2).position()), {}, {}, CSimulatorInfo::XPLANE);
model.setDistributor(dist);
}
else if (tokens.at(1) == QLatin1String("acf/_author"))
{
if (model.getDistributor().hasDescription()) { continue; }
const thread_local QRegularExpression end("\\W\\s", QRegularExpression::UseUnicodePropertiesOption);
QString author = line.mid(tokens.at(2).position());
author = author.left(author.indexOf(end)).trimmed();
if (author.isEmpty()) { continue; }
const CDistributor dist({}, author, {}, {}, CSimulatorInfo::XPLANE);
model.setDistributor(dist);
}
}
}
file.close();
model.setModelString(stringForFlyableModel(model, aircraftIt.fileInfo()));
if (!model.hasDescription()) { model.setDescription(descriptionForFlyableModel(model)); }
addUniqueModel(model, installedModels);
const QString baseModelString = model.getModelString();
@@ -281,6 +233,59 @@ namespace BlackMisc
return installedModels;
}
BlackMisc::Simulation::CAircraftModel CAircraftModelLoaderXPlane::extractAcfProperties(const QString &filePath, const QFileInfo &fileInfo)
{
BlackMisc::Simulation::CAircraftModel model;
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return model; }
QTextStream ts(&file);
if (ts.readLine() == "I" && ts.readLine().contains("version") && ts.readLine() == "ACF")
{
while (!ts.atEnd())
{
const QString line = ts.readLine();
QVector<QStringRef> tokens = line.splitRef(' ', QString::SkipEmptyParts);
if (tokens.size() < 3 || tokens.at(0) != QLatin1String("P")) { continue; }
if (tokens.at(1) == QLatin1String("acf/_ICAO"))
{
const CAircraftIcaoCode icao(tokens.at(2).toString());
model.setAircraftIcaoCode(icao);
}
else if (tokens.at(1) == QLatin1String("acf/_descrip"))
{
const QString desc(line.mid(tokens.at(2).position()));
model.setDescription("[ACF] " % desc);
}
else if (tokens.at(1) == QLatin1String("acf/_name"))
{
const QString name(line.mid(tokens.at(2).position()));
model.setName(name);
}
else if (tokens.at(1) == QLatin1String("acf/_studio"))
{
const CDistributor dist({}, line.mid(tokens.at(2).position()), {}, {}, CSimulatorInfo::XPLANE);
model.setDistributor(dist);
}
else if (tokens.at(1) == QLatin1String("acf/_author"))
{
if (model.getDistributor().hasDescription()) { continue; }
const thread_local QRegularExpression end("\\W\\s", QRegularExpression::UseUnicodePropertiesOption);
QString author = line.mid(tokens.at(2).position());
author = author.left(author.indexOf(end)).trimmed();
if (author.isEmpty()) { continue; }
const CDistributor dist({}, author, {}, {}, CSimulatorInfo::XPLANE);
model.setDistributor(dist);
}
}
}
file.close();
model.setModelString(stringForFlyableModel(model, fileInfo));
if (!model.hasDescription()) { model.setDescription(descriptionForFlyableModel(model)); }
return model;
}
CAircraftModelList CAircraftModelLoaderXPlane::parseCslPackages(const QString &rootDirectory, const QStringList &excludeDirectories)
{
Q_UNUSED(excludeDirectories);

View File

@@ -52,6 +52,9 @@ namespace BlackMisc
virtual bool isLoadingFinished() const override;
//! @}
//! Extract from an acf file (flyable plane) the properties needed to generate model string.
static BlackMisc::Simulation::CAircraftModel extractAcfProperties(const QString &filePath, const QFileInfo &fileInfo);
public slots:
//! Parsed or injected models
void updateInstalledModels(const BlackMisc::Simulation::CAircraftModelList &models);

View File

@@ -300,18 +300,14 @@ namespace BlackSimPlugin
emitSimulatorCombinedStatus();
}
void CSimulatorXPlane::ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao)
void CSimulatorXPlane::ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao,
const QString &modelString, const QString &name, const QString &distributor, const QString &description)
{
Q_UNUSED(icao);
Q_UNUSED(distributor);
//! \todo XP, change as appropriate, add resolution of own livery
// try to set correct model and ICAO values here
// thy show up in GUI
CAircraftModel model(getOwnAircraftModel());
CAirlineIcaoCode airlineIcaoCode(model.getAirlineIcaoCode());
model.setModelType(CAircraftModel::TypeOwnSimulatorModel);
CAircraftModel model(modelString, CAircraftModel::TypeOwnSimulatorModel, CSimulatorInfo::XPLANE, name, description, icao);
if (!livery.isEmpty()) { model.setModelString(model.getModelString() + " " + livery); }
model.setFileName(path + "/" + filename);
model.setLivery(CLivery("XPLANE." + livery, airlineIcaoCode, "XP livery", "", "", false));
this->reverseLookupAndUpdateOwnAircraftModel(model);
}

View File

@@ -135,7 +135,8 @@ namespace BlackSimPlugin
private slots:
void ps_serviceUnregistered();
void ps_setAirportsInRange(const QStringList &icaoCodes, const QStringList &names, const BlackMisc::CSequence<double> &lats, const BlackMisc::CSequence<double> &lons, const BlackMisc::CSequence<double> &alts);
void ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao);
void ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao,
const QString &modelString, const QString &name, const QString &distributor, const QString &description);
void ps_fastTimerTimeout();
void ps_slowTimerTimeout();
void ps_installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries);

View File

@@ -72,6 +72,15 @@ namespace BlackSimPlugin
m_dbusInterface->callDBusAsync(QLatin1String("getAircraftIcaoCode"), setterCallback(o_icaoCode));
}
QString CXSwiftBusServiceProxy::getAircraftDescription() const
{
return m_dbusInterface->callDBusRet<QString>(QLatin1String("getAircraftDescription"));
}
void CXSwiftBusServiceProxy::getAircraftDescriptionAsync(QString *o_description)
{
m_dbusInterface->callDBusAsync(QLatin1String("getAircraftDescription"), setterCallback(o_description));
}
int CXSwiftBusServiceProxy::getXPlaneVersionMajor() const
{
return m_dbusInterface->callDBusRet<int>(QLatin1String("getXPlaneVersionMajor"));

View File

@@ -89,7 +89,8 @@ namespace BlackSimPlugin
void asyncMethodError(QDBusError error);
//! \copydoc XSwiftBus::CService::aircraftModelChanged
void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao);
void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao,
const QString &modelString, const QString &name, const QString &distributor, const QString &description);
//! \copydoc XSwiftBus::CService::airportsInRangeUpdated
void airportsInRangeUpdated(const QStringList &icaoCodes, const QStringList &names, const QList<double> &lats, const QList<double> &lons, const QList<double> &alts);
@@ -125,6 +126,12 @@ namespace BlackSimPlugin
void getAircraftIcaoCodeAsync(QString *o_icaoCode);
//! @}
//! \copydoc XSwiftBus::CService::getAircraftDescription
//! @{
QString getAircraftDescription() const;
void getAircraftDescriptionAsync(QString *o_description);
//! @}
//! \copydoc XSwiftBus::CService::getXPlaneVersionMajor
//! @{
int getXPlaneVersionMajor() const;

View File

@@ -8,6 +8,7 @@
*/
#include "service.h"
#include "blackmisc/simulation/xplane/aircraftmodelloaderxplane.h"
#include <XPLM/XPLMPlanes.h>
#include <XPLM/XPLMUtilities.h>
#include <QDebug>
@@ -31,7 +32,9 @@ namespace XSwiftBus
char filename[256];
char path[512];
XPLMGetNthAircraftModel(XPLM_USER_AIRCRAFT, filename, path);
emit aircraftModelChanged(path, filename, getAircraftLivery(), getAircraftIcaoCode());
const auto model = BlackMisc::Simulation::XPlane::CAircraftModelLoaderXPlane::extractAcfProperties(path, QFileInfo(path));
emit aircraftModelChanged(path, filename, getAircraftLivery(), getAircraftIcaoCode(),
model.getModelString(), model.getName(), model.getDistributor().getDescription(), getAircraftDescription());
}
void CService::addTextMessage(const QString &text, double red, double green, double blue)

View File

@@ -70,7 +70,8 @@ namespace XSwiftBus
signals:
//! Emitted when the model or livery changes.
void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao);
void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao,
const QString &modelString, const QString &name, const QString &distributor, const QString &description);
//! Airports in range updated.
void airportsInRangeUpdated(const QStringList &icaoCodes, const QStringList &names, const QDoubleList &lats, const QDoubleList &lons, const QDoubleList &alts);
@@ -94,6 +95,9 @@ namespace XSwiftBus
//! Get the ICAO code of the current aircraft model
QString getAircraftIcaoCode() const { return m_icao.get().c_str(); }
//! Get the description of the current aircraft model
QString getAircraftDescription() const { return m_descrip.get().c_str(); }
//! Get major version number
int getXPlaneVersionMajor() const;
@@ -233,6 +237,7 @@ namespace XSwiftBus
StringDataRef<xplane::data::sim::aircraft::view::acf_livery_path> m_liveryPath;
StringDataRef<xplane::data::sim::aircraft::view::acf_ICAO> m_icao;
StringDataRef<xplane::data::sim::aircraft::view::acf_descrip> m_descrip;
DataRef<xplane::data::sim::time::paused> m_paused;
DataRef<xplane::data::sim::time::use_system_time> m_useSystemTime;
DataRef<xplane::data::sim::flightmodel::position::latitude> m_latitude;