swift
contextsimulatorimpl.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_CONTEXTSIMULATOR_IMPL_H
7 #define SWIFT_CORE_CONTEXT_CONTEXTSIMULATOR_IMPL_H
8 
9 #include <QPair>
10 #include <QPointer>
11 #include <QString>
12 
13 #include "core/aircraftmatcher.h"
16 #include "core/corefacadeconfig.h"
17 #include "core/simulator.h"
18 #include "core/swiftcoreexport.h"
20 #include "misc/identifier.h"
23 #include "misc/pixmap.h"
24 #include "misc/pq/length.h"
25 #include "misc/pq/time.h"
26 #include "misc/settingscache.h"
38 #include "misc/worker.h"
39 
40 // clazy:excludeall=const-signal-or-slot
41 
42 namespace swift::misc
43 {
44  class CDBusServer;
45  namespace aviation
46  {
47  class CCallsign;
48  }
49  namespace simulation
50  {
51  class CSimulatedAircraft;
52  }
53 } // namespace swift::misc
54 
55 namespace swift::core
56 {
57  class CCoreFacade;
58  class CPluginManagerSimulator;
59 
60  namespace context
61  {
64  public IContextSimulator,
66  public swift::misc::simulation::CRemoteAircraftAware, // gain access to in memory remote aircraft data
68  {
69  Q_OBJECT
71  Q_CLASSINFO("D-Bus Interface", SWIFT_CORE_CONTEXTSIMULATOR_INTERFACENAME)
72  friend class swift::core::CCoreFacade;
73  friend class IContextSimulator;
74 
75  public slots:
77  virtual swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const override;
78 
80  virtual swift::misc::simulation::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const override;
81 
83  virtual swift::misc::simulation::settings::CSimulatorSettings getSimulatorSettings() const override;
84 
86  virtual bool setSimulatorSettings(const swift::misc::simulation::settings::CSimulatorSettings &settings,
87  const swift::misc::simulation::CSimulatorInfo &simulator) override;
88 
90  virtual bool
91  startSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) override;
92 
94  virtual void
95  stopSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) override;
96 
98  virtual int checkListeners() override;
99 
101  virtual ISimulator::SimulatorStatus getSimulatorStatus() const override;
102 
104  virtual swift::misc::simulation::CSimulatorInternals getSimulatorInternals() const override;
105 
107  virtual swift::misc::simulation::CSimulatorInfo getModelSetLoaderSimulator() const override;
108 
110  virtual void setModelSetLoaderSimulator(const swift::misc::simulation::CSimulatorInfo &simulator) override;
111 
113  virtual swift::misc::simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const override;
114 
116  virtual swift::misc::CStatusMessageList verifyPrerequisites() const override;
117 
119  virtual QStringList getModelSetStrings() const override;
120 
122  virtual QStringList getModelSetCompleterStrings(bool sorted) const override;
123 
125  virtual bool isKnownModelInSet(const QString &modelString) const override;
126 
128  virtual int removeModelsFromSet(const swift::misc::simulation::CAircraftModelList &removeModels) override;
129 
131  virtual void disableModelsForMatching(const swift::misc::simulation::CAircraftModelList &removedModels,
132  bool incremental) override;
133 
135  virtual swift::misc::simulation::CAircraftModelList getDisabledModelsForMatching() const override;
136 
138  virtual void restoreDisabledModels() override;
139 
141  virtual bool isValidationInProgress() const override;
142 
144  virtual bool triggerModelSetValidation(const swift::misc::simulation::CSimulatorInfo &simulator) override;
145 
148  getModelSetModelsStartingWith(const QString &modelString) const override;
149 
152  getInterpolationAndRenderingSetupGlobal() const override;
153 
155  virtual swift::misc::simulation::CInterpolationSetupList
156  getInterpolationAndRenderingSetupsPerCallsign() const override;
157 
160  getInterpolationAndRenderingSetupPerCallsignOrDefault(
161  const swift::misc::aviation::CCallsign &callsign) const override;
162 
164  virtual bool setInterpolationAndRenderingSetupsPerCallsign(
165  const swift::misc::simulation::CInterpolationSetupList &setups, bool ignoreSameAsGlobal) override;
166 
168  virtual void setInterpolationAndRenderingSetupGlobal(
170 
173  getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const override;
174 
176  virtual bool followAircraft(const swift::misc::aviation::CCallsign &callsign) override;
177 
179  virtual void recalculateAllAircraft() override;
180 
182  virtual bool resetToModelMatchingAircraft(const swift::misc::aviation::CCallsign &callsign) override;
183 
185  virtual bool
186  requestElevationBySituation(const swift::misc::aviation::CAircraftSituation &situation) override;
187 
190  findClosestElevationWithinRange(const swift::misc::geo::CCoordinateGeodetic &reference,
191  const swift::misc::physical_quantities::CLength &range) const override;
192 
194  virtual int doMatchingsAgain() override;
195 
197  virtual bool doMatchingAgain(const swift::misc::aviation::CCallsign &callsign) override;
198 
201  getMatchingMessages(const swift::misc::aviation::CCallsign &callsign) const override;
202 
204  virtual swift::misc::simulation::MatchingLog isMatchingMessagesEnabled() const override;
205 
207  virtual void enableMatchingMessages(swift::misc::simulation::MatchingLog enabled) override;
208 
211  getCurrentMatchingStatistics(bool missingOnly) const override;
212 
214  virtual void setMatchingSetup(const swift::misc::simulation::CAircraftMatcherSetup &setup) override;
215 
217  virtual swift::misc::simulation::CAircraftMatcherSetup getMatchingSetup() const override;
218 
220  virtual bool testRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft,
221  bool add) override;
222 
224  virtual bool testUpdateRemoteAircraft(const swift::misc::aviation::CCallsign &cs,
226  const swift::misc::aviation::CAircraftParts &parts) override;
227 
229  virtual swift::misc::simulation::CAircraftModelList getModelSet() const override;
230 
232  virtual int getModelSetCount() const override;
233 
243  virtual bool parseCommandLine(const QString &commandLine,
244  const swift::misc::CIdentifier &originator) override;
245  // ----------------------------- context interface -----------------------------
246 
247  public:
249  virtual ~CContextSimulator() override;
250 
252  void gracefulShutdown();
253 
255  QPointer<ISimulator> simulator() const;
256 
258  bool hasSimulator() const { return this->simulator(); }
259 
261  static void registerHelp()
262  {
263  if (swift::misc::CSimpleCommandParser::registered("swift::core::CContextSimulator")) { return; }
265  { ".ris", "rendering/interpolation setup (global setup)" });
267  { ".ris debug on|off", "rendering/interpolation debug messages (global setup)" });
269  { ".ris parts on|off", "aircraft parts (global setup)" });
270  }
271 
272  protected:
275 
277  bool isSimulatorPluginAvailable() const;
278 
279  private:
280  static constexpr int MatchingLogMaxModelSetSize = 250;
281  static constexpr int MaxModelAddedFailoverTrials = 3;
282 
283  // ------------ slots connected with network or other contexts ---------
284 
287  void xCtxAddedRemoteAircraftReadyForModelMatching(
288  const swift::misc::simulation::CSimulatedAircraft &remoteAircraft);
289 
292  void xCtxRemovedRemoteAircraft(const swift::misc::aviation::CCallsign &callsign);
293 
296  void xCtxChangedRemoteAircraftModel(const swift::misc::simulation::CSimulatedAircraft &aircraft,
297  const swift::misc::CIdentifier &originator);
298 
301  void xCtxChangedOwnAircraftModel(const swift::misc::simulation::CAircraftModel &aircraftModel,
302  const swift::misc::CIdentifier &originator);
303 
306  void xCtxChangedRemoteAircraftEnabled(const swift::misc::simulation::CSimulatedAircraft &aircraft);
307 
310  void xCtxNetworkConnectionStatusChanged(const swift::misc::network::CConnectionStatus &from,
312 
315  void xCtxUpdateSimulatorCockpitFromContext(const swift::misc::simulation::CSimulatedAircraft &ownAircraft,
316  const swift::misc::CIdentifier &originator);
317 
320  void xCtxUpdateSimulatorSelcalFromContext(const swift::misc::aviation::CSelcal &selcal,
321  const swift::misc::CIdentifier &originator);
322 
325  void xCtxNetworkRequestedNewAircraft(const swift::misc::aviation::CCallsign &callsign,
326  const QString &aircraftIcao, const QString &airlineIcao,
327  const QString &livery);
328 
331  void xCtxTextMessagesReceived(const swift::misc::network::CTextMessageList &textMessages);
332  // ------------ slots connected with network or other contexts ---------
333 
335  void onSimulatorStatusChanged(ISimulator::SimulatorStatus status);
336 
338  void onSimulatorStarted(const swift::misc::simulation::CSimulatorPluginInfo &info);
339 
341  void onOwnSimulatorModelChanged(const swift::misc::simulation::CAircraftModel &model);
342 
344  void onAddingRemoteAircraftFailed(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft,
345  bool disabled, bool requestFailover,
346  const swift::misc::CStatusMessage &message);
347 
349  void relayStatusMessageToSimulator(const swift::misc::CStatusMessage &message);
350 
352  void changeEnabledSimulators();
353 
355  void restoreSimulatorPlugins();
356 
358  bool loadSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorPluginInfo);
359 
361  void unloadSimulatorPlugin();
362 
364  bool listenForSimulator(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo);
365 
367  void listenForAllSimulators();
368 
370  void stopSimulatorListeners();
371 
373  void addMatchingMessages(const swift::misc::aviation::CCallsign &callsign,
374  const swift::misc::CStatusMessageList &messages);
375 
377  void clearMatchingMessages(const swift::misc::aviation::CCallsign &callsign);
378 
381  reverseLookupModel(const swift::misc::simulation::CAircraftModel &model);
382 
384  void initByLastUsedModelSet();
385 
387  void setValidator(const swift::misc::simulation::CSimulatorInfo &simulator);
388 
389  QPair<swift::misc::simulation::CSimulatorPluginInfo, QPointer<ISimulator>>
390  m_simulatorPlugin;
392  m_matchingMessages;
393  QMap<swift::misc::aviation::CCallsign, int> m_failoverAddingCounts;
394  CPluginManagerSimulator *m_plugins = nullptr;
395  swift::misc::CRegularThread m_listenersThread;
396  CAircraftMatcher m_aircraftMatcher { this };
397 
398  bool m_wasSimulating = false;
399  bool m_initallyAddAircraft = false;
400  swift::misc::simulation::MatchingLog m_logMatchingMessages = swift::misc::simulation::MatchingLogSimplified;
401 
402  QString m_networkSessionId;
404  swift::misc::simulation::CBackgroundValidation *m_validator = nullptr;
405 
406  // settings
408  this, &CContextSimulator::changeEnabledSimulators
409  };
411  this
412  };
414  this
415  };
417  this
418  };
420  m_renderSettings { this };
422  this
423  };
424  };
425  } // namespace context
426 } // namespace swift::core
427 
428 #endif // SWIFT_CORE_CONTEXT_CONTEXTSIMULATOR_IMPL_H
Matcher for all models.
ContextMode
How to handle a given context.
The class providing facades (the contexts) for all DBus relevant operations.
Definition: corefacade.h:57
Manages plugins for the simulator context.
Network simulator concrete implementation.
static void registerHelp()
Register dot commands.
bool hasSimulator() const
Simulator available?
Base class with a member CIdentifier to be inherited by a class which has an identity in the environm...
Definition: identifiable.h:24
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
Just a subclass of QThread whose destructor waits for the thread to finish.
Definition: worker.h:38
Class template for accessing a specific value in the CSettingsCache.
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 information of an aircraft's situation.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for SELCAL.
Definition: selcal.h:31
Plane of same elevation, can be a single point or larger area (e.g. airport)
Value object encapsulating information about a connection status.
Value object encapsulating a list of text messages.
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object encapsulating a list of aircraft models.
Validate model files from the sets and check if the model still exists.
Value object for interpolator and rendering per callsign.
Value object for matching statistics.
Class which can be directly used to access an.
Comprehensive information of an aircraft.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Simulator internals for flight simulators. Those are obtained from a running simulator and represent ...
Value object encapsulating a list of SimulatorInfo objects.
Value object encapsulating a list of aircraft models.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
#define SWIFT_CORE_CONTEXTSIMULATOR_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.
#define SWIFT_CORE_EXPORT
Export a class or function from the library.