swift
contextnetworkimpl.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_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H
7 #define SWIFT_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H
8 
9 #include <functional>
10 
11 #include <QList>
12 #include <QMetaObject>
13 #include <QObject>
14 #include <QQueue>
15 #include <QString>
16 #include <QtGlobal>
17 
19 #include "core/corefacadeconfig.h"
20 #include "core/swiftcoreexport.h"
28 #include "misc/digestsignal.h"
29 #include "misc/identifier.h"
32 #include "misc/network/server.h"
35 #include "misc/network/user.h"
36 #include "misc/network/userlist.h"
37 #include "misc/pq/length.h"
45 #include "misc/statusmessage.h"
46 #include "misc/weather/metar.h"
47 #include "misc/weather/metarlist.h"
48 
49 // clazy:excludeall=const-signal-or-slot
50 
51 class QTimer;
52 
53 namespace swift::misc
54 {
55  class CDBusServer;
56  namespace aviation
57  {
58  class CAircraftParts;
59  class CAircraftSituation;
60  class CCallsign;
61  } // namespace aviation
62 } // namespace swift::misc
63 
64 namespace swift::core
65 {
66  class CAirspaceMonitor;
67  class CCoreFacade;
68 
69  namespace fsd
70  {
71  class CFSDClient;
72  }
73 
74  namespace context
75  {
78  public IContextNetwork,
81  {
82  Q_OBJECT
85  Q_CLASSINFO("D-Bus Interface", SWIFT_CORE_CONTEXTNETWORK_INTERFACENAME)
86 
87  friend class IContextNetwork;
88  friend class swift::core::CCoreFacade;
89 
90  public:
92  virtual ~CContextNetwork() override;
93 
94  // remoteaircraftprovider
96  remoteAircraftSituations(const swift::misc::aviation::CCallsign &callsign) const override;
98  remoteAircraftSituation(const swift::misc::aviation::CCallsign &callsign, int index) const override;
99  virtual swift::misc::MillisecondsMinMaxMean remoteAircraftSituationsTimestampDifferenceMinMaxMean(
100  const swift::misc::aviation::CCallsign &callsign) const override;
101  virtual swift::misc::aviation::CAircraftSituationList latestRemoteAircraftSituations() const override;
102  virtual swift::misc::aviation::CAircraftSituationList latestOnGroundProviderElevations() const override;
103  virtual int remoteAircraftSituationsCount(const swift::misc::aviation::CCallsign &callsign) const override;
105  remoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override;
106  virtual int remoteAircraftPartsCount(const swift::misc::aviation::CCallsign &callsign) const override;
107  virtual swift::misc::aviation::CCallsignSet remoteAircraftSupportingParts() const override;
109  remoteAircraftSituationChanges(const swift::misc::aviation::CCallsign &callsign) const override;
110  virtual int
111  remoteAircraftSituationChangesCount(const swift::misc::aviation::CCallsign &callsign) const override;
112  virtual bool updateAircraftRendered(const swift::misc::aviation::CCallsign &callsign,
113  bool rendered) override;
114  virtual int updateMultipleAircraftRendered(const swift::misc::aviation::CCallsignSet &callsigns,
115  bool rendered) override;
116  virtual int updateMultipleAircraftEnabled(const swift::misc::aviation::CCallsignSet &callsigns,
117  bool enabled) override;
118  virtual int updateAircraftGroundElevation(const swift::misc::aviation::CCallsign &callsign,
119  const swift::misc::geo::CElevationPlane &elevation,
121  bool *setForOnGroundPosition) override;
122  virtual void updateMarkAllAsNotRendered() override;
124  getCGFromDB(const swift::misc::aviation::CCallsign &callsign) const override;
125  virtual swift::misc::physical_quantities::CLength getCGFromDB(const QString &modelString) const override;
126  virtual void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB,
127  const swift::misc::aviation::CCallsign &callsign) override;
128  virtual void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB,
129  const QString &modelString) override;
131  getLatestAirspaceAircraftSnapshot() const override;
133  averageElevationOfNonMovingAircraft(const swift::misc::aviation::CAircraftSituation &reference,
135  int minValues = 1, int sufficientValues = 2) const override;
136 
138  virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
139  QObject *receiver,
140  std::function<void(const swift::misc::aviation::CAircraftSituation &)> addedSituationSlot,
141  std::function<void(const swift::misc::aviation::CCallsign &,
143  addedPartsSlot,
144  std::function<void(const swift::misc::aviation::CCallsign &)> removedAircraftSlot,
145  std::function<void(const swift::misc::simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot)
146  override;
147 
148  // clientprovider
149  virtual void setClients(const swift::misc::network::CClientList &clients) override;
150  virtual void clearClients() override;
152  getClientOrDefaultForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
153  virtual bool hasClientInfo(const swift::misc::aviation::CCallsign &callsign) const override;
154  virtual bool addNewClient(const swift::misc::network::CClient &client) override;
155  virtual int updateOrAddClient(const swift::misc::aviation::CCallsign &callsign,
157  bool skipEqualValues = true) override;
158  virtual int removeClient(const swift::misc::aviation::CCallsign &callsign) override;
159  virtual bool
160  autoAdjustCientGndCapability(const swift::misc::aviation::CAircraftSituation &situation) override;
161  virtual bool addClientGndCapability(const swift::misc::aviation::CCallsign &callsign) override;
162  virtual bool setClientGndCapability(const swift::misc::aviation::CCallsign &callsign,
163  bool supportGndFlag) override;
164  virtual void markAsSwiftClient(const swift::misc::aviation::CCallsign &callsign) override;
165 
167  virtual QMetaObject::Connection
168  connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot) override;
169 
171  void gracefulShutdown();
172 
177  fsd::CFSDClient *fsdClient() const { return m_fsdClient; }
178 
183  CAirspaceMonitor *airspace() const { return m_airspace; }
184 
185  public slots:
186  // remoteaircraftprovider
187 
188  // emit signal when changed
190  virtual bool updateAircraftEnabled(const swift::misc::aviation::CCallsign &callsign,
191  bool enabledForRendering) override;
192 
194  virtual bool updateAircraftModel(const swift::misc::aviation::CCallsign &callsign,
196  const swift::misc::CIdentifier &originator) override;
197 
199  virtual bool updateAircraftNetworkModel(const swift::misc::aviation::CCallsign &callsign,
201  const swift::misc::CIdentifier &originator) override;
202 
204  virtual bool updateFastPositionEnabled(const swift::misc::aviation::CCallsign &callsign,
205  bool enableFastPositonUpdates) override;
206 
208  virtual bool updateAircraftSupportingGndFLag(const swift::misc::aviation::CCallsign &callsign,
209  bool supportGndFlag) override;
210 
212  virtual void enableReverseLookupMessages(swift::misc::simulation::ReverseLookupLogging enable) override;
213 
214  // plain vanilla passing to airspace monitor
216  virtual bool setAircraftEnabledFlag(const swift::misc::aviation::CCallsign &callsign,
217  bool enabledForRendering) override;
218 
220  virtual int reInitializeAllAircraft() override;
221 
223  virtual bool updateCG(const swift::misc::aviation::CCallsign &callsign,
224  const swift::misc::physical_quantities::CLength &cg) override;
225 
228  updateCGForModel(const QString &modelString, const swift::misc::physical_quantities::CLength &cg) override;
229 
231  virtual bool updateCGAndModelString(const swift::misc::aviation::CCallsign &callsign,
233  const QString &modelString) override;
234 
236  virtual swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const override;
237 
239  virtual swift::misc::aviation::CCallsignSet getAircraftInRangeCallsigns() const override;
240 
242  virtual int getAircraftInRangeCount() const override;
243 
245  virtual bool isAircraftInRange(const swift::misc::aviation::CCallsign &callsign) const override;
246 
248  virtual bool isVtolAircraft(const swift::misc::aviation::CCallsign &callsign) const override;
249 
252  getAircraftInRangeForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
253 
256  getAircraftInRangeModelForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
257 
260  getReverseLookupMessages(const swift::misc::aviation::CCallsign &callsign) const override;
261 
263  virtual swift::misc::simulation::ReverseLookupLogging isReverseLookupMessagesEnabled() const override;
264 
267  getAircraftPartsHistory(const swift::misc::aviation::CCallsign &callsign) const override;
268 
271  getRemoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override;
272 
274  virtual int getRemoteAircraftSupportingPartsCount() const override;
275 
277  virtual bool isAircraftPartsHistoryEnabled() const override;
278 
280  virtual bool
281  isRemoteAircraftSupportingParts(const swift::misc::aviation::CCallsign &callsign) const override;
282 
284  virtual void enableAircraftPartsHistory(bool enabled) override;
285 
287  virtual int aircraftSituationsAdded() const override;
288 
290  virtual int aircraftPartsAdded() const override;
291 
293  virtual qint64 situationsLastModified(const swift::misc::aviation::CCallsign &callsign) const override;
294 
296  virtual qint64 partsLastModified(const swift::misc::aviation::CCallsign &callsign) const override;
297 
299  virtual QString getNetworkStatistics(bool reset, const QString &separator) override;
300 
302  virtual bool setNetworkStatisticsEnable(bool enabled) override;
303 
305  virtual bool testAddAltitudeOffset(const swift::misc::aviation::CCallsign &callsign,
308 
310  virtual QStringList getNetworkPresetValues() const override;
311 
313  virtual swift::misc::aviation::CCallsign getPartnerCallsign() const override;
314 
316  virtual swift::misc::network::CClientList getClients() const override;
317 
320  getClientsForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override;
321 
323  virtual bool setOtherClient(const swift::misc::network::CClient &client) override;
324 
328  bool isPendingConnection() const;
329 
330  // --------------------- IContextNetwork implementations ---------------------
341  virtual bool parseCommandLine(const QString &commandLine,
342  const swift::misc::CIdentifier &originator) override;
343 
345  static void registerHelp()
346  {
347  if (swift::misc::CSimpleCommandParser::registered("swift::core::CContextNetwork")) { return; }
348  swift::misc::CSimpleCommandParser::registerCommand({ ".m", "alias: .msg, .chat" });
349  swift::misc::CSimpleCommandParser::registerCommand({ ".m message text", "send text message" });
350  swift::misc::CSimpleCommandParser::registerCommand({ ".m callsign message text", "send text message" });
352  { ".altos callsign|? offsetvalue", "set altitude offset value (testing), ?=all" });
354  { ".addtimeos offsetvalue", "add (delta) time offset (testing), e.g. 50ms" });
356  { ".watchdog on|off", "enable/disable network watchdog (testing)" });
357  swift::misc::CSimpleCommandParser::registerCommand({ ".wallop message", "send a wallop message" });
358  swift::misc::CSimpleCommandParser::registerCommand({ ".reinit", "re-initialize all aircraft" });
359  swift::misc::CSimpleCommandParser::registerCommand({ ".enable", "alias: .unignore" });
360  swift::misc::CSimpleCommandParser::registerCommand({ ".enable callsign", "enable/unignore callsign" });
361  swift::misc::CSimpleCommandParser::registerCommand({ ".disable", "alias: .ignore" });
362  swift::misc::CSimpleCommandParser::registerCommand({ ".disable callsign", "disable/ignore callsign" });
363  }
364 
367  getAtcStationsOnline(bool recalculateDistance) const override;
368 
370  virtual swift::misc::aviation::CAtcStationList getClosestAtcStationsOnline(int number) const override;
371 
374  getOnlineStationForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
375 
378  getOnlineStationsForFrequency(const swift::misc::physical_quantities::CFrequency &frequency) const override;
379 
381  virtual bool isOnlineStation(const swift::misc::aviation::CCallsign &callsign) const override;
382 
385  connectToNetwork(const swift::misc::network::CServer &server, const QString &extraLiveryString,
386  bool sendLivery, const QString &extraModelString, bool sendModelString,
387  const swift::misc::aviation::CCallsign &partnerCallsign,
388  swift::misc::network::CLoginMode mode) override;
389 
391  virtual swift::misc::network::CServer getConnectedServer() const override;
392 
394  virtual swift::misc::network::CLoginMode getLoginMode() const override;
395 
397  virtual swift::misc::CStatusMessage disconnectFromNetwork() override;
398 
400  virtual bool isConnected() const override;
401 
403  virtual void sendTextMessages(const swift::misc::network::CTextMessageList &textMessages) override;
404 
406  virtual void sendFlightPlan(const swift::misc::aviation::CFlightPlan &flightPlan) override;
407 
410  loadFlightPlanFromNetwork(const swift::misc::aviation::CCallsign &callsign) const override;
411 
414  getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &airportIcaoCode) const override;
415 
417  virtual swift::misc::network::CUserList getUsers() const override;
418 
421  getUsersForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override;
422 
425  getUserForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
426 
428  virtual swift::misc::network::CServerList getVatsimFsdServers() const override;
429 
431  virtual void requestAircraftDataUpdates() override;
432 
434  virtual void requestAtisUpdates() override;
435 
437  virtual void setFastPositionEnabledCallsigns(swift::misc::aviation::CCallsignSet &callsigns) override;
438 
440  virtual swift::misc::aviation::CCallsignSet getFastPositionEnabledCallsigns() const override;
441 
443  virtual void testCreateDummyOnlineAtcStations(int number) override;
444 
446  virtual void testAddAircraftParts(const swift::misc::aviation::CCallsign &callsign,
448  bool incremental) override;
449 
451  virtual void testReceivedAtisMessage(const swift::misc::aviation::CCallsign &callsign,
452  const swift::misc::aviation::CInformationMessage &msg) override;
453 
455  virtual void testReceivedTextMessages(const swift::misc::network::CTextMessageList &textMessages) override;
456 
458  virtual void testRequestAircraftConfig(const swift::misc::aviation::CCallsign &callsign) override;
459 
460  protected:
463 
465  void setSimulationEnvironmentProvider(swift::misc::simulation::ISimulationEnvironmentProvider *provider);
466 
467  private:
469  CAirspaceMonitor *m_airspace = nullptr;
470  fsd::CFSDClient *m_fsdClient = nullptr;
471  QTimer *m_requestAircraftDataTimer =
472  nullptr;
473  QTimer *m_requestAtisTimer = nullptr;
474  QTimer *m_staggeredMatchingTimer = nullptr;
475  int m_simulatorConnected = 0;
476  swift::misc::simulation::CSimulatorInfo m_lastConnectedSim;
477 
478  // Digest signals, only sending after some time
479  misc::CDigestSignal m_dsAtcStationsOnlineChanged { this, &IContextNetwork::changedAtcStationsOnline,
481  std::chrono::milliseconds(1000), 4 };
482  misc::CDigestSignal m_dsAircraftsInRangeChanged { this, &IContextNetwork::changedAircraftInRange,
484  std::chrono::milliseconds(1000), 4 };
485 
486  QQueue<swift::misc::simulation::CSimulatedAircraft> m_readyForModelMatching;
487 
490 
492  bool isValidPartnerCallsign(const swift::misc::aviation::CCallsign &ownCallsign,
493  const swift::misc::aviation::CCallsign &partnerCallsign);
494 
496  void updateMetars(const swift::misc::weather::CMetarList &metars);
497 
499  void onTextMessagesReceived(const swift::misc::network::CTextMessageList &messages);
500 
502  void onTextMessageSent(const swift::misc::network::CTextMessage &message);
503 
505  void onChangedAtisReceived(const swift::misc::aviation::CCallsign &callsign);
506 
508  void onFsdConnectionStatusChanged(const swift::misc::network::CConnectionStatus &from,
510 
512  void onReadyForModelMatching(const swift::misc::simulation::CSimulatedAircraft &aircraft);
513 
515  void emitReadyForMatching();
516 
518  void createRelayMessageToPartnerCallsign(const swift::misc::network::CTextMessage &textMessage,
519  const swift::misc::aviation::CCallsign &partnerCallsign,
520  swift::misc::network::CTextMessageList &relayedMessages);
521 
525  void xCtxSimulatorRenderRestrictionsChanged(
526  bool restricted, bool enabled, int maxAircraft,
527  const swift::misc::physical_quantities::CLength &maxRenderedDistance);
528 
531  void xCtxSimulatorStatusChanged(int status);
532 
534  bool canUseFsd() const;
535 
537  bool canUseAirspaceMonitor() const;
538  };
539  } // namespace context
540 } // namespace swift::core
541 
542 #endif // SWIFT_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H
Keeps track of other entities in the airspace: aircraft, ATC stations, etc. Central instance of data ...
ContextMode
How to handle a given context.
The class providing facades (the contexts) for all DBus relevant operations.
Definition: corefacade.h:57
void gracefulShutdown()
Clean up (will be connected to signal QCoreApplication::aboutToQuit)
Definition: corefacade.cpp:335
bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Parse command line in all contexts.
Definition: corefacade.cpp:184
Network context implementation.
fsd::CFSDClient * fsdClient() const
Network library.
CAirspaceMonitor * airspace() const
Airspace.
static void registerHelp()
Register help.
void changedAircraftInRange()
Aircraft list has been changed.
void changedAtcStationsOnline()
ATC station (online) list has been changed.
std::function< void(const swift::misc::network::CRawFsdMessage &)> RawFsdMessageReceivedSlot
Raw FSD message receiver functor.
void changedAtcStationsOnlineDigest()
Digest signal changedAtcStationsOnline()
void changedAircraftInRangeDigest()
Digest signal changedAircraftInRange()
FSD client Todo: Send (interim) data updates automatically Todo Check ':' in FSD messages....
Definition: fsdclient.h:86
Receive 1..n signals, collect them over time, and resend afer n milliseconds.
Definition: digestsignal.h:18
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
Specialized value object compliant map for variants, based on indexes.
static void registerCommand(const CommandHtmlHelp &command)
Register a command.
static bool registered(const QString &helpContext)
Help already registered.
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 a list of aircraft parts.
Value object encapsulating a list of aircraft parts.
Value object encapsulating information of an aircraft's situation.
GndElevationInfo
Where did we get elevation from?
Value object encapsulating information of airport ICAO data.
Value object encapsulating information about an ATC station.
Definition: atcstation.h:38
Value object for a list of ATC stations.
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 a flight plan.
Definition: flightplan.h:148
Value object encapsulating information message (ATIS, METAR, TAF)
Plane of same elevation, can be a single point or larger area (e.g. airport)
Another client software.
Definition: client.h:27
Value object encapsulating a list of voice rooms.
Definition: clientlist.h:27
Value object encapsulating information about a connection status.
Value object encapsulating information about login mode.
Definition: loginmode.h:18
Value object encapsulating information of a server.
Definition: server.h:28
Value object encapsulating a list of servers.
Definition: serverlist.h:23
Value object encapsulating information of a text message.
Definition: textmessage.h:31
Value object encapsulating a list of text messages.
Value object encapsulating information of a user.
Definition: user.h:28
Value object encapsulating a list of voice rooms.
Definition: userlist.h:26
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.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Direct thread safe in memory access to remote aircraft.
Value object encapsulating information about METAR FIXME: runway visibilities FIXME: runway wind shea...
Definition: metar.h:38
Sequence of Metars.
Definition: metarlist.h:24
#define SWIFT_CORE_CONTEXTNETWORK_INTERFACENAME
DBus interface for context.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
Free functions in swift::misc.
Milliseconds minimum/maximum/mean.
#define SWIFT_CORE_EXPORT
Export a class or function from the library.