[XP] Get the ground elevation under the own aircraft

This commit is contained in:
Mat Sutcliffe
2022-02-03 20:43:23 +00:00
parent f5a9452ec2
commit 2ccee127e9
8 changed files with 42 additions and 0 deletions

View File

@@ -321,6 +321,7 @@ namespace BlackSimPlugin::XPlane
m_serviceProxy->getOwnAircraftCom2DataAsync(&m_xplaneData); m_serviceProxy->getOwnAircraftCom2DataAsync(&m_xplaneData);
m_serviceProxy->getOwnAircraftXpdrAsync(&m_xplaneData); m_serviceProxy->getOwnAircraftXpdrAsync(&m_xplaneData);
m_serviceProxy->getAllWheelsOnGroundAsync(&m_xplaneData.onGroundAll); m_serviceProxy->getAllWheelsOnGroundAsync(&m_xplaneData.onGroundAll);
m_serviceProxy->getGroundElevationAsync(&m_xplaneData.groundElevation);
CAircraftSituation situation; CAircraftSituation situation;
situation.setPosition({ m_xplaneData.latitudeDeg, m_xplaneData.longitudeDeg, 0 }); situation.setPosition({ m_xplaneData.latitudeDeg, m_xplaneData.longitudeDeg, 0 });
@@ -333,6 +334,8 @@ namespace BlackSimPlugin::XPlane
situation.setPitch({ m_xplaneData.pitchDeg, CAngleUnit::deg() }); situation.setPitch({ m_xplaneData.pitchDeg, CAngleUnit::deg() });
situation.setBank({ m_xplaneData.rollDeg, CAngleUnit::deg() }); situation.setBank({ m_xplaneData.rollDeg, CAngleUnit::deg() });
situation.setGroundSpeed({ m_xplaneData.groundspeedMs, CSpeedUnit::m_s() }); situation.setGroundSpeed({ m_xplaneData.groundspeedMs, CSpeedUnit::m_s() });
const CAltitude elevation { std::isnan(m_xplaneData.groundElevation) ? 0 : m_xplaneData.groundElevation, CAltitude::MeanSeaLevel, CLengthUnit::m() };
situation.setGroundElevation(elevation, CAircraftSituation::FromProvider);
situation.setVelocity({ m_xplaneData.localXVelocityMs, m_xplaneData.localYVelocityMs, m_xplaneData.localZVelocityMs, situation.setVelocity({ m_xplaneData.localXVelocityMs, m_xplaneData.localYVelocityMs, m_xplaneData.localZVelocityMs,
CSpeedUnit::m_s(), m_xplaneData.pitchRadPerSec, m_xplaneData.rollRadPerSec, m_xplaneData.headingRadPerSec, CSpeedUnit::m_s(), m_xplaneData.pitchRadPerSec, m_xplaneData.rollRadPerSec, m_xplaneData.headingRadPerSec,
CAngleUnit::rad(), CTimeUnit::s()}); CAngleUnit::rad(), CTimeUnit::s()});

View File

@@ -86,6 +86,7 @@ namespace BlackSimPlugin::XPlane
double rollRadPerSec = 0; //!< Roll angular velocity [rad/s] double rollRadPerSec = 0; //!< Roll angular velocity [rad/s]
double headingRadPerSec = 0; //!< Heading angular velocity [rad/s] double headingRadPerSec = 0; //!< Heading angular velocity [rad/s]
bool onGroundAll = false; //!< All wheels on ground? bool onGroundAll = false; //!< All wheels on ground?
double groundElevation = 0; //!< Elevation of ground [m]
int com1ActiveKhz = 122800; //!< COM1 active [kHz] int com1ActiveKhz = 122800; //!< COM1 active [kHz]
int com1StandbyKhz = 122800; //!< COM1 standby [kHz] int com1StandbyKhz = 122800; //!< COM1 standby [kHz]
bool isCom1Receiving = true; //!< COM1 receiving bool isCom1Receiving = true; //!< COM1 receiving

View File

@@ -544,6 +544,16 @@ namespace BlackSimPlugin::XPlane
m_dbusInterface->callDBusAsync(QLatin1String("getAllWheelsOnGround"), setterCallback(o_allWheels)); m_dbusInterface->callDBusAsync(QLatin1String("getAllWheelsOnGround"), setterCallback(o_allWheels));
} }
double CXSwiftBusServiceProxy::getGroundElevation() const
{
return m_dbusInterface->callDBusRet<double>(QLatin1String("getGroundElevation"));
}
void CXSwiftBusServiceProxy::getGroundElevationAsync(double* o_elevationM)
{
m_dbusInterface->callDBusAsync(QLatin1String("getGroundElevation"), setterCallback(o_elevationM));
}
int CXSwiftBusServiceProxy::getCom1ActiveKhz() const int CXSwiftBusServiceProxy::getCom1ActiveKhz() const
{ {
return m_dbusInterface->callDBusRet<int>(QLatin1String("getCom1ActiveKhz")); return m_dbusInterface->callDBusRet<int>(QLatin1String("getCom1ActiveKhz"));

View File

@@ -329,6 +329,12 @@ namespace BlackSimPlugin::XPlane
void getAllWheelsOnGroundAsync(bool *o_allWheels); void getAllWheelsOnGroundAsync(bool *o_allWheels);
//! @} //! @}
//! Get elevation of ground under the plane (in meters)
//! @{
double getGroundElevation() const;
void getGroundElevationAsync(double *o_elevationM);
//! @}
//! \copydoc XSwiftBus::CService::getCom1ActiveKhz //! \copydoc XSwiftBus::CService::getCom1ActiveKhz
//! @{ //! @{
int getCom1ActiveKhz() const; int getCom1ActiveKhz() const;

View File

@@ -766,6 +766,13 @@ namespace XSwiftBus
sendDBusReply(sender, serial, getAllWheelsOnGround()); sendDBusReply(sender, serial, getAllWheelsOnGround());
}); });
} }
else if (message.getMethodName() == "getGroundElevation")
{
queueDBusCall([ = ]()
{
sendDBusReply(sender, serial, getGroundElevation());
});
}
else if (message.getMethodName() == "getCom1ActiveKhz") else if (message.getMethodName() == "getCom1ActiveKhz")
{ {
queueDBusCall([ = ]() queueDBusCall([ = ]()

View File

@@ -19,6 +19,7 @@
#include "datarefs.h" #include "datarefs.h"
#include "messages.h" #include "messages.h"
#include "navdatareference.h" #include "navdatareference.h"
#include "terrainprobe.h"
#include <XPLM/XPLMNavigation.h> #include <XPLM/XPLMNavigation.h>
#include <string> #include <string>
#include <chrono> #include <chrono>
@@ -174,6 +175,9 @@ namespace XSwiftBus
//! Get whether all wheels are on the ground //! Get whether all wheels are on the ground
bool getAllWheelsOnGround() const { return m_onGroundAll.get(); } bool getAllWheelsOnGround() const { return m_onGroundAll.get(); }
//! Get elevation of ground under the plane in meters
double getGroundElevation() const { return m_terrainProbe.getElevation(m_latitude.get(), m_longitude.get(), m_elevation.get())[0]; }
//! COM Selection 6/7 //! COM Selection 6/7
//! @{ //! @{
int getComSelection() const { return m_comAudioSelection.get(); } int getComSelection() const { return m_comAudioSelection.get(); }
@@ -333,6 +337,7 @@ namespace XSwiftBus
int m_disapperMessageWindowTimeMs = 5000; int m_disapperMessageWindowTimeMs = 5000;
std::chrono::system_clock::time_point m_disappearMessageWindowTime; std::chrono::system_clock::time_point m_disappearMessageWindowTime;
std::vector<CNavDataReference> m_airports; std::vector<CNavDataReference> m_airports;
CTerrainProbe m_terrainProbe;
void readAirportsDatabase(); void readAirportsDatabase();
std::vector<CNavDataReference> findClosestAirports(int number, double latitude, double longitude); std::vector<CNavDataReference> findClosestAirports(int number, double latitude, double longitude);

View File

@@ -18,6 +18,13 @@ namespace XSwiftBus
CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); } CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); }
std::array<double, 3> CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude) const
{
static const std::string callsign = "myself";
bool unused = false;
return getElevation(degreesLatitude, degreesLongitude, metersAltitude, callsign, unused);
}
std::array<double, 3> CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign, bool &o_isWater) 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; double x, y, z;

View File

@@ -36,7 +36,10 @@ 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.
//! @{
std::array<double, 3> getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude) const;
std::array<double, 3> getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign, bool &o_isWater) const; std::array<double, 3> getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign, bool &o_isWater) const;
//! @}
private: private:
XPLMProbeRef m_ref = nullptr; XPLMProbeRef m_ref = nullptr;