Ref T778 XSwiftBus traffic service prodives water/land flag for elevations

This commit is contained in:
Mat Sutcliffe
2020-04-08 22:22:12 +01:00
parent 7c4fe83799
commit 22ebf6c5ea
16 changed files with 52 additions and 34 deletions

View File

@@ -79,6 +79,7 @@ R"XML(<node>
<arg name="latitudesDeg" type="ad" direction="out"/>
<arg name="longitudesDeg" type="ad" direction="out"/>
<arg name="elevationsM" type="ad" direction="out"/>
<arg name="waterFlags" type="ab" direction="out"/>
<arg name="verticalOffsets" type="ad" direction="out"/>
</method>
<method name="getElevationAtPosition">
@@ -90,6 +91,7 @@ R"XML(<node>
<arg type="d" direction="out"/>
<arg type="d" direction="out"/>
<arg type="d" direction="out"/>
<arg type="b" direction="out"/>
</method>
<method name="setFollowedAircraft">
<arg name="callsign" type="s" direction="in"/>

View File

@@ -18,7 +18,7 @@ namespace XSwiftBus
CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); }
std::array<double, 3> 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, bool &o_isWater) const
{
double x, y, z;
XPLMWorldToLocal(degreesLatitude, degreesLongitude, metersAltitude, &x, &y, &z);
@@ -38,6 +38,7 @@ namespace XSwiftBus
WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
}
o_isWater = false;
return {{ std::numeric_limits<double>::quiet_NaN(), degreesLatitude, degreesLongitude }};
}
XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, &degreesLatitude, &degreesLongitude, &metersAltitude);
@@ -52,6 +53,7 @@ namespace XSwiftBus
m_logMessageCount++;
DEBUG_LOG(callsign + " probe returned NaN at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
}
o_isWater = probe.is_wet;
return {{ metersAltitude, degreesLatitude, degreesLongitude }};
}
} // ns

View File

@@ -36,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.
std::array<double, 3> 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, bool &o_isWater) const;
private:
XPLMProbeRef m_ref = nullptr;

View File

@@ -488,7 +488,7 @@ namespace XSwiftBus
}
void CTraffic::getRemoteAircraftData(std::vector<std::string> &callsigns, std::vector<double> &latitudesDeg, std::vector<double> &longitudesDeg,
std::vector<double> &elevationsM, std::vector<double> &verticalOffsets) const
std::vector<double> &elevationsM, std::vector<bool> &waterFlags, std::vector<double> &verticalOffsets) const
{
if (callsigns.empty() || m_planesByCallsign.empty()) { return; }
@@ -510,10 +510,11 @@ namespace XSwiftBus
const double latDeg = plane->position.lat;
const double lonDeg = plane->position.lon;
double groundElevation = 0.0;
bool isWater = false;
if (getSettings().isTerrainProbeEnabled())
{
// we expect elevation in meters
groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation, requestedCallsign).front();
groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation, requestedCallsign, isWater).front();
if (std::isnan(groundElevation)) { groundElevation = 0.0; }
}
double fudgeFactor = 3.0;
@@ -523,11 +524,12 @@ namespace XSwiftBus
latitudesDeg.push_back(latDeg);
longitudesDeg.push_back(lonDeg);
elevationsM.push_back(groundElevation);
waterFlags.push_back(isWater);
verticalOffsets.push_back(hasOffset ? fudgeFactor : std::numeric_limits<decltype(fudgeFactor)>::quiet_NaN());
}
}
std::array<double, 3> 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, bool &o_isWater) const
{
if (!getSettings().isTerrainProbeEnabled()) { return {{ std::numeric_limits<double>::quiet_NaN(), latitudeDeg, longitudeDeg }}; }
@@ -535,11 +537,11 @@ namespace XSwiftBus
if (planeIt != m_planesByCallsign.end())
{
const Plane *plane = planeIt->second;
return plane->terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign);
return plane->terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign, o_isWater);
}
else
{
return m_terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign + " (plane not found)");
return m_terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign + " (plane not found)", o_isWater);
}
}
@@ -798,8 +800,9 @@ namespace XSwiftBus
std::vector<double> latitudesDeg;
std::vector<double> longitudesDeg;
std::vector<double> elevationsM;
std::vector<bool> waterFlags;
std::vector<double> verticalOffsets;
getRemoteAircraftData(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
getRemoteAircraftData(callsigns, latitudesDeg, longitudesDeg, elevationsM, waterFlags, verticalOffsets);
CDBusMessage reply = CDBusMessage::createReply(sender, serial);
reply.beginArgumentWrite();
reply.appendArgument(callsigns);
@@ -823,13 +826,15 @@ namespace XSwiftBus
message.getArgument(altitudeMeters);
queueDBusCall([ = ]()
{
const auto elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters);
bool isWater = false;
const auto elevation = getElevationAtPosition(callsign, latitudeDeg, longitudeDeg, altitudeMeters, isWater);
CDBusMessage reply = CDBusMessage::createReply(sender, serial);
reply.beginArgumentWrite();
reply.appendArgument(callsign);
reply.appendArgument(elevation[0]);
reply.appendArgument(elevation[1]);
reply.appendArgument(elevation[2]);
reply.appendArgument(isWater);
sendDBusMessage(reply);
});
}

View File

@@ -115,10 +115,10 @@ namespace XSwiftBus
//! Get remote aircrafts data (lat, lon, elevation and CG)
void getRemoteAircraftData(std::vector<std::string> &callsigns, std::vector<double> &latitudesDeg, std::vector<double> &longitudesDeg,
std::vector<double> &elevationsM, std::vector<double> &verticalOffsets) const;
std::vector<double> &elevationsM, std::vector<bool> &waterFlags, std::vector<double> &verticalOffsets) const;
//! Get the ground elevation at an arbitrary position
std::array<double, 3> 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, bool &o_isWater) const;
//! Sets the aircraft with callsign to be followed in plane view
void setFollowedAircraft(const std::string &callsign);