swift
simulatedaircraftlist.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 <tuple>
7 
8 #include <QString>
9 
12 #include "misc/aviation/callsign.h"
14 #include "misc/network/user.h"
15 #include "misc/predicates.h"
16 #include "misc/range.h"
18 
19 using namespace swift::misc::aviation;
20 using namespace swift::misc::geo;
21 using namespace swift::misc::physical_quantities;
22 using namespace swift::misc::network;
23 
24 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::simulation, CSimulatedAircraft, CSimulatedAircraftList)
25 
26 namespace swift::misc::simulation
27 {
28  CSimulatedAircraftList::CSimulatedAircraftList(const CSequence<CSimulatedAircraft> &other)
30  {}
31 
33  {
36  }
37 
39  {
41  }
42 
44  {
45  return this->findBy(&CSimulatedAircraft::isEnabled, enabled);
46  }
47 
49  {
50  return this->findBy(&CSimulatedAircraft::isRendered, rendered);
51  }
52 
54  {
55  return this->findBy(&CSimulatedAircraft::isVtol, vtol);
56  }
57 
59  {
60  CCallsignSet csl;
61  for (const CSimulatedAircraft &aircraft : (*this))
62  {
63  if (!aircraft.isPartsSynchronized()) { continue; }
64  csl.push_back(aircraft.getCallsign());
65  }
66  return csl;
67  }
68 
70  {
71  if (this->isEmpty()) return false;
72  if (aircraftToBeUpdated.hasRealName() && aircraftToBeUpdated.hasId() &&
73  aircraftToBeUpdated.hasAircraftAndAirlineDesignator())
74  {
75  return false;
76  }
77 
78  CSimulatedAircraft currentDataFileAircraft = this->findFirstByCallsign(aircraftToBeUpdated.getCallsign());
79  if (currentDataFileAircraft.getCallsign().isEmpty()) return false;
80 
81  CUser user = aircraftToBeUpdated.getPilot();
82  user.updateMissingParts(currentDataFileAircraft.getPilot());
83  aircraftToBeUpdated.setPilot(user);
84 
85  CAircraftIcaoCode aircraftIcao = aircraftToBeUpdated.getAircraftIcaoCode();
86  CAirlineIcaoCode airlineIcao = aircraftToBeUpdated.getAirlineIcaoCode();
87  aircraftIcao.updateMissingParts(currentDataFileAircraft.getAircraftIcaoCode());
88  airlineIcao.updateMissingParts(currentDataFileAircraft.getAirlineIcaoCode());
89  aircraftToBeUpdated.setIcaoCodes(aircraftIcao, airlineIcao);
90  return true;
91  }
92 
94  {
95  for (CSimulatedAircraft &aircraft : (*this))
96  {
97  if (!aircraft.isRendered()) { continue; }
98  aircraft.setRendered(false);
99  }
100  }
101 
102  int CSimulatedAircraftList::setRendered(const CCallsign &callsign, bool rendered, bool onlyFirst)
103  {
104  int c = 0;
105  for (CSimulatedAircraft &aircraft : (*this))
106  {
107  if (aircraft.getCallsign() != callsign) { continue; }
108  aircraft.setRendered(rendered);
109  c++;
110  if (onlyFirst) break;
111  }
112  return c;
113  }
114 
115  int CSimulatedAircraftList::setCG(const CCallsign &callsign, const CLength &cg, bool onlyFirst)
116  {
117  int c = 0;
118  for (CSimulatedAircraft &aircraft : (*this))
119  {
120  if (aircraft.getCallsign() != callsign) { continue; }
121  aircraft.setCG(cg);
122  c++;
123  if (onlyFirst) break;
124  }
125  return c;
126  }
127 
128  int CSimulatedAircraftList::setFastPositionUpdates(const CCallsign &callsign, bool fastPositions, bool onlyFirst)
129  {
130  int c = 0;
131  for (CSimulatedAircraft &aircraft : (*this))
132  {
133  if (aircraft.getCallsign() != callsign) { continue; }
134  aircraft.setFastPositionUpdates(fastPositions);
135  c++;
136  if (onlyFirst) break;
137  }
138  return c;
139  }
140 
141  int CSimulatedAircraftList::setEnabled(const CCallsign &callsign, bool enabled, bool onlyFirst)
142  {
143  int c = 0;
144  for (CSimulatedAircraft &aircraft : (*this))
145  {
146  if (aircraft.getCallsign() != callsign) { continue; }
147  aircraft.setEnabled(enabled);
148  c++;
149  if (onlyFirst) break;
150  }
151  return c;
152  }
153 
154  int CSimulatedAircraftList::setAircraftModel(const CCallsign &callsign, const CAircraftModel &model, bool onlyFirst)
155  {
156  int c = 0;
157  for (CSimulatedAircraft &aircraft : (*this))
158  {
159  if (aircraft.getCallsign() != callsign) { continue; }
160  aircraft.setModel(model);
161  c++;
162  if (onlyFirst) break;
163  }
164  return c;
165  }
166 
168  bool onlyFirst)
169  {
170  int c = 0;
171  for (CSimulatedAircraft &aircraft : (*this))
172  {
173  if (aircraft.getCallsign() != callsign) { continue; }
174  aircraft.setParts(parts);
175  aircraft.setPartsSynchronized(true);
176  c++;
177  if (onlyFirst) break;
178  }
179  return c;
180  }
181 
183  bool onlyFirst)
184  {
185  int c = 0;
186  for (CSimulatedAircraft &aircraft : (*this))
187  {
188  if (aircraft.getCallsign() != callsign) { continue; }
189  aircraft.setSituation(situation); // also sets setSupportingGndFlag
190  if (onlyFirst) break;
191  }
192  return c;
193  }
194 
196  CAircraftSituation::GndElevationInfo info, bool onlyFirst)
197  {
198  int c = 0;
199  for (CSimulatedAircraft &aircraft : (*this))
200  {
201  if (aircraft.getCallsign() != callsign) { continue; }
202  aircraft.setGroundElevationChecked(elevation, info);
203  c++;
204  if (onlyFirst) break;
205  }
206  return c;
207  }
208 
209  bool CSimulatedAircraftList::isEnabled(const CCallsign &callsign) const
210  {
211  for (const CSimulatedAircraft &aircraft : (*this))
212  {
213  if (aircraft.getCallsign() != callsign) { continue; }
214  return aircraft.isEnabled();
215  }
216  return false;
217  }
218 
219  bool CSimulatedAircraftList::isRendered(const CCallsign &callsign) const
220  {
221  for (const CSimulatedAircraft &aircraft : (*this))
222  {
223  if (aircraft.getCallsign() != callsign) { continue; }
224  return aircraft.isRendered();
225  }
226  return false;
227  }
228 
230  {
231  const CCallsign cs(aircraft.getCallsign());
232  if (cs.isEmpty()) { return false; }
233 
234  if (this->containsCallsign(cs))
235  {
236  int c = this->replaceIf(&CSimulatedAircraft::getCallsign, cs, aircraft);
237  return c > 0;
238  }
239  this->push_back(aircraft);
240  return true;
241  }
242 
244  {
245  int c = 0;
246  for (const CSimulatedAircraft &aircraft : (*this))
247  {
248  if (aircraft.isEnabled()) { c++; }
249  }
250  return c;
251  }
252 
254  {
255  int c = 0;
256  for (const CSimulatedAircraft &aircraft : (*this))
257  {
258  if (aircraft.isRendered()) { c++; }
259  }
260  return c;
261  }
262 
264  {
265  int c = 0;
266  for (const CSimulatedAircraft &aircraft : (*this))
267  {
268  if (aircraft.isPartsSynchronized()) { c++; }
269  }
270  return c;
271  }
272 
274  {
275  this->sort([&](const CSimulatedAircraft &a, const CSimulatedAircraft &b) {
277  {
278  return a.getRelativeDistance() < b.getRelativeDistance();
279  }
280  if (a.isRendered() != b.isRendered()) { return a.isRendered(); } // get the rendered first
281  return a.getCallsignAsString() < b.getCallsignAsString();
282  });
283  }
284 } // namespace swift::misc::simulation
iterator push_back(const T &value)
Synonym for insert.
Definition: collection.h:238
auto transform(F function) const
Return a new container generated by applying some transformation function to all elements of this one...
Definition: range.h:403
int replaceIf(Predicate p, const CSimulatedAircraft &replacement)
Replace elements for which a given predicate returns true.
Definition: sequence.h:495
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
void push_back(const CSimulatedAircraft &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
void sort(Predicate p)
In-place sort by a given comparator predicate.
Definition: sequence.h:560
Value object for ICAO classification.
void updateMissingParts(const CAircraftIcaoCode &otherIcaoCode)
Update missing parts.
Value object encapsulating information of aircraft's parts.
Definition: aircraftparts.h:26
Value object encapsulating information of an aircraft's situation.
GndElevationInfo
Where did we get elevation from?
Value object for ICAO classification.
void updateMissingParts(const CAirlineIcaoCode &otherIcaoCode)
Update missing parts.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
bool isEmpty() const
Is empty?
Definition: callsign.h:63
Value object for a set of callsigns.
Definition: callsignset.h:26
CSimulatedAircraft findFirstByCallsign(const CCallsign &callsign, const CSimulatedAircraft &ifNotFound={}) const
Find the first aircraft by callsign, if none return given one.
Plane of same elevation, can be a single point or larger area (e.g. airport)
const physical_quantities::CLength & getRelativeDistance() const
Get the distance.
Value object encapsulating information of a user.
Definition: user.h:28
void updateMissingParts(const CUser &otherUser)
Update missing parts in this object.
Definition: user.cpp:169
Value object encapsulating a list of voice rooms.
Definition: userlist.h:26
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.
Comprehensive information of an aircraft.
bool hasRealName() const
Has valid realname?
const network::CUser & getPilot() const
Get user.
const aviation::CCallsign & getCallsign() const
Get callsign.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Get aircraft ICAO info.
const simulation::CAircraftModel & getModel() const
Get model (model used for mapping)
bool hasAircraftAndAirlineDesignator() const
Valid designators?
bool isEnabled() const
Enabled? Enable means it shall be displayed in the simulator.
bool setIcaoCodes(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode)
Set ICAO info.
QString getCallsignAsString() const
Get callsign.
const aviation::CAirlineIcaoCode & getAirlineIcaoCode() const
Airline ICAO code if any.
void setPilot(const network::CUser &user)
Set pilot.
Value object encapsulating a list of aircraft.
int countRendered() const
Number of rendered aircraft.
bool updateWithVatsimDataFileData(CSimulatedAircraft &aircraftToBeUpdated) const
Update aircraft with data from VATSIM data file.
int setAircraftSituation(const aviation::CCallsign &callsign, const aviation::CAircraftSituation &situation, bool onlyFirst=true)
Set aircraft situation.
network::CUserList getPilots() const
All pilots (with valid data)
int setCG(const aviation::CCallsign &callsign, const physical_quantities::CLength &cg, bool onlyFirst=true)
Set center of gravity.
Q_REQUIRED_RESULT CSimulatedAircraftList findByRendered(bool rendered) const
Rendered / not rendered aircraft.
int setAircraftPartsSynchronized(const aviation::CCallsign &callsign, const aviation::CAircraftParts &parts, bool onlyFirst=true)
Set aircraft parts and mark as synchronized.
int countEnabled() const
Number of enabled aircraft.
aviation::CCallsignSet getCallsignsWithSynchronizedParts() const
Callsigns of aircraft with synchronized parts.
Q_REQUIRED_RESULT CSimulatedAircraftList findByEnabled(bool enabled) const
Enabled / disabled aircraft.
bool replaceOrAddByCallsign(const CSimulatedAircraft &aircraft)
Replace or add by callsign.
int setEnabled(const aviation::CCallsign &callsign, bool enabled, bool onlyFirst)
Mark given callsign as enabled.
bool isRendered(const aviation::CCallsign &callsign) const
Rendered?
CAircraftModelList getModels() const
Get all models.
bool isEnabled(const aviation::CCallsign &callsign) const
Enabled?
void sortByDistanceToReferencePositionRenderedCallsign()
Same as sortByDistanceToReferencePosition, but consider callsign and rendered as secondary criteria.
int setAircraftModel(const aviation::CCallsign &callsign, const CAircraftModel &model, bool onlyFirst=true)
Set model.
CSimulatedAircraftList findByVtol(bool vtol) const
VTOL / non VTOL aircraft.
int countAircraftPartsSynchronized() const
Number of aircraft with parts.
int setFastPositionUpdates(const aviation::CCallsign &callsign, bool fastPositions, bool onlyFirst=true)
Mark as fast position enabled.
int setGroundElevationChecked(const aviation::CCallsign &callsign, const geo::CElevationPlane &elevation, aviation::CAircraftSituation::GndElevationInfo info, bool onlyFirst=true)
Set ground elevation.
void markAllAsNotRendered()
Mark all aircraft as unrendered.
int setRendered(const aviation::CCallsign &callsign, bool rendered, bool onlyFirst=true)
Mark given callsign as rendered.
auto MemberTransform(T memberFunc)
Returns a function object that returns the value returned by one of it's argument member functions.
Definition: predicates.h:54
auto MemberValid(T memberFunc)
Returns a predicate that returns true if the isValid() method of the value returned from one of its m...
Definition: predicates.h:64
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63