mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-22 13:15:39 +08:00
[XP] Get the ground elevation under the own aircraft
This commit is contained in:
@@ -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()});
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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([ = ]()
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user