diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index 401f70124..38feebb37 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -157,6 +157,11 @@ void BlackMisc::registerMetadata() Settings::registerMetadata(); Audio::registerMetadata(); Hardware::registerMetadata(); + + // needed by XBus proxy class + qRegisterMetaType>(); + qRegisterMetaType>("CDoubleSequence"); + qDBusRegisterMetaType>(); } /* diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 1c8e1415d..c98320748 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -88,7 +88,10 @@ namespace BlackSimPlugin m_traffic = new CXBusTrafficProxy(m_conn, this); if (m_service->isValid() && m_traffic->isValid() && m_traffic->initialize()) { + // FIXME duplication connect(m_service, &CXBusServiceProxy::aircraftModelChanged, this, &CSimulatorXPlane::emitAircraftModelChanged); + connect(m_service, &CXBusServiceProxy::airportsInRangeUpdated, this, &CSimulatorXPlane::setAirportsInRange); + m_service->updateAirportsInRange(); m_watcher->setConnection(m_conn); emit statusChanged(ISimulator::Connected); return true; @@ -128,7 +131,10 @@ namespace BlackSimPlugin { delete m_service; m_service = new CXBusServiceProxy(m_conn, this); + // FIXME duplication connect(m_service, &CXBusServiceProxy::aircraftModelChanged, this, &CSimulatorXPlane::emitAircraftModelChanged); + connect(m_service, &CXBusServiceProxy::airportsInRangeUpdated, this, &CSimulatorXPlane::setAirportsInRange); + m_service->updateAirportsInRange(); } else if (serviceName == CXBusTrafficProxy::InterfaceName()) { @@ -204,20 +210,39 @@ namespace BlackSimPlugin return { m_xplaneData.aircraftModelPath, true }; } - BlackMisc::Aviation::CAirportList CSimulatorXPlane::getAirportsInRange() const + void CSimulatorXPlane::setAirportsInRange(const QStringList &icaos, const QStringList &names, const BlackMisc::CSequence &lats, const BlackMisc::CSequence &lons, const BlackMisc::CSequence &alts) { - // TODO: Fill with airports nearby from sim - BlackMisc::Aviation::CAirportList airports; - return airports; + qDebug() << alts; + m_airports.clear(); + auto icaoIt = icaos.begin(); + auto nameIt = names.begin(); + auto latIt = lats.begin(); + auto lonIt = lons.begin(); + auto altIt = alts.begin(); + for (; icaoIt != icaos.end() && nameIt != names.end() && latIt != lats.end() && lonIt != lons.end() && altIt != alts.end(); ++icaoIt, ++nameIt, ++latIt, ++lonIt, ++altIt) + { + using namespace BlackMisc::PhysicalQuantities; + using namespace BlackMisc::Geo; + + m_airports.push_back({ *icaoIt, { CLatitude(*latIt, CAngleUnit::deg()), CLongitude(*lonIt, CAngleUnit::deg()), CLength(*altIt, CLengthUnit::ft()) }, *nameIt }); + } + using namespace BlackMisc::Math; } - void CSimulatorXPlane::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) + BlackMisc::Aviation::CAirportList CSimulatorXPlane::getAirportsInRange() const + { + auto copy = m_airports; + copy.sortByRange({ m_xplaneData.latitude, m_xplaneData.longitude, 0 }, true); + copy.truncate(20); + return copy; + } + + void CSimulatorXPlane::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime) { if (enable) { - emit this->displayStatusMessage(CStatusMessage::getWarningMessage("Use time synchronization of XP itself", CStatusMessage::TypeSimulator)); + emit displayStatusMessage(CStatusMessage::getWarningMessage("X-Plane already provides real time synchronization", CStatusMessage::TypeSimulator)); } - Q_UNUSED(offset); } bool CSimulatorXPlane::updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft) diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index 1270b8fd4..5fb593451 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -92,6 +92,7 @@ namespace BlackSimPlugin private slots: void serviceRegistered(const QString &serviceName); void serviceUnregistered(); + void setAirportsInRange(const QStringList &icaoCodes, const QStringList &names, const BlackMisc::CSequence &lats, const BlackMisc::CSequence &lons, const BlackMisc::CSequence &alts); void emitAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); void fastTimerTimeout(); void slowTimerTimeout(); @@ -103,6 +104,8 @@ namespace BlackSimPlugin CXBusTrafficProxy *m_traffic { nullptr }; QTimer *m_fastTimer { nullptr }; QTimer *m_slowTimer { nullptr }; + + BlackMisc::Aviation::CAirportList m_airports; QSet m_planes; // FIXME should not be needed here IMHO struct // data is written by DBus async method callbacks diff --git a/src/plugins/simulator/xplane/xbus_service_proxy.cpp b/src/plugins/simulator/xplane/xbus_service_proxy.cpp index 9ab41eb93..22ed4f28c 100644 --- a/src/plugins/simulator/xplane/xbus_service_proxy.cpp +++ b/src/plugins/simulator/xplane/xbus_service_proxy.cpp @@ -34,6 +34,11 @@ namespace BlackSimPlugin } } + void CXBusServiceProxy::updateAirportsInRange() + { + m_dbusInterface->callDBus(QLatin1String("updateAirportsInRange")); + } + QString CXBusServiceProxy::getAircraftModelPath() const { return m_dbusInterface->callDBusRet(QLatin1String("getAircraftModelPath")); diff --git a/src/plugins/simulator/xplane/xbus_service_proxy.h b/src/plugins/simulator/xplane/xbus_service_proxy.h index 0df324eff..e36bdb257 100644 --- a/src/plugins/simulator/xplane/xbus_service_proxy.h +++ b/src/plugins/simulator/xplane/xbus_service_proxy.h @@ -9,6 +9,7 @@ //! \file #include "blackmisc/genericdbusinterface.h" +#include "blackmisc/sequence.h" #include //! \cond PRIVATE @@ -21,6 +22,9 @@ namespace BlackSimPlugin namespace XPlane { + //! Typedef needed to use CSequence as a DBus argument + typedef BlackMisc::CSequence CDoubleSequence; + /*! * Proxy object connected to a real XBus::CService object via DBus */ @@ -76,7 +80,13 @@ namespace BlackSimPlugin //! \copydoc XBus::CService::aircraftModelChanged void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); + //! \copydoc XBus::CService::airportsInRangeUpdated + void airportsInRangeUpdated(const QStringList &icaoCodes, const QStringList &names, const CDoubleSequence &lats, const CDoubleSequence &lons, const CDoubleSequence &alts); + public slots: + //! \copydoc XBus::CService::updateAirportsInRange + void updateAirportsInRange(); + //! \copydoc XBus::CService::getAircraftModelPath //! @{ QString getAircraftModelPath() const;