8 #include <QDBusConnection>
9 #include <QLatin1String>
13 #define XSWIFTBUS_SERVICENAME "org.swift-project.xswiftbus"
16 using namespace swift::misc::aviation;
17 using namespace swift::misc::geo;
18 using namespace swift::misc::physical_quantities;
20 namespace swift::simplugin::xplane
22 const QStringList &CXSwiftBusTrafficProxy::getLogCategories()
28 CXSwiftBusTrafficProxy::CXSwiftBusTrafficProxy(QDBusConnection &connection, QObject *parent,
bool dummy)
36 s = connection.connect(QString(),
"/xswiftbus/traffic",
"org.swift_project.xswiftbus.traffic",
"simFrame",
40 s = connection.connect(QString(),
"/xswiftbus/traffic",
"org.swift_project.xswiftbus.traffic",
44 s = connection.connect(QString(),
"/xswiftbus/traffic",
"org.swift_project.xswiftbus.traffic",
52 QDBusPendingReply<bool, QString> reply = m_dbusInterface->asyncCall(QLatin1String(
"acquireMultiplayerPlanes"));
53 reply.waitForFinished();
56 CLogMessage(
this).
debug(u
"CXSwiftBusTrafficProxy::acquireMultiplayerPlanes returned: %1")
61 info.
owner = reply.argumentAt<1>();
67 return m_dbusInterface->
callDBusRet<
bool>(QLatin1String(
"initialize"));
74 return m_dbusInterface->
callDBusRet<QString>(QLatin1String(
"loadPlanesPackage"), path);
79 m_dbusInterface->
callDBus(QLatin1String(
"setDefaultIcao"), defaultIcao);
84 m_dbusInterface->
callDBus(QLatin1String(
"setMaxPlanes"), planes);
89 m_dbusInterface->
callDBus(QLatin1String(
"setMaxDrawDistance"), nauticalMiles);
93 const QString &aircraftIcao,
const QString &airlineIcao,
94 const QString &livery)
96 m_dbusInterface->
callDBus(QLatin1String(
"addPlane"), callsign, modelName, aircraftIcao, airlineIcao, livery);
101 m_dbusInterface->
callDBus(QLatin1String(
"removePlane"), callsign);
108 m_dbusInterface->
callDBus(QLatin1String(
"setPlanesPositions"), planesPositions.
callsigns,
116 m_dbusInterface->
callDBus(QLatin1String(
"setPlanesSurfaces"), planesSurfaces.
callsigns, planesSurfaces.
gears,
126 m_dbusInterface->
callDBus(QLatin1String(
"setPlanesTransponders"), planesTransponders.
callsigns,
132 m_dbusInterface->
callDBus(QLatin1String(
"setInterpolatorMode"), callsign, spline);
138 std::function<void(QDBusPendingCallWatcher *)> callback = [=](QDBusPendingCallWatcher *watcher) {
139 QDBusPendingReply<QStringList, QList<double>, QList<double>, QList<double>, QList<bool>, QList<double>>
141 if (!reply.isError())
143 const QStringList callsigns = reply.argumentAt<0>();
144 const QList<double> latitudesDeg = reply.argumentAt<1>();
145 const QList<double> longitudesDeg = reply.argumentAt<2>();
146 const QList<double> elevationsM = reply.argumentAt<3>();
147 const QList<bool> waterFlags = reply.argumentAt<4>();
148 const QList<double> verticalOffsets = reply.argumentAt<5>();
150 setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, waterFlags, verticalOffsets);
154 const QString errorMsg = reply.error().message();
155 CLogMessage(
this).
warning(u
"xswiftbus DBus error getRemoteAircraftData: %1") << errorMsg;
157 watcher->deleteLater();
159 m_dbusInterface->
callDBusAsync(QLatin1String(
"getRemoteAircraftData"), callback, callsigns);
163 double longitudeDeg,
double altitudeMeters,
166 std::function<void(QDBusPendingCallWatcher *)> callback = [=](QDBusPendingCallWatcher *watcher) {
167 QDBusPendingReply<QString, double, double, double, bool> reply = *watcher;
168 if (!reply.isError())
170 const CCallsign cs(reply.argumentAt<0>());
171 const double elevationMeters = reply.argumentAt<1>();
172 const double latitudeDegrees = reply.argumentAt<2>();
173 const double longitudeDegrees = reply.argumentAt<3>();
174 const CAltitude elevationAlt = std::isnan(elevationMeters) ?
176 CAltitude(elevationMeters, CLengthUnit::m(), CLengthUnit::ft());
178 CLongitude(longitudeDegrees, CAngleUnit::deg()), elevationAlt,
179 CElevationPlane::singlePointRadius());
180 const bool isWater = reply.argumentAt<4>();
181 setter(elevation, cs, isWater);
185 watcher->deleteLater();
188 m_dbusInterface->
callDBusAsync(QLatin1String(
"getElevationAtPosition"), callback, callsign.
asString(),
189 latitudeDeg, longitudeDeg, altitudeMeters);
196 m_dbusInterface->
callDBus(QLatin1String(
"setFollowedAircraft"), callsign);
Used for hand written interface based on virtual methods.
void callDBus(QLatin1String method, Args &&...args)
Call DBus, no return value.
Ret callDBusRet(QLatin1String method, Args &&...args)
Call DBus with synchronous return value.
QDBusPendingCallWatcher * callDBusAsync(QLatin1String method, Func callback, Args &&...args)
Call DBus with asynchronous return value Callback can be any callable object taking a single argument...
static const QString & dbus()
DBus related.
static const QString & driver()
Driver.
Class for emitting a log message.
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & debug()
Set the severity to debug.
QString message() const
Private.
Altitude as used in aviation, can be AGL or MSL altitude.
Value object encapsulating information of a callsign.
const QString & asString() const
Get callsign (normalized)
Plane of same elevation, can be a single point or larger area (e.g. airport)
void cleanup()
Reverse the actions of initialize().
static const QString & ObjectPath()
Service path.
void setMaxPlanes(int planes)
Set the maximum number of aircraft.
void addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery)
Introduce a new traffic aircraft.
MultiplayerAcquireInfo acquireMultiplayerPlanes()
Returns whether multiplayer planes have been acquired. If not, owner will be set to the plugin that a...
void remoteAircraftAddingFailed(const QString &callsign)
Remote aircraft adding failed.
bool initialize()
Initialize the multiplayer planes rendering and return true if successful.
void setPlanesPositions(const swift::simplugin::xplane::PlanesPositions &planesPositions)
Set the position of multiple traffic aircrafts.
void removeAllPlanes()
Remove all traffic aircraft.
void setFollowedAircraft(const QString &callsign)
Sets the aircraft with callsign to be followed in plane view.
void simFrame()
Simulator frame.
void setMaxDrawDistance(double nauticalMiles)
Set the maximum distance at which to draw aircraft (nautical miles).
void setPlanesSurfaces(const swift::simplugin::xplane::PlanesSurfaces &planesSurfaces)
Set the flight control surfaces and lights of multiple traffic aircrafts.
void getElevationAtPosition(const swift::misc::aviation::CCallsign &callsign, double latitudeDeg, double longitudeDeg, double altitudeMeters, const ElevationCallback &setter) const
Get the ground elevation at an arbitrary position.
void setInterpolatorMode(const QString &callsign, bool spline)
QString loadPlanesPackage(const QString &path)
Load a collection of planes from the given directory and return error message if unsuccessful.
static const QString & InterfaceName()
Service name.
void setDefaultIcao(const QString &defaultIcao)
Set the ICAO code to use for aircraft without a model match.
void setPlanesTransponders(const swift::simplugin::xplane::PlanesTransponders &planesTransponders)
Set the transponder of multiple traffic aircraft.
std::function< void(const swift::misc::geo::CElevationPlane &, const swift::misc::aviation::CCallsign &, bool)> ElevationCallback
Elevation callback.
void removePlane(const QString &callsign)
Remove a traffic aircraft.
std::function< void(const QStringList &, const QDoubleList &, const QDoubleList &, const QDoubleList &, const QBoolList &, const QDoubleList &)> RemoteAircraftDataCallback
Remote aircrafts data callback.
void remoteAircraftAdded(const QString &callsign)
Remote aircraft successfully added.
void getRemoteAircraftData(const QStringList &callsigns, const RemoteAircraftDataCallback &setter) const
Get remote aircrafts data (lat, lon, elevation and CG)
Free functions in swift::misc.
Multiplayer Acquire Info.
bool hasAcquired
Has xswiftbus acquired multiplayer planes?
QString owner
Name of the plugin having multiplayer planes acquired.
QList< double > pitchesDeg
List of pitches.
QList< double > altitudesFt
List of altitudes.
QStringList callsigns
List of callsigns.
QList< double > headingsDeg
List of headings.
QList< double > rollsDeg
List of rolls.
QList< bool > onGrounds
List of onGrounds.
QList< double > latitudesDeg
List of latitudes.
QList< double > longitudesDeg
List of longitudes.
QList< double > slats
List of slats.
QList< bool > beaconLights
List of beacon lights.
QList< bool > landLights
List of landing lights.
QList< double > gears
List of gears.
QStringList callsigns
List of callsigns.
QList< double > speedBrakes
List of speed brakes.
QList< bool > strobeLights
List of strobe lights.
QList< double > rudders
List of rudders.
QList< double > ailerons
List of ailerons.
QList< bool > navLights
List of nav lights.
QList< double > thrusts
List of thrusts.
QList< double > elevators
List of elevators.
QList< bool > taxiLights
List of taxi lights.
QList< int > lightPatterns
List of light patterns.
QList< double > spoilers
List of spoilers.
QList< double > flaps
List of flaps.
QList< double > wingSweeps
List of wing sweeps.
QList< bool > idents
List of active idents.
QStringList callsigns
List of callsigns.
QList< bool > modeCs
List of active mode C's.
QList< int > codes
List of transponder codes.