mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-30 22:29:13 +08:00
Ref T778 XSwiftBus traffic service prodives water/land flag for elevations
This commit is contained in:
@@ -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"/>
|
||||
|
||||
@@ -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, °reesLatitude, °reesLongitude, &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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user