swift
contextsimulatorproxy.cpp
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 #include <QDBusConnection>
7 #include <QLatin1String>
8 #include <QObject>
9 #include <QtGlobal>
10 
11 #include "misc/dbus.h"
12 #include "misc/dbusserver.h"
15 
16 using namespace swift::misc;
17 using namespace swift::misc::physical_quantities;
18 using namespace swift::misc::aviation;
19 using namespace swift::misc::network;
20 using namespace swift::misc::geo;
21 using namespace swift::misc::simulation;
22 using namespace swift::misc::simulation::settings;
23 
24 namespace swift::core::context
25 {
26  CContextSimulatorProxy::CContextSimulatorProxy(const QString &serviceName, QDBusConnection &connection,
28  : IContextSimulator(mode, runtime), m_dBusInterface(nullptr)
29  {
30  this->m_dBusInterface = new swift::misc::CGenericDBusInterface(
31  serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), connection, this);
32  this->relaySignals(serviceName, connection);
33  }
34 
35  void CContextSimulatorProxy::unitTestRelaySignals()
36  {
37  // connect signals, asserts when failures
38  QDBusConnection con = QDBusConnection::sessionBus();
40  Q_UNUSED(c)
41  }
42 
43  void CContextSimulatorProxy::relaySignals(const QString &serviceName, QDBusConnection &connection)
44  {
45  // the types here have to be fully qualifed
46 
47  bool s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
48  "simulatorStatusChanged", this, SIGNAL(simulatorStatusChanged(int)));
49  Q_ASSERT(s);
50  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
51  "simulatorPluginChanged", this,
53  Q_ASSERT(s);
54  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
55  "simulatorChanged", this,
57  Q_ASSERT(s);
58  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
59  "simulatorSettingsChanged", this, SIGNAL(simulatorSettingsChanged()));
60  Q_ASSERT(s);
61  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
62  "vitalityLost", this, SIGNAL(vitalityLost()));
63  Q_ASSERT(s);
64  s = connection.connect(
66  "renderRestrictionsChanged", this,
68  Q_ASSERT(s);
69  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
70  "interpolationAndRenderingSetupChanged", this,
72  Q_ASSERT(s);
73  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
74  "matchingSetupChanged", this, SIGNAL(matchingSetupChanged()));
75  Q_ASSERT(s);
76  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
77  "modelSetChanged", this,
79  Q_ASSERT(s);
80  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
81  "modelMatchingCompleted", this,
83  Q_ASSERT(s);
84  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
85  "addingRemoteModelFailed", this,
88  Q_ASSERT(s);
89  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
90  "aircraftRenderingChanged", this,
92  Q_ASSERT(s);
93  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
94  "ownAircraftModelChanged", this,
96  Q_ASSERT(s);
97  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
98  "airspaceSnapshotHandled", this, SIGNAL(airspaceSnapshotHandled()));
99  Q_ASSERT(s);
100  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
101  "driverMessages", this, SIGNAL(driverMessages(swift::misc::CStatusMessageList)));
102 
103  Q_ASSERT(s);
104  s = connection.connect(
105  serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), "validatedModelSet", this,
106  SIGNAL(
109  Q_ASSERT(s);
110  s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
111  "insufficientFrameRateDetected", this, SIGNAL(insufficientFrameRateDetected(bool)));
112  Q_ASSERT(s);
113  Q_UNUSED(s)
114  this->relayBaseClassSignals(serviceName, connection, IContextSimulator::ObjectPath(),
116  }
117 
119  {
120  return m_dBusInterface->callDBusRet<CSimulatorPluginInfoList>(QLatin1String("getAvailableSimulatorPlugins"));
121  }
122 
124  {
125  return m_dBusInterface->callDBusRet<CSimulatorSettings>(QLatin1String("getSimulatorSettings"));
126  }
127 
129  const CSimulatorInfo &simulatorInfo)
130  {
131  return m_dBusInterface->callDBusRet<bool>(QLatin1String("setSimulatorSettings"), settings, simulatorInfo);
132  }
133 
134  ISimulator::SimulatorStatus CContextSimulatorProxy::getSimulatorStatus() const
135  {
136  return m_dBusInterface->callDBusRet<ISimulator::SimulatorStatus>(QLatin1String("getSimulatorStatus"));
137  }
138 
140  {
141  return m_dBusInterface->callDBusRet<CAircraftModelList>(QLatin1String("getModelSet"));
142  }
143 
145  {
146  return m_dBusInterface->callDBusRet<CSimulatorInfo>(QLatin1String("simulatorsWithInitializedModelSet"));
147  }
148 
150  {
151  return m_dBusInterface->callDBusRet<swift::misc::CStatusMessageList>(QLatin1String("verifyPrerequisites"));
152  }
153 
155  {
156  return m_dBusInterface->callDBusRet<CSimulatorInfo>(QLatin1String("getModelSetLoaderSimulator"));
157  }
158 
160  {
161  m_dBusInterface->callDBus(QLatin1String("setModelSetLoaderSimulator"), simulator);
162  }
163 
165  {
166  return m_dBusInterface->callDBusRet<QStringList>(QLatin1String("getModelSetStrings"));
167  }
168 
170  {
171  return m_dBusInterface->callDBusRet<QStringList>(QLatin1String("getModelSetCompleterStrings"), sorted);
172  }
173 
175  {
176  return m_dBusInterface->callDBusRet<int>(QLatin1String("removeModelsFromSet"), removeModels);
177  }
178 
179  bool CContextSimulatorProxy::isKnownModelInSet(const QString &modelString) const
180  {
181  return m_dBusInterface->callDBusRet<bool>(QLatin1String("isKnownModelInSet"), modelString);
182  }
183 
185  {
186  return m_dBusInterface->callDBusRet<CAircraftModelList>(QLatin1String("getModelSetModelsStartingWith"),
187  modelString);
188  }
189 
191  {
192  return m_dBusInterface->callDBusRet<int>(QLatin1String("getModelSetCount"));
193  }
194 
196  {
197  return m_dBusInterface->callDBusRet<CSimulatorPluginInfo>(QLatin1String("getSimulatorPluginInfo"));
198  }
199 
201  {
202  return m_dBusInterface->callDBusRet<CSimulatorInternals>(QLatin1String("getSimulatorInternals"));
203  }
204 
205  void CContextSimulatorProxy::disableModelsForMatching(const CAircraftModelList &removedModels, bool incremental)
206  {
207  m_dBusInterface->callDBus(QLatin1String("disableModelsForMatching"), removedModels, incremental);
208  }
209 
211  {
212  return m_dBusInterface->callDBusRet<CAircraftModelList>(QLatin1String("getDisabledModelsForMatching"));
213  }
214 
216  {
217  return m_dBusInterface->callDBusRet<bool>(QLatin1String("triggerModelSetValidation"), simulator);
218  }
219 
221  {
222  return m_dBusInterface->callDBusRet<bool>(QLatin1String("isValidationInProgress"));
223  }
224 
226  {
227  m_dBusInterface->callDBus(QLatin1String("restoreDisabledModels"));
228  }
229 
231  {
232  return m_dBusInterface->callDBusRet<CInterpolationAndRenderingSetupGlobal>(
233  QLatin1String("getInterpolationAndRenderingSetupGlobal"));
234  }
235 
237  {
238  return m_dBusInterface->callDBusRet<CInterpolationSetupList>(
239  QLatin1String("getInterpolationAndRenderingSetupsPerCallsign"));
240  }
241 
244  {
246  QLatin1String("getInterpolationAndRenderingSetupPerCallsignOrDefault"), callsign);
247  }
248 
250  bool ignoreSameAsGlobal)
251  {
252  return m_dBusInterface->callDBusRet<bool>(QLatin1String("setInterpolationAndRenderingSetupsPerCallsign"),
253  setups, ignoreSameAsGlobal);
254  }
255 
257  {
258  return m_dBusInterface->callDBusRet<CStatusMessageList>(QLatin1String("getInterpolationMessages"), callsign);
259  }
260 
261  void
263  {
264  m_dBusInterface->callDBus(QLatin1String("setInterpolationAndRenderingSetupGlobal"), setup);
265  }
266 
268  {
269  return m_dBusInterface->callDBusRet<bool>(QLatin1String("startSimulatorPlugin"), simulatorInfo);
270  }
271 
273  {
274  m_dBusInterface->callDBus(QLatin1String("stopSimulatorPlugin"), simulatorInfo);
275  }
276 
278  {
279  return m_dBusInterface->callDBusRet<int>(QLatin1String("checkListeners"));
280  }
281 
283  {
284  return m_dBusInterface->callDBusRet<bool>(QLatin1String("followAircraft"), callsign);
285  }
286 
288  {
289  m_dBusInterface->callDBus(QLatin1String("recalculateAllAircraft"));
290  }
291 
293  {
294  return m_dBusInterface->callDBusRet<bool>(QLatin1String("resetToModelMatchingAircraft"), callsign);
295  }
296 
298  {
299  return m_dBusInterface->callDBusRet<bool>(QLatin1String("requestElevationBySituation"), situation);
300  }
301 
303  const CLength &range) const
304  {
305  return m_dBusInterface->callDBusRet<swift::misc::geo::CElevationPlane>(
306  QLatin1String("findClosestElevationWithinRange"), reference, range);
307  }
308 
311  {
312  return m_dBusInterface->callDBusRet<swift::misc::CStatusMessageList>(QLatin1String("getMatchingMessages"),
313  callsign);
314  }
315 
317  {
318  return m_dBusInterface->callDBusRet<MatchingLog>(QLatin1String("isMatchingMessagesEnabled"));
319  }
320 
322  {
323  m_dBusInterface->callDBus(QLatin1String("enableMatchingMessages"), enabled);
324  }
325 
326  bool CContextSimulatorProxy::parseCommandLine(const QString &commandLine, const CIdentifier &originator)
327  {
328  return m_dBusInterface->callDBusRet<bool>(QLatin1String("parseCommandLine"), commandLine, originator);
329  }
330 
332  {
333  return m_dBusInterface->callDBusRet<int>(QLatin1String("doMatchingsAgain"));
334  }
335 
337  {
338  return m_dBusInterface->callDBusRet<bool>(QLatin1String("doMatchingAgain"), callsign);
339  }
340 
342  {
343  return m_dBusInterface->callDBusRet<CMatchingStatistics>(QLatin1String("getCurrentMatchingStatistics"),
344  missingOnly);
345  }
346 
348  {
349  m_dBusInterface->callDBus(QLatin1String("setMatchingSetup"), setup);
350  }
351 
353  {
354  return m_dBusInterface->callDBusRet<CAircraftMatcherSetup>(QLatin1String("getMatchingSetup"));
355  }
356 
358  {
359  return m_dBusInterface->callDBusRet<bool>(QLatin1String("testRemoteAircraft"), aircraft, add);
360  }
361 
363  const CAircraftParts &parts)
364  {
365  return m_dBusInterface->callDBusRet<bool>(QLatin1String("testUpdateRemoteAircraft"), cs, situation, parts);
366  }
367 
368 } // namespace swift::core::context
ContextMode
How to handle a given context.
@ Remote
context runs in a different process.
The class providing facades (the contexts) for all DBus relevant operations.
Definition: corefacade.h:57
virtual bool setSimulatorSettings(const swift::misc::simulation::settings::CSimulatorSettings &settings, const swift::misc::simulation::CSimulatorInfo &simulatorInfo)
Set settings for give simulator.
virtual void setMatchingSetup(const swift::misc::simulation::CAircraftMatcherSetup &setup)
Set matching setup.
virtual bool followAircraft(const swift::misc::aviation::CCallsign &callsign)
Follow aircraft im simulator view.
virtual swift::misc::simulation::CSimulatorInternals getSimulatorInternals() const
Simulator setup.
virtual bool isValidationInProgress() const
Validation in progress.
virtual bool testRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft, bool add)
Test a remote aircraft.
virtual int removeModelsFromSet(const swift::misc::simulation::CAircraftModelList &removeModels)
Remove models from set.
virtual swift::misc::simulation::CMatchingStatistics getCurrentMatchingStatistics(bool missingOnly) const
Current matching statistics.
virtual bool doMatchingAgain(const swift::misc::aviation::CCallsign &callsign)
Repeat the matching callsign.
virtual bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Parse a given command line.
virtual swift::misc::simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const
Simulators which have an initialized model set.
virtual swift::misc::geo::CElevationPlane findClosestElevationWithinRange(const swift::misc::geo::CCoordinateGeodetic &reference, const swift::misc::physical_quantities::CLength &range) const
Find closest elevation (or return NULL)
virtual void setModelSetLoaderSimulator(const swift::misc::simulation::CSimulatorInfo &simulator)
Set the model set loader simulator directly.
virtual swift::misc::CStatusMessageList verifyPrerequisites() const
Verify prerequisites for simulation like an existing model set.
virtual swift::misc::simulation::MatchingLog isMatchingMessagesEnabled() const
Enabled mapping logging?
virtual bool triggerModelSetValidation(const swift::misc::simulation::CSimulatorInfo &simulator)
Trigger model set validation.
virtual bool requestElevationBySituation(const swift::misc::aviation::CAircraftSituation &situation)
Request elevation, there is no guarantee the requested elevation will be available in the provider.
virtual bool isKnownModelInSet(const QString &modelString) const
Known model?
virtual void disableModelsForMatching(const swift::misc::simulation::CAircraftModelList &removedModels, bool incremental)
Remove a model for matching.
virtual swift::misc::simulation::CSimulatorInfo getModelSetLoaderSimulator() const
Get the model set loader simulator directly.
virtual void restoreDisabledModels()
Restore the models removed with CAircraftMatcher::disableModelForMatching.
virtual swift::misc::CStatusMessageList getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const
Interpolation messages.
virtual bool resetToModelMatchingAircraft(const swift::misc::aviation::CCallsign &callsign)
Reset model by matching it again.
virtual swift::misc::simulation::CInterpolationAndRenderingSetupGlobal getInterpolationAndRenderingSetupGlobal() const
The global setup.
virtual ISimulator::SimulatorStatus getSimulatorStatus() const
Simulator combined status.
virtual int checkListeners()
Check all listeners enabled if simulator is connected.
virtual int getModelSetCount() const
Number of installed models in simulator eco system.
virtual bool setInterpolationAndRenderingSetupsPerCallsign(const swift::misc::simulation::CInterpolationSetupList &setups, bool ignoreSameAsGlobal)
Set all setups per callsign.
virtual swift::misc::simulation::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const
Return list of available simulator plugins.
virtual swift::misc::simulation::settings::CSimulatorSettings getSimulatorSettings() const
Get the current simulator settings.
virtual swift::misc::simulation::CAircraftModelList getModelSetModelsStartingWith(const QString &modelString) const
Models for model string.
virtual bool testUpdateRemoteAircraft(const swift::misc::aviation::CCallsign &cs, const swift::misc::aviation::CAircraftSituation &situation, const swift::misc::aviation::CAircraftParts &parts)
Test update remote aircraft.
virtual swift::misc::CStatusMessageList getMatchingMessages(const swift::misc::aviation::CCallsign &callsign) const
Get mapping messages.
virtual void stopSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo)
Stop listener or unload the given plugin (if currently loaded)
virtual swift::misc::simulation::CInterpolationSetupList getInterpolationAndRenderingSetupsPerCallsign() const
Get all setups per callsign.
virtual QStringList getModelSetCompleterStrings(bool sorted) const
Model set completer string.
virtual swift::misc::simulation::CInterpolationAndRenderingSetupPerCallsign getInterpolationAndRenderingSetupPerCallsignOrDefault(const swift::misc::aviation::CCallsign &callsign) const
Get the setup for callsign, if not existing the global setup.
virtual swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const
Simulator info, currently loaded plugin.
virtual bool startSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo)
Load and start specific simulator plugin.
virtual swift::misc::simulation::CAircraftMatcherSetup getMatchingSetup() const
Get matching setup.
virtual swift::misc::simulation::CAircraftModelList getDisabledModelsForMatching() const
The disabled models for matching.
virtual void recalculateAllAircraft()
Recalculate all aircraft.
virtual QStringList getModelSetStrings() const
Model strings.
virtual void setInterpolationAndRenderingSetupGlobal(const swift::misc::simulation::CInterpolationAndRenderingSetupGlobal &setup)
Set the global setup.
virtual int doMatchingsAgain()
Repeat all matchings.
virtual void enableMatchingMessages(swift::misc::simulation::MatchingLog enabled)
Enable mapping logging.
virtual swift::misc::simulation::CAircraftModelList getModelSet() const
Installed models in simulator eco system.
void relayBaseClassSignals(const QString &serviceName, QDBusConnection &connection, const QString &objectPath, const QString &interfaceName)
Relay signals from this class.
Definition: context.cpp:61
void renderRestrictionsChanged(bool restricted, bool enabled, int maxAircraft, const swift::misc::physical_quantities::CLength &maxRenderedDistance)
Render restrictions have been changed.
void validatedModelSet(const swift::misc::simulation::CSimulatorInfo &simulator, const swift::misc::simulation::CAircraftModelList &valid, const swift::misc::simulation::CAircraftModelList &invalid, bool stopped, const swift::misc::CStatusMessageList &msgs)
Validated model set.
void addingRemoteModelFailed(const swift::misc::simulation::CSimulatedAircraft &aircraft, bool disabled, bool failover, const swift::misc::CStatusMessage &message)
Adding a remote aircraft failed.
static const QString & InterfaceName()
Service name.
void vitalityLost()
A formerly vital driver is no longer vital/responding.
static const QString & ObjectPath()
Service path.
void interpolationAndRenderingSetupChanged()
Setup changed.
void ownAircraftModelChanged(const swift::misc::simulation::CAircraftModel &model)
Emitted when own aircraft model changes.
void simulatorChanged(const swift::misc::simulation::CSimulatorInfo &simulator)
Same as simulatorPluginChanged, only with simulator signature.
void modelSetChanged(const swift::misc::simulation::CSimulatorInfo &simulator)
Model set ready or changed.
void simulatorPluginChanged(const swift::misc::simulation::CSimulatorPluginInfo &info)
Simulator plugin loaded / unloaded (default info)
void modelMatchingCompleted(const swift::misc::simulation::CSimulatedAircraft &aircraft)
A single model has been matched for given aircraft.
void matchingSetupChanged()
Matching setup changed.
void driverMessages(const swift::misc::CStatusMessageList &messages)
Relevant simulator messages to be explicitly displayed.
void simulatorStatusChanged(int status)
Simulator combined status.
void insufficientFrameRateDetected(bool fatal)
Frame rate has fallen too far below the threshold to maintain consistent sim rate.
void simulatorSettingsChanged()
Simulator settings have been changed.
void airspaceSnapshotHandled()
An airspace snapshot was handled.
void aircraftRenderingChanged(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft rendering changed.
static const QString & coreServiceName()
Default service name.
Definition: dbusserver.cpp:98
Used for hand written interface based on virtual methods.
void callDBus(QLatin1String method, Args &&...args)
Call DBus, no return value.
Ret callDBusRet(QLatin1String method, Args &&...args)
Call DBus with synchronous return value.
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
Plane of same elevation, can be a single point or larger area (e.g. airport)
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.
Value object for interpolator and rendering per callsign.
Value object for matching statistics.
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.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
Free functions in swift::misc.