From 25cdff54f354c9cc2f5398f6b36ac43df1dc7ccc Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Mon, 15 Jun 2015 21:24:47 +0200 Subject: [PATCH] refs #435 Read installed models from X-Plane via xbus --- .../simulator/xplane/simulator_xplane.cpp | 25 ++++++++++++++++--- .../simulator/xplane/simulator_xplane.h | 3 +++ .../simulator/xplane/xbus_traffic_proxy.cpp | 5 ++++ .../simulator/xplane/xbus_traffic_proxy.h | 7 ++++++ src/xbus/traffic.cpp | 25 +++++++++++++++++++ src/xbus/traffic.h | 9 +++++++ 6 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 94af517ef..e999f874a 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -151,6 +151,23 @@ namespace BlackSimPlugin } } + void CSimulatorXPlane::ps_installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries) + { + m_installedModels.clear(); + auto modelStringsIt = modelStrings.begin(); + auto icaosIt = icaos.begin(); + auto airlinesIt = airlines.begin(); + auto liveriesIt = liveries.begin(); + for (; modelStringsIt != modelStrings.end() && icaosIt != icaos.end() && airlinesIt != airlines.end() && liveriesIt != liveries.end(); ++modelStringsIt, ++icaosIt, ++airlinesIt, ++liveriesIt) + { + using namespace BlackMisc::Simulation; + CAircraftIcaoData icaoData {*icaosIt, *airlinesIt}; + icaoData.setLivery(*liveriesIt); + CAircraftModel aircraftModel { *modelStringsIt, CAircraftModel::TypeModelMapping, QString(), icaoData }; + m_installedModels.push_back(aircraftModel); + } + } + bool CSimulatorXPlane::isConnected() const { return m_service && m_traffic; @@ -168,7 +185,9 @@ namespace BlackSimPlugin // FIXME duplication connect(m_service, &CXBusServiceProxy::aircraftModelChanged, this, &CSimulatorXPlane::ps_emitOwnAircraftModelChanged); connect(m_service, &CXBusServiceProxy::airportsInRangeUpdated, this, &CSimulatorXPlane::ps_setAirportsInRange); + connect(m_traffic, &CXBusTrafficProxy::installedModelsUpdated, this, &CSimulatorXPlane::ps_installedModelsUpdated); m_service->updateAirportsInRange(); + m_traffic->updateInstalledModels(); m_watcher->setConnection(m_conn); emitSimulatorCombinedStatus(); return true; @@ -243,12 +262,10 @@ namespace BlackSimPlugin Q_UNUSED(message); } - BlackMisc::Simulation::CAircraftModelList CSimulatorXPlane::getInstalledModels() const + CAircraftModelList CSimulatorXPlane::getInstalledModels() const { Q_ASSERT(isConnected()); - //! \todo XP driver, function not available - CLogMessage(this).error("Function not avialable"); - return {}; + return m_installedModels; } void CSimulatorXPlane::reloadInstalledModels() diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index a1eb1cfda..295f9fdc5 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -14,6 +14,7 @@ #include "blackcore/simulator_common.h" #include "blackmisc/simulation/ownaircraftprovider.h" +#include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/pixmap.h" #include @@ -129,6 +130,7 @@ namespace BlackSimPlugin void ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); void ps_fastTimerTimeout(); void ps_slowTimerTimeout(); + void ps_installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries); private: QDBusConnection m_conn { "default" }; @@ -138,6 +140,7 @@ namespace BlackSimPlugin QTimer *m_fastTimer { nullptr }; QTimer *m_slowTimer { nullptr }; BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft + BlackMisc::Simulation::CAircraftModelList m_installedModels; //! \todo Add units to members? pitchDeg?, altitudeFt? struct // data is written by DBus async method callbacks diff --git a/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp b/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp index cb7c27d83..203619a20 100644 --- a/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp +++ b/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp @@ -64,6 +64,11 @@ namespace BlackSimPlugin return m_dbusInterface->callDBusRet(QLatin1String("isDrawingLabels")); } + void CXBusTrafficProxy::updateInstalledModels() const + { + m_dbusInterface->callDBus(QLatin1String("updateInstalledModels")); + } + void CXBusTrafficProxy::addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) { m_dbusInterface->callDBus(QLatin1String("addPlane"), callsign, aircraftIcao, airlineIcao, livery); diff --git a/src/plugins/simulator/xplane/xbus_traffic_proxy.h b/src/plugins/simulator/xplane/xbus_traffic_proxy.h index 6fe2e2e93..6260a0f2d 100644 --- a/src/plugins/simulator/xplane/xbus_traffic_proxy.h +++ b/src/plugins/simulator/xplane/xbus_traffic_proxy.h @@ -53,6 +53,10 @@ namespace BlackSimPlugin void relaySignals(); + signals: + //! \copydoc XBus::CTraffic::installedModelsUpdated + void installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries); + public slots: //! \copydoc XBus::CTraffic::initialize bool initialize(); @@ -72,6 +76,9 @@ namespace BlackSimPlugin //! \copydoc XBus::CTraffic::isDrawingLabels bool isDrawingLabels() const; + //! \copydoc XBus::CTraffic::updateInstalledModels + void updateInstalledModels() const; + //! \copydoc XBus::CTraffic::addPlane void addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery); diff --git a/src/xbus/traffic.cpp b/src/xbus/traffic.cpp index 00045e288..16d0baada 100644 --- a/src/xbus/traffic.cpp +++ b/src/xbus/traffic.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -148,6 +149,30 @@ namespace XBus return XPMPDrawingAircraftLabels(); } + void CTraffic::updateInstalledModels() + { + int numberOfModels = XPMPGetNumberOfInstalledModels(); + QStringList modelNames; + QStringList icaos; + QStringList airlines; + QStringList liveries; + + for (int i = 0; i < numberOfModels; ++i) + { + const char *modelName = nullptr; + const char *icao = nullptr; + const char *airline = nullptr; + const char *livery = nullptr; + XPMPGetModelInfo(i, &modelName, &icao, &airline, &livery); + modelNames.append(QString::fromLocal8Bit(modelName)); + icaos.append(QString::fromLocal8Bit(icao)); + airlines.append(QString::fromLocal8Bit(airline)); + liveries.append(QString::fromLocal8Bit(livery)); + } + + emit installedModelsUpdated(modelNames, icaos, airlines, liveries); + } + void CTraffic::addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) { auto id = XPMPCreatePlane(qPrintable(aircraftIcao), qPrintable(airlineIcao), qPrintable(livery), getPlaneData, static_cast(this)); diff --git a/src/xbus/traffic.h b/src/xbus/traffic.h index 57dcbccef..962a80025 100644 --- a/src/xbus/traffic.h +++ b/src/xbus/traffic.h @@ -11,6 +11,8 @@ #include "datarefs.h" #include #include +#include +#include #include "XPMPMultiplayer.h" //! \cond PRIVATE @@ -53,6 +55,10 @@ namespace XBus //! Called by XPluginStart static void initLegacyData(); + signals: + //! Installed models updated. + void installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries); + public slots: //! Initialize the multiplayer planes rendering and return true if successful bool initialize(); @@ -72,6 +78,9 @@ namespace XBus //! Get whether the plugin draws type and callsign labels above aircraft bool isDrawingLabels() const; + //! Called by newly connected client to cause installedModelsUpdated to be emitted. + void updateInstalledModels(); + //! Introduce a new traffic aircraft void addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery);