[xswiftbus] getElevationAtPosition also returns latitude and longitude

This commit is contained in:
Mat Sutcliffe
2020-02-25 19:50:07 +00:00
parent 74d5afd123
commit f4f34341e6
6 changed files with 28 additions and 15 deletions

View File

@@ -166,14 +166,16 @@ namespace BlackSimPlugin
{ {
std::function<void(QDBusPendingCallWatcher *)> callback = [ = ](QDBusPendingCallWatcher * watcher) std::function<void(QDBusPendingCallWatcher *)> callback = [ = ](QDBusPendingCallWatcher * watcher)
{ {
QDBusPendingReply<QString, double> reply = *watcher; QDBusPendingReply<QString, double, double, double> reply = *watcher;
if (!reply.isError()) if (!reply.isError())
{ {
const CCallsign cs(reply.argumentAt<0>()); const CCallsign cs(reply.argumentAt<0>());
const double elevationMeters = reply.argumentAt<1>(); 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 CAltitude elevationAlt = std::isnan(elevationMeters) ? CAltitude::null() : CAltitude(elevationMeters, CLengthUnit::m(), CLengthUnit::ft());
const CElevationPlane elevation(CLatitude(latitudeDeg, CAngleUnit::deg()), const CElevationPlane elevation(CLatitude(latitudeDegrees, CAngleUnit::deg()),
CLongitude(longitudeDeg, CAngleUnit::deg()), CLongitude(longitudeDegrees, CAngleUnit::deg()),
elevationAlt, CElevationPlane::singlePointRadius()); elevationAlt, CElevationPlane::singlePointRadius());
setter(elevation, cs); setter(elevation, cs);
} }

View File

@@ -88,6 +88,8 @@ R"XML(<node>
<arg name="altitudeMeters" type="d" direction="in"/> <arg name="altitudeMeters" type="d" direction="in"/>
<arg type="s" direction="out"/> <arg type="s" direction="out"/>
<arg type="d" direction="out"/> <arg type="d" direction="out"/>
<arg type="d" direction="out"/>
<arg type="d" direction="out"/>
</method> </method>
<method name="setFollowedAircraft"> <method name="setFollowedAircraft">
<arg name="callsign" type="s" direction="in"/> <arg name="callsign" type="s" direction="in"/>

View File

@@ -10,6 +10,7 @@
#include "utils.h" #include "utils.h"
#include <XPLM/XPLMGraphics.h> #include <XPLM/XPLMGraphics.h>
#include <limits> #include <limits>
#include <cmath>
namespace XSwiftBus namespace XSwiftBus
{ {
@@ -17,7 +18,7 @@ namespace XSwiftBus
CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); } CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); }
double CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const std::array<double, 3> CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const
{ {
double x, y, z; double x, y, z;
XPLMWorldToLocal(degreesLatitude, degreesLongitude, metersAltitude, &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)); WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
} }
return std::numeric_limits<double>::quiet_NaN(); return {{ std::numeric_limits<double>::quiet_NaN(), degreesLatitude, degreesLongitude }};
} }
XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, &degreesLatitude, &degreesLongitude, &metersAltitude);
if (probe.is_wet && m_logMessageCount < 100) if (probe.is_wet && m_logMessageCount < 100)
{ {
m_logMessageCount++; m_logMessageCount++;
DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
} }
if (std::isnan(metersAltitude) && m_logMessageCount < 100)
XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, &degreesLatitude, &degreesLongitude, &metersAltitude); {
return metersAltitude; 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 } // ns

View File

@@ -11,6 +11,7 @@
#include <XPLM/XPLMScenery.h> #include <XPLM/XPLMScenery.h>
#include <string> #include <string>
#include <array>
namespace XSwiftBus namespace XSwiftBus
{ {
@@ -35,7 +36,7 @@ namespace XSwiftBus
//! Get the elevation in meters at the given point in OpenGL space. //! 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. //! \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. //! \return NaN if no ground was detected.
double getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const; std::array<double, 3> getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const;
private: private:
XPLMProbeRef m_ref = nullptr; XPLMProbeRef m_ref = nullptr;

View File

@@ -512,7 +512,7 @@ namespace XSwiftBus
double groundElevation = 0.0; double groundElevation = 0.0;
if (getSettings().isTerrainProbeEnabled()) 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; } if (std::isnan(groundElevation)) { groundElevation = 0.0; }
} }
double fudgeFactor = 3.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<double, 3> CTraffic::getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const
{ {
if (!getSettings().isTerrainProbeEnabled()) { return std::numeric_limits<double>::quiet_NaN(); } if (!getSettings().isTerrainProbeEnabled()) { return {{ std::numeric_limits<double>::quiet_NaN(), latitudeDeg, longitudeDeg }}; }
auto planeIt = m_planesByCallsign.find(callsign); auto planeIt = m_planesByCallsign.find(callsign);
if (planeIt != m_planesByCallsign.end()) if (planeIt != m_planesByCallsign.end())
@@ -822,11 +822,13 @@ namespace XSwiftBus
message.getArgument(altitudeMeters); message.getArgument(altitudeMeters);
queueDBusCall([ = ]() queueDBusCall([ = ]()
{ {
double elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters); const auto elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters);
CDBusMessage reply = CDBusMessage::createReply(sender, serial); CDBusMessage reply = CDBusMessage::createReply(sender, serial);
reply.beginArgumentWrite(); reply.beginArgumentWrite();
reply.appendArgument(callsign); reply.appendArgument(callsign);
reply.appendArgument(elevation); reply.appendArgument(elevation[0]);
reply.appendArgument(elevation[1]);
reply.appendArgument(elevation[2]);
sendDBusMessage(reply); sendDBusMessage(reply);
}); });
} }

View File

@@ -118,7 +118,7 @@ namespace XSwiftBus
std::vector<double> &elevationsM, std::vector<double> &verticalOffsets) const; std::vector<double> &elevationsM, std::vector<double> &verticalOffsets) const;
//! Get the ground elevation at an arbitrary position //! Get the ground elevation at an arbitrary position
double getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const; std::array<double, 3> getElevationAtPosition(const std::string &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters) const;
//! Sets the aircraft with callsign to be followed in plane view //! Sets the aircraft with callsign to be followed in plane view
void setFollowedAircraft(const std::string &callsign); void setFollowedAircraft(const std::string &callsign);