[FG] Fetching elevation from sim

This commit is contained in:
Lars Toenning
2020-02-29 14:18:33 +01:00
committed by Mat Sutcliffe
parent 22a70e083e
commit 469a057a86
4 changed files with 55 additions and 0 deletions

View File

@@ -105,5 +105,26 @@ namespace BlackSimPlugin
};
m_dbusInterface->callDBusAsync(QLatin1String("getRemoteAircraftData"), callback, callsigns);
}
void CFGSwiftBusTrafficProxy::getElevationAtPosition(const CCallsign &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters,
const ElevationCallback &setter) const
{
std::function<void(QDBusPendingCallWatcher *)> callback = [ = ](QDBusPendingCallWatcher * watcher)
{
QDBusPendingReply<QString, double> reply = *watcher;
if (!reply.isError())
{
const CCallsign cs(reply.argumentAt<0>());
const double elevationMeters = reply.argumentAt<1>();
const CAltitude elevationAlt = std::isnan(elevationMeters) ? CAltitude::null() : CAltitude(elevationMeters, CLengthUnit::m(), CLengthUnit::ft());
const CElevationPlane elevation(CLatitude(latitudeDeg, CAngleUnit::deg()),
CLongitude(longitudeDeg, CAngleUnit::deg()),
elevationAlt, CElevationPlane::singlePointRadius());
setter(elevation, cs);
}
watcher->deleteLater();
};
m_dbusInterface->callDBusAsync(QLatin1String("getElevationAtPosition"), callback, callsign.asString(), latitudeDeg, longitudeDeg, altitudeMeters);
}
} // ns
} // ns

View File

@@ -216,6 +216,10 @@ namespace BlackSimPlugin
//! Get remote aircrafts data (lat, lon, elevation and CG)
void getRemoteAircraftData(const QStringList &callsigns, const RemoteAircraftDataCallback &setter) const;
//! \copydoc XSwiftBus::CTraffic::getElevationAtPosition
void getElevationAtPosition(const BlackMisc::Aviation::CCallsign &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters,
const ElevationCallback &setter) const;
private:
BlackMisc::CGenericDBusInterface *m_dbusInterface = nullptr;
};

View File

@@ -824,6 +824,35 @@ namespace BlackSimPlugin
emit this->aircraftRenderingChanged(addedRemoteAircraft);
}
bool CSimulatorFlightgear::requestElevation(const BlackMisc::Geo::ICoordinateGeodetic &reference, const BlackMisc::Aviation::CCallsign &callsign)
{
if (this->isShuttingDownOrDisconnected()) { return false; }
if(reference.isNull()) { return false; }
CCoordinateGeodetic pos(reference);
if(!pos.hasMSLGeodeticHeight()){
// testing showed: height has an influence on the returned result
// - the most accurate value seems to be returned if the height is close to the elevation
// - in normal scenarios there is no much difference of the results if 0 is used
// - in Lukla (9200ft MSL) the difference between 0 and 9200 is around 1ft
// - in the LOWW scenario using 50000ft MSL results in around 3ft too low elevation
static const CAltitude alt(0, CAltitude::MeanSeaLevel, CLengthUnit::ft());
pos.setGeodeticHeight(alt);
}
using namespace std::placeholders;
auto callback = std::bind(&CSimulatorFlightgear::callbackReceivedRequestedElevation, this, _1, _2);
// Request
m_trafficProxy->getElevationAtPosition(callsign,
pos.latitude().value(CAngleUnit::deg()),
pos.longitude().value(CAngleUnit::deg()),
pos.geodeticHeight().value(CLengthUnit::m()),
callback);
emit this->requestedElevation(callsign);
return true;
}
void CSimulatorFlightgear::onRemoteAircraftAddingFailed(const QString &callsign)
{
BLACK_VERIFY_X(!callsign.isEmpty(), Q_FUNC_INFO, "Need callsign");

View File

@@ -137,6 +137,7 @@ namespace BlackSimPlugin
virtual void resetAircraftStatistics() override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
virtual bool requestElevation(const BlackMisc::Geo::ICoordinateGeodetic &reference, const BlackMisc::Aviation::CCallsign &callsign) override;
//! @}
protected: