42 using namespace swift::config;
44 using namespace swift::misc::aviation;
45 using namespace swift::misc::geo;
46 using namespace swift::misc::simulation;
48 using namespace swift::misc::json;
49 using namespace swift::misc::network;
50 using namespace swift::misc::physical_quantities;
51 using namespace swift::misc::weather;
52 using namespace swift::core::fsd;
53 using namespace swift::core::vatsim;
61 m_fsdClient(fsdClient), m_analyzer(new
CAirspaceAnalyzer(ownAircraftProvider, m_fsdClient, this))
63 this->setObjectName(
"CAirspaceMonitor");
66 RevLogEnabledSimplified);
69 connect(m_fsdClient, &CFSDClient::atcDataUpdateReceived,
this, &CAirspaceMonitor::onAtcPositionUpdate);
70 connect(m_fsdClient, &CFSDClient::atisReplyReceived,
this, &CAirspaceMonitor::onAtisReceived);
71 connect(m_fsdClient, &CFSDClient::atisLogoffTimeReplyReceived,
this,
72 &CAirspaceMonitor::onAtisLogoffTimeReceived);
73 connect(m_fsdClient, &CFSDClient::flightPlanReceived,
this, &CAirspaceMonitor::onFlightPlanReceived);
74 connect(m_fsdClient, &CFSDClient::realNameResponseReceived,
this, &CAirspaceMonitor::onRealNameReplyReceived);
75 connect(m_fsdClient, &CFSDClient::planeInformationReceived,
this, &CAirspaceMonitor::onIcaoCodesReceived);
76 connect(m_fsdClient, &CFSDClient::deletePilotReceived,
this, &CAirspaceMonitor::onPilotDisconnected);
77 connect(m_fsdClient, &CFSDClient::deleteAtcReceived,
this, &CAirspaceMonitor::onAtcControllerDisconnected);
78 connect(m_fsdClient, &CFSDClient::pilotDataUpdateReceived,
this, &CAirspaceMonitor::onAircraftUpdateReceived);
79 connect(m_fsdClient, &CFSDClient::interimPilotDataUpdatedReceived,
this,
80 &CAirspaceMonitor::onAircraftInterimUpdateReceived);
81 connect(m_fsdClient, &CFSDClient::visualPilotDataUpdateReceived,
this,
82 &CAirspaceMonitor::onAircraftVisualUpdateReceived);
83 connect(m_fsdClient, &CFSDClient::euroscopeSimDataUpdatedReceived,
this,
84 &CAirspaceMonitor::onAircraftSimDataUpdateReceived);
85 connect(m_fsdClient, &CFSDClient::com1FrequencyResponseReceived,
this, &CAirspaceMonitor::onFrequencyReceived);
86 connect(m_fsdClient, &CFSDClient::capabilityResponseReceived,
this,
87 &CAirspaceMonitor::onCapabilitiesReplyReceived);
88 connect(m_fsdClient, &CFSDClient::planeInformationFsinnReceived,
this,
89 &CAirspaceMonitor::onCustomFSInnPacketReceived);
90 connect(m_fsdClient, &CFSDClient::serverResponseReceived,
this, &CAirspaceMonitor::onServerReplyReceived);
91 connect(m_fsdClient, &CFSDClient::aircraftConfigReceived,
this, &CAirspaceMonitor::onAircraftConfigReceived);
92 connect(m_fsdClient, &CFSDClient::connectionStatusChanged,
this, &CAirspaceMonitor::onConnectionStatusChanged);
93 connect(m_fsdClient, &CFSDClient::revbAircraftConfigReceived,
this,
94 &CAirspaceMonitor::onRevBAircraftConfigReceived);
98 if (this->supportsVatsimDataFile())
101 &CAirspaceMonitor::onReceivedVatsimDataFile);
110 Qt::QueuedConnection);
112 Qt::QueuedConnection);
115 connect(&m_fastProcessTimer, &QTimer::timeout,
this, &CAirspaceMonitor::fastProcessing);
116 connect(&m_slowProcessTimer, &QTimer::timeout,
this, &CAirspaceMonitor::slowProcessing);
117 m_fastProcessTimer.start(FastProcessIntervalMs);
118 m_slowProcessTimer.start(SlowProcessIntervalMs);
130 const QPointer<CAirspaceMonitor> myself(
this);
132 if (!myself) {
return; }
151 Q_ASSERT_X(m_analyzer, Q_FUNC_INFO,
"No analyzer");
158 QPointer<CAirspaceMonitor> myself(
this);
161 if (m_flightPlanCache.contains(callsign)) { plan = m_flightPlanCache[callsign]; }
167 m_flightPlanCache.remove(callsign);
173 eventLoop.
stopWhen(m_fsdClient, &CFSDClient::flightPlanReceived,
174 [=](
const auto &cs,
const auto &) {
return cs == callsign; });
175 if (eventLoop.
exec(1500))
181 if (m_flightPlanCache.contains(callsign)) { plan = m_flightPlanCache[callsign]; }
189 if (callsign.
isEmpty()) {
return {}; }
192 if (m_flightPlanCache.contains(callsign)) {
return m_flightPlanCache[callsign].getFlightPlanRemarks(); }
195 if (this->supportsVatsimDataFile())
207 return m_atcStationsOnline;
213 for (
const CAtcStation &station : m_atcStationsOnline)
215 CUser user = station.getController();
221 CUser user = aircraft.getPilot();
231 if (callsigns.
isEmpty()) {
return users; }
245 if (searchList.
isEmpty()) {
break; }
246 const CCallsign callsign = aircraft.getCallsign();
249 const CUser user = aircraft.getPilot();
251 searchList.
remove(callsign);
255 for (
const CAtcStation &station : m_atcStationsOnline)
257 if (searchList.
isEmpty()) {
break; }
258 const CCallsign callsign = station.getCallsign();
261 const CUser user = station.getController();
263 searchList.
remove(callsign);
269 for (
const CCallsign &callsign : std::as_const(searchList))
274 const CUser user(callsign);
277 else { users.
push_back(usersByCallsign[0]); }
285 if (stations.
isEmpty()) {
return {}; }
287 return stations.
front();
292 if (!this->isConnectedAndNotShuttingDown()) {
return; }
297 const CCallsign cs(aircraft.getCallsign());
298 if (!m_queryPilot.contains(cs)) { m_queryPilot.enqueue(aircraft.getCallsign()); }
304 if (!this->isConnectedAndNotShuttingDown()) {
return; }
308 const CCallsign cs = station.getCallsign();
312 if (!m_queryAtis.contains(cs)) { m_queryAtis.enqueue(cs); }
316 void CAirspaceMonitor::testCreateDummyOnlineAtcStations(
int number)
318 if (number < 1) {
return; }
319 m_atcStationsOnline.
push_back(CTesting::createAtcStations(number));
331 static const QString nr(
"not ready");
332 static const QString icao(
"rec. ICAO");
333 static const QString fsinn(
"rec. FsInn");
334 static const QString ready(
"ready sent");
335 static const QString rec(
"recursive");
345 static const QString unknown(
"????");
362 Q_UNUSED(originator;)
363 if (commandLine.isEmpty()) {
return false; }
364 static const QStringList cmds({
".fsd" });
366 parser.parse(commandLine);
367 if (!parser.isKnownCommand()) {
return false; }
368 if (parser.matchesCommand(
".fsd"))
370 if (parser.countParts() < 2) {
return false; }
371 if (parser.matchesPart(1,
"range") && parser.countParts() > 2)
373 const QString r = parser.part(2);
374 const CLength d = CLength::parsedFromString(r);
381 void CAirspaceMonitor::fastProcessing()
383 if (!this->isConnectedAndNotShuttingDown()) {
return; }
386 const bool send = this->sendNextStaggeredAtisQuery();
387 if (!send) { this->sendNextStaggeredPilotDataQuery(); }
390 void CAirspaceMonitor::slowProcessing()
392 if (!this->isConnectedAndNotShuttingDown()) {
return; }
393 this->queryAllOnlineAtcStations();
398 m_flightPlanCache.clear();
399 m_tempFsInnPackets.clear();
401 this->removeAllOnlineAtcStations();
402 this->removeAllAircraft();
405 m_foundInNonMovingAircraft = 0;
406 m_foundInElevationsOnGnd = 0;
415 this->asyncReInitializeAllAircraft(aircraft,
true);
416 return aircraft.
size();
424 m_maxDistanceNM = -1;
425 m_maxDistanceNMHysteresis = -1;
430 const int rIntNM = range.
valueInteger(CLengthUnit::NM());
432 m_maxDistanceNM = rIntNM;
433 m_maxDistanceNMHysteresis = qRound(rIntNM * 1.1);
436 void CAirspaceMonitor::onRealNameReplyReceived(
const CCallsign &callsign,
const QString &realname)
438 if (!this->isConnectedAndNotShuttingDown() || realname.isEmpty()) {
return; }
442 const QString rn = CUser::beautifyRealName(realname);
449 const int c1 = this->updateOnlineStation(callsign, vm,
false,
true);
463 vm.
addValue({ CClient::IndexVoiceCapabilities }, voiceCaps);
467 void CAirspaceMonitor::onCapabilitiesReplyReceived(
const CCallsign &callsign, CClient::Capabilities clientCaps)
469 if (!this->isConnectedAndNotShuttingDown() || callsign.
isEmpty()) {
return; }
472 vm.
addValue({ CClient::IndexVoiceCapabilities }, voiceCaps);
476 if (clientCaps.testFlag(CClient::FsdWithAircraftConfig))
482 void CAirspaceMonitor::onServerReplyReceived(
const CCallsign &callsign,
const QString &server)
484 if (!this->isConnectedAndNotShuttingDown() || callsign.
isEmpty() || server.isEmpty()) {
return; }
489 void CAirspaceMonitor::onFlightPlanReceived(
const CCallsign &callsign,
const CFlightPlan &flightPlan)
491 if (!this->isConnectedAndNotShuttingDown() || callsign.
isEmpty()) {
return; }
493 plan.setWhenLastSentOrLoaded(QDateTime::currentDateTimeUtc());
494 m_flightPlanCache.insert(callsign, plan);
497 void CAirspaceMonitor::removeAllOnlineAtcStations()
499 m_atcStationsOnline.
clear();
503 void CAirspaceMonitor::removeAllAircraft()
508 m_flightPlanCache.clear();
510 m_queryPilot.clear();
513 void CAirspaceMonitor::removeFromAircraftCachesAndLogs(
const CCallsign &callsign)
515 if (callsign.
isEmpty()) {
return; }
516 m_flightPlanCache.remove(callsign);
517 m_readiness.remove(callsign);
521 void CAirspaceMonitor::onReceivedVatsimDataFile()
526 bool changed =
false;
527 for (
auto &client : clients)
529 if (client.hasSpecifiedVoiceCapabilities()) {
continue; }
534 client.setVoiceCapabilities(vc);
536 if (!changed) {
return; }
540 CAirspaceMonitor::Readiness &CAirspaceMonitor::addMatchingReadinessFlag(
const CCallsign &callsign,
543 Readiness &readiness = m_readiness[callsign].addFlag(mrf);
547 void CAirspaceMonitor::sendReadyForModelMatching(
const CCallsign &callsign, MatchingReadinessFlag rf)
549 if (!this->isConnectedAndNotShuttingDown()) {
return; }
550 Q_ASSERT_X(!callsign.
isEmpty(), Q_FUNC_INFO,
"missing callsign");
553 Readiness &readiness = this->addMatchingReadinessFlag(callsign, rf);
556 const qint64 ageMs = readiness.getAgeMs();
557 if (readiness.wasMatchingSent() && readiness.getAgeMs() < MMMaxAgeThresholdMs) {
return; }
563 const bool complete = validRemoteCs && minSituations &&
564 (readiness.receivedAll() ||
572 if (rf !=
Verified && validRemoteCs && ageMs <= MMMaxAgeMs && !complete)
574 static const QString ws(
"Wait for further data, '%1' age: %2ms ts: %3");
575 static const QString format(
"hh:mm:ss.zzz");
576 if (!revLogEnabled.testFlag(RevLogSimplifiedInfo))
580 ws.arg(readiness.toQString()).arg(ageMs).arg(QDateTime::currentDateTimeUtc().toString(format)));
583 const QPointer<CAirspaceMonitor> myself(
this);
596 if (this->recallFsInnPacket(callsign)) {
return; }
611 static const QString readyForMatching(
612 "Ready (%1) for matching callsign '%2' with model type '%3', ICAO: '%4' '%5'");
615 const QString readyMsg = readyForMatching.arg(readiness.toQString(), callsign.
toQString(),
627 callsign,
"Ignoring this aircraft, not found in range list, disconnected, or no callsign",
630 m_readiness.remove(callsign);
634 void CAirspaceMonitor::verifyReceivedIcaoData(
const CCallsign &callsign)
636 if (callsign.
isEmpty() || !this->isAircraftInRange(callsign)) {
return; }
639 Readiness &readiness = m_readiness[callsign];
640 if (readiness.wasMatchingSent()) {
return; }
641 if (readiness.wasVerified())
643 CLogMessage(
this).
warning(u
"Verfied ICAO data of '%1' again, using it as it is! Most likely incomplete "
644 u
"data from the other client")
646 this->sendReadyForModelMatching(callsign,
Verified);
653 if (!readiness.receivedIcaoCodes())
655 CLogMessage(
this).
info(u
"Query ICAO codes for '%1' again") << callsign;
656 this->sendInitialPilotQueries(callsign,
true,
true);
660 const QPointer<CAirspaceMonitor> myself(
this);
664 this->verifyReceivedIcaoData(callsign);
670 CLogMessage(
this).
info(u
"Verified '%1' again, has ICAO codes, ready for matching!") << callsign;
671 this->sendReadyForModelMatching(callsign,
Verified);
674 void CAirspaceMonitor::onAtcPositionUpdate(
const CCallsign &callsign,
const CFrequency &frequency,
679 if (!this->isConnectedAndNotShuttingDown()) {
return; }
682 if (stationsWithCallsign.
isEmpty())
687 if (this->getConnectedServer().getEcosystem() == CEcosystem::vatsim())
702 this->sendInitialAtcQueries(callsign);
713 vm.
addValue(CAtcStation::IndexFrequency, frequency);
714 vm.
addValue(CAtcStation::IndexPosition, position);
715 vm.
addValue(CAtcStation::IndexRange, range);
716 const int changed = m_atcStationsOnline.
applyIfCallsign(callsign, vm,
true);
721 void CAirspaceMonitor::onAtcControllerDisconnected(
const CCallsign &callsign)
724 if (!this->isConnectedAndNotShuttingDown()) {
return; }
739 if (!this->isConnectedAndNotShuttingDown() || callsign.
isEmpty())
return;
746 void CAirspaceMonitor::onAtisLogoffTimeReceived(
const CCallsign &callsign,
const QString &zuluTime)
749 if (!this->isConnectedAndNotShuttingDown()) {
return; }
751 if (zuluTime.length() == 5)
755 QStringView zuluTimeView(zuluTime);
757 zuluTimeView.chop(1);
760 const int h = zuluTimeView.left(2).toInt(&ok);
762 const int m = zuluTimeView.right(2).toInt(&ok);
764 QDateTime logoffDateTime = QDateTime::currentDateTimeUtc();
765 logoffDateTime.setTime(QTime(h, m));
768 this->updateOnlineStation(callsign, vm);
772 void CAirspaceMonitor::onCustomFSInnPacketReceived(
const CCallsign &callsign,
const QString &airlineIcaoDesignator,
773 const QString &aircraftIcaoDesignator,
774 const QString &combinedAircraftType,
const QString &modelString)
781 if (!callsign.
isValid()) {
return; }
782 if (!this->isConnectedAndNotShuttingDown()) {
return; }
786 if (!isAircraft && !isAtc)
789 const FsInnPacket fsInn(aircraftIcaoDesignator, airlineIcaoDesignator, combinedAircraftType, modelString);
790 m_tempFsInnPackets[callsign] = fsInn;
806 reverseLookupEnabled.testFlag(RevLogEnabled) ? &reverseLookupMessages :
nullptr;
808 CCallsign::addLogDetailsToList(
809 pReverseLookupMessages, callsign,
810 QStringLiteral(
"FsInn data from network: aircraft '%1', airline '%2', model '%3', combined '%4'")
811 .arg(aircraftIcaoDesignator, airlineIcaoDesignator, modelString, combinedAircraftType));
813 QString usedModelString = modelString;
818 usedModelString.clear();
819 CCallsign::addLogDetailsToList(
820 pReverseLookupMessages, callsign,
821 QStringLiteral(
"FsInn modelstring '%1' ignored because of setuo").arg(modelString));
827 usedModelString.clear();
828 CCallsign::addLogDetailsToList(
829 pReverseLookupMessages, callsign,
830 QStringLiteral(
"FsInn modelstring ignored, as modelstring '%1' is not known").arg(modelString));
835 if (!usedModelString.isEmpty())
837 this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, QString(),
839 pReverseLookupMessages);
846 void CAirspaceMonitor::onIcaoCodesReceived(
const CCallsign &callsign,
const QString &aircraftIcaoDesignator,
847 const QString &airlineIcaoDesignator,
const QString &livery)
850 if (!this->isConnectedAndNotShuttingDown()) {
return; }
851 if (CBuildConfig::isLocalDeveloperDebugBuild())
855 if (!callsign.
isValid()) {
return; }
861 reverseLookupEnabled.testFlag(RevLogEnabled) ? &reverseLookupMessages :
nullptr;
862 CCallsign::addLogDetailsToList(pReverseLookupMessages, callsign,
863 QStringLiteral(
"Data from network: aircraft '%1', airline '%2', livery '%3'")
864 .arg(aircraftIcaoDesignator, airlineIcaoDesignator, livery),
868 this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery,
870 pReverseLookupMessages);
874 emit this->requestedNewAircraft(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery);
877 CAircraftModel CAirspaceMonitor::reverseLookupModelWithFlightplanData(
878 const CCallsign &callsign,
const QString &aircraftIcaoString,
const QString &airlineIcaoString,
883 CCallsign::addLogDetailsToList(
884 log, callsign, QStringLiteral(
"Reverse lookup (with FP data), model set count: %1").arg(modelSetCount),
888 const bool hasAnyId = ids.
hasAnyId();
896 if (!modelString.isEmpty())
909 CCallsign::addLogDetailsToList(
910 log, callsign, QStringLiteral(
"Reverse lookup of livery string '%1' disabled").arg(liveryString));
925 CCallsign::addLogDetailsToList(
927 QStringLiteral(
"Using DB livery %1 and aircraft ICAO %2 to create model")
933 CAircraftModel(modelString, type,
"By DB livery and aircraft ICAO", aircraftIcao, livery);
942 const bool knownAircraftIcao =
947 CCallsign::addLogDetailsToList(
949 QStringLiteral(
"Fuzzy search among airline aircraft because '%1' is not known ICAO designator")
950 .arg(aircraftIcaoString));
963 QString airlineNameLookup;
964 QString telephonyLookup;
965 QString telephonyFromFp;
966 QString airlineNameFromFp;
967 QString airlineIcaoFromFp;
971 CCallsign::addLogDetailsToList(log, callsign,
972 QStringLiteral(
"No flight plan remarks, skipping FP resolution"));
976 CCallsign::addLogDetailsToList(log, callsign,
977 QStringLiteral(
"FP remarks: '%1'").arg(fpRemarks.
getRemarks()));
978 CCallsign::addLogDetailsToList(
979 log, callsign, QStringLiteral(
"FP rem.parsed: '%1'").arg(fpRemarks.
toQString(
true)));
991 if (!airlineNameLookup.isEmpty())
993 CCallsign::addLogDetailsToList(
995 QStringLiteral(
"Using resolved airline name '%1' found by FP name '%2'")
996 .arg(airlineNameLookup, airlineNameFromFp),
999 if (!telephonyLookup.isEmpty())
1001 CCallsign::addLogDetailsToList(
1003 QStringLiteral(
"Using resolved telephony designator '%1' found by FP telephoy '%2'")
1004 .arg(telephonyLookup, telephonyFromFp),
1015 callsign, airlineIcaoString, airlineIcaoFromFp,
true, airlineNameFromFp, telephonyFromFp, modelSet,
1026 if (!airlineNameLookup.isEmpty()) { airlineIcao.
setName(airlineNameLookup); }
1034 CCallsign::addLogDetailsToList(log, callsign,
1035 QStringLiteral(
"Used aircraft ICAO: '%1'").arg(aircraftIcao.
toQString(
true)),
1037 CCallsign::addLogDetailsToList(log, callsign,
1038 QStringLiteral(
"Used airline ICAO: '%1'").arg(airlineIcao.
toQString(
true)),
1043 modelString, setup, modelSet, type, log);
1059 CCallsign::addLogDetailsToList(
1060 log, callsign, QStringLiteral(
"Matching script: Re-run reverseLookupModelWithFlightplanData"),
1062 return CAirspaceMonitor::reverseLookupModelWithFlightplanData(
1066 lookupModel = rv.
model;
1067 CCallsign::addLogDetailsToList(log, callsign,
1068 QStringLiteral(
"Matching script: Using model from matching script"),
1072 else { CCallsign::addLogDetailsToList(log, callsign, QStringLiteral(
"No reverse lookup script used")); }
1082 Q_ASSERT_X(!callsign.
isEmpty(), Q_FUNC_INFO,
"Missing callsign");
1087 newAircraft.setRendered(
false);
1088 newAircraft.calculcateAndUpdateRelativeDistanceAndBearing(
1091 if (this->getConnectedServer().getEcosystem() == CEcosystem::vatsim())
1098 const QPointer<CAirspaceMonitor> myself(
this);
1102 this->verifyReceivedIcaoData(callsign);
1120 bool readyForModelMatching)
1122 if (aircraft.
isEmpty()) {
return; }
1126 QPointer<CAirspaceMonitor> myself(
this);
1130 if (!myself) {
return; }
1131 myself->addNewAircraftInRange(ac);
1135 m_readiness.remove(cs);
1137 myself->sendReadyForModelMatching(cs, ready);
1143 bool skipEqualValues,
bool sendSignal)
1145 const int c = m_atcStationsOnline.
applyIfCallsign(callsign, vm, skipEqualValues);
1152 if (situation.
isNull()) {
return false; }
1153 if (m_maxDistanceNM < 0) {
return true; }
1154 const int distanceNM =
1156 if (distanceNM > m_maxDistanceNMHysteresis)
1161 return distanceNM <= m_maxDistanceNM;
1164 bool CAirspaceMonitor::recallFsInnPacket(
const CCallsign &callsign)
1166 if (!m_tempFsInnPackets.contains(callsign)) {
return false; }
1167 const FsInnPacket packet = m_tempFsInnPackets[callsign];
1168 m_tempFsInnPackets.remove(callsign);
1169 this->onCustomFSInnPacketReceived(callsign, packet.airlineIcaoDesignator, packet.aircraftIcaoDesignator,
1170 packet.combinedCode, packet.modelString);
1175 const CCallsign &callsign,
const QString &aircraftIcao,
const QString &airlineIcao,
const QString &livery,
1184 CAircraftModel model = this->reverseLookupModelWithFlightplanData(callsign, aircraftIcao, airlineIcao,
1185 livery, modelString, modelType, log);
1207 if (situations.
size() < 3) {
return false; }
1212 return extrapolateElevation(situations.
front(), old, older, change);
1215 bool CAirspaceMonitor::extrapolateElevation(
CAircraftSituation &situationToBeUpdated,
1229 if (oldSituation.
isNull() || olderSituation.
isNull()) {
return false; }
1231 if (oldChange.
isNull()) {
return false; }
1236 const double deltaAltFt = qAbs(situationToBeUpdated.
getAltitude().
value(CLengthUnit::ft()) -
1238 if (deltaAltFt <= CAircraftSituation::allowedAltitudeDeviation().value(CLengthUnit::ft()))
1242 CAircraftSituation::Extrapolated);
1254 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1257 Q_ASSERT_X(!callsign.
isEmpty(), Q_FUNC_INFO,
"Empty callsign");
1259 if (this->isCopilotAircraft(callsign)) {
return; }
1262 const bool validMaxRange = this->handleMaxRange(situation);
1264 if (!validMaxRange && !existsInRange) {
return; }
1273 if (!existsInRange && validMaxRange)
1276 const bool hasFsInnPacket = m_tempFsInnPackets.contains(callsign);
1282 this->addNewAircraftInRange(aircraft);
1283 this->sendInitialPilotQueries(callsign,
true, !hasFsInnPacket);
1286 const CClient client(callsign);
1289 else if (existsInRange)
1293 vm.
addValue(CSimulatedAircraft::IndexTransponder, transponder);
1294 vm.
addValue(CSimulatedAircraft::IndexSituation, situation);
1295 vm.
addValue(CSimulatedAircraft::IndexRelativeDistance, this->calculateDistanceToOwnAircraft(situation));
1296 vm.
addValue(CSimulatedAircraft::IndexRelativeBearing, this->calculateBearingToOwnAircraft(situation));
1301 void CAirspaceMonitor::onAircraftInterimUpdateReceived(
const CAircraftSituation &situation)
1304 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1309 Q_ASSERT_X(!callsign.
isEmpty(), Q_FUNC_INFO,
"Empty callsign");
1311 if (isCopilotAircraft(callsign)) {
return; }
1314 if (CBuildConfig::isLocalDeveloperDebugBuild())
1325 if (history.
isEmpty()) {
return; }
1329 interimSituation.setCurrentUtcTime();
1336 if (samePosition) {
return; }
1340 this->calculateDistanceToOwnAircraft(interimSituation),
1341 this->calculateBearingToOwnAircraft(interimSituation));
1348 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1353 Q_ASSERT_X(!callsign.
isEmpty(), Q_FUNC_INFO,
"Empty callsign");
1355 if (isCopilotAircraft(callsign)) {
return; }
1358 if (CBuildConfig::isLocalDeveloperDebugBuild())
1370 if (history.
empty()) {
return; }
1374 visualSituation.setCurrentUtcTime();
1381 if (samePosition) {
return; }
1385 this->calculateDistanceToOwnAircraft(visualSituation),
1386 this->calculateBearingToOwnAircraft(visualSituation));
1389 void CAirspaceMonitor::onAircraftSimDataUpdateReceived(
const CAircraftSituation &situation,
1391 const QString &aircraftIcao,
const QString &airlineIcao)
1393 onAircraftUpdateReceived(situation,
CTransponder(2000, CTransponder::ModeC));
1399 onIcaoCodesReceived(situation.
getCallsign(), aircraftIcao, airlineIcao, airlineIcao);
1410 if (newStatus == CConnectionStatus::Connecting && m_fsdClient)
1414 const CLength maxRange(isVatsim ? 125 : -1, CLengthUnit::NM());
1421 void CAirspaceMonitor::onPilotDisconnected(
const CCallsign &callsign)
1426 this->removeFromAircraftCachesAndLogs(callsign);
1432 void CAirspaceMonitor::onFrequencyReceived(
const CCallsign &callsign,
const CFrequency &frequency)
1442 void CAirspaceMonitor::onRevBAircraftConfigReceived(
const CCallsign &callsign,
const QString &config,
1443 qint64 currentOffsetMs)
1448 if (callsign.
isEmpty()) {
return; }
1450 unsigned long pp = 0;
1452 pp = config.toULong(&ok, 10);
1454 bool gear = (pp & 1U);
1455 bool landLight = (pp & 2U);
1456 bool navLight = (pp & 4U);
1457 bool strobeLight = (pp & 8U);
1458 bool beaconLight = (pp & 16U);
1459 bool taxiLight = (pp & 32U);
1460 bool engine1Running = (pp & 64U);
1461 bool engine2Running = (pp & 128U);
1462 bool engine3Running = (pp & 256U);
1463 bool engine4Running = (pp & 512U);
1500 if (client.
hasCapability(CClient::FsdWithAircraftConfig)) {
return; }
1505 void CAirspaceMonitor::onAircraftConfigReceived(
const CCallsign &callsign,
const QJsonObject &jsonObject,
1506 qint64 currentOffsetMs)
1510 if (callsign.
isEmpty()) {
return; }
1518 if (client.
hasCapability(CClient::FsdWithAircraftConfig)) {
return; }
1524 bool allowTestOffset)
1528 if (callsign.
isEmpty()) {
return situation; }
1532 bool needToRequestElevation =
false;
1560 CSpeed rotateSpeed(
nullptr);
1562 if (!rotateSpeed.
isNull())
1564 rotateSpeed *= 1.25;
1573 if (!changesBeforeStoring.
isNull())
1576 if (canLikelySkipNearGround) {
break; }
1581 using namespace std::chrono_literals;
1595 CElevationPlane::singlePointRadius()));
1597 needToRequestElevation = ep.
isNull();
1598 Q_ASSERT_X(needToRequestElevation || !ep.
getRadius().
isNull(), Q_FUNC_INFO,
"null radius");
1617 bool fromNonMoving =
false;
1618 bool triedExtrapolation =
false;
1619 bool couldNotExtrapolate =
false;
1624 if (averagePlane.
isNull())
1627 situation, CElevationPlane::minorAirportRadius(), 2, 3);
1628 fromNonMoving =
true;
1632 if (!averagePlane.
isNull())
1635 if (fromNonMoving) { m_foundInNonMovingAircraft++; }
1636 else { m_foundInElevationsOnGnd++; }
1642 if (situationsBeforeStoring.
size() > 1)
1644 const bool extrapolated =
1645 extrapolateElevation(correctedSituation, situationsBeforeStoring[0],
1646 situationsBeforeStoring[1], changesBeforeStoring);
1647 triedExtrapolation =
true;
1648 couldNotExtrapolate = !extrapolated;
1657 if (CBuildConfig::isLocalDeveloperDebugBuild())
1660 SWIFT_VERIFY_X(needToRequestElevation, Q_FUNC_INFO,
"Request should already be set");
1662 needToRequestElevation =
true;
1664 Q_UNUSED(triedExtrapolation)
1665 Q_UNUSED(couldNotExtrapolate)
1670 if (CBuildConfig::isLocalDeveloperDebugBuild())
1673 "Suspicious elevation");
1689 else if (client.
hasCapability(CClient::FsdWithAircraftConfig))
1701 if (!cg.
isNull()) { correctedSituation.
setCG(cg); }
1708 if (needToRequestElevation && !canLikelySkipNearGround)
1720 Q_UNUSED(needToRequestElevation)
1721 return correctedSituation;
1724 void CAirspaceMonitor::sendInitialAtcQueries(
const CCallsign &callsign)
1726 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1729 m_fsdClient->sendClientQueryCapabilities(callsign);
1733 void CAirspaceMonitor::queryAllOnlineAtcStations()
1735 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1740 if (cs.
isEmpty()) {
continue; }
1745 bool CAirspaceMonitor::sendNextStaggeredAtisQuery()
1747 if (m_queryAtis.isEmpty()) {
return false; }
1748 if (!this->isConnectedAndNotShuttingDown()) {
return false; }
1749 const CCallsign cs = m_queryAtis.dequeue();
1755 void CAirspaceMonitor::sendInitialPilotQueries(
const CCallsign &callsign,
bool withIcaoQuery,
bool withFsInn)
1757 if (!this->isConnectedAndNotShuttingDown()) {
return; }
1764 m_fsdClient->sendClientQueryCapabilities(callsign);
1768 bool CAirspaceMonitor::sendNextStaggeredPilotDataQuery()
1770 if (m_queryPilot.isEmpty()) {
return false; }
1771 if (!this->isConnectedAndNotShuttingDown()) {
return false; }
1772 const CCallsign cs = m_queryPilot.dequeue();
1783 bool CAirspaceMonitor::isConnected()
const
1788 bool CAirspaceMonitor::isConnectedAndNotShuttingDown()
const
1791 return this->isConnected();
1794 const CServer &CAirspaceMonitor::getConnectedServer()
const
1797 if (!this->isConnected()) {
return empty; }
1801 const CEcosystem &CAirspaceMonitor::getCurrentEcosystem()
const
1806 bool CAirspaceMonitor::supportsVatsimDataFile()
const
1808 const bool dataFile =
1827 bool CAirspaceMonitor::isCopilotAircraft(
const CCallsign &callsign)
const
1838 CAirspaceMonitor::FsInnPacket::FsInnPacket(
const QString &aircraftIcaoDesignator,
1839 const QString &airlineIcaoDesignator,
const QString &combinedCode,
1840 const QString &modelString)
1841 : aircraftIcaoDesignator(aircraftIcaoDesignator.trimmed().toUpper()),
1842 airlineIcaoDesignator(airlineIcaoDesignator.trimmed().toUpper()),
1843 combinedCode(combinedCode.trimmed().toUpper()), modelString(modelString.trimmed())
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
static swift::misc::simulation::CAircraftModel reverseLookupModelId(int id, const swift::misc::aviation::CCallsign &callsign, swift::misc::CStatusMessageList *log)
Try to find model by id.
static swift::misc::simulation::CAircraftModel reverseLookupModelStringInDB(const QString &modelString, const swift::misc::aviation::CCallsign &callsign, bool doLookupString, swift::misc::CStatusMessageList *log)
Try to find model by model string.
static swift::misc::aviation::CAirlineIcaoCode failoverValidAirlineIcaoDesignatorModelsFirst(const swift::misc::aviation::CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, const QString &airlineName, const QString &airlineTelephony, const swift::misc::simulation::CAircraftModelList &models, swift::misc::CStatusMessageList *log=nullptr)
Return an valid airline ICAO code from a given model list and use webservices if NOT found.
static QString reverseLookupTelephonyDesignator(const QString &candidate, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Lookup of telephony designator.
static swift::misc::aviation::CAirlineIcaoCode reverseLookupAirlineIcao(const swift::misc::aviation::CAirlineIcaoCode &icaoPattern, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Try to find the DB corresponding ICAO code.
static QString reverseLookupAirlineName(const QString &candidate, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Lookup of airline name.
static swift::misc::simulation::MatchingScriptReturnValues reverseLookupScript(const swift::misc::simulation::CAircraftModel &inModel, const swift::misc::simulation::CAircraftMatcherSetup &setup, const swift::misc::simulation::CAircraftModelList &modelSet, swift::misc::CStatusMessageList *log)
Run the network reverse lookup script.
static bool isKnownModelString(const QString &candidate, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Is this aircraft designator known?
static swift::misc::aviation::CAircraftIcaoCode searchAmongAirlineAircraft(const QString &icaoString, const swift::misc::aviation::CAirlineIcaoCode &airline, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Search among the airline aircraft.
static swift::misc::simulation::CAircraftModel reverseLookupModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftIcaoCode &networkAircraftIcao, const swift::misc::aviation::CAirlineIcaoCode &networkAirlineIcao, const QString &networkLiveryInfo, const QString &networkModelString, const swift::misc::simulation::CAircraftMatcherSetup &setup, const swift::misc::simulation::CAircraftModelList &modelSet, swift::misc::simulation::CAircraftModel::ModelType type, swift::misc::CStatusMessageList *log)
Try to find the corresponding data in DB and get best information for given data.
static int reverseLookupByIds(const swift::misc::simulation::DBTripleIds &ids, swift::misc::aviation::CAircraftIcaoCode &aircraftIcao, swift::misc::aviation::CLivery &livery, const swift::misc::aviation::CCallsign &logCallsign, swift::misc::CStatusMessageList *log=nullptr)
Lookup by ids.
static bool isKnownAircraftDesignator(const QString &candidate, const swift::misc::aviation::CCallsign &callsign={}, swift::misc::CStatusMessageList *log=nullptr)
Is this aircraft designator known?
Class monitoring and analyzing (closest aircraft, outdated aircraft / watchdog) airspace in backgroun...
void timeoutAircraft(const swift::misc::aviation::CCallsign &callsign)
Callsign has timed out.
void timeoutAtc(const swift::misc::aviation::CCallsign &callsign)
Callsign has timed out.
void airspaceAircraftSnapshot(const swift::misc::simulation::CAirspaceAircraftSnapshot &snapshot)
New aircraft snapshot.
swift::misc::simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const
Get the latest snapshot.
misc::network::CUserList getUsers() const
Returns the list of users we know about.
MatchingReadinessFlag
Matching readiness.
@ Verified
verified already
@ ReceivedFsInnPacket
FsInn pcket received.
@ ReadyForMatchingSent
Read for matching sending.
@ ReceivedIcaoCodes
ICAO codes received.
virtual swift::misc::aviation::CAircraftSituation storeAircraftSituation(const swift::misc::aviation::CAircraftSituation &situation, bool allowTestOffset=true)
Store an aircraft situation under consideration of gnd.flags/CG and elevation.
void requestAtisUpdates()
Request to update ATC stations' ATIS data from the network.
misc::aviation::CAtcStationList getAtcStationsOnlineRecalculated()
Recalculate distance to own aircraft.
misc::aviation::CAtcStationList getAtcStationsOnline() const
Returns the current online ATC stations.
static const QStringList & getLogCategories()
Log categories.
misc::aviation::CFlightPlanRemarks tryToGetFlightPlanRemarks(const misc::aviation::CCallsign &callsign) const
Try to get flight plan remarks.
void atcStationDisconnected(const swift::misc::aviation::CAtcStation &station)
ATC station disconnected.
misc::network::CUserList getUsersForCallsigns(const misc::aviation::CCallsignSet &callsigns) const
Returns a list of the users corresponding to the given callsigns.
void requestAircraftDataUpdates()
Request to update other clients' data from the network.
misc::aviation::CFlightPlan loadFlightPlanFromNetwork(const misc::aviation::CCallsign &callsign)
Returns the loaded flight plan for the given callsign.
void readyForModelMatching(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)
Ready for model matching.
void changedAtisReceived(const swift::misc::aviation::CCallsign &callsign)
An ATIS has been received.
void changedAtcStationsOnline()
Online ATC stations were changed.
int reInitializeAllAircraft()
Re-init all aircrft.
misc::aviation::CAtcStation getAtcStationForComUnit(const misc::aviation::CComSystem &comSystem) const
Returns the closest ATC station operating on the given frequency, if any.
static QString enumToString(MatchingReadiness r)
As string.
void setMaxRange(const swift::misc::physical_quantities::CLength &range)
Max (FSD) range.
void clear()
Clear the contents.
static void registerHelp()
Register help.
static const QString & enumFlagToString(MatchingReadinessFlag r)
As string.
void gracefulShutdown()
Gracefully shut down, e.g. for thread safety.
bool updateFastPositionEnabled(const misc::aviation::CCallsign &callsign, bool enableFastPositonUpdates)
Members not implenented or fully implenented by CRemoteAircraftProvider.
misc::simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const
Members not implenented or fully implenented by CRemoteAircraftProvider.
bool isDeveloperFlagSet() const
Running with dev.flag?
bool hasWebDataServices() const
Web data services available?
const context::IContextNetwork * getIContextNetwork() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::network::CUserList getUsersForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Users by callsign.
void updateWithVatsimDataFileData(swift::misc::simulation::CSimulatedAircraft &aircraftToBeUdpated) const
Update with web data.
swift::misc::network::CVoiceCapabilities getVoiceCapabilityForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Voice capabilities for given callsign.
swift::misc::simulation::CAircraftModel getModelForModelString(const QString &modelString) const
Model for model string if any.
vatsim::CVatsimDataFileReader * getVatsimDataFileReader() const
Data file reader.
swift::misc::aviation::CAtcStationList getAtcStationsForCallsign(const swift::misc::aviation::CCallsign &callsign) const
ATC stations by callsign.
virtual swift::misc::network::CLoginMode getLoginMode() const =0
Login mode.
FSD client Todo: Send (interim) data updates automatically Todo Check ':' in FSD messages....
void sendClientQueryCom1Freq(const swift::misc::aviation::CCallsign &callsign)
void sendClientQueryAtis(const swift::misc::aviation::CCallsign &callsign)
const swift::misc::network::CServer & getServer() const
Get the server.
void sendPlaneInfoRequest(const swift::misc::aviation::CCallsign &receiver)
void sendClientQueryRealName(const swift::misc::aviation::CCallsign &callsign)
void addInterimPositionReceiver(const swift::misc::aviation::CCallsign &receiver)
Interim positions.
void sendClientQueryServer(const swift::misc::aviation::CCallsign &callsign)
void removeInterimPositionReceiver(const swift::misc::aviation::CCallsign &receiver)
Interim positions.
void sendClientQueryAircraftConfig(const swift::misc::aviation::CCallsign &callsign)
void sendClientQueryFlightPlan(const swift::misc::aviation::CCallsign &callsign)
void sendPlaneInfoRequestFsinn(const swift::misc::aviation::CCallsign &callsign)
swift::misc::network::CConnectionStatus getConnectionStatus() const
Connection status.
swift::misc::aviation::CFlightPlanRemarks getFlightPlanRemarksForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Flight plan remarks for callsign.
T get() const
Get a copy of the current value.
void remove(const T &object)
Efficient remove using the find and erase of the implementation container. Typically O(log n).
bool isEmpty() const
Synonym for empty.
Utility class which blocks until a signal is emitted or timeout reached.
bool exec(int timeoutMs)
Begin processing events until the timeout or stop condition occurs.
void stopWhen(const T *sender, F signal)
Event loop will stop if the given signal is received.
Value object encapsulating information identifying a component of a modular distributed swift process...
static const CIdentifier & null()
Null (empty) identifier.
static const QString & matching()
Matching.
static const QString & network()
Network specific, but not necessarily one specific flight network.
Class for emitting a log message.
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
Specialized value object compliant map for variants, based on indexes.
void addValue(const CPropertyIndex &index, const CVariant &value)
Add a value.
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
size_type size() const
Returns number of elements in the sequence.
const_reference frontOrDefault() const
Access the first element, or a default-initialized value if the sequence is empty.
bool empty() const
Returns true if the sequence is empty.
void push_back(const T &value)
Appends an element at the end of the sequence.
reference front()
Access the first element.
void clear()
Removes all elements in the sequence.
bool isEmpty() const
Synonym for empty.
Utility methods for simple line parsing used with the command line.
Streamable status message, e.g.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
static bool isInThisThread(const QObject *toBeTested)
Is the current thread the object's thread?
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
static CVariant from(T &&value)
Synonym for fromValue().
void setCurrentUtcTime()
Set the current time as timestamp.
OBJ latestObject() const
Latest object.
void setTimeOffsetMs(qint64 offset)
Milliseconds to add to timestamp for interpolation.
Value object encapsulating a list of aircraft engines.
void initEngines(int engineNumber, bool on)
Init some engines.
void setEngineOn(int engineNumber, bool on)
Set engine on/off.
Value object for ICAO classification.
bool hasDesignator() const
Aircraft designator?
bool isVtol() const
Is VTOL aircraft (helicopter, tilt wing)
QString getDesignatorDbKey() const
Designator and DB key.
void guessModelParameters(physical_quantities::CLength &guessedCGOut, physical_quantities::CSpeed &guessedVRotateOut) const
Guess aircraft model parameters.
Value object encapsulating information about aircraft's lights.
void setStrobeOn(bool on)
Set strobe lights.
void setBeaconOn(bool on)
Set beacon lights.
void setTaxiOn(bool on)
Set taxi lights.
void setNavOn(bool on)
Set nav lights.
void setLandingOn(bool on)
Set landing lights.
Value object encapsulating information of aircraft's parts.
QJsonObject toIncrementalJson() const
Incremental JSON object.
void setEngines(const CAircraftEngineList &engines)
Set engines.
void setGearDown(bool down)
Set gear down.
void setPartsDetails(PartsDetails details)
Set parts details.
void setLights(const CAircraftLights &lights)
Set aircraft lights.
QJsonObject toFullJson() const
Full JSON Object.
Value object encapsulating a list of aircraft parts.
Value object about changes in situations.
bool isConstAscending() const
Constantly ascending?
bool hasAltitudeDevWithinAllowedRange() const
Altitude within CAircraftSituation::allowedAltitudeDeviation range.
bool hasElevationDevWithinAllowedRange() const
Elevation within CAircraftSituation::allowedAltitudeDeviation range.
bool isConstOnGround() const
Are all situations on ground?
Value object encapsulating information of an aircraft's situation.
const CAltitude & getGroundElevation() const
Elevation of the ground directly beneath.
void resetGroundElevation()
Reset ground elevation.
bool hasGroundElevation() const
Is ground elevation value available.
void setCG(const physical_quantities::CLength &cg)
Set CG.
physical_quantities::CLength getDistancePerTime250ms(const physical_quantities::CLength &min=physical_quantities::CLength::null()) const
Distance per milliseconds (250ms)
bool setGroundElevation(const aviation::CAltitude &altitude, GndElevationInfo info, bool transferred=false)
Elevation of the ground directly beneath at the given situation.
bool transferGroundElevationFromMe(CAircraftSituation &transferToSituation, const physical_quantities::CLength &radius=geo::CElevationPlane::singlePointRadius()) const
Transfer from "this" situation to otherSituation.
aviation::COnGroundInfo getOnGroundInfo() const
On ground info.
bool isOtherElevationInfoBetter(GndElevationInfo otherInfo, bool transferred) const
Is given info better (more accurate)?
bool canLikelySkipNearGroundInterpolation() const
Situation looks like an aircraft not near ground.
const CCallsign & getCallsign() const
Corresponding callsign.
const physical_quantities::CSpeed & getGroundSpeed() const
Get ground speed.
const CAltitude & getAltitude() const
Get altitude.
physical_quantities::CLength getDistancePerTime(std::chrono::milliseconds, const physical_quantities::CLength &min=physical_quantities::CLength::null()) const
Distance per milliseconds.
virtual bool isNull() const
Null situation.
bool isMoving() const
Is moving? Means ground speed > epsilon.
void setOnGroundDetails(COnGroundInfo::OnGroundDetails details)
On ground details.
bool adjustGroundFlag(const CAircraftParts &parts, bool alwaysSetDetails, double timeDeviationFactor=0.1, qint64 *differenceMs=nullptr)
Transfer ground flag from parts.
List of aircraft situations.
CAircraftSituation findClosestElevationWithinRange(const geo::ICoordinateGeodetic &coordinate, const physical_quantities::CLength &range=geo::CElevationPlane::singlePointRadius()) const
CLosest elevation within given range.
Value object for ICAO classification.
void setTelephonyDesignator(const QString &telephony)
Telephony designator such as "Speedbird".
QString getDesignatorDbKey() const
Designator and DB key.
const QString & getDesignator() const
Get airline, e.g. "DLH".
bool hasValidDesignator() const
Airline designator available?
void setName(const QString &name)
Set name.
void setDesignator(const QString &icaoDesignator)
Set airline, e.g. "DLH".
Value object encapsulating information about an ATC station.
void setFrequency(const swift::misc::physical_quantities::CFrequency &frequency)
Set frequency.
const CCallsign & getCallsign() const
Get callsign.
void setCallsign(const CCallsign &callsign)
Set callsign.
void setPosition(const swift::misc::geo::CCoordinateGeodetic &position)
Set position.
bool setOnline(bool online)
Set online.
void setRange(const physical_quantities::CLength &range)
Set range.
Value object for a list of ATC stations.
CAtcStationList findIfComUnitTunedInChannelSpacing(const CComSystem &comUnit) const
Find 0..n stations tuned in frequency of COM unit (with channel spacing)
bool updateIfMessageChanged(const CInformationMessage &im, const CCallsign &callsign, bool overrideWithNewer)
Update if message changed.
Value object encapsulating information of a callsign.
bool isMaybeCopilotCallsign(const CCallsign &pilotCallsign) const
Returns true if this is a co-pilot callsign of pilot. The logic is that the callsign is the same as t...
bool hasSuffix() const
Suffix such as "_TWR"?
bool isEmpty() const
Is empty?
QString getAirlinePrefix() const
Airline suffix (e.g. DLH1234 -> DLH) if applicable.
bool isValid() const
Valid callsign?
Value object for a set of callsigns.
Value object for a flight plan.
bool wasSentOrLoaded() const
Flight plan already sent.
qint64 timeDiffSentOrLoadedMs() const
Received before n ms.
Value object encapsulating information about an airpot.
const CAirlineIcaoCode & getAirlineIcaoCode() const
Corresponding airline, if any.
const QString & getCombinedCode() const
Combined code.
OnGroundDetails getGroundDetails() const
Get ground details.
CONTAINER findByCallsign(const CCallsign &callsign) const
Find 0..n stations by callsign.
OBJ findFirstByCallsign(const CCallsign &callsign, const OBJ &ifNotFound={}) const
Find the first aircraft by callsign, if none return given one.
int applyIfCallsign(const CCallsign &callsign, const CPropertyIndexVariantMap &variantMap, bool skipEqualValues=true)
Apply for given callsign.
int removeByCallsign(const CCallsign &callsign)
Remove all objects with callsign.
bool containsCallsign(const CCallsign &callsign) const
Contains callsign?
QString getDbKeyAsString() const
DB key as string.
bool isLoadedFromDb() const
Loaded from DB.
bool hasValidDbKey() const
Has valid DB key.
Plane of same elevation, can be a single point or larger area (e.g. airport)
virtual bool isNull() const
Existing value?
const physical_quantities::CLength & getRadius() const
Radius.
bool isNaNVectorDouble() const
Check values.
physical_quantities::CLength calculateGreatCircleDistance(const ICoordinateGeodetic &otherCoordinate) const
Great circle distance.
bool isInfVectorDouble() const
Check values.
bool isValidVectorRange() const
Check values.
bool equalNormalVectorDouble(const std::array< double, 3 > &otherVector) const
Is equal? Epsilon considered.
physical_quantities::CAngle calculateBearing(const ICoordinateGeodetic &otherCoordinate) const
Initial bearing.
physical_quantities::CLength calculcateAndUpdateRelativeDistanceAndBearing(const geo::ICoordinateGeodetic &position)
Calculcate distance and bearing to plane, set it, and return distance.
void calculcateAndUpdateRelativeDistanceAndBearing(const ICoordinateGeodetic &position)
Calculate distances.
void sortByDistanceToReferencePosition()
If distance is already set, just sort container.
QString toQString(bool i18n=false) const
Cast as QString.
bool hasCapability(Capability capability) const
Has capability?
const QString & getQueriedModelString() const
Model.
void addCapability(Capability capability)
Add capability.
bool setUserCallsign(const swift::misc::aviation::CCallsign &callsign)
User's callsign.
Value object encapsulating a list of voice rooms.
virtual int removeClient(const aviation::CCallsign &callsign)
Remove client.
virtual int updateOrAddClient(const aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues=true)
Update or add a client.
virtual void markAsSwiftClient(const aviation::CCallsign &callsign)
Mark as other swift client.
virtual bool setOtherClient(const swift::misc::network::CClient &client)
Set client for its callsign.
virtual bool addNewClient(const CClient &client)
Add a new client, if existing nothing will be added.
virtual void setClients(const CClientList &clients)
Set other clients.
virtual CClientList getClients() const
clientprovider
virtual void clearClients()
Set other clients.
virtual CClient getClientOrDefaultForCallsign(const aviation::CCallsign &callsign) const
Other client for the given callsigns.
virtual bool autoAdjustCientGndCapability(const aviation::CAircraftSituation &situation)
Adjust gnd.flag capability from situation.
Value object encapsulating information about a connection status.
bool isConnected() const
Query status.
bool isDisconnected() const
Query status.
Ecosystem of server belonging together.
bool isSystem(System s) const
Is system?
@ Observer
Login as observer.
Value object encapsulating information of a server.
const CEcosystem & getEcosystem() const
Get the ecosystem.
Value object encapsulating information of a user.
bool setCallsign(const aviation::CCallsign &callsign)
Set associated callsign.
bool hasCallsign() const
Has associated callsign?
Value object encapsulating a list of voice rooms.
Value object encapsulating information for voice capabilities.
bool isUnknown() const
Is capability known.
Physical unit angle (radians, degrees)
Physical unit length (length)
bool isNegativeWithEpsilonConsidered() const
Value <= 0 epsilon considered.
int valueInteger(MU unit) const
As integer value.
PQ & switchUnit(const MU &newUnit)
Change unit, and convert value to maintain the same quantity.
bool isNull() const
Is quantity null?
double value(MU unit) const
Value in given unit.
bool isZeroEpsilonConsidered() const
Quantity value <= epsilon.
bool isReverseLookupModelString() const
Reverse lookup.
bool isReverseLookupSwiftLiveryIds() const
Reverse lookup.
bool doRunMsReverseLookupScript() const
Run the scripts.
Aircraft model (used by another pilot, my models on disk)
static DBTripleIds parseNetworkLiveryString(const QString &liveryString)
Split swift network string.
const aviation::CLivery & getLivery() const
Get livery.
const QString & getAircraftIcaoCodeDesignator() const
Aircraft ICAO code designator.
@ TypeFSInnData
model based on FSD ICAO data
@ TypeQueriedFromNetwork
model was queried by network protocol (ICAO data)
void setCallsign(const aviation::CCallsign &callsign)
Corresponding callsign if applicable.
const physical_quantities::CLength & getCG() const
Get center of gravity.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Aircraft ICAO code.
const QString & getModelTypeAsString() const
Model type.
const QString getAirlineIcaoCodeVDesignator() const
Airline ICAO code designator.
void updateMissingParts(const CAircraftModel &otherModel, bool dbModelPriority=true)
Update missing parts from another model.
Value object encapsulating a list of aircraft models.
Current situation in the skies analyzed.
Delegating class which can be directly used to access an.
aviation::CAircraftSituation getOwnAircraftSituation() const
Own aircraft's position.
aviation::CCallsign getOwnCallsign() const
Own aircraft's callsign.
swift::misc::geo::CCoordinateGeodetic getOwnAircraftPosition() const
Own aircraft's position.
CSimulatedAircraft getOwnAircraft() const
Own aircraft.
Implementaion of the interface, which can also be used for testing.
virtual bool isAircraftInRange(const aviation::CCallsign &callsign) const
Is aircraft in range?
virtual CSimulatedAircraftList getAircraftInRange() const
All remote aircraft.
virtual aviation::CAircraftSituation storeAircraftSituation(const aviation::CAircraftSituation &situation, bool allowTestAltitudeOffset=true)
Store an aircraft situation.
bool addNewAircraftInRange(const CSimulatedAircraft &aircraft)
Add new aircraft, ignored if aircraft already exists.
aviation::CAircraftSituation addTestAltitudeOffsetToSituation(const aviation::CAircraftSituation &situation) const
Add an offset for testing.
bool removeAircraft(const aviation::CCallsign &callsign)
Remove all aircraft in range.
virtual int remoteAircraftSituationsCount(const aviation::CCallsign &callsign) const
Number of remote aircraft situations for callsign.
virtual geo::CElevationPlane averageElevationOfNonMovingAircraft(const aviation::CAircraftSituation &reference, const physical_quantities::CLength &range, int minValues=1, int sufficientValues=2) const
Average elevation of aircraft in given range, which are NOT moving.
virtual aviation::CAircraftSituationList remoteAircraftSituations(const aviation::CCallsign &callsign) const
Rendered aircraft situations (per callsign, time history)
virtual aviation::CAircraftSituationChangeList remoteAircraftSituationChanges(const aviation::CCallsign &callsign) const
Aircraft changes.
int updateAircraftInRange(const aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues=true)
Update aircraft.
void storeAircraftParts(const aviation::CCallsign &callsign, const aviation::CAircraftParts &parts, bool removeOutdated)
Store an aircraft part.
bool updateAircraftInRangeDistanceBearing(const aviation::CCallsign &callsign, const aviation::CAircraftSituation &situation, const physical_quantities::CLength &distance, const physical_quantities::CAngle &bearing)
Update aircraft bearing, distance and situation.
virtual void rememberCGFromDB(const physical_quantities::CLength &cgFromDB, const aviation::CCallsign &callsign)
CG values from DB.
void removeReverseLookupMessages(const aviation::CCallsign &callsign)
Remove the lookup messages.
void addReverseLookupMessages(const aviation::CCallsign &callsign, const CStatusMessageList &messages)
Reverse lookup messages.
void airspaceAircraftSnapshot(const swift::misc::simulation::CAirspaceAircraftSnapshot &snapshot)
New aircraft snapshot.
virtual bool updateAircraftNetworkModel(const aviation::CCallsign &callsign, const CAircraftModel &model, const CIdentifier &originator)
Change network model.
virtual bool updateAircraftModel(const aviation::CCallsign &callsign, const CAircraftModel &model, const CIdentifier &originator)
Change model.
virtual physical_quantities::CLength getCGFromDB(const aviation::CCallsign &callsign) const
CG values from DB.
virtual bool updateFastPositionEnabled(const aviation::CCallsign &callsign, bool enableFastPositonUpdates)
Change fast position updates.
ReverseLookupLogging whatToReverseLog() const
What to log?
virtual ReverseLookupLogging isReverseLookupMessagesEnabled() const
Enabled reverse lookup logging?
virtual CAircraftModel getAircraftInRangeModelForCallsign(const aviation::CCallsign &callsign) const
Aircraft model for callsign.
virtual CSimulatedAircraft getAircraftInRangeForCallsign(const aviation::CCallsign &callsign) const
Aircraft for callsign.
virtual aviation::CAircraftPartsList remoteAircraftParts(const aviation::CCallsign &callsign) const
All parts (per callsign, time history)
virtual void enableReverseLookupMessages(ReverseLookupLogging enable)
Enable reverse lookup logging.
void removeAllAircraft()
Remove all aircraft in range.
void addReverseLookupMessage(const aviation::CCallsign &callsign, const CStatusMessage &message)
Reverse lookup messages.
void removedAircraft(const swift::misc::aviation::CCallsign &callsign)
An aircraft disappeared.
Comprehensive information of an aircraft.
void setCallsign(const aviation::CCallsign &callsign)
Set callsign.
bool hasModelString() const
Has model string?
void setSituation(const aviation::CAircraftSituation &situation)
Set situation. Won't overwrite the velocity unless it held the default value.
const network::CUser & getPilot() const
Get user.
const simulation::CAircraftModel & getNetworkModel() const
Get network model.
const aviation::CCallsign & getCallsign() const
Get callsign.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Get aircraft ICAO info.
bool hasValidCallsign() const
Valid callsign?
const simulation::CAircraftModel & getModel() const
Get model (model used for mapping)
void setTransponder(const aviation::CTransponder &transponder)
Set transponder.
const aviation::CAirlineIcaoCode & getAirlineIcaoCode() const
Airline ICAO code if any.
const QString & getModelString() const
Get model string.
Value object encapsulating a list of aircraft.
bool requestElevation(const geo::ICoordinateGeodetic &reference, const aviation::CCallsign &callsign)
Request elevation, there is no guarantee the requested elevation will be available in the provider.
physical_quantities::CLength getSimulatorOrDbCG(const aviation::CCallsign &callsign, const physical_quantities::CLength &dbCG) const
Get CG per callsign, NULL if not found.
geo::CElevationPlane averageElevationOfOnGroundAircraft(const aviation::CAircraftSituation &reference, const physical_quantities::CLength &range, int minValues, int sufficientValues) const
Average elevation of "on ground" cached values.
geo::CElevationPlane findClosestElevationWithinRange(const geo::ICoordinateGeodetic &reference, const physical_quantities::CLength &range) const
Find closest elevation (or return NULL)
Value object encapsulating a list of aircraft models.
virtual int getModelSetCount() const =0
Get the model set models count.
virtual CAircraftModelList getModelSet() const =0
Get the model set models.
Direct threadsafe in memory access to own aircraft.
bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Parse a given command line.
Backend services of the swift project, like dealing with the network or the simulators.
Generate data for testing purposes.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
bool hasAnyId() const
Any valid id?
swift::misc::simulation::CAircraftModel model
the model
bool runScriptAndModified() const
Did run the script with modified result.
bool runScriptAndRerun() const
Did run the script and re-run requested.
#define SWIFT_AUDIT_X(COND, WHERE, WHAT)
A weaker kind of verify.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.