diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp index 858d66b37..2c3e0f815 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp @@ -166,14 +166,16 @@ namespace BlackSimPlugin { std::function callback = [ = ](QDBusPendingCallWatcher * watcher) { - QDBusPendingReply reply = *watcher; + QDBusPendingReply reply = *watcher; if (!reply.isError()) { const CCallsign cs(reply.argumentAt<0>()); const double elevationMeters = reply.argumentAt<1>(); + const double latitudeDegrees = reply.argumentAt<2>(); + const double longitudeDegrees = reply.argumentAt<3>(); const CAltitude elevationAlt = std::isnan(elevationMeters) ? CAltitude::null() : CAltitude(elevationMeters, CLengthUnit::m(), CLengthUnit::ft()); - const CElevationPlane elevation(CLatitude(latitudeDeg, CAngleUnit::deg()), - CLongitude(longitudeDeg, CAngleUnit::deg()), + const CElevationPlane elevation(CLatitude(latitudeDegrees, CAngleUnit::deg()), + CLongitude(longitudeDegrees, CAngleUnit::deg()), elevationAlt, CElevationPlane::singlePointRadius()); setter(elevation, cs); } diff --git a/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml b/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml index 60fc7d284..ef6edd4b4 100644 --- a/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml +++ b/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml @@ -88,6 +88,8 @@ R"XML( + + diff --git a/src/xswiftbus/terrainprobe.cpp b/src/xswiftbus/terrainprobe.cpp index 07b1e9c48..3452ad843 100644 --- a/src/xswiftbus/terrainprobe.cpp +++ b/src/xswiftbus/terrainprobe.cpp @@ -10,6 +10,7 @@ #include "utils.h" #include #include +#include namespace XSwiftBus { @@ -17,7 +18,7 @@ namespace XSwiftBus CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); } - double CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const + std::array CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const { double x, y, z; XPLMWorldToLocal(degreesLatitude, degreesLongitude, metersAltitude, &x, &y, &z); @@ -37,15 +38,20 @@ namespace XSwiftBus WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); } - return std::numeric_limits::quiet_NaN(); + return {{ std::numeric_limits::quiet_NaN(), degreesLatitude, degreesLongitude }}; } + XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, °reesLatitude, °reesLongitude, &metersAltitude); + if (probe.is_wet && m_logMessageCount < 100) { m_logMessageCount++; DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); } - - XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, °reesLatitude, °reesLongitude, &metersAltitude); - return metersAltitude; + if (std::isnan(metersAltitude) && m_logMessageCount < 100) + { + m_logMessageCount++; + DEBUG_LOG(callsign + " probe returned NaN at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); + } + return {{ metersAltitude, degreesLatitude, degreesLongitude }}; } } // ns diff --git a/src/xswiftbus/terrainprobe.h b/src/xswiftbus/terrainprobe.h index 2a9f6e368..779bd1cb5 100644 --- a/src/xswiftbus/terrainprobe.h +++ b/src/xswiftbus/terrainprobe.h @@ -11,6 +11,7 @@ #include #include +#include namespace XSwiftBus { @@ -35,7 +36,7 @@ namespace XSwiftBus //! Get the elevation in meters at the given point in OpenGL space. //! \note Due to the Earth's curvature, the OpenGL vertical axis may not be exactly perpendicular to the surface of the geoid. //! \return NaN if no ground was detected. - double getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const; + std::array getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const; private: XPLMProbeRef m_ref = nullptr; diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index b6ad3f274..729f70906 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -512,7 +512,7 @@ namespace XSwiftBus double groundElevation = 0.0; if (getSettings().isTerrainProbeEnabled()) { - groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation, requestedCallsign); + groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation, requestedCallsign).front(); if (std::isnan(groundElevation)) { groundElevation = 0.0; } } double fudgeFactor = 3.0; @@ -526,9 +526,9 @@ namespace XSwiftBus } } - double CTraffic::getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const + std::array CTraffic::getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const { - if (!getSettings().isTerrainProbeEnabled()) { return std::numeric_limits::quiet_NaN(); } + if (!getSettings().isTerrainProbeEnabled()) { return {{ std::numeric_limits::quiet_NaN(), latitudeDeg, longitudeDeg }}; } auto planeIt = m_planesByCallsign.find(callsign); if (planeIt != m_planesByCallsign.end()) @@ -822,11 +822,13 @@ namespace XSwiftBus message.getArgument(altitudeMeters); queueDBusCall([ = ]() { - double elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters); + const auto elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters); CDBusMessage reply = CDBusMessage::createReply(sender, serial); reply.beginArgumentWrite(); reply.appendArgument(callsign); - reply.appendArgument(elevation); + reply.appendArgument(elevation[0]); + reply.appendArgument(elevation[1]); + reply.appendArgument(elevation[2]); sendDBusMessage(reply); }); } diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index e5c65765e..aa1858a4b 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -118,7 +118,7 @@ namespace XSwiftBus std::vector &elevationsM, std::vector &verticalOffsets) const; //! Get the ground elevation at an arbitrary position - double getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const; + std::array getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const; //! Sets the aircraft with callsign to be followed in plane view void setFollowedAircraft(const std::string &callsign);