swift
airspaceaircraftsnapshot.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QThread>
7 
11 
12 using namespace swift::misc::aviation;
13 using namespace swift::misc::physical_quantities;
14 
15 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::simulation, CAirspaceAircraftSnapshot)
16 
17 namespace swift::misc::simulation
18 {
19  CAirspaceAircraftSnapshot::CAirspaceAircraftSnapshot(const CSimulatedAircraftList &allAircraft, bool restricted,
20  bool renderingEnabled, int maxAircraft,
21  const CLength &maxRenderedDistance)
22  : m_timestampMsSinceEpoch(QDateTime::currentMSecsSinceEpoch()), m_restricted(restricted),
23  m_renderingEnabled(renderingEnabled), m_threadName(QThread::currentThread()->objectName())
24  {
25  if (allAircraft.isEmpty()) { return; }
26 
27  CSimulatedAircraftList aircraft(allAircraft);
29  const int numberAll = aircraft.size();
30  Q_ASSERT_X(numberAll == allAircraft.size(), Q_FUNC_INFO, "aircraft got lost");
31  const CSimulatedAircraftList vtolAircraft(aircraft.findByVtol(true));
32  const int numberVtol = vtolAircraft.size();
33  m_aircraftCallsignsByDistance = aircraft.getCallsigns();
34  Q_ASSERT_X(m_aircraftCallsignsByDistance.size() == allAircraft.size(), Q_FUNC_INFO,
35  "redundant or missing callsigns");
36  m_vtolAircraftCallsignsByDistance = vtolAircraft.getCallsigns();
37  Q_ASSERT_X(m_vtolAircraftCallsignsByDistance.size() == numberVtol, Q_FUNC_INFO,
38  "redundant or missing callsigns");
39 
40  // no restrictions, just find by attributes
41  if (!restricted)
42  {
43  m_enabledAircraftCallsignsByDistance = aircraft.findByEnabled(true).getCallsigns();
44  m_disabledAircraftCallsignsByDistance = aircraft.findByEnabled(false).getCallsigns();
45  int numberEnabled = m_enabledAircraftCallsignsByDistance.size();
46  int numberDisabled = m_disabledAircraftCallsignsByDistance.size();
47  Q_ASSERT_X(numberEnabled + numberDisabled == numberAll, Q_FUNC_INFO, "Mismatch in enabled/disabled/all");
48  m_enabledVtolAircraftCallsignsByDistance = vtolAircraft.findByEnabled(true).getCallsigns();
49  return;
50  }
51 
52  // no rendering, this means all aircraft are disabled
53  if (!m_renderingEnabled)
54  {
55  m_disabledAircraftCallsignsByDistance = aircraft.getCallsigns();
56  return;
57  }
58 
59  // restricted
60  int count = 0; // when max. aircraft reached?
61  for (const CSimulatedAircraft &currentAircraft : aircraft)
62  {
63  const CCallsign cs(currentAircraft.getCallsign());
64  if (currentAircraft.isEnabled())
65  {
66  CLength distance(currentAircraft.getRelativeDistance());
67  if (count >= maxAircraft || (!maxRenderedDistance.isNull() && distance >= maxRenderedDistance))
68  {
69  m_disabledAircraftCallsignsByDistance.push_back(cs);
70  }
71  else
72  {
73  count++;
74  m_enabledAircraftCallsignsByDistance.push_back(cs);
75  if (currentAircraft.isVtol()) { m_enabledVtolAircraftCallsignsByDistance.push_back(cs); }
76  }
77  }
78  else { m_disabledAircraftCallsignsByDistance.push_back(cs); }
79  }
80  }
81 
82  bool CAirspaceAircraftSnapshot::isValidSnapshot() const { return m_timestampMsSinceEpoch > 0; }
83 
85  {
86  if (this->isValidSnapshot() == snapshot.isValidSnapshot())
87  {
88  this->m_restrictionChanged = (snapshot.m_restricted != this->m_restricted) ||
89  (snapshot.m_renderingEnabled != this->m_renderingEnabled);
90  }
91  else { this->m_restrictionChanged = true; }
92  }
93 
95  {
96  if (index.isMyself()) { return QVariant::fromValue(*this); }
97  return CValueObject::propertyByIndex(index);
98  }
99 
101  {
102  if (index.isMyself())
103  {
104  (*this) = variant.value<CAirspaceAircraftSnapshot>();
105  return;
106  }
107  CValueObject::setPropertyByIndex(index, variant);
108  }
109 
111  {
112  Q_UNUSED(i18n);
113  return this->getTimestamp().toString();
114  }
115 
116 } // namespace swift::misc::simulation
size_type size() const
Returns number of elements in the collection.
Definition: collection.h:185
iterator push_back(const T &value)
Synonym for insert.
Definition: collection.h:238
Non-owning reference to a CPropertyIndex with a subset of its features.
bool isMyself() const
Myself index, used with nesting.
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Value object encapsulating information of a callsign.
Definition: callsign.h:30
swift::misc::aviation::CCallsignSet getCallsigns() const
All callsigns.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: mixinindex.h:158
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:165
Physical unit length (length)
Definition: length.h:18
const QDateTime getTimestamp() const
Time when snapshot was taken.
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
QString convertToQString(bool i18n=false) const
Cast as QString.
void setRestrictionChanged(const CAirspaceAircraftSnapshot &snapshot)
Did restriction change compared to last snapshot.
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Comprehensive information of an aircraft.
Value object encapsulating a list of aircraft.
Q_REQUIRED_RESULT CSimulatedAircraftList findByEnabled(bool enabled) const
Enabled / disabled aircraft.
void sortByDistanceToReferencePositionRenderedCallsign()
Same as sortByDistanceToReferencePosition, but consider callsign and rendered as secondary criteria.
CSimulatedAircraftList findByVtol(bool vtol) const
VTOL / non VTOL aircraft.
QString toString(QStringView format) const const
QVariant fromValue(T &&value)
T value() const &const
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67