swift
fgswiftbustrafficproxy.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QDBusConnection>
7 #include <QLatin1String>
8 
9 #define FGSWIFTBUS_SERVICENAME "org.swift-project.fgswiftbus"
10 
11 using namespace swift::misc::aviation;
12 using namespace swift::misc::geo;
13 using namespace swift::misc::physical_quantities;
14 
15 namespace swift::simplugin::flightgear
16 {
17  CFGSwiftBusTrafficProxy::CFGSwiftBusTrafficProxy(QDBusConnection &connection, QObject *parent, bool dummy)
18  : QObject(parent)
19  {
20  m_dbusInterface = new swift::misc::CGenericDBusInterface(FGSWIFTBUS_SERVICENAME, ObjectPath(), InterfaceName(),
21  connection, this);
22  if (!dummy)
23  {
24  bool s;
25  s = connection.connect(QString(), "/fgswiftbus/traffic", "org.swift_project.fgswiftbus.traffic", "simFrame",
26  this, SIGNAL(simFrame()));
27  Q_ASSERT(s);
28 
29  s = connection.connect(QString(), "/fgswiftbus/traffic", "org.swift_project.fgswiftbus.traffic",
30  "remoteAircraftAdded", this, SIGNAL(remoteAircraftAdded(QString)));
31  Q_ASSERT(s);
32 
33  s = connection.connect(QString(), "/fgswiftbus/traffic", "org.swift_project.fgswiftbus.traffic",
34  "remoteAircraftAddingFailed", this, SIGNAL(remoteAircraftAddingFailed(QString)));
35  Q_ASSERT(s);
36  }
37  }
38 
40  {
41  QDBusPendingReply<bool, QString> reply = m_dbusInterface->asyncCall(QLatin1String("acquireMultiplayerPlanes"));
42  reply.waitForFinished();
43  if (reply.isError())
44  {
45  swift::misc::CLogMessage(this).debug(u"CFGSwiftBusTrafficProxy::acquireMultiplayerPlanes returned: %1")
46  << reply.error().message();
47  }
49  info.hasAcquired = reply.argumentAt<0>();
50  info.owner = reply.argumentAt<1>();
51  return info;
52  }
53 
55  {
56  return m_dbusInterface->callDBusRet<bool>(QLatin1String("initialize"));
57  }
58 
59  void CFGSwiftBusTrafficProxy::cleanup() { m_dbusInterface->callDBus(QLatin1String("cleanup")); }
60 
61  void CFGSwiftBusTrafficProxy::addPlane(const QString &callsign, const QString &modelName,
62  const QString &aircraftIcao, const QString &airlineIcao,
63  const QString &livery)
64  {
65  m_dbusInterface->callDBus(QLatin1String("addPlane"), callsign, modelName, aircraftIcao, airlineIcao, livery);
66  }
67 
68  void CFGSwiftBusTrafficProxy::removePlane(const QString &callsign)
69  {
70  m_dbusInterface->callDBus(QLatin1String("removePlane"), callsign);
71  }
72 
73  void CFGSwiftBusTrafficProxy::removeAllPlanes() { m_dbusInterface->callDBus(QLatin1String("removeAllPlanes")); }
74 
76  {
77  m_dbusInterface->callDBus(QLatin1String("setPlanesPositions"), planesPositions.callsigns,
78  planesPositions.latitudesDeg, planesPositions.longitudesDeg,
79  planesPositions.altitudesFt, planesPositions.pitchesDeg, planesPositions.rollsDeg,
80  planesPositions.headingsDeg, planesPositions.groundSpeedKts,
81  planesPositions.onGrounds);
82  }
83 
85  {
86  m_dbusInterface->callDBus(QLatin1String("setPlanesSurfaces"), planesSurfaces.callsigns, planesSurfaces.gears,
87  planesSurfaces.flaps, planesSurfaces.spoilers, planesSurfaces.speedBrakes,
88  planesSurfaces.slats, planesSurfaces.wingSweeps, planesSurfaces.thrusts,
89  planesSurfaces.elevators, planesSurfaces.rudders, planesSurfaces.ailerons,
90  planesSurfaces.landLights, planesSurfaces.taxiLights, planesSurfaces.beaconLights,
91  planesSurfaces.strobeLights, planesSurfaces.navLights, planesSurfaces.lightPatterns);
92  }
93 
95  {
96  m_dbusInterface->callDBus(QLatin1String("setPlanesTransponders"), planesTransponders.callsigns,
97  planesTransponders.codes, planesTransponders.modeCs, planesTransponders.idents);
98  }
99 
100  void CFGSwiftBusTrafficProxy::getRemoteAircraftData(const QStringList &callsigns,
101  const RemoteAircraftDataCallback &setter) const
102  {
103  std::function<void(QDBusPendingCallWatcher *)> callback = [=](QDBusPendingCallWatcher *watcher) {
104  QDBusPendingReply<QStringList, QList<double>, QList<double>, QList<double>, QList<double>> reply = *watcher;
105  if (!reply.isError())
106  {
107  const QStringList callsigns = reply.argumentAt<0>();
108  const QList<double> latitudesDeg = reply.argumentAt<1>();
109  const QList<double> longitudesDeg = reply.argumentAt<2>();
110  const QList<double> elevationsM = reply.argumentAt<3>();
111  const QList<double> verticalOffsets = reply.argumentAt<4>();
112  setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
113  }
114  watcher->deleteLater();
115  };
116  m_dbusInterface->callDBusAsync(QLatin1String("getRemoteAircraftData"), callback, callsigns);
117  }
118 
119  void CFGSwiftBusTrafficProxy::getElevationAtPosition(const CCallsign &callsign, double latitudeDeg,
120  double longitudeDeg, double altitudeMeters,
121  const ElevationCallback &setter) const
122  {
123  std::function<void(QDBusPendingCallWatcher *)> callback = [=](QDBusPendingCallWatcher *watcher) {
124  QDBusPendingReply<QString, double> reply = *watcher;
125  if (!reply.isError())
126  {
127  const CCallsign cs(reply.argumentAt<0>());
128  const double elevationMeters = reply.argumentAt<1>();
129  const CAltitude elevationAlt = std::isnan(elevationMeters) ?
130  CAltitude::null() :
131  CAltitude(elevationMeters, CLengthUnit::m(), CLengthUnit::ft());
132  const CElevationPlane elevation(CLatitude(latitudeDeg, CAngleUnit::deg()),
133  CLongitude(longitudeDeg, CAngleUnit::deg()), elevationAlt,
134  CElevationPlane::singlePointRadius());
135  setter(elevation, cs);
136  }
137  watcher->deleteLater();
138  };
139  m_dbusInterface->callDBusAsync(QLatin1String("getElevationAtPosition"), callback, callsign.asString(),
140  latitudeDeg, longitudeDeg, altitudeMeters);
141  }
142 } // namespace swift::simplugin::flightgear
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...
Class for emitting a log message.
Definition: logmessage.h:27
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.
Definition: altitude.h:52
Value object encapsulating information of a callsign.
Definition: callsign.h:30
const QString & asString() const
Get callsign (normalized)
Definition: callsign.h:96
Plane of same elevation, can be a single point or larger area (e.g. airport)
void remoteAircraftAdded(const QString &callsign)
Remote aircraft successfully added.
void setPlanesTransponders(const swift::simplugin::flightgear::PlanesTransponders &planesTransponders)
Set the transponders of multiple traffic aircrafts.
void setPlanesSurfaces(const swift::simplugin::flightgear::PlanesSurfaces &planesSurfaces)
Set the surfaces of multiple traffic aircrafts.
void cleanup()
Reverse the actions of initialize().
std::function< void(const QStringList &, const QDoubleList &, const QDoubleList &, const QDoubleList &, const QDoubleList &)> RemoteAircraftDataCallback
Remote aircrafts data callback.
void remoteAircraftAddingFailed(const QString &callsign)
Remote aircraft adding failed.
void addPlane(const QString &callsign, const QString &modelName, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery)
Introduce a new traffic aircraft.
bool initialize()
Initialize the multiplayer planes rendering and return true if successful.
MultiplayerAcquireInfo acquireMultiplayerPlanes()
Returns whether multiplayer planes have been acquired. If not, owner will be set to the plugin that a...
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.
std::function< void(const swift::misc::geo::CElevationPlane &, const swift::misc::aviation::CCallsign &)> ElevationCallback
Elevation callback.
void getRemoteAircraftData(const QStringList &callsigns, const RemoteAircraftDataCallback &setter) const
Get remote aircrafts data (lat, lon, elevation and CG)
void removePlane(const QString &callsign)
Remove a traffic aircraft.
void setPlanesPositions(const swift::simplugin::flightgear::PlanesPositions &planesPositions)
Set the position of multiple traffic aircrafts.
QString owner
Name of the plugin having multiplayer planes acquired.
bool hasAcquired
Has FGSwiftBus acquired multiplayer planes?
QList< double > altitudesFt
List of altitudes.
QList< double > latitudesDeg
List of latitudes.
QList< double > longitudesDeg
List of longitudes.
QList< double > groundSpeedKts
List of groundspeeds.
QList< bool > strobeLights
List of strobeLights.
QList< double > wingSweeps
List of wingSweeps.
QList< bool > taxiLights
List of taxi lights.
QList< int > lightPatterns
List of lightPatterns.
QList< double > speedBrakes
List of speedBrakes.
QList< bool > beaconLights
List of beaconLights.
QList< int > codes
List of transponder codes.
QList< bool > modeCs
List of active mode C's.