swift
simulatorflightgear.h
Go to the documentation of this file.
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 #ifndef SWIFT_SIMPLUGIN_SIMULATOR_FLIGHTGEAR_H
7 #define SWIFT_SIMPLUGIN_SIMULATOR_FLIGHTGEAR_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 "flightgearmpaircraft.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::flightgear
62 {
63  extern int FGSWIFTBUS_API_VERSION;
64  extern QList<int> incompatibleVersions;
65  class CFGSwiftBusServiceProxy;
66  class CFGSwiftBusTrafficProxy;
67 
70  {
72  QString aircraftIcaoCode;
73  double latitudeDeg = 0;
74  double longitudeDeg = 0;
75  double altitudeFt = 0;
76  double groundspeedKts = 0;
77  double pitchDeg = 0;
78  double rollDeg = 0;
79  double trueHeadingDeg = 0;
80  double velocityXMs = 0;
81  double velocityYMs = 0;
82  double velocityZMs = 0;
83  double pitchRateRadPerSec = 0;
84  double rollRateRadPerSec = 0;
85  double yawRateRadPerSec = 0;
86  bool onGroundAll = false;
87  int com1ActiveKhz = 122800;
88  int com1StandbyKhz = 122800;
89  int com2ActiveKhz = 122800;
90  int com2StandbyKhz = 122800;
91  int xpdrCode = 2000;
92  int xpdrMode = 0;
93  bool xpdrIdent = false;
94  bool beaconLightsOn = false;
95  bool landingLightsOn = false;
96  bool navLightsOn = false;
97  bool strobeLightsOn = false;
98  bool taxiLightsOn = false;
99  double flapsReployRatio = false;
100  double gearReployRatio = false;
101  QList<double> enginesN1Percentage;
102  double speedBrakeRatio = 0;
103  double pressureAltitudeFt = 0;
104  double groundElevation = 0;
105  double volumeCom1 = 1;
106  double volumeCom2 = 1;
107  };
108 
111  {
112  Q_OBJECT
113 
114  public:
118  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
119  swift::misc::network::IClientProvider *clientProvider, QObject *parent = nullptr);
120 
122  virtual ~CSimulatorFlightgear() override;
123 
126  virtual bool connectTo() override;
127  virtual bool disconnectFrom() override;
129  const swift::misc::CIdentifier &originator) override;
130  virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal,
131  const swift::misc::CIdentifier &originator) override;
132  virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const override;
133  virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const override;
134  virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const override;
136  virtual void unload() override;
137  virtual QString getStatisticsSimulatorSpecific() const override;
138  virtual void resetAircraftStatistics() override;
140  getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const override;
141  virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign,
143  const swift::misc::aviation::CAircraftParts &parts) override;
144  virtual bool requestElevation(const swift::misc::geo::ICoordinateGeodetic &reference,
145  const swift::misc::aviation::CCallsign &callsign) override;
147 
148  protected:
151  virtual bool isConnected() const override;
152  virtual bool
154  virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign) override;
155  virtual int physicallyRemoveAllRemoteAircraft() override;
156  virtual void clearAllRemoteAircraftData() override;
157  virtual bool isPaused() const override { return false; }
159 
160  private slots:
162  void onDBusServiceUnregistered();
163 
164  private:
165  enum DBusMode
166  {
167  Session,
168  P2P
169  };
170 
171  using QDoubleList = QList<double>;
172 
173  void emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery,
174  const QString &icao, const QString &modelString, const QString &name,
175  const QString &description);
176  void fastTimerTimeout();
177  void slowTimerTimeout();
178 
181  void updateRemoteAircraft();
182 
185  void requestRemoteAircraftDataFromFlightgear();
186  void requestRemoteAircraftDataFromFlightgear(const swift::misc::aviation::CCallsignSet &callsigns);
187  void triggerRequestRemoteAircraftDataFromFlightgear(const swift::misc::aviation::CCallsignSet &callsigns);
189 
192  void addNextPendingAircraft();
193  void triggerAddNextPendingAircraft();
195 
197  int detectTimeoutAdding();
198 
200  void triggerRemoveAircraft(const swift::misc::aviation::CCallsign &callsign, qint64 deferMs);
201 
203  QPair<qint64, qint64> minMaxTimestampsAddInProgress() const;
204 
206  bool canAddAircraft() const;
207 
210  void onRemoteAircraftAdded(const QString &callsign);
211  void onRemoteAircraftAddingFailed(const QString &callsign);
212  void updateRemoteAircraftFromSimulator(const QStringList &callsigns, const QDoubleList &latitudesDeg,
213  const QDoubleList &longitudesDeg, const QDoubleList &elevationsMeters,
214  const QDoubleList &verticalOffsetsMeters);
216 
218  void disconnectFromDBus();
219 
220  DBusMode m_dbusMode;
222  this
223  };
224  static constexpr qint64 TimeoutAdding = 10000;
225  QDBusConnection m_dBusConnection { "default" };
226  QDBusServiceWatcher *m_watcher { nullptr };
227  CFGSwiftBusServiceProxy *m_serviceProxy { nullptr };
228  CFGSwiftBusTrafficProxy *m_trafficProxy { nullptr };
229  QTimer m_fastTimer;
230  QTimer m_slowTimer;
231  QTimer m_airportUpdater;
232  QTimer m_pendingAddedTimer;
234  this
235  };
236  swift::misc::simulation::CSimulatedAircraftList m_pendingToBeAddedAircraft;
237  QHash<swift::misc::aviation::CCallsign, qint64> m_addingInProgressAircraft;
239  CFlightgearMPAircraftObjects m_flightgearAircraftObjects;
240  FlightgearData m_flightgearData;
241 
242  // statistics
243  qint64 m_statsAddMaxTimeMs = -1;
244  qint64 m_statsAddCurrentTimeMs = -1;
245 
246  bool m_simulatorPaused = false;
247 
249  void resetFlightgearData() { m_flightgearData = {}; }
250  };
251 
254  {
255  Q_OBJECT
256 
257  public:
260 
261  protected:
263  virtual void startImpl() override;
264 
266  virtual void stopImpl() override;
267 
269  virtual void checkImpl() override;
270 
271  private:
272  void checkConnection();
273  void checkConnectionViaSessionBus();
274  void checkConnectionViaPeer(const QString &address);
275  void checkConnectionCommon();
276 
277  void serviceRegistered(const QString &serviceName);
278  void fgSwiftBusServerSettingChanged();
279 
280  QTimer m_timer { this };
281  QDBusConnection m_conn { "default" };
283  this, &CSimulatorFlightgearListener::fgSwiftBusServerSettingChanged
284  };
285  };
286 
289  {
290  Q_OBJECT
291  Q_PLUGIN_METADATA(IID "org.swift-project.swift_core.simulatorinterface" FILE "simulatorflightgear.json")
292  Q_INTERFACES(swift::core::ISimulatorFactory)
293 
294  public:
296  virtual swift::core::ISimulator *
299  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
300  swift::misc::network::IClientProvider *clientProvider) override;
301 
305  {
306  return new CSimulatorFlightgearListener(info);
307  }
308  };
309 } // namespace swift::simplugin::flightgear
310 
311 #endif // SWIFT_SIMPLUGIN_SIMULATOR_FLIGHTGEAR_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
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.
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 CSimulatorFlightgear 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.
virtual swift::misc::CStatusMessageList getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const
Interpolation messages for callsign.
virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const
Display a text message.
virtual bool physicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &newRemoteAircraft)
Add new remote aircraft physically to the simulator.
virtual bool updateOwnSimulatorCockpit(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
virtual int physicallyRemoveAllRemoteAircraft()
Remove all remote aircraft and their data via ISimulator::clearAllRemoteAircraftData.
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.
virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign)
Remove remote aircraft from simulator.
virtual bool isConnected() const
Are we connected to the simulator?
CSimulatorFlightgear(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 swift::misc::aviation::CCallsignSet physicallyRenderedAircraft() const
Physically rendered (displayed in simulator) This shall only return aircraft handled in the simulator...
virtual void resetAircraftStatistics()
Reset the statistics.
virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const
Display a status message in the simulator.
virtual QString getStatisticsSimulatorSpecific() const
Allows to print out simulator specific statistics.
virtual bool isPaused() const
Simulator paused?
virtual bool disconnectFrom()
Disconnect from simulator.
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 void clearAllRemoteAircraftData()
Clear all aircraft related data, but do not physically remove the aircraft.
virtual void unload()
Driver will be unloaded.
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.
Listener waits for fgswiftbus service to show up.
virtual void stopImpl()
Plugin specific implementation to stop listener.
CSimulatorFlightgearListener(const swift::misc::simulation::CSimulatorPluginInfo &info)
Constructor.
virtual void startImpl()
Plugin specific implementation to start listener.
virtual void checkImpl()
Plugin specific implementation to check.
Free functions in swift::misc.
double pressureAltitudeFt
Pressure altitude [inhg].
QList< double > enginesN1Percentage
N1 per engine [%].
double rollRateRadPerSec
Roll angular velocity [rad/s].
double pitchRateRadPerSec
Pitch angular velocity [rad/s].
double gearReployRatio
Gear deployment ratio [%].
int xpdrMode
Transponder mode (off=0,stdby=1-2, >2 on)
double yawRateRadPerSec
Yaw angular velocity [rad/s].
double flapsReployRatio
Flaps deployment ratio [%].