swift
simulatorxplane.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_SIMPLUGIN_SIMULATOR_XPLANE_H
7 #define SWIFT_SIMPLUGIN_SIMULATOR_XPLANE_H
8 
9 #include <QDBusConnection>
10 #include <QHash>
11 #include <QList>
12 #include <QObject>
13 #include <QPair>
14 #include <QString>
15 #include <QStringList>
16 #include <QTimer>
17 
18 #include "xplanempaircraft.h"
19 
23 #include "misc/identifier.h"
24 #include "misc/pixmap.h"
25 #include "misc/pq/time.h"
26 #include "misc/pq/units.h"
27 #include "misc/sequence.h"
28 #include "misc/settingscache.h"
34 #include "misc/statusmessage.h"
37 
38 class QDBusServiceWatcher;
39 
40 namespace swift::misc
41 {
42  namespace aviation
43  {
44  class CAircraftParts;
45  class CAircraftSituation;
46  class CCallsign;
47  } // namespace aviation
48  namespace network
49  {
50  class CTextMessage;
51  }
52  namespace simulation
53  {
54  class CSimulatedAircraft;
55  class CSimulatorPluginInfo;
56  class IOwnAircraftProvider;
57  class IRemoteAircraftProvider;
58  } // namespace simulation
59 } // namespace swift::misc
60 
61 namespace swift::simplugin::xplane
62 {
63  class CXSwiftBusServiceProxy;
64  class CXSwiftBusTrafficProxy;
65 
67  struct XPlaneData
68  {
70  QString aircraftIcaoCode;
71  double latitudeDeg = 0;
72  double longitudeDeg = 0;
73  double altitudeM = 0;
74  double pressureAltitudeFt = 0;
75  double heightAglM = 0;
76  double groundspeedMs = 0;
77  double pitchDeg = 0;
78  double rollDeg = 0;
79  double trueHeadingDeg = 0;
80  double localXVelocityMs = 0;
81  double localYVelocityMs = 0;
82  double localZVelocityMs = 0;
83  double pitchRadPerSec = 0;
84  double rollRadPerSec = 0;
85  double headingRadPerSec = 0;
86  bool onGroundAll = false;
87  double groundElevation = 0;
88  int com1ActiveKhz = 122800;
89  int com1StandbyKhz = 122800;
90  bool isCom1Receiving = true;
91  bool isCom1Transmitting = true;
92  double com1Volume = 1;
93  int com2ActiveKhz = 122800;
94  int com2StandbyKhz = 122800;
95  bool isCom2Receiving = true;
96  bool isCom2Transmitting = true;
97  double com2Volume = 1;
98  int xpdrCode = 2000;
99  int xpdrMode = 0;
100  bool xpdrIdent = false;
101  bool beaconLightsOn = false;
102  bool landingLightsOn = false;
103  bool navLightsOn = false;
104  bool strobeLightsOn = false;
105  bool taxiLightsOn = false;
106  double flapsDeployRatio = 0;
107  double gearDeployRatio = 0;
108  QList<double> enginesN1Percentage;
109  double speedBrakeRatio = 0;
110  double seaLevelPressureInHg = 0;
111  };
112 
115  {
116  Q_OBJECT
117 
118  public:
122  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
123  swift::misc::network::IClientProvider *clientProvider, QObject *parent = nullptr);
124 
126  virtual ~CSimulatorXPlane() override;
127 
130  virtual bool connectTo() override;
131  virtual bool disconnectFrom() override;
133  const swift::misc::CIdentifier &originator) override;
134  virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal,
135  const swift::misc::CIdentifier &originator) override;
136  virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const override;
137  virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const override;
138  virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const override;
140  virtual bool followAircraft(const swift::misc::aviation::CCallsign &callsign) override;
141  virtual void unload() override;
142  virtual QString getStatisticsSimulatorSpecific() const override;
143  virtual void resetAircraftStatistics() override;
145  getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const override;
146  virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign,
148  const swift::misc::aviation::CAircraftParts &parts) override;
150  const swift::misc::aviation::CCallsign &callsign,
151  bool isWater) override;
152  virtual void setFlightNetworkConnected(bool connected) override;
154 
156  virtual bool requestElevation(const swift::misc::geo::ICoordinateGeodetic &reference,
157  const swift::misc::aviation::CCallsign &callsign) override;
158 
159  protected:
162  virtual bool isConnected() const override;
163  virtual bool
165  virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign) override;
166  virtual int physicallyRemoveAllRemoteAircraft() override;
167  virtual void clearAllRemoteAircraftData() override;
168  virtual bool isPaused() const override
169  {
171  return false;
172  }
174 
175  private slots:
177  void onDBusServiceUnregistered();
178 
179  private:
181  enum DBusMode
182  {
183  Session,
184  P2P
185  };
186 
187  using QDoubleList = QList<double>;
188  using QBoolList = QList<bool>;
189 
190  void emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery,
191  const QString &icao, const QString &modelString, const QString &name,
192  const QString &description);
193  void fastTimerTimeout();
194  void slowTimerTimeout();
195 
196  void loadCslPackages();
197  QString findCslPackage(const QString &modelFileName);
198 
201  void updateRemoteAircraft();
202 
204  void updateAirportsInRange();
205 
208  void requestRemoteAircraftDataFromXPlane();
209  void requestRemoteAircraftDataFromXPlane(const swift::misc::aviation::CCallsignSet &callsigns);
210  void triggerRequestRemoteAircraftDataFromXPlane(const swift::misc::aviation::CCallsignSet &callsigns);
212 
215  void addNextPendingAircraft();
216  void triggerAddNextPendingAircraft();
218 
220  int detectTimeoutAdding();
221 
223  void triggerRemoveAircraft(const swift::misc::aviation::CCallsign &callsign, qint64 deferMs);
224 
226  QPair<qint64, qint64> minMaxTimestampsAddInProgress() const;
227 
229  bool canAddAircraft() const;
230 
233  void onRemoteAircraftAdded(const QString &callsign);
234  void onRemoteAircraftAddingFailed(const QString &callsign);
235  void updateRemoteAircraftFromSimulator(const QStringList &callsigns, const QDoubleList &latitudesDeg,
236  const QDoubleList &longitudesDeg, const QDoubleList &elevationsMeters,
237  const QBoolList &waterFlags, const QDoubleList &verticalOffsetsMeters);
239 
241  void disconnectFromDBus();
242 
245  bool sendXSwiftBusSettings();
246  swift::misc::simulation::settings::CXSwiftBusSettings receiveXSwiftBusSettings(bool &ok);
248 
250  void onXSwiftBusSettingsChanged();
251 
253  void setMinTerrainProbeDistance(const swift::misc::physical_quantities::CLength &distance);
254 
256  bool handleProbeValue(const swift::misc::geo::CElevationPlane &plane,
257  const swift::misc::aviation::CCallsign &callsign, bool waterFlag, const QString &hint,
258  bool ignoreOutsideRange);
259 
260  static bool isSuspiciousTerrainValue(const swift::misc::geo::CElevationPlane &elevation);
261  static const swift::misc::physical_quantities::CLength &maxTerrainRequestDistance();
262 
264  fixSimulatorCg(const swift::misc::physical_quantities::CLength &cg,
266 
267  DBusMode m_dbusMode;
269  this, &CSimulatorXPlane::onXSwiftBusSettingsChanged
270  };
271  static constexpr qint64 TimeoutAdding = 10000;
272  QDBusConnection m_dBusConnection { "default" };
273  QDBusServiceWatcher *m_watcher { nullptr };
274  CXSwiftBusServiceProxy *m_serviceProxy { nullptr };
275  CXSwiftBusTrafficProxy *m_trafficProxy { nullptr };
276  QTimer m_fastTimer;
277  QTimer m_slowTimer;
278  QTimer m_airportUpdater;
279  QTimer m_pendingAddedTimer;
280  unsigned int m_fastTimerCalls = 0;
281  unsigned int m_slowTimerCalls = 0;
282 
283  CXPlaneMPAircraftObjects m_xplaneAircraftObjects;
284 
285  swift::misc::simulation::CSimulatedAircraftList m_pendingToBeAddedAircraft;
286  QHash<swift::misc::aviation::CCallsign, qint64> m_addingInProgressAircraft;
288  swift::misc::physical_quantities::CLength m_minSuspicousTerrainProbe {
289  nullptr
290  };
291  XPlaneData m_xplaneData;
293  m_altitudeDelta;
294 
295  // statistics
296  qint64 m_statsAddMaxTimeMs = -1;
297  qint64 m_statsAddCurrentTimeMs = -1;
298 
300  void resetXPlaneData() { m_xplaneData = {}; }
301  };
302 
305  {
306  Q_OBJECT
307 
308  public:
311 
312  protected:
314  virtual void startImpl() override;
315 
317  virtual void stopImpl() override;
318 
320  virtual void checkImpl() override;
321 
322  private:
323  void checkConnection();
324  void checkConnectionViaSessionBus();
325  void checkConnectionViaPeer(const QString &address);
326  void checkConnectionCommon();
327 
328  void serviceRegistered(const QString &serviceName);
329  void onXSwiftBusServerSettingChanged();
330 
331  QTimer m_timer { this };
332  QDBusConnection m_DBusConnection { "default" };
333  QString m_dBusServerAddress;
335  this, &CSimulatorXPlaneListener::onXSwiftBusServerSettingChanged
336  };
337  };
338 
341  {
342  Q_OBJECT
343  Q_PLUGIN_METADATA(IID "org.swift-project.swift_core.simulatorinterface" FILE "simulatorxplane.json")
344  Q_INTERFACES(swift::core::ISimulatorFactory)
345 
346  public:
348  virtual swift::core::ISimulator *
351  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
352  swift::misc::network::IClientProvider *clientProvider) override;
353 
357  {
358  return new CSimulatorXPlaneListener(info);
359  }
360  };
361 } // namespace swift::simplugin::xplane
362 
363 #endif // SWIFT_SIMPLUGIN_SIMULATOR_XPLANE_H
Factory pattern class to create instances of ISimulator.
Definition: simulator.h:691
Interface to a simulator.
Definition: simulator.h:59
Interface to a simulator listener.
Definition: simulator.h:630
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
Value object encapsulating information of aircraft's parts.
Definition: aircraftparts.h:26
Value object encapsulating information of an aircraft's situation.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for a set of callsigns.
Definition: callsignset.h:26
Value object for SELCAL.
Definition: selcal.h:31
Plane of same elevation, can be a single point or larger area (e.g. airport)
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Value object encapsulating information of a text message.
Definition: textmessage.h:31
Direct in memory access to client (network client) data.
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Comprehensive information of an aircraft.
Value object encapsulating a list of aircraft.
Direct threadsafe in memory access to own aircraft.
Direct thread safe in memory access to remote aircraft.
Common base class for simulator plugins.
Factory for creating CSimulatorXPlane instance.
virtual swift::core::ISimulatorListener * createListener(const swift::misc::simulation::CSimulatorPluginInfo &info)
Simulator listener instance.
virtual swift::core::ISimulator * create(const swift::misc::simulation::CSimulatorPluginInfo &info, swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider, swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider, swift::misc::network::IClientProvider *clientProvider)
Create a new instance of a driver.
X-Plane ISimulator implementation.
virtual int physicallyRemoveAllRemoteAircraft()
Remove all remote aircraft and their data via ISimulator::clearAllRemoteAircraftData.
virtual bool connectTo()
Connect to simulator.
virtual bool followAircraft(const swift::misc::aviation::CCallsign &callsign)
Follow aircraft.
virtual bool isConnected() const
Are we connected to the simulator?
virtual bool requestElevation(const swift::misc::geo::ICoordinateGeodetic &reference, const swift::misc::aviation::CCallsign &callsign)
Request elevation, there is no guarantee the requested elevation will be available in the provider.
CSimulatorXPlane(const swift::misc::simulation::CSimulatorPluginInfo &info, swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider, swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider, swift::misc::network::IClientProvider *clientProvider, QObject *parent=nullptr)
Constructor.
virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftSituation &situation, const swift::misc::aviation::CAircraftParts &parts)
Send situation/parts for testing.
virtual void resetAircraftStatistics()
Reset the statistics.
virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
virtual void clearAllRemoteAircraftData()
Clear all aircraft related data, but do not physically remove the aircraft.
virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const
Is the aircraft rendered (displayed in simulator)? This shall only return true if the aircraft is rea...
virtual bool isPaused() const
Simulator paused?
virtual void unload()
Driver will be unloaded.
virtual bool updateOwnSimulatorCockpit(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
virtual swift::misc::aviation::CCallsignSet physicallyRenderedAircraft() const
Physically rendered (displayed in simulator) This shall only return aircraft handled in the simulator...
virtual swift::misc::CStatusMessageList getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const
Interpolation messages for callsign.
virtual void setFlightNetworkConnected(bool connected)
Flight network has been connected.
virtual bool physicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &newRemoteAircraft)
Add new remote aircraft physically to the simulator.
virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign)
Remove remote aircraft from simulator.
virtual QString getStatisticsSimulatorSpecific() const
Allows to print out simulator specific statistics.
virtual void callbackReceivedRequestedElevation(const swift::misc::geo::CElevationPlane &plane, const swift::misc::aviation::CCallsign &callsign, bool isWater)
A requested elevation has been received.
virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const
Display a status message in the simulator.
virtual bool disconnectFrom()
Disconnect from simulator.
virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const
Display a text message.
Listener waits for xswiftbus service to show up.
CSimulatorXPlaneListener(const swift::misc::simulation::CSimulatorPluginInfo &info)
Constructor.
virtual void checkImpl()
Plugin specific implementation to check.
virtual void startImpl()
Plugin specific implementation to start listener.
virtual void stopImpl()
Plugin specific implementation to stop listener.
Free functions in swift::misc.
int com2StandbyKhz
COM2 standby [kHz].
double headingRadPerSec
Heading angular velocity [rad/s].
double groundspeedMs
Ground speed [m/s].
double com2Volume
COM2 volume 0..1.
double groundElevation
Elevation of ground [m].
double com1Volume
COM1 volume 0..1.
double localXVelocityMs
Local x velocity [m/s].
int xpdrMode
Transponder mode (off=0,stdby=1,on=2,test=3)
bool isCom1Transmitting
COM1 transmittings.
QString aircraftModelPath
Aircraft model path.
double flapsDeployRatio
Flaps deployment ratio [%].
double localZVelocityMs
Local z velocity [m/s].
bool isCom2Transmitting
COM2 transmittings.
double rollRadPerSec
Roll angular velocity [rad/s].
double gearDeployRatio
Gear deployment ratio [%].
double trueHeadingDeg
True heading [deg].
bool xpdrIdent
Is transponder in ident?
QString aircraftIcaoCode
Aircraft ICAO code.
bool onGroundAll
All wheels on ground?
double latitudeDeg
Longitude [deg].
double pitchRadPerSec
Pitch angular velocity [rad/s].
QList< double > enginesN1Percentage
N1 per engine [%].
double speedBrakeRatio
Speed break ratio [%].
double seaLevelPressureInHg
Sea level pressure [inhg].
int com1StandbyKhz
COM1 standby [kHz].
double pressureAltitudeFt
Pressure altitude [ft, XP12].
bool landingLightsOn
Landing lights on?
double localYVelocityMs
Local y velocity [m/s].