From 72497fdefc326790542e76aa9c5796cf2e40e0ef Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Thu, 22 Feb 2018 21:50:28 +0100 Subject: [PATCH] Regularly request remote aircraft data from X-Plane This includes * ground elevation * model offset (to be implemented) ref T259 --- .../simulator/xplane/simulatorxplane.cpp | 25 +++++++++++++++++++ .../simulator/xplane/simulatorxplane.h | 3 +++ .../xplane/xswiftbustrafficproxy.cpp | 5 ++++ .../simulator/xplane/xswiftbustrafficproxy.h | 6 +++++ src/xswiftbus/traffic.cpp | 16 ++++++++++++ src/xswiftbus/traffic.h | 6 +++++ 6 files changed, 61 insertions(+) diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 454ed5731..815dc4d7a 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -223,6 +223,8 @@ namespace BlackSimPlugin m_xplaneData.speedBrakeRatio > 0.5, engines, m_xplaneData.onGroundAll }; updateOwnParts(parts); + + requestRemoteAircraftDataFromXPlane(); } } @@ -247,6 +249,7 @@ namespace BlackSimPlugin connect(m_service, &CXSwiftBusServiceProxy::airportsInRangeUpdated, this, &CSimulatorXPlane::ps_setAirportsInRange); m_service->updateAirportsInRange(); connect(m_traffic, &CXSwiftBusTrafficProxy::simFrame, this, &CSimulatorXPlane::updateRemoteAircraft); + connect(m_traffic, &CXSwiftBusTrafficProxy::remoteAircraftData, this, &CSimulatorXPlane::updateRemoteAircraftFromSimulator); if (m_watcher) { m_watcher->setConnection(m_conn); } loadCslPackages(); emitSimulatorCombinedStatus(); @@ -1005,6 +1008,28 @@ namespace BlackSimPlugin return true; } + void CSimulatorXPlane::requestRemoteAircraftDataFromXPlane() + { + if (!isConnected()) { return; } + m_traffic->requestRemoteAircraftData(); + } + + void CSimulatorXPlane::updateRemoteAircraftFromSimulator(const QString &callsign_, double latitude, double longitude, double groundElevation, double modelVerticalOffset) + { + CCallsign callsign(callsign_); + if (!m_xplaneAircrafts.contains(callsign)) { return; } + + CElevationPlane elevation(CLatitude(latitude, CAngleUnit::deg()), CLongitude(longitude, CAngleUnit::deg()), CAltitude(groundElevation, CLengthUnit::m())); + elevation.setSinglePointRadius(); + + CInterpolationHints &hints = m_hints[callsign]; + hints.setElevationPlane(elevation); // update elevation + hints.setCGAboveGround({ modelVerticalOffset, CLengthUnit::ft() }); // normally never changing, but if user changes ModelMatching update possible + + // set it in the remote aircraft provider + this->updateAircraftGroundElevation(callsign, elevation); + } + BlackCore::ISimulator *CSimulatorXPlaneFactory::create(const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index 6a83cbd60..c232df736 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -159,6 +159,9 @@ namespace BlackSimPlugin //! Send parts to simulator bool sendRemoteAircraftPartsToSimulator(const CXPlaneMPAircraft &xplaneAircraft, const BlackMisc::Aviation::CAircraftParts &parts); + void requestRemoteAircraftDataFromXPlane(); + void updateRemoteAircraftFromSimulator(const QString &callsign, double latitude, double longitude, double elevation, double modelVerticalOffset); + static constexpr bool c_driverInterpolation = true; static constexpr int GuessRemoteAircraftPartsCycle = 20; //!< guess every n-th cycle diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp index bf0258c7f..2e518d89f 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp @@ -115,5 +115,10 @@ namespace BlackSimPlugin m_dbusInterface->callDBus(QLatin1String("setInterpolatorMode"), callsign, spline); } + void CXSwiftBusTrafficProxy::requestRemoteAircraftData() + { + m_dbusInterface->callDBus(QLatin1String("requestRemoteAircraftData")); + } + } } diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.h b/src/plugins/simulator/xplane/xswiftbustrafficproxy.h index 64d577fd2..6b34602c1 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.h +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.h @@ -65,6 +65,9 @@ namespace BlackSimPlugin //! \copydoc XSwiftBus::CTraffic::simFrame void simFrame(); + //! \copydoc XSwiftBus::CTraffic::remoteAircraftData + void remoteAircraftData(const QString &callsign, double latitude, double longitude, double elevation, double modelVerticalOffset); + public slots: //! \copydoc XSwiftBus::CTraffic::initialize bool initialize(); @@ -118,6 +121,9 @@ namespace BlackSimPlugin //! \copydoc XSwiftBus::CTraffic::setInterpolatorMode void setInterpolatorMode(const QString &callsign, bool spline); + + //! \copydoc XSwiftBus::CTraffic::requestRemoteAircraftData + void requestRemoteAircraftData(); }; } diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index 6bea1ed1a..503b41722 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -380,6 +380,22 @@ namespace XSwiftBus } } + void CTraffic::requestRemoteAircraftData() + { + if (m_planesByCallsign.empty()) { return; } + const QList planes = m_planesByCallsign.values(); + for (const Plane *plane : planes) + { + double lat = plane->position.lat; + double lon = plane->position.lon; + double elevation = plane->position.elevation; + double groundElevation = plane->terrainProbe.getElevation(lat, lon, elevation); + if (std::isnan(groundElevation)) { groundElevation = 0.0; } + constexpr double fudgeFactor = 3.0; //! \fixme Value should be different for each plane, derived from the CSL model geometry + emit remoteAircraftData(plane->callsign, lat, lon, groundElevation, fudgeFactor); + } + } + //! memcmp function which ignores the header ("size" member) and compares only the payload (the rest of the struct) template int memcmpPayload(T *dst, T *src) diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index 6c2afa262..e2f1d4b68 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -70,6 +70,9 @@ namespace XSwiftBus //! Signal emitted for each simulator rendering frame void simFrame(); + //! Remote aircraft data + void remoteAircraftData(const QString &callsign, double latitude, double longitude, double elevation, double modelVerticalOffset); + public slots: //! Initialize the multiplayer planes rendering and return true if successful bool initialize(); @@ -124,6 +127,9 @@ namespace XSwiftBus //! Set interpolation mode for a traffic aircraft void setInterpolatorMode(const QString &callsign, bool spline); + //! Request traffic plane data. A signal remoteAircraftData will be emitted for each known plane + void requestRemoteAircraftData(); + private: bool m_initialized = false; bool m_enabled = false;