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() {}
20 
21  CAirspaceAircraftSnapshot::CAirspaceAircraftSnapshot(const CSimulatedAircraftList &allAircraft, bool restricted,
22  bool renderingEnabled, int maxAircraft,
23  const CLength &maxRenderedDistance)
24  : m_timestampMsSinceEpoch(QDateTime::currentMSecsSinceEpoch()), m_restricted(restricted),
25  m_renderingEnabled(renderingEnabled), m_threadName(QThread::currentThread()->objectName())
26  {
27  if (allAircraft.isEmpty()) { return; }
28 
29  CSimulatedAircraftList aircraft(allAircraft);
31  const int numberAll = aircraft.size();
32  Q_ASSERT_X(numberAll == allAircraft.size(), Q_FUNC_INFO, "aircraft got lost");
33  const CSimulatedAircraftList vtolAircraft(aircraft.findByVtol(true));
34  const int numberVtol = vtolAircraft.size();
35  m_aircraftCallsignsByDistance = aircraft.getCallsigns();
36  Q_ASSERT_X(m_aircraftCallsignsByDistance.size() == allAircraft.size(), Q_FUNC_INFO,
37  "redundant or missing callsigns");
38  m_vtolAircraftCallsignsByDistance = vtolAircraft.getCallsigns();
39  Q_ASSERT_X(m_vtolAircraftCallsignsByDistance.size() == numberVtol, Q_FUNC_INFO,
40  "redundant or missing callsigns");
41 
42  // no restrictions, just find by attributes
43  if (!restricted)
44  {
45  m_enabledAircraftCallsignsByDistance = aircraft.findByEnabled(true).getCallsigns();
46  m_disabledAircraftCallsignsByDistance = aircraft.findByEnabled(false).getCallsigns();
47  int numberEnabled = m_enabledAircraftCallsignsByDistance.size();
48  int numberDisabled = m_disabledAircraftCallsignsByDistance.size();
49  Q_ASSERT_X(numberEnabled + numberDisabled == numberAll, Q_FUNC_INFO, "Mismatch in enabled/disabled/all");
50  m_enabledVtolAircraftCallsignsByDistance = vtolAircraft.findByEnabled(true).getCallsigns();
51  return;
52  }
53 
54  // no rendering, this means all aircraft are disabled
55  if (!m_renderingEnabled)
56  {
57  m_disabledAircraftCallsignsByDistance = aircraft.getCallsigns();
58  return;
59  }
60 
61  // restricted
62  int count = 0; // when max. aircraft reached?
63  for (const CSimulatedAircraft &currentAircraft : aircraft)
64  {
65  const CCallsign cs(currentAircraft.getCallsign());
66  if (currentAircraft.isEnabled())
67  {
68  CLength distance(currentAircraft.getRelativeDistance());
69  if (count >= maxAircraft || (!maxRenderedDistance.isNull() && distance >= maxRenderedDistance))
70  {
71  m_disabledAircraftCallsignsByDistance.push_back(cs);
72  }
73  else
74  {
75  count++;
76  m_enabledAircraftCallsignsByDistance.push_back(cs);
77  if (currentAircraft.isVtol()) { m_enabledVtolAircraftCallsignsByDistance.push_back(cs); }
78  }
79  }
80  else { m_disabledAircraftCallsignsByDistance.push_back(cs); }
81  }
82  }
83 
84  bool CAirspaceAircraftSnapshot::isValidSnapshot() const { return m_timestampMsSinceEpoch > 0; }
85 
87  {
88  if (this->isValidSnapshot() == snapshot.isValidSnapshot())
89  {
90  this->m_restrictionChanged = (snapshot.m_restricted != this->m_restricted) ||
91  (snapshot.m_renderingEnabled != this->m_renderingEnabled);
92  }
93  else { this->m_restrictionChanged = true; }
94  }
95 
97  {
98  if (index.isMyself()) { return QVariant::fromValue(*this); }
99  return CValueObject::propertyByIndex(index);
100  }
101 
103  {
104  if (index.isMyself())
105  {
106  (*this) = variant.value<CAirspaceAircraftSnapshot>();
107  return;
108  }
109  CValueObject::setPropertyByIndex(index, variant);
110  }
111 
113  {
114  Q_UNUSED(i18n);
115  return this->getTimestamp().toString();
116  }
117 
118 } // 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:160
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:167
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.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67