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);