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  swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const override;
78 
80  swift::misc::simulation::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const override;
81 
83  swift::misc::simulation::settings::CSimulatorSettings getSimulatorSettings() const override;
84 
86  bool setSimulatorSettings(const swift::misc::simulation::settings::CSimulatorSettings &settings,
87  const swift::misc::simulation::CSimulatorInfo &simulator) override;
88 
90  bool startSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) override;
91 
93  void stopSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) override;
94 
96  int checkListeners() override;
97 
99  ISimulator::SimulatorStatus getSimulatorStatus() const override;
100 
102  swift::misc::simulation::CSimulatorInternals getSimulatorInternals() const override;
103 
105  swift::misc::simulation::CSimulatorInfo getModelSetLoaderSimulator() const override;
106 
108  void setModelSetLoaderSimulator(const swift::misc::simulation::CSimulatorInfo &simulator) override;
109 
111  swift::misc::simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const override;
112 
114  swift::misc::CStatusMessageList verifyPrerequisites() const override;
115 
117  QStringList getModelSetStrings() const override;
118 
120  QStringList getModelSetCompleterStrings(bool sorted) const override;
121 
123  bool isKnownModelInSet(const QString &modelString) const override;
124 
126  int removeModelsFromSet(const swift::misc::simulation::CAircraftModelList &removeModels) override;
127 
129  void disableModelsForMatching(const swift::misc::simulation::CAircraftModelList &removedModels,
130  bool incremental) override;
131 
133  swift::misc::simulation::CAircraftModelList getDisabledModelsForMatching() const override;
134 
136  void restoreDisabledModels() override;
137 
139  bool isValidationInProgress() const override;
140 
142  bool triggerModelSetValidation(const swift::misc::simulation::CSimulatorInfo &simulator) override;
143 
146  getModelSetModelsStartingWith(const QString &modelString) const override;
147 
150  getInterpolationAndRenderingSetupGlobal() const override;
151 
153  swift::misc::simulation::CInterpolationSetupList
154  getInterpolationAndRenderingSetupsPerCallsign() const override;
155 
158  getInterpolationAndRenderingSetupPerCallsignOrDefault(
159  const swift::misc::aviation::CCallsign &callsign) const override;
160 
162  bool setInterpolationAndRenderingSetupsPerCallsign(
163  const swift::misc::simulation::CInterpolationSetupList &setups, bool ignoreSameAsGlobal) override;
164 
166  void setInterpolationAndRenderingSetupGlobal(
168 
171  getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const override;
172 
174  bool followAircraft(const swift::misc::aviation::CCallsign &callsign) override;
175 
177  void recalculateAllAircraft() override;
178 
180  bool resetToModelMatchingAircraft(const swift::misc::aviation::CCallsign &callsign) override;
181 
183  bool requestElevationBySituation(const swift::misc::aviation::CAircraftSituation &situation) override;
184 
187  findClosestElevationWithinRange(const swift::misc::geo::CCoordinateGeodetic &reference,
188  const swift::misc::physical_quantities::CLength &range) const override;
189 
191  int doMatchingsAgain() override;
192 
194  bool doMatchingAgain(const swift::misc::aviation::CCallsign &callsign) override;
195 
198  getMatchingMessages(const swift::misc::aviation::CCallsign &callsign) const override;
199 
201  swift::misc::simulation::MatchingLog isMatchingMessagesEnabled() const override;
202 
204  void enableMatchingMessages(swift::misc::simulation::MatchingLog enabled) override;
205 
207  swift::misc::simulation::CMatchingStatistics getCurrentMatchingStatistics(bool missingOnly) const override;
208 
210  void setMatchingSetup(const swift::misc::simulation::CAircraftMatcherSetup &setup) override;
211 
213  swift::misc::simulation::CAircraftMatcherSetup getMatchingSetup() const override;
214 
216  bool testRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft, bool add) override;
217 
219  bool testUpdateRemoteAircraft(const swift::misc::aviation::CCallsign &cs,
221  const swift::misc::aviation::CAircraftParts &parts) override;
222 
224  swift::misc::simulation::CAircraftModelList getModelSet() const override;
225 
227  int getModelSetCount() const override;
228 
238  bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator) override;
239  // ----------------------------- context interface -----------------------------
240 
241  public:
243  ~CContextSimulator() override;
244 
246  void gracefulShutdown();
247 
249  QPointer<ISimulator> simulator() const;
250 
252  bool hasSimulator() const { return this->simulator(); }
253 
255  static void registerHelp()
256  {
257  if (swift::misc::CSimpleCommandParser::registered("swift::core::CContextSimulator")) { return; }
259  { ".ris", "rendering/interpolation setup (global setup)" });
261  { ".ris debug on|off", "rendering/interpolation debug messages (global setup)" });
263  { ".ris parts on|off", "aircraft parts (global setup)" });
264  }
265 
266  protected:
269 
271  bool isSimulatorPluginAvailable() const;
272 
273  private:
274  static constexpr int MatchingLogMaxModelSetSize = 250;
275  static constexpr int MaxModelAddedFailoverTrials = 3;
276 
277  // ------------ slots connected with network or other contexts ---------
278 
281  void xCtxAddedRemoteAircraftReadyForModelMatching(
282  const swift::misc::simulation::CSimulatedAircraft &remoteAircraft);
283 
286  void xCtxRemovedRemoteAircraft(const swift::misc::aviation::CCallsign &callsign);
287 
290  void xCtxChangedRemoteAircraftModel(const swift::misc::simulation::CSimulatedAircraft &aircraft,
291  const swift::misc::CIdentifier &originator);
292 
295  void xCtxChangedOwnAircraftModel(const swift::misc::simulation::CAircraftModel &aircraftModel,
296  const swift::misc::CIdentifier &originator);
297 
300  void xCtxChangedRemoteAircraftEnabled(const swift::misc::simulation::CSimulatedAircraft &aircraft);
301 
304  void xCtxNetworkConnectionStatusChanged(const swift::misc::network::CConnectionStatus &from,
306 
309  void xCtxUpdateSimulatorCockpitFromContext(const swift::misc::simulation::CSimulatedAircraft &ownAircraft,
310  const swift::misc::CIdentifier &originator);
311 
314  void xCtxUpdateSimulatorSelcalFromContext(const swift::misc::aviation::CSelcal &selcal,
315  const swift::misc::CIdentifier &originator);
316 
319  void xCtxNetworkRequestedNewAircraft(const swift::misc::aviation::CCallsign &callsign,
320  const QString &aircraftIcao, const QString &airlineIcao,
321  const QString &livery);
322 
325  void xCtxTextMessagesReceived(const swift::misc::network::CTextMessageList &textMessages);
326  // ------------ slots connected with network or other contexts ---------
327 
329  void onSimulatorStatusChanged(ISimulator::SimulatorStatus status);
330 
332  void onSimulatorStarted(const swift::misc::simulation::CSimulatorPluginInfo &info);
333 
335  void onOwnSimulatorModelChanged(const swift::misc::simulation::CAircraftModel &model);
336 
338  void onAddingRemoteAircraftFailed(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft,
339  bool disabled, bool requestFailover,
340  const swift::misc::CStatusMessage &message);
341 
343  void relayStatusMessageToSimulator(const swift::misc::CStatusMessage &message);
344 
346  void changeEnabledSimulators();
347 
349  void restoreSimulatorPlugins();
350 
352  bool loadSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorPluginInfo);
353 
355  void unloadSimulatorPlugin();
356 
358  bool listenForSimulator(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo);
359 
361  void listenForAllSimulators();
362 
364  void stopSimulatorListeners();
365 
367  void addMatchingMessages(const swift::misc::aviation::CCallsign &callsign,
368  const swift::misc::CStatusMessageList &messages);
369 
371  void clearMatchingMessages(const swift::misc::aviation::CCallsign &callsign);
372 
375  reverseLookupModel(const swift::misc::simulation::CAircraftModel &model);
376 
378  void initByLastUsedModelSet();
379 
381  void setValidator(const swift::misc::simulation::CSimulatorInfo &simulator);
382 
383  QPair<swift::misc::simulation::CSimulatorPluginInfo, QPointer<ISimulator>>
384  m_simulatorPlugin;
386  m_matchingMessages;
387  QMap<swift::misc::aviation::CCallsign, int> m_failoverAddingCounts;
388  CPluginManagerSimulator *m_plugins = nullptr;
389  swift::misc::CRegularThread m_listenersThread;
390  CAircraftMatcher m_aircraftMatcher { this };
391 
392  bool m_wasSimulating = false;
393  bool m_initallyAddAircraft = false;
394  swift::misc::simulation::MatchingLog m_logMatchingMessages = swift::misc::simulation::MatchingLogSimplified;
395 
396  QString m_networkSessionId;
398  swift::misc::simulation::CBackgroundValidation *m_validator = nullptr;
399 
400  // settings
402  this, &CContextSimulator::changeEnabledSimulators
403  };
405  this
406  };
408  this
409  };
411  this
412  };
414  m_renderSettings { this };
416  this
417  };
418  };
419  } // namespace context
420 } // namespace swift::core
421 
422 #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.