swift
simulatoremulated.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "simulatoremulated.h"
5 
6 #include <QApplication>
7 #include <QPointer>
8 #include <QTimer>
9 
11 #include "gui/guiapplication.h"
12 #include "misc/aviation/altitude.h"
13 #include "misc/math/mathutils.h"
15 
16 using namespace swift::gui;
17 using namespace swift::misc;
18 using namespace swift::misc::aviation;
19 using namespace swift::misc::physical_quantities;
20 using namespace swift::misc::geo;
21 using namespace swift::misc::network;
22 using namespace swift::misc::math;
23 using namespace swift::misc::simulation;
24 using namespace swift::misc::simulation::settings;
25 using namespace swift::core;
26 using namespace swift::core::context;
27 
28 namespace swift::simplugin::emulated
29 {
30  CSimulatorEmulated::CSimulatorEmulated(const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider,
31  IRemoteAircraftProvider *remoteAircraftProvider,
32  IClientProvider *clientProvider, QObject *parent)
33  : CSimulatorPluginCommon(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, parent)
34  {
35  Q_ASSERT_X(sApp && sApp->getIContextSimulator(), Q_FUNC_INFO, "Need context");
36 
38  this->onSettingsChanged(); // init from settings
39 
40  m_myAircraft = this->getOwnAircraft(); // sync with provider
41  m_monitorWidget = new CSimulatorEmulatedMonitorDialog(this, sGui->mainApplicationWidget());
42 
43  connect(qApp, &QApplication::aboutToQuit, this, &CSimulatorEmulated::closeMonitor);
44  connect(sGui, &CGuiApplication::aboutToShutdown, this, &CSimulatorEmulated::closeMonitor, Qt::QueuedConnection);
45  connect(&m_interpolatorFetchTimer, &QTimer::timeout, this, &CSimulatorEmulated::updateRemoteAircraft);
46 
47  // connect own signals for monitoring
48  this->connectOwnSignals();
49  }
50 
52  {
53  if (m_monitorWidget)
54  {
55  // if the widget still exists, close and delete it
56  m_monitorWidget->close();
57  m_monitorWidget->deleteLater();
58  m_monitorWidget.clear();
59  }
60  }
61 
63  {
64  const QPointer<CSimulatorEmulated> myself(this);
65  QTimer::singleShot(1000, this, [=] {
66  if (myself.isNull() || !sGui || sGui->isShuttingDown()) { return; }
67  this->emitSimulatorCombinedStatus();
68  m_monitorWidget->show();
69  CGuiApplication::modalWindowToFront();
70  });
71 
72  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
73  return true;
74  }
75 
77  {
78  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
79  m_renderedAircraft.clear();
80  return CSimulatorPluginCommon::disconnectFrom();
81  }
82 
84  {
85  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
86  CSimulatorPluginCommon::unload();
87  }
88 
90  {
91  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, remoteAircraft.toQString()); }
92  return ISimulator::logicallyAddRemoteAircraft(remoteAircraft);
93  }
94 
96  {
97  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, callsign.toQString()); }
98  return ISimulator::logicallyRemoveRemoteAircraft(callsign);
99  }
100 
102  {
103  if (canLog()) m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, callsigns.toQString());
104  return ISimulator::physicallyRemoveMultipleRemoteAircraft(callsigns);
105  }
106 
108  {
109  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, aircraft.toQString()); }
110  return ISimulator::changeRemoteAircraftEnabled(aircraft);
111  }
112 
114  {
115  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, aircraft.toQString()); }
116  return ISimulator::changeRemoteAircraftEnabled(aircraft);
117  }
118 
120  const CIdentifier &originator)
121  {
122  if (canLog())
123  {
124  m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, aircraft.toQString(), originator.toQString());
125  }
126  if (originator == identifier()) { return false; } // myself
127 
128  CSimulatedAircraft a = aircraft;
129 
130  // only use the frequencies, not active transmit/receive
131  CComSystem com1 = m_myAircraft.getCom1System();
132  CComSystem com2 = m_myAircraft.getCom2System();
137  a.setCom1System(com1);
138  a.setCom2System(com2);
139 
140  m_myAircraft.setCockpit(a);
141  emit this->internalAircraftChanged();
142  return true;
143  }
144 
145  bool CSimulatorEmulated::updateOwnSimulatorSelcal(const CSelcal &selcal, const CIdentifier &originator)
146  {
147  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, selcal.toQString(), originator.toQString()); }
148  if (originator == identifier()) { return false; } // myself
149  if (m_myAircraft.getSelcal() == selcal) { return false; }
150  m_myAircraft.setSelcal(selcal);
151  emit this->internalAircraftChanged();
152  return true;
153  }
154 
156  {
157  if (!canDisplay()) { return; }
158  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, message.toQString()); }
159  m_monitorWidget->displayStatusMessage(message);
160  }
161 
163  {
164  if (!canDisplay()) { return; }
165  if (canLog()) m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, message.toQString());
166  m_monitorWidget->displayTextMessage(message);
167  }
168 
170  {
171  if (canLog()) m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, callsign.toQString());
172  return m_renderedAircraft.containsCallsign(callsign);
173  }
174 
176  {
177  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
178  return m_renderedAircraft.getCallsigns();
179  }
180 
182  {
183  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
184  if (!m_interpolators.contains(callsign)) { return CStatusMessageList(); }
186  this->getInterpolationSetupPerCallsignOrDefault(callsign); // threadsafe copy
187  return m_interpolators[callsign]->getInterpolationMessages(setup.getInterpolatorMode());
188  }
189 
191  const CAircraftParts &parts)
192  {
193  if (!m_renderedAircraft.containsCallsign(callsign)) { return false; }
194  m_renderedAircraft.setAircraftSituation(callsign, situation);
195  m_renderedAircraft.setAircraftPartsSynchronized(callsign, parts);
196  return true;
197  }
198 
200  {
201  const bool hasRequested = CSimulatorPluginCommon::requestElevation(reference, callsign);
202  if (hasRequested || !m_enablePseudoElevation) { return hasRequested; }
203 
204  // For TESTING purposes ONLY
205  // we could not request elevation, so we provide a random value or set value
206  CElevationPlane elv(reference, CElevationPlane::singlePointRadius());
208  {
209  const double elvRnd = CMathUtils::randomDouble(1000);
210  const CAltitude alt(elvRnd, CLengthUnit::ft());
211  elv.setGeodeticHeight(alt);
212  }
213  else { elv.setGeodeticHeight(m_pseudoElevation); }
214 
215  QPointer<CSimulatorEmulated> myself(this);
216  QTimer::singleShot(444, this, [=] {
217  if (!myself) { return; }
218 
219  // updates in providers and emits signal
220  ISimulator::callbackReceivedRequestedElevation(elv, callsign, false);
221  });
222 
223  emit this->requestedElevation(callsign);
224  return true;
225  }
226 
227  bool CSimulatorEmulated::parseCommandLine(const QString &commandLine, const CIdentifier &originator)
228  {
229  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, commandLine, originator.toQString()); }
230  return CSimulatorPluginCommon::parseCommandLine(commandLine, originator);
231  }
232 
234  {
235  if (CSimpleCommandParser::registered("swift::simplugin::emulated::CSimulatorEmulated")) { return; }
236  CSimpleCommandParser::registerCommand({ ".drv", "alias: .driver .plugin" });
237  CSimpleCommandParser::registerCommand({ ".drv show", "show emulated driver window" });
238  CSimpleCommandParser::registerCommand({ ".drv hide", "hide emulated driver window" });
239  }
240 
241  void CSimulatorEmulated::setCombinedStatus(bool connected, bool simulating, bool paused)
242  {
243  m_connected = connected;
244  m_simulating = simulating;
245  m_paused = paused;
247  }
248 
250  {
251  return m_pluginSettings.get().getEmulatedSimulator();
252  }
253 
255  {
256  bool changed = false;
257  if (aircraft.getCom1System() != m_myAircraft.getCom1System()) { changed = true; }
258  if (aircraft.getCom2System() != m_myAircraft.getCom2System()) { changed = true; }
259  if (aircraft.getTransponder() != m_myAircraft.getTransponder()) { changed = true; }
260  if (aircraft.getSelcal() != m_myAircraft.getSelcal()) { changed = true; }
261 
262  if (!changed) { return false; }
263  m_myAircraft.setCockpit(aircraft);
264  return this->updateCockpit(aircraft, this->identifier());
265  }
266 
268  {
269  if (m_myAircraft.getComSystem(unit) == comSystem) { return false; }
270  m_myAircraft.setComSystem(comSystem, unit);
271  const bool c = this->updateCockpit(m_myAircraft, this->identifier());
272  if (c) { emit this->internalAircraftChanged(); }
273  return c;
274  }
275 
277  {
278  if (m_myAircraft.getSelcal() == selcal) { return false; }
279  m_myAircraft.setSelcal(selcal);
280  return this->updateSelcal(selcal, identifier());
281  }
282 
284  {
285  if (m_myAircraft.getSituation() == situation) { return false; }
286  m_myAircraft.setSituation(situation);
287 
288  return this->updateOwnSituationAndGroundElevation(situation);
289  }
290 
292  {
293  if (m_myAircraft.getParts() == parts) { return false; }
294  m_myAircraft.setParts(parts);
295  return this->updateOwnParts(parts);
296  }
297 
299  {
300  if (timeMs < 1) { m_interpolatorFetchTimer.stop(); }
301  else { m_interpolatorFetchTimer.start(timeMs); }
302  return m_interpolatorFetchTimer.isActive();
303  }
304 
305  bool CSimulatorEmulated::isInterpolatorFetching() const { return m_interpolatorFetchTimer.isActive(); }
306 
308  {
309  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
310  return m_connected;
311  }
312 
314  {
315  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
316  return m_paused;
317  }
318 
320  {
321  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
322  return m_simulating;
323  }
324 
326  {
327  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, remoteAircraft.toQString()); }
328  CSimulatedAircraft aircraft(remoteAircraft);
329  aircraft.setRendered(true);
330  const CCallsign cs = aircraft.getCallsign();
331  m_interpolators.insert(
333 
334  this->logAddingAircraftModel(aircraft);
335  m_renderedAircraft.push_back(aircraft); // my simulator list
336  this->updateAircraftRendered(cs, true); // in provider
337  emit this->aircraftRenderingChanged(aircraft);
338 
339  // debugging/logging (just here for debugging purposes)
340  const CAircraftModel networkModel = remoteAircraft.getNetworkModel();
341  const CAircraftModel currentModel = remoteAircraft.getModel();
342  Q_UNUSED(networkModel)
343  Q_UNUSED(currentModel)
344 
345  return true;
346  }
347 
349  {
350  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, callsign.toQString()); }
351  m_interpolators.remove(callsign);
352  const int c = m_renderedAircraft.removeByCallsign(callsign);
353  this->updateAircraftRendered(callsign, false); // in provider
354  CSimulatorPluginCommon::physicallyRemoveRemoteAircraft(callsign);
355  return c > 0;
356  }
357 
359  {
360  if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO); }
361  return ISimulator::physicallyRemoveAllRemoteAircraft();
362  }
363 
365  {
366  if (m_monitorWidget && parser.isKnownCommand())
367  {
368  if (parser.matchesPart(1, "show"))
369  {
370  m_monitorWidget->show();
371  return true;
372  }
373  if (parser.matchesPart(1, "hide"))
374  {
375  m_monitorWidget->hide();
376  return true;
377  }
378  }
379  return CSimulatorPluginCommon::parseDetails(parser);
380  }
381 
382  void CSimulatorEmulated::setObjectName(const CSimulatorInfo &info)
383  {
384  QObject::setObjectName("Emulated driver for " + info.toQString());
385  m_interpolatorFetchTimer.setObjectName(this->objectName() + ":interpolatorFetchTimer");
386  }
387 
388  bool CSimulatorEmulated::canLog() const { return this->canDisplay() && m_log; }
389 
390  bool CSimulatorEmulated::canDisplay() const { return sApp && !sApp->isShuttingDown() && m_monitorWidget; }
391 
392  void CSimulatorEmulated::closeMonitor()
393  {
394  if (m_monitorWidget) { m_monitorWidget->close(); }
395  }
396 
397  void CSimulatorEmulated::onSettingsChanged()
398  {
399  if (!sApp || sApp->isShuttingDown()) { return; }
400  const CSwiftPluginSettings settings(m_pluginSettings.get());
401  m_log = settings.isLoggingFunctionCalls();
402 
403  CSimulatorInfo simulator = settings.getEmulatedSimulator();
404  if (!simulator.isSingleSimulator())
405  {
406  // this will always be the same
407  simulator = CSimulatorInfo::guessDefaultSimulator();
408  }
409  Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "need single simulator");
410 
412  const CSimulatorPluginInfo plugin = plugins.findBySimulator(simulator);
413 
414  if (plugin.isValid())
415  {
416  // ? restart driver, disconnect/reconnect
417  this->setNewPluginInfo(plugin, m_multiSettings.getSettings(simulator), settings.getDefaultModel());
418  }
419  else
420  {
421  // not all drivers are installed, like FS9/FSX on x64
422  CLogMessage(this).validationError(u"No valid plugin in emulated driver for '%1'") << simulator.toQString();
423  const QString sn = simulator.toQString(true);
424  const CSimulatorPluginInfo fakedPlugin =
425  CSimulatorPluginInfo(CSimulatorPluginInfo::identifierFromSimulatorInfo(simulator), sn, sn,
426  QStringLiteral("Emulated, but uninstalled '%1'").arg(sn), false);
427  this->setNewPluginInfo(fakedPlugin, m_multiSettings.getSettings(simulator), settings.getDefaultModel());
428  }
429 
430  // update provider, own name, title
431  this->updateOwnModel(settings.getOwnModel());
432  this->setObjectName(simulator);
433  m_interpolationLogger.setObjectName("Logger (emulated driver): " + simulator.toQString());
434 
435  if (m_monitorWidget) { m_monitorWidget->updateWindowTitleAndUiValues(simulator); }
436  }
437 
438  void CSimulatorEmulated::connectOwnSignals()
439  {
441  m_connectionGuard.append(connect(
442  this, &ISimulator::simulatorStatusChanged, this,
443  [=](SimulatorStatus status) {
444  if (!m_monitorWidget) return;
445  m_monitorWidget->appendSendingCall("simulatorStatusChanged",
447  },
448  Qt::QueuedConnection));
449 
450  m_connectionGuard.append(connect(
451  this, &ISimulator::ownAircraftModelChanged, this,
452  [=](const CAircraftModel &model) {
453  if (!m_monitorWidget) return;
454  m_monitorWidget->appendSendingCall("ownAircraftModelChanged", model.toQString());
455  },
456  Qt::QueuedConnection));
457 
458  m_connectionGuard.append(connect(
459  this, &ISimulator::renderRestrictionsChanged, this,
460  [=](bool restricted, bool enabled, int maxAircraft, const CLength &maxRenderedDistance) {
461  if (!m_monitorWidget) return;
462  static const QString params("restricted: %1 enabled: %2 max aircraft: %3");
463  m_monitorWidget->appendSendingCall(
464  "renderRestrictionsChanged",
465  params.arg(boolToYesNo(restricted), boolToYesNo(enabled)).arg(maxAircraft),
466  maxRenderedDistance.valueRoundedWithUnit(CLengthUnit::m(), 1));
467  },
468  Qt::QueuedConnection));
469 
470  m_connectionGuard.append(connect(
471  this, &ISimulator::interpolationAndRenderingSetupChanged, this,
472  [=]() {
473  if (!m_monitorWidget) return;
474  m_monitorWidget->appendSendingCall("interpolationAndRenderingSetupChanged");
475  },
476  Qt::QueuedConnection));
477 
478  m_connectionGuard.append(connect(
479  this, &ISimulator::aircraftRenderingChanged, this,
480  [=](const CSimulatedAircraft &aircraft) {
481  if (!m_monitorWidget) return;
482  m_monitorWidget->appendSendingCall("aircraftRenderingChanged", aircraft.toQString());
483  },
484  Qt::QueuedConnection));
485 
486  m_connectionGuard.append(connect(
487  this, &ISimulator::physicallyAddingRemoteModelFailed, this,
488  [=](const CSimulatedAircraft &aircraft) {
489  if (!m_monitorWidget) return;
490  m_monitorWidget->appendSendingCall("physicallyAddingRemoteModelFailed", aircraft.toQString());
491  },
492  Qt::QueuedConnection));
493 
494  m_connectionGuard.append(connect(
495  this, &ISimulator::airspaceSnapshotHandled, this,
496  [=] {
497  if (!m_monitorWidget) return;
498  m_monitorWidget->appendSendingCall("airspaceSnapshotHandled");
499  },
500  Qt::QueuedConnection));
501  }
502 
503  void CSimulatorEmulated::updateRemoteAircraft()
504  {
505  const qint64 now = QDateTime::currentMSecsSinceEpoch();
506  const bool updateAllAircraft = this->isUpdateAllRemoteAircraft(now);
507  uint32_t aircraftNumber = 0;
508 
509  for (const CSimulatedAircraft &aircraft : m_renderedAircraft)
510  {
511  const CCallsign callsign = aircraft.getCallsign();
512  if (!m_interpolators.contains(callsign)) { continue; }
514  this->getInterpolationSetupConsolidated(callsign, updateAllAircraft);
515  CInterpolatorMulti *im = m_interpolators[callsign];
516  Q_ASSERT_X(im, Q_FUNC_INFO, "interpolator missing");
517  const CInterpolationResult result = im->getInterpolation(now, setup, aircraftNumber++);
518  const CAircraftSituation s = result;
519  const CAircraftParts p = result;
520  m_countInterpolatedParts++;
521  m_countInterpolatedSituations++;
522  Q_UNUSED(s)
523  Q_UNUSED(p)
524  }
525 
527  }
528 
530  {}
531 
533  {
534  if (this->isShuttingDown()) { return; }
535  const QPointer<CSimulatorEmulatedListener> myself(this);
536  QTimer::singleShot(2000, this, [=] {
537  if (!myself) { return; }
538  Q_ASSERT_X(this->getPluginInfo().isValid(), Q_FUNC_INFO, "Invalid plugin");
539  emit this->simulatorStarted(this->getPluginInfo());
540  });
541  }
542 
544 
546 } // namespace swift::simplugin::emulated
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
bool isShuttingDown() const
Is application shutting down?
const context::IContextSimulator * getIContextSimulator() const
Direct access to contexts if a CCoreFacade has been initialized.
static QString statusToString(SimulatorStatus status)
Status to string.
Definition: simulator.cpp:540
swift::misc::simulation::settings::CMultiSimulatorSettings m_multiSettings
simulator settings for all simulators
Definition: simulator.h:597
swift::misc::aviation::CAltitude m_pseudoElevation
pseudo elevation for testing purposes
Definition: simulator.h:575
bool updateOwnSituationAndGroundElevation(const swift::misc::aviation::CAircraftSituation &situation)
Update own aircraft position and if suitable use it to update ground elevation.
Definition: simulator.cpp:1057
bool isUpdateAllRemoteAircraft(qint64 currentTimestamp=-1) const
Do update all remote aircraft?
Definition: simulator.cpp:212
void requestedElevation(const swift::misc::aviation::CCallsign &callsign)
Requested elevation, call pending.
void finishUpdateRemoteAircraftAndSetStatistics(qint64 startTime, bool limited=false)
Update stats and flags.
Definition: simulator.cpp:1029
void emitSimulatorCombinedStatus(SimulatorStatus oldStatus=Unspecified)
Emit the combined status.
Definition: simulator.cpp:812
void logAddingAircraftModel(const swift::misc::simulation::CSimulatedAircraft &aircraft) const
Unified qeeing aircraft message.
Definition: simulator.cpp:1132
swift::misc::simulation::CInterpolationAndRenderingSetupPerCallsign getInterpolationSetupConsolidated(const swift::misc::aviation::CCallsign &callsign, bool forceFullUpdate) const
Consolidate setup with other data like from swift::misc::simulation::IRemoteAircraftProvider.
Definition: simulator.cpp:237
swift::misc::simulation::CInterpolationLogger m_interpolationLogger
log.interpolation
Definition: simulator.h:579
void aircraftRenderingChanged(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft rendering changed.
bool m_enablePseudoElevation
return faked elevations (testing)
Definition: simulator.h:557
Interface to a simulator listener.
Definition: simulator.h:630
const swift::misc::simulation::CSimulatorPluginInfo & getPluginInfo() const
Corresponding info.
Definition: simulator.h:638
void simulatorStarted(const swift::misc::simulation::CSimulatorPluginInfo &info)
Emitted when the listener discovers the simulator running.
virtual bool isShuttingDown() const
Overall (swift) application shutting down.
Definition: simulator.cpp:1256
virtual swift::misc::simulation::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const =0
Return list of available simulator plugins.
static QWidget * mainApplicationWidget()
Main application window widget.
T get() const
Get a copy of the current value.
Definition: valuecache.h:408
bool append(const QMetaObject::Connection &connection)
Add connection.
const CIdentifier & identifier() const
Get identifier.
Definition: identifiable.h:27
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
Class for emitting a log message.
Definition: logmessage.h:27
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
void clear()
Removes all elements in the sequence.
Definition: sequence.h:288
Utility methods for simple line parsing used with the command line.
bool matchesPart(int index, const QString &toMatch, Qt::CaseSensitivity cs=Qt::CaseInsensitive) const
Matches given part.
bool isKnownCommand() const
Known command?
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.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for a set of callsigns.
Definition: callsignset.h:26
COM system (aka "radio")
Definition: comsystem.h:37
void setFrequencyStandby(const physical_quantities::CFrequency &frequency)
Set active frequency.
Definition: comsystem.cpp:45
void setFrequencyActive(const physical_quantities::CFrequency &frequency)
Set active frequency.
Definition: comsystem.cpp:37
swift::misc::physical_quantities::CFrequency getFrequencyStandby() const
Standby frequency.
Definition: modulator.cpp:36
swift::misc::physical_quantities::CFrequency getFrequencyActive() const
Active frequency.
Definition: modulator.cpp:30
Value object for SELCAL.
Definition: selcal.h:31
int removeByCallsign(const CCallsign &callsign)
Remove all objects with callsign.
swift::misc::aviation::CCallsignSet getCallsigns() const
All callsigns.
bool containsCallsign(const CCallsign &callsign) const
Contains callsign?
void setGeodeticHeight(const aviation::CAltitude &height)
Set height (ellipsoidal or geodetic height)
Plane of same elevation, can be a single point or larger area (e.g. airport)
Geodetic coordinate, a position in 3D space relative to the reference geoid.
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Value object encapsulating information of a text message.
Definition: textmessage.h:31
Direct in memory access to client (network client) data.
Physical unit length (length)
Definition: length.h:18
QString valueRoundedWithUnit(const MU &unit, int digits=-1, bool withGroupSeparator=false, bool i18n=false) const
Value to QString with the given unit, e.g. "5.00m".
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object for interpolator and rendering per callsign.
Multiplexed interpolator which allows switching between modes at runtime.
CInterpolationResult getInterpolation(qint64 currentTimeSinceEpoch, const CInterpolationAndRenderingSetupPerCallsign &setup, uint32_t aircraftNumber)
Get interpolated situation.
CInterpolatorMulti which can be used with QMap/QHash.
bool updateOwnParts(const aviation::CAircraftParts &parts)
Update own parts.
bool updateOwnModel(const swift::misc::simulation::CAircraftModel &model)
Update model.
bool updateCockpit(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)
bool updateSelcal(const aviation::CSelcal &selcal, const swift::misc::CIdentifier &originator)
Update cockpit, but only send signals when applicable.
CSimulatedAircraft getOwnAircraft() const
Own aircraft.
IRemoteAircraftProvider * getRemoteAircraftProvider() const
Get the aircraft provider.
bool updateAircraftRendered(const aviation::CCallsign &callsign, bool rendered)
Set aircraft rendered.
Comprehensive information of an aircraft.
const aviation::CSelcal getSelcal() const
SELCAL.
const aviation::CAircraftSituation & getSituation() const
Get situation.
void setCockpit(const CSimulatedAircraft &aircraft)
Set COM unit (all values + transponder and SELCAL)
const aviation::CComSystem & getCom2System() const
Get COM2 system.
const aviation::CTransponder & getTransponder() const
Get transponder.
void setSelcal(const aviation::CSelcal &selcal)
Own SELCAL code.
void setSituation(const aviation::CAircraftSituation &situation)
Set situation. Won't overwrite the velocity unless it held the default value.
void setCom1System(const aviation::CComSystem &comSystem)
Set COM1 system.
const simulation::CAircraftModel & getNetworkModel() const
Get network model.
const aviation::CCallsign & getCallsign() const
Get callsign.
void setComSystem(const aviation::CComSystem &com, aviation::CComSystem::ComUnit unit)
Set COM unit.
const simulation::CAircraftModel & getModel() const
Get model (model used for mapping)
aviation::CComSystem getComSystem(aviation::CComSystem::ComUnit unit) const
Get COM unit.
void setParts(const aviation::CAircraftParts &parts)
Set aircraft parts.
void setCom2System(const aviation::CComSystem &comSystem)
Set COM2 system.
const aviation::CComSystem & getCom1System() const
Get COM1 system.
const aviation::CAircraftParts & getParts() const
Get aircraft parts.
int setAircraftSituation(const aviation::CCallsign &callsign, const aviation::CAircraftSituation &situation, bool onlyFirst=true)
Set aircraft situation.
int setAircraftPartsSynchronized(const aviation::CCallsign &callsign, const aviation::CAircraftParts &parts, bool onlyFirst=true)
Set aircraft parts and mark as synchronized.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isSingleSimulator() const
Single simulator selected.
bool isValid() const
Check if the provided plugin metadata is valid. Simulator plugin (driver) has to meet the following r...
Value object encapsulating a list of SimulatorInfo objects.
CSimulatorPluginInfo findBySimulator(const swift::misc::simulation::CSimulatorInfo &simulator) const
Find by simulator.
CInterpolationAndRenderingSetupPerCallsign getInterpolationSetupPerCallsignOrDefault(const aviation::CCallsign &callsign) const
Get the setup for callsign, if not existing the global setup.
Direct threadsafe in memory access to own aircraft.
Direct thread safe in memory access to remote aircraft.
void setNewPluginInfo(const CSimulatorPluginInfo &info, const settings::CSimulatorSettings &settings, const CAircraftModel &defaultModel)
New plugin info and default model.
CSimulatorSettings getSettings(const CSimulatorInfo &simulator) const
Settings per simulator.
virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
bool isInterpolatorFetching() const
Is fetching from interpolator.
virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftSituation &situation, const swift::misc::aviation::CAircraftParts &parts)
Send situation/parts for testing.
virtual bool changeRemoteAircraftModel(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Change remote aircraft per property.
swift::misc::simulation::CSimulatorInfo getEmulatedSimulator() const
The emulated simulated simulator.
virtual bool disconnectFrom()
Disconnect from simulator.
virtual bool physicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)
Add new remote aircraft physically to the simulator.
void internalAircraftChanged()
Internal aircraft changed.
virtual swift::misc::aviation::CCallsignSet physicallyRenderedAircraft() const
Physically rendered (displayed in simulator) This shall only return aircraft handled in the simulator...
virtual bool connectTo()
Connect to simulator.
virtual bool updateOwnSimulatorCockpit(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)
Update own aircraft cockpit (usually from context)
virtual swift::misc::CStatusMessageList getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const
Interpolation messages for callsign.
virtual bool logicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign)
Logically remove remote aircraft from simulator. Depending on max. aircraft, enabled status etc....
virtual bool requestElevation(const swift::misc::geo::ICoordinateGeodetic &reference, const swift::misc::aviation::CCallsign &callsign)
Request elevation, there is no guarantee the requested elevation will be available in the provider.
bool changeInternalSituation(const swift::misc::aviation::CAircraftSituation &situation)
Simulator internal change of situation.
friend class CSimulatorEmulatedMonitorDialog
the monitor widget represents the simulator and needs access to internals (i.e.
virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const
Display a text message.
bool changeInternalCom(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Simulator internal change of COM values.
virtual bool isSimulating() const
Simulator running?
bool setInterpolatorFetchTime(int timeMs)
Interpolator fetch time, <=0 stops.
virtual void unload()
Driver will be unloaded.
virtual bool parseDetails(const swift::misc::CSimpleCommandParser &parser)
Parsed in derived classes.
bool changeInternalParts(const swift::misc::aviation::CAircraftParts &parts)
Simulator internal change of parts.
virtual int physicallyRemoveMultipleRemoteAircraft(const swift::misc::aviation::CCallsignSet &callsigns)
Remove remote aircraft from simulator.
bool changeInternalSelcal(const swift::misc::aviation::CSelcal &selcal)
Simulator internal change of SELCAL.
virtual bool changeRemoteAircraftEnabled(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft got enabled / disabled.
virtual bool logicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)
Logically add a new aircraft. Depending on max. aircraft, enabled status etc. it will physically adde...
virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign)
Remove remote aircraft from simulator.
virtual bool isConnected() const
Are we connected to the simulator?
virtual bool isPaused() const
Simulator paused?
virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const
Is the aircraft rendered (displayed in simulator)? This shall only return true if the aircraft is rea...
virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const
Display a status message in the simulator.
void setCombinedStatus(bool connected, bool simulating, bool paused)
UI setter.
virtual int physicallyRemoveAllRemoteAircraft()
Remove all remote aircraft and their data via ISimulator::clearAllRemoteAircraftData.
virtual void startImpl()
Plugin specific implementation to start listener.
CSimulatorEmulatedListener(const swift::misc::simulation::CSimulatorPluginInfo &info)
Constructor.
virtual void checkImpl()
Plugin specific implementation to stop listener.
virtual void stopImpl()
Plugin specific implementation to stop listener.
virtual bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
GUI related classes.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
Definition: threadutils.h:30
const std::string & boolToYesNo(bool t)
Yes/no from bool.
Definition: qtfreeutils.h:129