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  ~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  swift::misc::MillisecondsMinMaxMean remoteAircraftSituationsTimestampDifferenceMinMaxMean(
100  const swift::misc::aviation::CCallsign &callsign) const override;
101  swift::misc::aviation::CAircraftSituationList latestRemoteAircraftSituations() const override;
102  swift::misc::aviation::CAircraftSituationList latestOnGroundProviderElevations() const override;
103  int remoteAircraftSituationsCount(const swift::misc::aviation::CCallsign &callsign) const override;
105  remoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override;
106  int remoteAircraftPartsCount(const swift::misc::aviation::CCallsign &callsign) const override;
107  swift::misc::aviation::CCallsignSet remoteAircraftSupportingParts() const override;
109  remoteAircraftSituationChanges(const swift::misc::aviation::CCallsign &callsign) const override;
110  int remoteAircraftSituationChangesCount(const swift::misc::aviation::CCallsign &callsign) const override;
111  bool updateAircraftRendered(const swift::misc::aviation::CCallsign &callsign, bool rendered) override;
112  int updateMultipleAircraftRendered(const swift::misc::aviation::CCallsignSet &callsigns,
113  bool rendered) override;
114  int updateMultipleAircraftEnabled(const swift::misc::aviation::CCallsignSet &callsigns,
115  bool enabled) override;
116  int updateAircraftGroundElevation(const swift::misc::aviation::CCallsign &callsign,
117  const swift::misc::geo::CElevationPlane &elevation,
119  bool *setForOnGroundPosition) override;
120  void updateMarkAllAsNotRendered() override;
122  getCGFromDB(const swift::misc::aviation::CCallsign &callsign) const override;
123  swift::misc::physical_quantities::CLength getCGFromDB(const QString &modelString) const override;
124  void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB,
125  const swift::misc::aviation::CCallsign &callsign) override;
126  void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB,
127  const QString &modelString) override;
128  swift::misc::simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override;
130  averageElevationOfNonMovingAircraft(const swift::misc::aviation::CAircraftSituation &reference,
132  int minValues = 1, int sufficientValues = 2) const override;
133 
135  QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
136  QObject *receiver,
137  std::function<void(const swift::misc::aviation::CAircraftSituation &)> addedSituationSlot,
138  std::function<void(const swift::misc::aviation::CCallsign &,
140  addedPartsSlot,
141  std::function<void(const swift::misc::aviation::CCallsign &)> removedAircraftSlot,
142  std::function<void(const swift::misc::simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot)
143  override;
144 
145  // clientprovider
146  void setClients(const swift::misc::network::CClientList &clients) override;
147  void clearClients() override;
149  getClientOrDefaultForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
150  bool hasClientInfo(const swift::misc::aviation::CCallsign &callsign) const override;
151  bool addNewClient(const swift::misc::network::CClient &client) override;
152  int updateOrAddClient(const swift::misc::aviation::CCallsign &callsign,
154  bool skipEqualValues = true) override;
155  int removeClient(const swift::misc::aviation::CCallsign &callsign) override;
156  bool autoAdjustCientGndCapability(const swift::misc::aviation::CAircraftSituation &situation) override;
157  bool addClientGndCapability(const swift::misc::aviation::CCallsign &callsign) override;
158  bool setClientGndCapability(const swift::misc::aviation::CCallsign &callsign, bool supportGndFlag) override;
159  void markAsSwiftClient(const swift::misc::aviation::CCallsign &callsign) override;
160 
163  connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot) override;
164 
166  void gracefulShutdown();
167 
172  fsd::CFSDClient *fsdClient() const { return m_fsdClient; }
173 
178  CAirspaceMonitor *airspace() const { return m_airspace; }
179 
180  public slots:
181  // remoteaircraftprovider
182 
183  // emit signal when changed
185  bool updateAircraftEnabled(const swift::misc::aviation::CCallsign &callsign,
186  bool enabledForRendering) override;
187 
189  bool updateAircraftModel(const swift::misc::aviation::CCallsign &callsign,
191  const swift::misc::CIdentifier &originator) override;
192 
194  bool updateAircraftNetworkModel(const swift::misc::aviation::CCallsign &callsign,
196  const swift::misc::CIdentifier &originator) override;
197 
199  bool updateFastPositionEnabled(const swift::misc::aviation::CCallsign &callsign,
200  bool enableFastPositonUpdates) override;
201 
203  bool updateAircraftSupportingGndFLag(const swift::misc::aviation::CCallsign &callsign,
204  bool supportGndFlag) override;
205 
207  void enableReverseLookupMessages(swift::misc::simulation::ReverseLookupLogging enable) override;
208 
209  // plain vanilla passing to airspace monitor
211  bool setAircraftEnabledFlag(const swift::misc::aviation::CCallsign &callsign,
212  bool enabledForRendering) override;
213 
215  int reInitializeAllAircraft() override;
216 
218  bool updateCG(const swift::misc::aviation::CCallsign &callsign,
219  const swift::misc::physical_quantities::CLength &cg) override;
220 
223  updateCGForModel(const QString &modelString, const swift::misc::physical_quantities::CLength &cg) override;
224 
226  bool updateCGAndModelString(const swift::misc::aviation::CCallsign &callsign,
228  const QString &modelString) override;
229 
231  swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const override;
232 
234  swift::misc::aviation::CCallsignSet getAircraftInRangeCallsigns() const override;
235 
237  int getAircraftInRangeCount() const override;
238 
240  bool isAircraftInRange(const swift::misc::aviation::CCallsign &callsign) const override;
241 
243  bool isVtolAircraft(const swift::misc::aviation::CCallsign &callsign) const override;
244 
247  getAircraftInRangeForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
248 
251  getAircraftInRangeModelForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
252 
255  getReverseLookupMessages(const swift::misc::aviation::CCallsign &callsign) const override;
256 
258  swift::misc::simulation::ReverseLookupLogging isReverseLookupMessagesEnabled() const override;
259 
262  getAircraftPartsHistory(const swift::misc::aviation::CCallsign &callsign) const override;
263 
266  getRemoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override;
267 
269  int getRemoteAircraftSupportingPartsCount() const override;
270 
272  bool isAircraftPartsHistoryEnabled() const override;
273 
275  bool isRemoteAircraftSupportingParts(const swift::misc::aviation::CCallsign &callsign) const override;
276 
278  void enableAircraftPartsHistory(bool enabled) override;
279 
281  int aircraftSituationsAdded() const override;
282 
284  int aircraftPartsAdded() const override;
285 
287  qint64 situationsLastModified(const swift::misc::aviation::CCallsign &callsign) const override;
288 
290  qint64 partsLastModified(const swift::misc::aviation::CCallsign &callsign) const override;
291 
293  QString getNetworkStatistics(bool reset, const QString &separator) override;
294 
296  bool setNetworkStatisticsEnable(bool enabled) override;
297 
299  bool testAddAltitudeOffset(const swift::misc::aviation::CCallsign &callsign,
302 
304  QStringList getNetworkPresetValues() const override;
305 
307  swift::misc::aviation::CCallsign getPartnerCallsign() const override;
308 
310  swift::misc::network::CClientList getClients() const override;
311 
314  getClientsForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override;
315 
317  bool setOtherClient(const swift::misc::network::CClient &client) override;
318 
322  bool isPendingConnection() const;
323 
324  // --------------------- IContextNetwork implementations ---------------------
335  bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator) override;
336 
338  static void registerHelp()
339  {
340  if (swift::misc::CSimpleCommandParser::registered("swift::core::CContextNetwork")) { return; }
341  swift::misc::CSimpleCommandParser::registerCommand({ ".m", "alias: .msg, .chat" });
342  swift::misc::CSimpleCommandParser::registerCommand({ ".m message text", "send text message" });
343  swift::misc::CSimpleCommandParser::registerCommand({ ".m callsign message text", "send text message" });
345  { ".altos callsign|? offsetvalue", "set altitude offset value (testing), ?=all" });
347  { ".addtimeos offsetvalue", "add (delta) time offset (testing), e.g. 50ms" });
349  { ".watchdog on|off", "enable/disable network watchdog (testing)" });
350  swift::misc::CSimpleCommandParser::registerCommand({ ".wallop message", "send a wallop message" });
351  swift::misc::CSimpleCommandParser::registerCommand({ ".reinit", "re-initialize all aircraft" });
352  swift::misc::CSimpleCommandParser::registerCommand({ ".enable", "alias: .unignore" });
353  swift::misc::CSimpleCommandParser::registerCommand({ ".enable callsign", "enable/unignore callsign" });
354  swift::misc::CSimpleCommandParser::registerCommand({ ".disable", "alias: .ignore" });
355  swift::misc::CSimpleCommandParser::registerCommand({ ".disable callsign", "disable/ignore callsign" });
356  }
357 
359  swift::misc::aviation::CAtcStationList getAtcStationsOnline(bool recalculateDistance) const override;
360 
362  swift::misc::aviation::CAtcStationList getClosestAtcStationsOnline(int number) const override;
363 
366  getOnlineStationForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
367 
370  getOnlineStationsForFrequency(const swift::misc::physical_quantities::CFrequency &frequency) const override;
371 
373  bool isOnlineStation(const swift::misc::aviation::CCallsign &callsign) const override;
374 
376  swift::misc::CStatusMessage connectToNetwork(const swift::misc::network::CServer &server,
377  const QString &extraLiveryString, bool sendLivery,
378  const QString &extraModelString, bool sendModelString,
379  const swift::misc::aviation::CCallsign &partnerCallsign,
380  swift::misc::network::CLoginMode mode) override;
381 
383  swift::misc::network::CServer getConnectedServer() const override;
384 
386  swift::misc::network::CLoginMode getLoginMode() const override;
387 
389  swift::misc::CStatusMessage disconnectFromNetwork() override;
390 
392  bool isConnected() const override;
393 
395  void sendTextMessages(const swift::misc::network::CTextMessageList &textMessages) override;
396 
398  void sendFlightPlan(const swift::misc::aviation::CFlightPlan &flightPlan) override;
399 
402  loadFlightPlanFromNetwork(const swift::misc::aviation::CCallsign &callsign) const override;
403 
406  getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &airportIcaoCode) const override;
407 
409  swift::misc::network::CUserList getUsers() const override;
410 
413  getUsersForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override;
414 
417  getUserForCallsign(const swift::misc::aviation::CCallsign &callsign) const override;
418 
420  swift::misc::network::CServerList getVatsimFsdServers() const override;
421 
423  void requestAircraftDataUpdates() override;
424 
426  void requestAtisUpdates() override;
427 
429  void setFastPositionEnabledCallsigns(swift::misc::aviation::CCallsignSet &callsigns) override;
430 
432  swift::misc::aviation::CCallsignSet getFastPositionEnabledCallsigns() const override;
433 
435  void testCreateDummyOnlineAtcStations(int number) override;
436 
438  void testAddAircraftParts(const swift::misc::aviation::CCallsign &callsign,
439  const swift::misc::aviation::CAircraftParts &parts, bool incremental) override;
440 
442  void testReceivedAtisMessage(const swift::misc::aviation::CCallsign &callsign,
443  const swift::misc::aviation::CInformationMessage &msg) override;
444 
446  void testReceivedTextMessages(const swift::misc::network::CTextMessageList &textMessages) override;
447 
449  void testRequestAircraftConfig(const swift::misc::aviation::CCallsign &callsign) override;
450 
451  protected:
454 
456  void setSimulationEnvironmentProvider(swift::misc::simulation::ISimulationEnvironmentProvider *provider);
457 
458  private:
460  CAirspaceMonitor *m_airspace = nullptr;
461  fsd::CFSDClient *m_fsdClient = nullptr;
462  QTimer *m_requestAircraftDataTimer =
463  nullptr;
464  QTimer *m_requestAtisTimer = nullptr;
465  QTimer *m_staggeredMatchingTimer = nullptr;
466  int m_simulatorConnected = 0;
467  swift::misc::simulation::CSimulatorInfo m_lastConnectedSim;
468 
469  // Digest signals, only sending after some time
470  misc::CDigestSignal m_dsAtcStationsOnlineChanged { this, &IContextNetwork::changedAtcStationsOnline,
472  std::chrono::milliseconds(1000), 4 };
473  misc::CDigestSignal m_dsAircraftsInRangeChanged { this, &IContextNetwork::changedAircraftInRange,
475  std::chrono::milliseconds(1000), 4 };
476 
478 
481 
483  bool isValidPartnerCallsign(const swift::misc::aviation::CCallsign &ownCallsign,
484  const swift::misc::aviation::CCallsign &partnerCallsign);
485 
487  void updateMetars(const swift::misc::weather::CMetarList &metars);
488 
490  void onTextMessagesReceived(const swift::misc::network::CTextMessageList &messages);
491 
493  void onTextMessageSent(const swift::misc::network::CTextMessage &message);
494 
496  void onChangedAtisReceived(const swift::misc::aviation::CCallsign &callsign);
497 
499  void onFsdConnectionStatusChanged(const swift::misc::network::CConnectionStatus &from,
501 
503  void onReadyForModelMatching(const swift::misc::simulation::CSimulatedAircraft &aircraft);
504 
506  void emitReadyForMatching();
507 
509  void createRelayMessageToPartnerCallsign(const swift::misc::network::CTextMessage &textMessage,
510  const swift::misc::aviation::CCallsign &partnerCallsign,
511  swift::misc::network::CTextMessageList &relayedMessages);
512 
516  void xCtxSimulatorRenderRestrictionsChanged(
517  bool restricted, bool enabled, int maxAircraft,
518  const swift::misc::physical_quantities::CLength &maxRenderedDistance);
519 
522  void xCtxSimulatorStatusChanged(int status);
523 
525  bool canUseFsd() const;
526 
528  bool canUseAirspaceMonitor() const;
529  };
530  } // namespace context
531 } // namespace swift::core
532 
533 #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:329
bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Parse command line in all contexts.
Definition: corefacade.cpp:178
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:85
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.