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 
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  {
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;
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_pendingAddedTimer;
233  this
234  };
235  swift::misc::simulation::CSimulatedAircraftList m_pendingToBeAddedAircraft;
236  QHash<swift::misc::aviation::CCallsign, qint64> m_addingInProgressAircraft;
238  CFlightgearMPAircraftObjects m_flightgearAircraftObjects;
239  FlightgearData m_flightgearData;
240 
241  // statistics
242  qint64 m_statsAddMaxTimeMs = -1;
243  qint64 m_statsAddCurrentTimeMs = -1;
244 
245  bool m_simulatorPaused = false;
246 
248  void resetFlightgearData() { m_flightgearData = {}; }
249  };
250 
253  {
254  Q_OBJECT
255 
256  public:
259 
260  protected:
262  virtual void startImpl() override;
263 
265  virtual void stopImpl() override;
266 
268  virtual void checkImpl() override;
269 
270  private:
271  void checkConnection();
272  void checkConnectionViaSessionBus();
273  void checkConnectionViaPeer(const QString &address);
274  void checkConnectionCommon();
275 
276  void serviceRegistered(const QString &serviceName);
277  void fgSwiftBusServerSettingChanged();
278 
279  QTimer m_timer { this };
280  QDBusConnection m_conn { "default" };
282  this, &CSimulatorFlightgearListener::fgSwiftBusServerSettingChanged
283  };
284  };
285 
288  {
289  Q_OBJECT
290  Q_PLUGIN_METADATA(IID "org.swift-project.swift_core.simulatorinterface" FILE "simulatorflightgear.json")
292 
293  public:
295  virtual swift::core::ISimulator *
298  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
299  swift::misc::network::IClientProvider *clientProvider) override;
300 
304  {
305  return new CSimulatorFlightgearListener(info);
306  }
307  };
308 } // namespace swift::simplugin::flightgear
309 
310 #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.
Q_INTERFACES(...)
Q_OBJECTQ_OBJECT
QObject * parent() const const
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 [%].