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() {}
29 
30  CSimulatedAircraftList::CSimulatedAircraftList(const CSequence<CSimulatedAircraft> &other)
32  {}
33 
35  {
38  }
39 
41  {
43  }
44 
46  {
47  return this->findBy(&CSimulatedAircraft::isEnabled, enabled);
48  }
49 
51  {
52  return this->findBy(&CSimulatedAircraft::isRendered, rendered);
53  }
54 
56  {
57  return this->findBy(&CSimulatedAircraft::isVtol, vtol);
58  }
59 
61  {
62  CCallsignSet csl;
63  for (const CSimulatedAircraft &aircraft : (*this))
64  {
65  if (!aircraft.isPartsSynchronized()) { continue; }
66  csl.push_back(aircraft.getCallsign());
67  }
68  return csl;
69  }
70 
72  {
73  if (this->isEmpty()) return false;
74  if (aircraftToBeUpdated.hasRealName() && aircraftToBeUpdated.hasId() &&
75  aircraftToBeUpdated.hasAircraftAndAirlineDesignator())
76  {
77  return false;
78  }
79 
80  CSimulatedAircraft currentDataFileAircraft = this->findFirstByCallsign(aircraftToBeUpdated.getCallsign());
81  if (currentDataFileAircraft.getCallsign().isEmpty()) return false;
82 
83  CUser user = aircraftToBeUpdated.getPilot();
84  user.updateMissingParts(currentDataFileAircraft.getPilot());
85  aircraftToBeUpdated.setPilot(user);
86 
87  CAircraftIcaoCode aircraftIcao = aircraftToBeUpdated.getAircraftIcaoCode();
88  CAirlineIcaoCode airlineIcao = aircraftToBeUpdated.getAirlineIcaoCode();
89  aircraftIcao.updateMissingParts(currentDataFileAircraft.getAircraftIcaoCode());
90  airlineIcao.updateMissingParts(currentDataFileAircraft.getAirlineIcaoCode());
91  aircraftToBeUpdated.setIcaoCodes(aircraftIcao, airlineIcao);
92  return true;
93  }
94 
96  {
97  for (CSimulatedAircraft &aircraft : (*this))
98  {
99  if (!aircraft.isRendered()) { continue; }
100  aircraft.setRendered(false);
101  }
102  }
103 
104  int CSimulatedAircraftList::setRendered(const CCallsign &callsign, bool rendered, bool onlyFirst)
105  {
106  int c = 0;
107  for (CSimulatedAircraft &aircraft : (*this))
108  {
109  if (aircraft.getCallsign() != callsign) { continue; }
110  aircraft.setRendered(rendered);
111  c++;
112  if (onlyFirst) break;
113  }
114  return c;
115  }
116 
117  int CSimulatedAircraftList::setCG(const CCallsign &callsign, const CLength &cg, bool onlyFirst)
118  {
119  int c = 0;
120  for (CSimulatedAircraft &aircraft : (*this))
121  {
122  if (aircraft.getCallsign() != callsign) { continue; }
123  aircraft.setCG(cg);
124  c++;
125  if (onlyFirst) break;
126  }
127  return c;
128  }
129 
130  int CSimulatedAircraftList::setFastPositionUpdates(const CCallsign &callsign, bool fastPositions, bool onlyFirst)
131  {
132  int c = 0;
133  for (CSimulatedAircraft &aircraft : (*this))
134  {
135  if (aircraft.getCallsign() != callsign) { continue; }
136  aircraft.setFastPositionUpdates(fastPositions);
137  c++;
138  if (onlyFirst) break;
139  }
140  return c;
141  }
142 
143  int CSimulatedAircraftList::setEnabled(const CCallsign &callsign, bool enabled, bool onlyFirst)
144  {
145  int c = 0;
146  for (CSimulatedAircraft &aircraft : (*this))
147  {
148  if (aircraft.getCallsign() != callsign) { continue; }
149  aircraft.setEnabled(enabled);
150  c++;
151  if (onlyFirst) break;
152  }
153  return c;
154  }
155 
156  int CSimulatedAircraftList::setAircraftModel(const CCallsign &callsign, const CAircraftModel &model, bool onlyFirst)
157  {
158  int c = 0;
159  for (CSimulatedAircraft &aircraft : (*this))
160  {
161  if (aircraft.getCallsign() != callsign) { continue; }
162  aircraft.setModel(model);
163  c++;
164  if (onlyFirst) break;
165  }
166  return c;
167  }
168 
170  bool onlyFirst)
171  {
172  int c = 0;
173  for (CSimulatedAircraft &aircraft : (*this))
174  {
175  if (aircraft.getCallsign() != callsign) { continue; }
176  aircraft.setParts(parts);
177  aircraft.setPartsSynchronized(true);
178  c++;
179  if (onlyFirst) break;
180  }
181  return c;
182  }
183 
185  bool onlyFirst)
186  {
187  int c = 0;
188  for (CSimulatedAircraft &aircraft : (*this))
189  {
190  if (aircraft.getCallsign() != callsign) { continue; }
191  aircraft.setSituation(situation); // also sets setSupportingGndFlag
192  if (onlyFirst) break;
193  }
194  return c;
195  }
196 
198  CAircraftSituation::GndElevationInfo info, bool onlyFirst)
199  {
200  int c = 0;
201  for (CSimulatedAircraft &aircraft : (*this))
202  {
203  if (aircraft.getCallsign() != callsign) { continue; }
204  aircraft.setGroundElevationChecked(elevation, info);
205  c++;
206  if (onlyFirst) break;
207  }
208  return c;
209  }
210 
211  bool CSimulatedAircraftList::isEnabled(const CCallsign &callsign) const
212  {
213  for (const CSimulatedAircraft &aircraft : (*this))
214  {
215  if (aircraft.getCallsign() != callsign) { continue; }
216  return aircraft.isEnabled();
217  }
218  return false;
219  }
220 
221  bool CSimulatedAircraftList::isRendered(const CCallsign &callsign) const
222  {
223  for (const CSimulatedAircraft &aircraft : (*this))
224  {
225  if (aircraft.getCallsign() != callsign) { continue; }
226  return aircraft.isRendered();
227  }
228  return false;
229  }
230 
232  {
233  const CCallsign cs(aircraft.getCallsign());
234  if (cs.isEmpty()) { return false; }
235 
236  if (this->containsCallsign(cs))
237  {
238  int c = this->replaceIf(&CSimulatedAircraft::getCallsign, cs, aircraft);
239  return c > 0;
240  }
241  this->push_back(aircraft);
242  return true;
243  }
244 
246  {
247  int c = 0;
248  for (const CSimulatedAircraft &aircraft : (*this))
249  {
250  if (aircraft.isEnabled()) { c++; }
251  }
252  return c;
253  }
254 
256  {
257  int c = 0;
258  for (const CSimulatedAircraft &aircraft : (*this))
259  {
260  if (aircraft.isRendered()) { c++; }
261  }
262  return c;
263  }
264 
266  {
267  int c = 0;
268  for (const CSimulatedAircraft &aircraft : (*this))
269  {
270  if (aircraft.isPartsSynchronized()) { c++; }
271  }
272  return c;
273  }
274 
276  {
277  this->sort([&](const CSimulatedAircraft &a, const CSimulatedAircraft &b) {
279  {
280  return a.getRelativeDistance() < b.getRelativeDistance();
281  }
282  if (a.isRendered() != b.isRendered()) { return a.isRendered(); } // get the rendered first
283  return a.getCallsignAsString() < b.getCallsignAsString();
284  });
285  }
286 } // 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