From 1ac89d477f72d74b0e6737a6dbaf34d91d5912b8 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Thu, 18 Jun 2015 23:20:54 +0200 Subject: [PATCH] refs #444 Use CAircraftMatcher to match a model and send it to xbus In case the model name is empty, xbus falls back to its former behaviour and lets libxplanemp do the matching. If aircraft matcher does provide a model this will be used instead. Until model mapping database is ready, a dummy provider has been added. Hence CAircraftMatcher will always return a default model. --- .../simulation/modelmappingsprovider.h | 14 +++++++ .../simulator/xplane/simulator_xplane.cpp | 39 +++++++++++++++++-- .../simulator/xplane/simulator_xplane.h | 2 + .../simulator/xplane/xbus_traffic_proxy.cpp | 4 +- .../simulator/xplane/xbus_traffic_proxy.h | 2 +- src/xbus/traffic.cpp | 22 ++++++++--- src/xbus/traffic.h | 2 +- 7 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/blackmisc/simulation/modelmappingsprovider.h b/src/blackmisc/simulation/modelmappingsprovider.h index eb40effae..ffab11e0e 100644 --- a/src/blackmisc/simulation/modelmappingsprovider.h +++ b/src/blackmisc/simulation/modelmappingsprovider.h @@ -42,6 +42,20 @@ namespace BlackMisc protected: BlackMisc::Network::CAircraftMappingList m_mappings; //!< Mappings }; + + //! Model mappings dummy + class BLACKMISC_EXPORT CModelMappingsProviderDummy : public IModelMappingsProvider + { + public: + //! Constructor + CModelMappingsProviderDummy(QObject *parent = nullptr) : IModelMappingsProvider(parent) {} + + //! Destructor + virtual ~CModelMappingsProviderDummy() {} + + //! Load data + virtual bool read() override { return true; } + }; } // ns } // ns diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index e999f874a..6b028f00a 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -11,6 +11,8 @@ #include "xbus_service_proxy.h" #include "xbus_traffic_proxy.h" #include "blackmisc/logmessage.h" +#include "blackmisc/blackmiscfreefunctions.h" +#include "blackmisc/simulation/modelmappingsprovider.h" #include "blackmisc/geo/coordinategeodetic.h" #include #include @@ -58,6 +60,15 @@ namespace BlackSimPlugin connect(m_slowTimer, &QTimer::timeout, this, &CSimulatorXPlane::ps_slowTimerTimeout); m_fastTimer->start(100); m_slowTimer->start(1000); + + m_modelMatcher.setModelMappingProvider(BlackMisc::make_unique()); + m_modelMatcher.setDefaultModel(CAircraftModel( + "__A319/A319_CFM.obj __A319/DAL.png", + CAircraftModel::TypeModelMatchingDefaultModel, + "A319 CFM DAL", + CAircraftIcaoData(CAircraftIcaoCode("A319", "L2J"), CAirlineIcaoCode(), "FFFFFF") + )); + resetData(); } @@ -166,6 +177,9 @@ namespace BlackSimPlugin CAircraftModel aircraftModel { *modelStringsIt, CAircraftModel::TypeModelMapping, QString(), icaoData }; m_installedModels.push_back(aircraftModel); } + + m_modelMatcher.setInstalledModels(m_installedModels); + m_modelMatcher.init(); } bool CSimulatorXPlane::isConnected() const @@ -357,13 +371,26 @@ namespace BlackSimPlugin Q_ASSERT(isConnected()); //! \todo XPlane driver check if already exists, how? //! \todo XPlane driver set correct return value - // KB: from what I can see here all data are available - // Is there any model matching required ???? + + // matched models + CAircraftModel aircraftModel = m_modelMatcher.getClosestMatch(newRemoteAircraft); + Q_ASSERT_X(newRemoteAircraft.getCallsign() == aircraftModel.getCallsign(), Q_FUNC_INFO, "mismatching callsigns"); + + CCallsign callsign(newRemoteAircraft.getCallsign()); + this->updateAircraftModel(callsign, aircraftModel, identifier()); + CSimulatedAircraft aircraftAfterModelApplied(getAircraftInRangeForCallsign(newRemoteAircraft.getCallsign())); + CAircraftIcaoData icao = newRemoteAircraft.getIcaoInfo(); - m_traffic->addPlane(newRemoteAircraft.getCallsign().asString(), icao.getAircraftDesignator(), icao.getAirlineDesignator(), icao.getLivery()); + m_traffic->addPlane(newRemoteAircraft.getCallsign().asString(), aircraftModel.getModelString(), icao.getAircraftDesignator(), icao.getAirlineDesignator(), icao.getLivery()); updateAircraftRendered(newRemoteAircraft.getCallsign(), true, identifier()); CLogMessage(this).info("XP: Added aircraft %1") << newRemoteAircraft.getCallsign().toQString(); - return true; + + bool rendered = true; + aircraftAfterModelApplied.setRendered(rendered); + this->updateAircraftRendered(callsign, rendered, identifier()); + emit modelMatchingCompleted(aircraftAfterModelApplied); + + return rendered; } void CSimulatorXPlane::ps_remoteProviderAddAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) @@ -419,6 +446,10 @@ namespace BlackSimPlugin bool CSimulatorXPlane::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft, const CIdentifier &originator) { + if (originator == this->identifier()) { return false; } + + // remove upfront, and then enable / disable again + this->physicallyRemoveRemoteAircraft(aircraft.getCallsign()); return this->changeRemoteAircraftEnabled(aircraft, originator); } diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index 295f9fdc5..8ebafd92b 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -13,6 +13,7 @@ #define BLACKSIMPLUGIN_SIMULATOR_XPLANE_H #include "blackcore/simulator_common.h" +#include "blackmisc/simulation/aircraftmatcher.h" #include "blackmisc/simulation/ownaircraftprovider.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/pixmap.h" @@ -141,6 +142,7 @@ namespace BlackSimPlugin QTimer *m_slowTimer { nullptr }; BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft BlackMisc::Simulation::CAircraftModelList m_installedModels; + BlackMisc::Simulation::CAircraftMatcher m_modelMatcher { BlackMisc::Simulation::CAircraftMatcher::AllModes, this }; //!< Model matcher //! \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 203619a20..ca7bac39e 100644 --- a/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp +++ b/src/plugins/simulator/xplane/xbus_traffic_proxy.cpp @@ -69,9 +69,9 @@ namespace BlackSimPlugin m_dbusInterface->callDBus(QLatin1String("updateInstalledModels")); } - void CXBusTrafficProxy::addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) + void CXBusTrafficProxy::addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) { - m_dbusInterface->callDBus(QLatin1String("addPlane"), callsign, aircraftIcao, airlineIcao, livery); + m_dbusInterface->callDBus(QLatin1String("addPlane"), callsign, modelName, aircraftIcao, airlineIcao, livery); } void CXBusTrafficProxy::removePlane(const QString &callsign) diff --git a/src/plugins/simulator/xplane/xbus_traffic_proxy.h b/src/plugins/simulator/xplane/xbus_traffic_proxy.h index 6260a0f2d..443ec6757 100644 --- a/src/plugins/simulator/xplane/xbus_traffic_proxy.h +++ b/src/plugins/simulator/xplane/xbus_traffic_proxy.h @@ -80,7 +80,7 @@ namespace BlackSimPlugin void updateInstalledModels() const; //! \copydoc XBus::CTraffic::addPlane - void addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery); + void addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery); //! \copydoc XBus::CTraffic::removePlane void removePlane(const QString &callsign); diff --git a/src/xbus/traffic.cpp b/src/xbus/traffic.cpp index 16d0baada..be9001ccb 100644 --- a/src/xbus/traffic.cpp +++ b/src/xbus/traffic.cpp @@ -173,12 +173,24 @@ namespace XBus emit installedModelsUpdated(modelNames, icaos, airlines, liveries); } - void CTraffic::addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) + void CTraffic::addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery) { - auto id = XPMPCreatePlane(qPrintable(aircraftIcao), qPrintable(airlineIcao), qPrintable(livery), getPlaneData, static_cast(this)); - auto plane = new Plane(id, callsign, aircraftIcao, airlineIcao, livery); - m_planesByCallsign[callsign] = plane; - m_planesById[id] = plane; + XPMPPlaneID id = nullptr; + if (modelName.isEmpty()) + { + id = XPMPCreatePlane(qPrintable(aircraftIcao), qPrintable(airlineIcao), qPrintable(livery), getPlaneData, static_cast(this)); + } + else + { + id = XPMPCreatePlaneWithModelName(qPrintable(modelName), qPrintable(aircraftIcao), qPrintable(airlineIcao), qPrintable(livery), getPlaneData, static_cast(this)); + } + + if (id) + { + auto plane = new Plane(id, callsign, aircraftIcao, airlineIcao, livery); + m_planesByCallsign[callsign] = plane; + m_planesById[id] = plane; + } } void CTraffic::removePlane(const QString &callsign) diff --git a/src/xbus/traffic.h b/src/xbus/traffic.h index 962a80025..9ab335b18 100644 --- a/src/xbus/traffic.h +++ b/src/xbus/traffic.h @@ -82,7 +82,7 @@ namespace XBus void updateInstalledModels(); //! Introduce a new traffic aircraft - void addPlane(const QString &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery); + void addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery); //! Remove a traffic aircraft void removePlane(const QString &callsign);