swift
simulationenvironmentprovider.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_SIMULATION_SIMULATIONENVIRONMENTPROVIDER_H
7 #define SWIFT_MISC_SIMULATION_SIMULATIONENVIRONMENTPROVIDER_H
8 
9 #include <QHash>
10 #include <QObject>
11 #include <QPair>
12 
17 #include "misc/pq/length.h"
18 #include "misc/provider.h"
22 
23 namespace swift::misc::simulation
24 {
28  {
29  public:
32  geo::CCoordinateGeodeticList getAllElevationCoordinates() const;
33 
36  geo::CCoordinateGeodeticList getElevationCoordinatesOnGround() const;
37 
40  geo::CElevationPlane averageElevationOfOnGroundAircraft(const aviation::CAircraftSituation &reference,
41  const physical_quantities::CLength &range,
42  int minValues, int sufficientValues) const;
43 
46  aviation::CAltitude highestElevation() const;
47 
50  geo::CElevationPlane findClosestElevationWithinRange(const geo::ICoordinateGeodetic &reference,
51  const physical_quantities::CLength &range) const;
52 
55  geo::CElevationPlane findClosestElevationWithinRangeOrRequest(const geo::ICoordinateGeodetic &reference,
56  const physical_quantities::CLength &range,
57  const aviation::CCallsign &callsign);
58 
61  virtual bool requestElevation(const geo::ICoordinateGeodetic &reference,
62  const aviation::CCallsign &callsign) = 0;
63 
66  bool requestElevationBySituation(const swift::misc::aviation::CAircraftSituation &situation);
67 
70  QPair<int, int> getElevationsFoundMissed() const;
71 
74  QPair<qint64, qint64> getElevationRequestTimes() const;
75 
78  QString getElevationsFoundMissedInfo() const;
79 
82  QString getElevationRequestTimesInfo() const;
83 
86  CSimulatorPluginInfo getSimulatorPluginInfo() const;
87 
90  CSimulatorInfo getSimulatorInfo() const;
91 
94  QString getSimulatorNameAndVersion() const;
95 
98  CAircraftModel getDefaultModel() const;
99 
102  aviation::CLengthPerCallsign getSimulatorCGsPerCallsign() const;
103 
106  QHash<QString, physical_quantities::CLength> getSimulatorCGsPerModelString() const;
107 
110  physical_quantities::CLength getSimulatorCG(const aviation::CCallsign &callsign) const;
111 
114  physical_quantities::CLength getSimulatorOrDbCG(const aviation::CCallsign &callsign,
115  const physical_quantities::CLength &dbCG) const;
116 
119  physical_quantities::CLength getSimulatorCGPerModelString(const QString &modelString) const;
120 
123  physical_quantities::CLength getSimulatorOrDbCGPerModelString(const QString &modelString,
124  const physical_quantities::CLength &dbCG) const;
125 
128  physical_quantities::CLength overriddenCGorDefault(const physical_quantities::CLength &defaultCG,
129  const QString &modelString) const;
130 
133  bool hasSimulatorCG(const aviation::CCallsign &callsign) const;
134 
137  bool hasSameSimulatorCG(const physical_quantities::CLength &cg, const aviation::CCallsign &callsign) const;
138 
141  int setMaxElevationsRemembered(int max);
142 
145  int getMaxElevationsRemembered() const;
146 
149  void resetSimulationEnvironmentStatistics();
150 
154  bool cleanElevationValues(const aviation::CAircraftSituation &reference,
155  const physical_quantities::CLength &keptRange, bool forced = false);
156 
160  int removeElevationValues(const aviation::CAircraftSituation &reference,
161  const physical_quantities::CLength &removeRange);
162 
163  protected:
166 
169  const settings::CSimulatorSettings &settings, bool supportElevation,
170  bool supportCG);
171 
175  bool isCgProviderEnabled() const;
176  bool isElevationProviderEnabled() const;
177  void setCgProviderEnabled(bool enabled);
178  void setElevationProviderEnabled(bool enabled);
179  void setSimulationProviderEnabled(bool elvEnabled, bool cgEnabled);
181 
184  geo::CCoordinateGeodeticList getAllElevationCoordinates(int &maxRemembered) const;
185 
189  void setNewPluginInfo(const CSimulatorPluginInfo &info, const settings::CSimulatorSettings &settings,
190  const CAircraftModel &defaultModel);
191 
194  void setNewPluginInfo(const CSimulatorPluginInfo &info, const settings::CSimulatorSettings &settings);
195 
198  void setSimulatorDetails(const QString &name, const QString &details, const QString &version);
199 
203  QString getSimulatorName() const;
204 
208  QString getSimulatorVersion() const;
209 
213  QString getSimulatorDetails() const;
214 
217  void setDefaultModel(const CAircraftModel &defaultModel);
218 
221  void clearDefaultModel();
222 
224  void clearElevations();
225 
228  void clearCGs();
229 
232  void clearSimulationEnvironmentData();
233 
236  int cleanUpElevations(const geo::ICoordinateGeodetic &referenceCoordinate, int maxNumber = -1);
237 
240  bool rememberGroundElevation(
241  const aviation::CCallsign &requestedForCallsign, bool likelyOnGroundElevation,
242  const geo::ICoordinateGeodetic &elevationCoordinate,
244 
247  bool rememberGroundElevation(const aviation::CCallsign &requestedForCallsign, bool likelyOnGroundElevation,
248  const geo::CElevationPlane &elevationPlane);
249 
253  bool insertCG(const physical_quantities::CLength &cg, const aviation::CCallsign &cs);
254 
258  bool insertCG(const physical_quantities::CLength &cg, const QString &modelString,
259  const aviation::CCallsign &cs);
260 
264  bool insertCGOverridden(const physical_quantities::CLength &cg, const aviation::CCallsign &cs);
265 
269  bool insertCGOverridden(const physical_quantities::CLength &cg, const aviation::CCallsignSet &callsigns);
270 
274  bool insertCGForModelString(const physical_quantities::CLength &cg, const QString &modelString);
275 
279  bool insertCGForModelStringOverridden(const physical_quantities::CLength &cg, const QString &modelString);
280 
283  aviation::CLengthPerCallsign clearCGOverrides();
284 
287  int removeSimulatorCG(const aviation::CCallsign &cs);
288 
292  void removePendingElevationRequest(const aviation::CCallsign &cs);
293 
295  static physical_quantities::CLength minRange(const physical_quantities::CLength &range);
296 
297  private:
298  CSimulatorPluginInfo m_simulatorPluginInfo;
299  settings::CSimulatorSettings m_settings;
300  QString m_simulatorName;
301  QString m_simulatorDetails;
302  QString m_simulatorVersion;
303  CAircraftModel m_defaultModel;
304 
305  // idea: the elevations on gnd are likely taxiways and runways, so we keep those
306  int m_maxElevations = 100;
307  int m_maxElevationsGnd = 400;
308  geo::CCoordinateGeodeticList m_elvCoordinates;
309  geo::CCoordinateGeodeticList m_elvCoordinatesGnd;
310 
312  m_pendingElevationRequests;
313  aviation::CLengthPerCallsign m_cgsPerCallsign;
314  aviation::CLengthPerCallsign m_cgsPerCallsignOverridden;
317  m_cgsPerModelOverridden;
318  qint64 m_statsMaxElevRequestTimeMs = -1;
319  qint64 m_statsCurrentElevRequestTimeMs = -1;
320 
321  bool m_enableElevation = true;
322  bool m_enableCG = true;
323 
324  mutable int m_elvFound = 0;
325  mutable int m_elvMissed = 0;
326 
327  mutable QReadWriteLock m_lockElvCoordinates {
328  QReadWriteLock::Recursive
329  };
330  mutable QReadWriteLock m_lockCG { QReadWriteLock::Recursive };
331  mutable QReadWriteLock m_lockModel { QReadWriteLock::Recursive };
332  mutable QReadWriteLock m_lockSimInfo { QReadWriteLock::Recursive };
333  };
334 
336  class SWIFT_MISC_EXPORT CSimulationEnvironmentAware : public IProviderAware<ISimulationEnvironmentProvider>
337  {
338  virtual void anchor();
339 
340  public:
342  void setSimulationEnvironmentProvider(ISimulationEnvironmentProvider *provider) { this->setProvider(provider); }
343 
345  geo::CElevationPlane findClosestElevationWithinRange(const geo::ICoordinateGeodetic &reference,
346  const physical_quantities::CLength &range) const;
347 
349  geo::CElevationPlane findClosestElevationWithinRangeOrRequest(const geo::ICoordinateGeodetic &reference,
350  const physical_quantities::CLength &range,
351  const aviation::CCallsign &callsign);
352 
354  geo::CElevationPlane averageElevationOfOnGroundAircraft(const aviation::CAircraftSituation &reference,
355  const physical_quantities::CLength &range,
356  int minValues, int sufficientValues) const;
357 
359  aviation::CAltitude highestElevation() const;
360 
362  bool requestElevation(const geo::ICoordinateGeodetic &reference, const aviation::CCallsign &callsign);
363 
365  bool requestElevation(const aviation::CAircraftSituation &situation);
366 
368  QPair<int, int> getElevationsFoundMissed() const;
369 
371  QString getElevationsFoundMissedInfo() const;
372 
374  QPair<qint64, qint64> getElevationRequestTimes() const;
375 
377  QString getElevationRequestTimesInfo() const;
378 
380  CSimulatorPluginInfo getSimulatorPluginInfo() const;
381 
383  CSimulatorInfo getSimulatorInfo() const;
384 
386  QString getSimulatorNameAndVersion() const;
387 
389  CAircraftModel getDefaultModel() const;
390 
392  physical_quantities::CLength getSimulatorCG(const aviation::CCallsign &callsign) const;
393 
395  physical_quantities::CLength getSimulatorOrDbCG(const aviation::CCallsign &callsign,
396  const physical_quantities::CLength &dbCG) const;
397 
399  bool hasSimulatorCG(const aviation::CCallsign &callsign) const;
400 
402  bool cleanElevationValues(const aviation::CAircraftSituation &reference,
403  const physical_quantities::CLength &range, bool forced = false);
404 
405  protected:
408 
411  {
412  Q_ASSERT(simEnvProvider);
413  }
414  };
415 } // namespace swift::misc::simulation
416 
418  "org.swift-project.misc::simulation::isimulationenvironmentprovider")
419 
420 #endif // SWIFT_MISC_SIMULATION_SIMULATIONENVIRONMENTPROVIDER_H
Base class of provider aware classes.
Definition: provider.h:41
Base class for providers.
Definition: provider.h:19
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
Value object encapsulating a list of coordinates.
Plane of same elevation, can be a single point or larger area (e.g. airport)
static const physical_quantities::CLength & singlePointRadius()
Radius for single point.
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Class which can be directly used to access an.
CSimulationEnvironmentAware(ISimulationEnvironmentProvider *simEnvProvider)
Constructor.
void setSimulationEnvironmentProvider(ISimulationEnvironmentProvider *provider)
Set the provider.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
virtual bool requestElevation(const geo::ICoordinateGeodetic &reference, const aviation::CCallsign &callsign)=0
Request elevation, there is no guarantee the requested elevation will be available in the provider.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.