6#include <QStringBuilder>
39using namespace swift::config;
41using namespace swift::misc::physical_quantities;
42using namespace swift::misc::aviation;
43using namespace swift::misc::network;
44using namespace swift::misc::geo;
45using namespace swift::misc::simulation;
46using namespace swift::misc::weather;
47using namespace swift::core::fsd;
48using namespace swift::core::vatsim;
50namespace swift::core::context
53 : IContextNetwork(mode, runtime)
81 m_requestAircraftDataTimer =
new QTimer(
this);
83 m_requestAircraftDataTimer->start(30 * 1000);
84 m_requestAircraftDataTimer->setObjectName(
"CContextNetwork::m_requestAircraftDataTimer");
86 m_requestAtisTimer =
new QTimer(
this);
88 m_requestAtisTimer->start(13 * 1000);
89 m_requestAtisTimer->setObjectName(
"CContextNetwork::m_requestAtisTimer");
92 m_staggeredMatchingTimer =
new QTimer(
this);
94 m_staggeredMatchingTimer->start(200);
95 m_staggeredMatchingTimer->setObjectName(
"CContextNetwork::m_staggeredMatchingTimer");
98 Q_ASSERT_X(this->
getRuntime()->getCContextOwnAircraft(), Q_FUNC_INFO,
99 "this and own aircraft context must be local");
100 Q_ASSERT_X(this->
getRuntime()->getCContextSimulator(), Q_FUNC_INFO,
101 "this and own simulator context must be local");
103 this->
getRuntime()->getCContextSimulator(), m_fsdClient,
this);
104 m_fsdClient->setClientProvider(m_airspace);
114 &CContextNetwork::onReadyForModelMatching);
123 if (this->canUseAirspaceMonitor())
125 m_airspace->setSimulationEnvironmentProvider(provider);
127 if (this->canUseFsd())
129 m_fsdClient->setSimulationEnvironmentProvider(provider);
137 if (!this->canUseAirspaceMonitor())
141 return m_airspace->remoteAircraftSituations(callsign);
146 if (!this->canUseAirspaceMonitor())
150 return m_airspace->remoteAircraftSituation(callsign, index);
156 if (!this->canUseAirspaceMonitor())
160 return m_airspace->remoteAircraftSituationsTimestampDifferenceMinMaxMean(callsign);
165 if (!this->canUseAirspaceMonitor())
169 return m_airspace->latestRemoteAircraftSituations();
174 Q_ASSERT(m_airspace);
175 return m_airspace->latestOnGroundProviderElevations();
180 if (!this->canUseAirspaceMonitor())
184 return m_airspace->remoteAircraftParts(callsign);
189 if (!this->canUseAirspaceMonitor())
193 return m_airspace->remoteAircraftPartsCount(callsign);
198 if (!this->canUseAirspaceMonitor())
202 return m_airspace->remoteAircraftSituationsCount(callsign);
207 if (!this->canUseAirspaceMonitor())
211 return m_airspace->isRemoteAircraftSupportingParts(callsign);
216 if (!this->canUseAirspaceMonitor())
220 return m_airspace->remoteAircraftSupportingParts();
225 if (!this->canUseAirspaceMonitor())
229 return m_airspace->remoteAircraftSituationChanges(callsign);
234 if (!this->canUseAirspaceMonitor())
238 return m_airspace->remoteAircraftSituationChangesCount(callsign);
244 std::function<
void(
const CCallsign &)> removedAircraftSlot,
247 Q_ASSERT_X(m_airspace, Q_FUNC_INFO,
"Missing airspace");
248 return m_airspace->connectRemoteAircraftProviderSignals(receiver, situationSlot, partsSlot, removedAircraftSlot,
249 aircraftSnapshotSlot);
261 m_fsdClient->gracefulShutdown();
262 m_fsdClient->setClientProvider(
nullptr);
263 m_fsdClient->deleteLater();
264 m_fsdClient =
nullptr;
269 m_airspace->gracefulShutdown();
270 m_airspace->deleteLater();
271 m_airspace =
nullptr;
276 bool sendLivery,
const QString &extraModelString,
277 bool sendModelString,
const CCallsign &partnerCallsign,
280 if (!this->canUseFsd())
283 u
"Invalid FSD state (shutdown)") };
294 u
"Invalid user credentials");
296 if (!this->ownAircraft().getAircraftIcaoCode().hasDesignator())
299 u
"Invalid ICAO data for own aircraft");
305 if (m_fsdClient->isConnected())
308 u
"Already connected");
313 u
"Pending connection, please wait");
318 m_fsdClient->setPartnerCallsign(
319 isValidPartnerCallsign(ownAircraft.getCallsign(), partnerCallsign) ? partnerCallsign :
CCallsign());
325 u
"No simulator connected or connected simulator not simulating. Falling back to observer mode");
333 extraLiveryString.
isEmpty() ? ownAircraft.getModel().getSwiftLiveryString(sim) : extraLiveryString;
334 const QString m = extraModelString.
isEmpty() ? ownAircraft.getModelString() : extraModelString;
340 sendModelString =
false;
343 m_currentMode = mode;
345 m_fsdClient->setCallsign(ownAircraft.getCallsign());
348 m_fsdClient->setSimType(sim);
350 m_fsdClient->setIcaoCodes(ownAircraft);
351 m_fsdClient->setLiveryAndModelString(l, sendLivery, m, sendModelString);
352 m_fsdClient->setClientName(sApp->swiftVersionChar());
355#ifdef SWIFT_VATSIM_SUPPORT
358 if (!getEnvironmentClientIdAndKey(clientId, clientKey))
361 clientId = CBuildConfig::vatsimClientId();
362 clientKey = CBuildConfig::vatsimPrivateKey();
365 m_fsdClient->setClientIdAndKey(
static_cast<quint16
>(clientId), clientKey.
toLocal8Bit());
370 m_fsdClient->setServer(server);
375 m_fsdClient->connectToServer();
382 if (!this->canUseFsd())
391 if (!this->canUseFsd())
404 if (!this->canUseFsd())
407 u
"Invalid FSD state (shutdown)") };
413 if (m_fsdClient->isConnected() || m_fsdClient->isPendingConnection())
415 m_fsdClient->disconnectFromServer();
417 u
"Connection terminating");
422 u
"Already disconnected");
428 if (!this->canUseFsd())
436 return m_fsdClient->isConnected();
441 if (!this->canUseFsd())
445 return m_fsdClient->isPendingConnection();
450 Q_UNUSED(originator);
452 if (!this->canUseAirspaceMonitor())
456 if (!this->canUseFsd())
465 static const QStringList cmds({
".msg",
".m",
".chat",
".altos",
".altoffset",
".addtimeos",
".addtimeoffset",
466 ".wallop",
".reinit",
".reinitialize",
".enable",
".disable",
".ignore",
467 ".unignore",
".fsd" });
469 parser.parse(commandLine);
470 if (!parser.isKnownCommand())
474 if (parser.matchesCommand(
".msg",
".m",
".chat"))
486 if (parser.countParts() < 3)
494 const QString receiver = parser.part(1).trimmed().toLower();
495 CCallsign ownCallsign = ownAircraft.getCallsign();
500 const CCallsign presetCallsign = m_fsdClient->getPresetCallsign();
503 ownCallsign = presetCallsign;
521 tm.
setFrequency(ownAircraft.getCom1System().getFrequencyActive());
526 tm.
setFrequency(ownAircraft.getCom2System().getFrequencyActive());
536 if (!radioFrequency.
isNull())
555 const QString msg(parser.partAndRemainingStringAfter(2));
566 else if (parser.matchesCommand(
".altos",
".altoffset"))
572 if (parser.countParts() < 2)
577 const QString csPart(parser.part(1));
586 if (!m_airspace->isAircraftInRange(cs))
594 if (parser.hasPart(2))
612 else if (parser.matchesCommand(
".addtimeos",
".addtimeoffset"))
618 if (parser.countParts() < 2)
624 if (parser.hasPart(2))
639 else if (parser.matchesCommand(
".reinit",
".reinitialize"))
645 const int count = m_airspace->reInitializeAllAircraft();
651 else if (parser.matchesCommand(
".wallop"))
653 if (parser.countParts() < 2)
666 const QString wallopMsg = parser.partAndRemainingStringAfter(1);
672 m_fsdClient->sendTextMessage(TextMessageGroups::AllSups, wallopMsg);
675 else if (parser.matchesCommand(
".enable",
".unignore"))
677 if (parser.countParts() < 2)
695 else if (parser.matchesCommand(
".disable",
".ignore"))
697 if (parser.countParts() < 2)
715 else if (m_airspace && parser.matchesCommand(
".fsd"))
717 return m_airspace->parseCommandLine(commandLine, originator);
729 m_fsdClient->sendTextMessages(textMessages);
738 m_fsdClient->sendFlightPlan(flightPlan);
739 m_fsdClient->sendClientQueryFlightPlan(this->ownAircraft().getCallsign());
744 if (!this->canUseFsd())
752 return m_airspace->loadFlightPlanFromNetwork(callsign);
757 if (!this->canUseAirspaceMonitor())
765 return m_airspace->getUsers();
770 if (!this->canUseAirspaceMonitor() || callsigns.
isEmpty())
778 return m_airspace->getUsersForCallsigns(callsigns);
799 if (!this->canUseAirspaceMonitor())
807 return m_airspace->getClients();
812 if (!this->canUseAirspaceMonitor())
820 return m_airspace->getClientsForCallsigns(callsigns);
825 if (!this->canUseAirspaceMonitor())
833 return m_airspace->setOtherClient(client);
838 if (!this->canUseAirspaceMonitor())
842 return m_airspace->removeClient(callsign);
847 if (!this->canUseAirspaceMonitor())
851 return m_airspace->autoAdjustCientGndCapability(situation);
856 if (!this->canUseAirspaceMonitor())
860 return m_airspace->addClientGndCapability(callsign);
865 if (!this->canUseAirspaceMonitor())
869 return m_airspace->setClientGndCapability(callsign, supportGndFlag);
876 Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO,
"Missing data reader");
881 return sApp->getWebDataServices()->getVatsimFsdServers();
892 Q_ASSERT(m_airspace);
909 static const QString chgMsg(
"Connection status changed from '%1' to '%2'");
916 void CContextNetwork::onReadyForModelMatching(
const CSimulatedAircraft &aircraft)
918 m_readyForModelMatching.enqueue(aircraft);
921 void CContextNetwork::emitReadyForMatching()
923 if (m_readyForModelMatching.isEmpty())
932 const CSimulatedAircraft aircraft = m_readyForModelMatching.dequeue();
940 void CContextNetwork::createRelayMessageToPartnerCallsign(
const CTextMessage &textMessage,
941 const CCallsign &partnerCallsign,
942 CTextMessageList &relayedMessages)
957 CTextMessage modified(textMessage);
958 modified.makeRelayedMessage(partnerCallsign);
962 void CContextNetwork::xCtxSimulatorRenderRestrictionsChanged(
bool restricted,
bool enabled,
int maxAircraft,
963 const CLength &maxRenderedDistance)
970 if (!m_airspace->analyzer())
974 m_airspace->analyzer()->setSimulatorRenderRestrictionsChanged(restricted, enabled, maxAircraft,
975 maxRenderedDistance);
978 void CContextNetwork::xCtxSimulatorStatusChanged(
int status)
980 const ISimulator::SimulatorStatus simStatus =
static_cast<ISimulator::SimulatorStatus
>(status);
985 const CSimulatorInfo simInfo = sim ? sim->getSimulatorPluginInfo().getSimulatorInfo() : CSimulatorInfo();
987 m_simulatorConnected++;
988 m_lastConnectedSim = simInfo;
998 bool CContextNetwork::canUseAirspaceMonitor()
const {
return sApp && !
sApp->
isShuttingDown() && m_airspace; }
1000 void CContextNetwork::updateMetars(
const CMetarList &metars)
1006 CLogMessage(
this).info(u
"%1 METARs updated") << metars.
size();
1009 void CContextNetwork::onChangedAtisReceived(
const CCallsign &callsign)
1012 m_dsAtcStationsOnlineChanged.inputSignal();
1015 void CContextNetwork::onTextMessagesReceived(
const CTextMessageList &messages)
1023 const CCallsign ownCallsign = this->ownAircraft().getCallsign();
1026 CTextMessageList partnerMessages;
1028 if (!partnerCallsign.
isEmpty())
1030 partnerMessages = textMessages.
findBySender(partnerCallsign);
1031 const CTextMessageList relayedSentMessages =
1040 for (
const CTextMessage &rsm : relayedSentMessages)
1052 if (!partnerMessages.
isEmpty())
1060 for (
const CTextMessage &m : supMessages)
1066 if (!partnerCallsign.
isEmpty())
1069 CTextMessageList relayedMessages;
1071 for (
const CTextMessage &m : privateMessages)
1073 this->createRelayMessageToPartnerCallsign(m, partnerCallsign, relayedMessages);
1076 if (!relayedMessages.
isEmpty())
1078 QPointer<CContextNetwork> myself(
this);
1082 myself->sendTextMessages(relayedMessages);
1090 void CContextNetwork::onTextMessageSent(
const CTextMessage &message)
1107 QPointer<CContextNetwork> myself(
this);
1108 CTextMessageList relayedMessages;
1109 this->createRelayMessageToPartnerCallsign(message, partnerCallsign, relayedMessages);
1110 if (!relayedMessages.
isEmpty())
1115 myself->sendTextMessages(relayedMessages);
1125 CSimulatedAircraft CContextNetwork::ownAircraft()
const
1138 return m_fsdClient ? m_fsdClient->getPresetPartnerCallsign() :
CCallsign();
1141 bool CContextNetwork::isValidPartnerCallsign(
const CCallsign &ownCallsign,
const CCallsign &partnerCallsign)
1143 if (partnerCallsign.
isEmpty())
1147 if (ownCallsign == partnerCallsign)
1187 return m_airspace->getAircraftInRange();
1196 return m_airspace->getAircraftInRangeCallsigns();
1205 return m_airspace->getAircraftInRangeCount();
1214 return m_airspace->isAircraftInRange(callsign);
1223 return m_airspace->isVtolAircraft(callsign);
1232 return m_airspace->getAircraftInRangeForCallsign(callsign);
1241 return m_airspace->getAircraftInRangeModelForCallsign(callsign);
1250 return m_airspace->getReverseLookupMessages(callsign);
1259 return m_airspace->isReverseLookupMessagesEnabled();
1268 const ReverseLookupLogging revEnabled = m_airspace->isReverseLookupMessagesEnabled();
1269 if (revEnabled == enable)
1273 m_airspace->enableReverseLookupMessages(enable);
1283 return m_airspace->getAircraftPartsHistory(callsign);
1292 return m_airspace->remoteAircraftParts(callsign);
1301 return m_airspace->getRemoteAircraftSupportingPartsCount();
1310 return m_airspace->isAircraftPartsHistoryEnabled();
1319 m_airspace->enableAircraftPartsHistory(enabled);
1329 return m_airspace->aircraftSituationsAdded();
1338 return m_airspace->aircraftPartsAdded();
1347 return m_airspace->situationsLastModified(callsign);
1356 return m_airspace->partsLastModified(callsign);
1369 return m_fsdClient->getNetworkStatisticsAsText(reset, separator);
1382 return m_fsdClient->setStatisticsEnable(enabled);
1391 return m_airspace->testAddAltitudeOffset(callsign, offset);
1400 return m_fsdClient->getPresetValues();
1409 return m_airspace->getAtcStationsOnline().findFirstByCallsign(callsign);
1432 if (!canUseAirspaceMonitor())
1445 m_airspace->requestAircraftDataUpdates();
1446 if (m_requestAircraftDataTimer)
1448 m_requestAircraftDataTimer->start();
1454 if (!canUseAirspaceMonitor())
1467 m_airspace->requestAtisUpdates();
1468 if (m_requestAtisTimer)
1470 m_requestAtisTimer->start();
1476 if (!canUseAirspaceMonitor())
1484 const bool c = m_airspace->updateAircraftEnabled(callsign, enabledForRendering);
1496 if (!canUseAirspaceMonitor())
1504 return m_airspace->setAircraftEnabledFlag(callsign, enabledForRendering);
1510 if (!canUseAirspaceMonitor())
1518 const bool c = m_airspace->updateAircraftModel(callsign, model, originator);
1531 if (!canUseAirspaceMonitor())
1539 const bool c = m_airspace->updateAircraftNetworkModel(callsign, model, originator);
1550 if (!canUseAirspaceMonitor())
1557 << Q_FUNC_INFO << callsign << enableFastPositonUpdates;
1559 const bool c = m_airspace->updateFastPositionEnabled(callsign, enableFastPositonUpdates);
1576 const bool c = m_airspace->setClientGndCapability(callsign, supportGndFlag);
1589 if (!canUseAirspaceMonitor())
1598 const bool c = m_airspace->updateCG(callsign, cg);
1604 if (!canUseAirspaceMonitor())
1613 const CCallsignSet set = m_airspace->updateCGForModel(modelString, cg);
1620 if (!canUseAirspaceMonitor())
1629 const bool c = m_airspace->updateCGAndModelString(callsign, cg, modelString);
1635 if (!canUseAirspaceMonitor())
1639 const bool c = m_airspace->updateAircraftRendered(callsign, rendered);
1645 if (!canUseAirspaceMonitor())
1649 const int c = m_airspace->updateMultipleAircraftRendered(callsigns, rendered);
1655 if (!canUseAirspaceMonitor())
1659 const int c = m_airspace->updateMultipleAircraftEnabled(callsigns, enabled);
1665 bool *setForOnGroundPosition)
1667 if (!canUseAirspaceMonitor())
1671 return m_airspace->updateAircraftGroundElevation(callsign, elevation, info, setForOnGroundPosition);
1676 if (!canUseAirspaceMonitor())
1680 m_airspace->updateMarkAllAsNotRendered();
1685 if (!canUseAirspaceMonitor())
1689 return m_airspace->getCGFromDB(callsign);
1694 if (!canUseAirspaceMonitor())
1698 return m_airspace->getCGFromDB(modelString);
1703 if (!canUseAirspaceMonitor())
1707 m_airspace->rememberCGFromDB(cgFromDB, callsign);
1712 if (!canUseAirspaceMonitor())
1716 m_airspace->rememberCGFromDB(cgFromDB, modelString);
1721 if (!canUseAirspaceMonitor())
1729 return m_airspace->reInitializeAllAircraft();
1734 if (!canUseAirspaceMonitor())
1738 return m_airspace->getLatestAirspaceAircraftSnapshot();
1742 const CLength &range,
int minValues,
1743 int sufficientValues)
const
1745 if (!canUseAirspaceMonitor())
1749 return m_airspace->averageElevationOfNonMovingAircraft(reference, range, minValues, sufficientValues);
1758 if (!canUseAirspaceMonitor())
1762 return m_airspace->getClientOrDefaultForCallsign(callsign);
1767 if (!canUseAirspaceMonitor())
1771 return m_airspace->hasClientInfo(callsign);
1776 if (!canUseAirspaceMonitor())
1780 return m_airspace->addNewClient(client);
1784 bool skipEqualValues)
1786 if (!canUseAirspaceMonitor())
1790 return m_airspace->updateOrAddClient(callsign, vm, skipEqualValues);
1799 Q_ASSERT(m_fsdClient);
1800 m_fsdClient->setInterimPositionReceivers(callsigns);
1809 Q_ASSERT(m_fsdClient);
1810 return m_fsdClient->getInterimPositionReceivers();
1815 if (!this->canUseFsd())
1823 m_fsdClient->sendClientQueryAircraftConfig(callsign);
1828 if (!this->canUseAirspaceMonitor())
1836 m_airspace->testCreateDummyOnlineAtcStations(number);
1841 if (!this->canUseAirspaceMonitor())
1849 m_airspace->testAddAircraftParts(callsign, parts, incremental);
1854 if (!this->canUseFsd())
1867 if (!this->canUseFsd())
1884 if (!sApp || !sApp->getWebDataServices())
1888 return sApp->getWebDataServices()->getMetarForAirport(airportIcaoCode);
1894 Q_ASSERT_X(receiver, Q_FUNC_INFO,
"Missing receiver");
1899 receiver, rawFsdMessageReceivedSlot) :
1901 Q_ASSERT_X(c || !rawFsdMessageReceivedSlot, Q_FUNC_INFO,
"connect failed");
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
static const QVersionNumber & getVersion()
Version as QVersionNumber.
static bool isLocalDeveloperDebugBuild()
Local build for developers.
Keeps track of other entities in the airspace: aircraft, ATC stations, etc. Central instance of data ...
void atcStationDisconnected(const swift::misc::aviation::CAtcStation &station)
ATC station disconnected.
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.
void clear()
Clear the contents.
bool isShuttingDown() const
Is application shutting down?
ContextMode
How to handle a given context.
context::CContextSimulator * getCContextSimulator()
Context for simulator.
context::CContextOwnAircraft * getCContextOwnAircraft()
Context for own aircraft.
static bool isAnyConnectedStatus(SimulatorStatus status)
Any connected status?
void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB, const swift::misc::aviation::CCallsign &callsign)
CG values from DB.
bool setNetworkStatisticsEnable(bool enabled)
Statistics enable/disable.
swift::misc::aviation::CCallsignSet updateCGForModel(const QString &modelString, const swift::misc::physical_quantities::CLength &cg)
Update the CG for this model string.
swift::misc::network::CLoginMode getLoginMode() const
Login mode.
void markAsSwiftClient(const swift::misc::aviation::CCallsign &callsign)
Mark as other swift client.
swift::misc::weather::CMetar getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &airportIcaoCode) const
Get METAR, if not available request it (code such as EDDF, KLAX).
swift::misc::CStatusMessageList getAircraftPartsHistory(const swift::misc::aviation::CCallsign &callsign) const
Get aircraft parts history.
void setFastPositionEnabledCallsigns(swift::misc::aviation::CCallsignSet &callsigns)
Callsigns enabled for fast position updates.
int updateMultipleAircraftRendered(const swift::misc::aviation::CCallsignSet &callsigns, bool rendered)
Set aircraft rendered.
swift::misc::MillisecondsMinMaxMean remoteAircraftSituationsTimestampDifferenceMinMaxMean(const swift::misc::aviation::CCallsign &callsign) const
Average update time.
swift::misc::aviation::CCallsignSet remoteAircraftSupportingParts() const
Remote aircraft supporting parts.
bool isRemoteAircraftSupportingParts(const swift::misc::aviation::CCallsign &callsign) const
Parts supported?
swift::misc::aviation::CCallsignSet getFastPositionEnabledCallsigns() const
Callsigns enabled for fast position updates.
swift::misc::aviation::CCallsign getPartnerCallsign() const
Partner callsign if any.
swift::misc::aviation::CAircraftPartsList getRemoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const
Get remote aircraft parts.
swift::misc::aviation::CAtcStationList getAtcStationsOnline(bool recalculateDistance) const
The ATC list with online ATC controllers.
int updateOrAddClient(const swift::misc::aviation::CCallsign &callsign, const swift::misc::CPropertyIndexVariantMap &vm, bool skipEqualValues=true)
Update or add a client.
bool hasClientInfo(const swift::misc::aviation::CCallsign &callsign) const
Client info for given callsign?
QStringList getNetworkPresetValues() const
Network preset values.
void enableAircraftPartsHistory(bool enabled)
Enable storing of aircraft parts.
int getRemoteAircraftSupportingPartsCount() const
Number of aircraft supporting parts.
qint64 partsLastModified(const swift::misc::aviation::CCallsign &callsign) const
When last modified.
swift::misc::geo::CElevationPlane averageElevationOfNonMovingAircraft(const swift::misc::aviation::CAircraftSituation &reference, const swift::misc::physical_quantities::CLength &range, int minValues=1, int sufficientValues=2) const
Average elevation of aircraft in given range, which are NOT moving.
swift::misc::aviation::CAircraftSituationList latestOnGroundProviderElevations() const
Latest aircraft situation "on ground" having a provider elevation.
void setClients(const swift::misc::network::CClientList &clients)
Set other clients.
bool updateAircraftEnabled(const swift::misc::aviation::CCallsign &callsign, bool enabledForRendering)
Enable/disable aircraft and follow up logic like sending signals.
swift::misc::CStatusMessageList getReverseLookupMessages(const swift::misc::aviation::CCallsign &callsign) const
Get reverse lookup messages.
swift::misc::aviation::CAircraftSituationList latestRemoteAircraftSituations() const
Latest aircraft situation for all callsigns.
swift::misc::aviation::CAtcStation getOnlineStationForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Online station for callsign.
bool addClientGndCapability(const swift::misc::aviation::CCallsign &callsign)
Add gnd.flag capability.
int updateAircraftGroundElevation(const swift::misc::aviation::CCallsign &callsign, const swift::misc::geo::CElevationPlane &elevation, swift::misc::aviation::CAircraftSituation::GndElevationInfo info, bool *setForOnGroundPosition)
Update the ground elevation.
swift::misc::CStatusMessage disconnectFromNetwork()
Disconnect from network.
swift::misc::aviation::CAtcStationList getOnlineStationsForFrequency(const swift::misc::physical_quantities::CFrequency &frequency) const
Online stations for frequency.
swift::misc::aviation::CAircraftSituation remoteAircraftSituation(const swift::misc::aviation::CCallsign &callsign, int index) const
Rendered aircraft situations (per callsign and index).
bool isAircraftPartsHistoryEnabled() const
Is storing the aircraft parts history enabled?
swift::misc::network::CClientList getClientsForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const
Returns a list of other clients corresponding to the given callsigns.
void sendTextMessages(const swift::misc::network::CTextMessageList &textMessages)
Text messages (radio and private chat messages).
int getAircraftInRangeCount() const
Aircraft count.
bool setAircraftEnabledFlag(const swift::misc::aviation::CCallsign &callsign, bool enabledForRendering)
Set the enabled flag without any further logic like sending signals.
int removeClient(const swift::misc::aviation::CCallsign &callsign)
Remove client.
swift::misc::network::CUserList getUsers() const
Get all users.
bool setOtherClient(const swift::misc::network::CClient &client)
Set client for its callsign.
void gracefulShutdown()
Gracefully shut down, e.g. for thread safety.
swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const
Aircraft list.
swift::misc::simulation::CAircraftModel getAircraftInRangeModelForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Aircraft model for callsign.
QMetaObject::Connection connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot)
Connect to receive raw fsd messages.
bool isOnlineStation(const swift::misc::aviation::CCallsign &callsign) const
Online station for callsign?
swift::misc::network::CServerList getVatsimFsdServers() const
Known FSD servers, available when data file was first read.
swift::misc::CStatusMessage connectToNetwork(const swift::misc::network::CServer &server, const QString &extraLiveryString, bool sendLivery, const QString &extraModelString, bool sendModelString, const swift::misc::aviation::CCallsign &partnerCallsign, swift::misc::network::CLoginMode mode)
Connect to Network.
bool updateAircraftRendered(const swift::misc::aviation::CCallsign &callsign, bool rendered)
Set aircraft rendered.
void requestAircraftDataUpdates()
Request data updates (pilot's frequencies, ATIS, ..).
int aircraftPartsAdded() const
Number of parts added.
void testAddAircraftParts(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftParts &parts, bool incremental)
Inject aircraft parts for testing.
bool addNewClient(const swift::misc::network::CClient &client)
Add a new client, if existing nothing will be added.
bool updateAircraftNetworkModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::simulation::CAircraftModel &model, const swift::misc::CIdentifier &originator)
Change network model.
QList< QMetaObject::Connection > connectRemoteAircraftProviderSignals(QObject *receiver, std::function< void(const swift::misc::aviation::CAircraftSituation &)> addedSituationSlot, std::function< void(const swift::misc::aviation::CCallsign &, const swift::misc::aviation::CAircraftParts &)> addedPartsSlot, std::function< void(const swift::misc::aviation::CCallsign &)> removedAircraftSlot, std::function< void(const swift::misc::simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot)
Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly...
int reInitializeAllAircraft()
Re-initialize all aircraft.
swift::misc::aviation::CAircraftSituationChangeList remoteAircraftSituationChanges(const swift::misc::aviation::CCallsign &callsign) const
Aircraft changes.
void testReceivedTextMessages(const swift::misc::network::CTextMessageList &textMessages)
Inject a text message as received.
swift::misc::network::CUserList getUsersForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const
Users for given callsigns, e.g. for voice room resolution.
void testCreateDummyOnlineAtcStations(int number)
Create dummy ATC stations for performance tests etc.
CContextNetwork(CCoreFacadeConfig::ContextMode, CCoreFacade *runtime)
Constructor, with link to runtime.
swift::misc::physical_quantities::CLength getCGFromDB(const swift::misc::aviation::CCallsign &callsign) const
CG values from DB.
void enableReverseLookupMessages(swift::misc::simulation::ReverseLookupLogging enable)
Enable reverse lookup logging.
bool autoAdjustCientGndCapability(const swift::misc::aviation::CAircraftSituation &situation)
Adjust gnd.flag capability from situation.
swift::misc::aviation::CAtcStationList getClosestAtcStationsOnline(int number) const
The ATC list with online ATC controllers.
bool isAircraftInRange(const swift::misc::aviation::CCallsign &callsign) const
Aircraft in range.
void updateMarkAllAsNotRendered()
Mark all as not rendered.
swift::misc::simulation::CSimulatedAircraft getAircraftInRangeForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Aircraft for given callsign.
void testRequestAircraftConfig(const swift::misc::aviation::CCallsign &callsign)
Request parts for callsign (from another client).
bool updateCGAndModelString(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &cg, const QString &modelString)
Update the CG and model string.
bool isPendingConnection() const
In transition state, e.g. connecting, disconnecting.
~CContextNetwork()
Destructor.
swift::misc::aviation::CCallsignSet getAircraftInRangeCallsigns() const
Aircraft callsigns.
swift::misc::network::CClient getClientOrDefaultForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Other client for the given callsigns.
static void registerHelp()
Register help.
bool updateAircraftSupportingGndFLag(const swift::misc::aviation::CCallsign &callsign, bool supportGndFlag)
Enable/disable support of gnd. flag.
void sendFlightPlan(const swift::misc::aviation::CFlightPlan &flightPlan)
Send flight plan.
int remoteAircraftSituationsCount(const swift::misc::aviation::CCallsign &callsign) const
Number of remote aircraft situations for callsign.
bool updateFastPositionEnabled(const swift::misc::aviation::CCallsign &callsign, bool enableFastPositonUpdates)
Change fast position updates.
void setSimulationEnvironmentProvider(swift::misc::simulation::ISimulationEnvironmentProvider *provider)
Set the provider.
bool testAddAltitudeOffset(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &offset=swift::misc::physical_quantities::CLength::null())
Add altitude offset for testing.
fsd::CFSDClient * fsdClient() const
Network library.
int remoteAircraftPartsCount(const swift::misc::aviation::CCallsign &callsign) const
All parts (per callsign, time history).
int updateMultipleAircraftEnabled(const swift::misc::aviation::CCallsignSet &callsigns, bool enabled)
Enable/disable aircraft.
swift::misc::network::CServer getConnectedServer() const
Server which is connected, if not connected empty default object.
int remoteAircraftSituationChangesCount(const swift::misc::aviation::CCallsign &callsign) const
Aircraft changes count.
swift::misc::aviation::CFlightPlan loadFlightPlanFromNetwork(const swift::misc::aviation::CCallsign &callsign) const
Load flight plan (from network).
void testReceivedAtisMessage(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CInformationMessage &msg)
Inject an ATIS.
bool updateAircraftModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::simulation::CAircraftModel &model, const swift::misc::CIdentifier &originator)
Change model.
swift::misc::network::CClientList getClients() const
Get other clients.
swift::misc::simulation::ReverseLookupLogging isReverseLookupMessagesEnabled() const
Enabled reverse lookup logging?
QString getNetworkStatistics(bool reset, const QString &separator)
Statistics info.
void clearClients()
Set other clients.
swift::misc::simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const
Current snapshot.
swift::misc::aviation::CAircraftSituationList remoteAircraftSituations(const swift::misc::aviation::CCallsign &callsign) const
Rendered aircraft situations (per callsign, time history).
qint64 situationsLastModified(const swift::misc::aviation::CCallsign &callsign) const
When last modified.
bool setClientGndCapability(const swift::misc::aviation::CCallsign &callsign, bool supportGndFlag)
Set gnd.flag capability.
swift::misc::network::CUser getUserForCallsign(const swift::misc::aviation::CCallsign &callsign) const
User for given callsign, e.g. for text messages.
int aircraftSituationsAdded() const
Number of situations added.
swift::misc::aviation::CAircraftPartsList remoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const
All parts (per callsign, time history).
bool updateCG(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &cg)
Update the CG.
bool isVtolAircraft(const swift::misc::aviation::CCallsign &callsign) const
Is VTOL aircraft?
bool isConnected() const
Network connected?
void requestAtisUpdates()
Request ATIS updates (for all stations).
swift::misc::simulation::CSimulatedAircraft getOwnAircraft() const
Get own aircraft.
void changedLogOrDebugSettings()
Log or debug values changed.
bool isUsingImplementingObject() const
Using local implementing object?
const IContextSimulator * getIContextSimulator() const
Context for simulator.
IContextNetwork * getIContextNetwork()
Context for network.
IContextOwnAircraft * getIContextOwnAircraft()
Context for own aircraft.
bool isDebugEnabled() const
Debug enabled?
CCoreFacade * getRuntime()
Runtime.
void textMessageSent(const swift::misc::network::CTextMessage &sentMessage)
Text message sent (by me).
void changedAircraftInRange()
Aircraft list has been changed.
void supervisorTextMessageReceived(const swift::misc::network::CTextMessage &message)
A supervisor text message was received.
void connectedServerChanged(const swift::misc::network::CServer &server)
The connected server has been changed.
void changedFastPositionUpdates(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft enabled / disabled.
void addedAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)
A new aircraft appeared.
void changedGndFlagCapability(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Changed gnd. flag capability.
void muteRequestReceived(bool mute)
Mute request received.
void changedRemoteAircraftModel(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)
Aircraft model was changed.
void changedAtcStationsOnline()
ATC station (online) list has been changed.
void textMessagesReceived(const swift::misc::network::CTextMessageList &textMessages)
Text messages received (also private chat messages, radio channel messages).
void kicked(const QString &kickMessage)
User has been kicked from network.
std::function< void(const swift::misc::network::CRawFsdMessage &)> RawFsdMessageReceivedSlot
Raw FSD message receiver functor.
void changedRemoteAircraftEnabled(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft enabled / disabled.
void connectionStatusChanged(const swift::misc::network::CConnectionStatus &from, const swift::misc::network::CConnectionStatus &to)
Connection status changed.
void atcStationDisconnected(const swift::misc::aviation::CAtcStation &atcStation)
ATC station disconnected.
void severeNetworkError(const QString &errorMessage)
Network error.
void readyForModelMatching(const swift::misc::simulation::CSimulatedAircraft &renderedAircraft)
Read for model matching.
void removedAircraft(const swift::misc::aviation::CCallsign &callsign)
An aircraft disappeared.
virtual bool updateOwnAircraftPilot(const swift::misc::network::CUser &pilot)=0
Set current pilot.
virtual swift::misc::aviation::CAircraftSituation getOwnAircraftSituation() const =0
Get own aircraft.
virtual swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const =0
Simulator info, currently loaded plugin.
FSD client Todo: Send (interim) data updates automatically Todo Check ':' in FSD messages....
void rawFsdMessage(const swift::misc::network::CRawFsdMessage &rawFsdMessage)
Client responses received.
void textMessagesReceived(const swift::misc::network::CTextMessageList &messages)
Client responses received.
void muteRequestReceived(bool mute)
Client responses received.
void connectionStatusChanged(swift::misc::network::CConnectionStatus oldStatus, swift::misc::network::CConnectionStatus newStatus)
Connection status has been changed.
void atisReplyReceived(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CInformationMessage &atis)
We received a reply to one of our ATIS queries.
void textMessageSent(const swift::misc::network::CTextMessage &sentMessage)
We have sent a text message.
const swift::misc::network::CServer & getServer() const
Get the server.
void killRequestReceived(const QString &reason)
Kill request (aka kicked).
void severeNetworkError(const QString &errorMessage)
Network error.
bool isEmpty() const
Synonym for empty.
iterator push_back(const T &value)
Synonym for insert.
Value object encapsulating information identifying a component of a modular distributed swift process...
static const QString & contextSlot()
Context slots.
static const QString & validation()
Validation.
Class for emitting a log message.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & debug()
Set the severity to debug.
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.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
bool isEmpty() const
Synonym for empty.
Utility methods for simple line parsing used with the command line.
Streamable status message, e.g.
static constexpr auto SeverityInfo
Status severities.
static constexpr auto SeverityError
Status severities.
static constexpr auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
Value object encapsulating information of aircraft's parts.
Value object encapsulating a list of aircraft parts.
Value object encapsulating a list of aircraft parts.
Value object encapsulating information of an aircraft's situation.
GndElevationInfo
Where did we get elevation from?
List of aircraft situations.
Value object encapsulating information of airport ICAO data.
Value object encapsulating information about an ATC station.
Value object for a list of ATC stations.
CAtcStationList findIfFrequencyIsWithinSpacing(const physical_quantities::CFrequency &frequency)
Find 0..n stations with frequency (with 5 kHz spacing for .x20/.x25 and .x70/.x75).
Value object encapsulating information of a callsign.
const QString & asString() const
Get callsign (normalized).
bool isEmpty() const
Is empty?
bool isValid() const
Valid callsign?
Value object for a set of callsigns.
static physical_quantities::CFrequency parseComFrequency(const QString &input, physical_quantities::CPqString::SeparatorMode sep)
Parses almost any shitty string to a valid COM frequency.
static bool isValidCivilAviationFrequency(const physical_quantities::CFrequency &f)
Valid civil aviation frequency?
Value object for a flight plan.
bool containsCallsign(const CCallsign &callsign) const
Contains callsign?
Plane of same elevation, can be a single point or larger area (e.g. airport).
CONTAINER findClosest(int number, const ICoordinateGeodetic &coordinate) const
Find 0..n objects closest to the given coordinate.
void calculcateAndUpdateRelativeDistanceAndBearing(const ICoordinateGeodetic &position)
Calculate distances.
QString toQString(bool i18n=false) const
Cast as QString.
Value object encapsulating a list of voice rooms.
Value object encapsulating information about a connection status.
bool isConnected() const
Query status.
bool isDisconnected() const
Query status.
Value object encapsulating information about login mode.
LoginMode getLoginMode() const
Get login mode.
@ Observer
Login as observer.
void setLoginMode(LoginMode mode)
Set login mode.
static bool canConnect(const QString &hostAddress, int port, QString &message, int timeoutMs=getTimeoutMs())
Can connect?
Value object encapsulating information of a FSD server.
int getPort() const
Get port.
const QString & getAddress() const
Get address.
const CUser & getUser() const
Get user.
Value object encapsulating a list of servers.
Value object encapsulating information of a text message.
bool isRelayedMessage() const
Is relayed message.
void setMessage(const QString &message)
Set message.
bool isPrivateMessage() const
Is private message?
void setSenderCallsign(const aviation::CCallsign &callsign)
Set callsign (from).
bool isEmpty() const
Empty message.
void setRecipientCallsign(const aviation::CCallsign &callsign)
Set callsign (recipient).
void setFrequency(const physical_quantities::CFrequency &frequency)
Set frequency.
const aviation::CCallsign & getRecipientCallsign() const
Get callsign (to).
const aviation::CCallsign & getSenderCallsign() const
Get callsign (from).
Value object encapsulating a list of text messages.
CTextMessageList withRemovedPrivateMessagesFromCallsign(const aviation::CCallsign &callsign) const
With removed private messages from callsign.
bool containsPrivateMessages() const
Contains private messages?
CTextMessageList findByNotForRecipient(const swift::misc::aviation::CCallsign &recipient) const
Find by recipient is NOT addressed.
CTextMessageList findBySender(const swift::misc::aviation::CCallsign &sender) const
Find by sender.
CTextMessageList getPrivateMessages() const
Private messages.
CTextMessageList getSupervisorMessages() const
Supervisor messages.
CTextMessageList withRelayedToPrivateMessages() const
List with relayed messages (if any) as private messages.
CTextMessageList findByRecipient(const swift::misc::aviation::CCallsign &recipient) const
Find by recipient.
CTextMessageList markedAsSent()
Marked as sent.
Value object encapsulating information of a user.
bool hasCredentials() const
Valid credentials?
Value object encapsulating a list of voice rooms.
Physical unit length (length).
static const CFrequency & FrequencyUnicom()
Unicom frequency.
void parseFromString(const QString &value)
Parse value from string.
int valueInteger(MU unit) const
As integer value.
bool isNull() const
Is quantity null?
static const CLength & null()
QString valueRoundedWithUnit(const MU &unit, int digits=-1, bool withGroupSeparator=false, bool i18n=false) const
Value to QString with the given unit, e.g. "5.00m".
bool isPositiveWithEpsilonConsidered() const
Value >= 0 epsilon considered.
@ SeparatorBestGuess
try to figure out
void parseFromString(const QString &time)
From string hh:mm, or hh:mm:ss, or time units such as s, min.
static CTimeUnit ms()
Millisecond ms.
Aircraft model (used by another pilot, my models on disk).
Current situation in the skies analyzed.
void changedAircraftInRange()
Aircraft were changed.
void addedAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)
A new aircraft appeared.
void removedAircraft(const swift::misc::aviation::CCallsign &callsign)
An aircraft disappeared.
Comprehensive information of an aircraft.
bool isSupportingGndFlag() const
Is supporting gnd.flag?
bool fastPositionUpdates() const
Support fast position updates.
const aviation::CCallsign & getCallsign() const
Get callsign.
QString getCallsignAsString() const
Get callsign.
Value object encapsulating a list of aircraft.
Simple hardcoded info about the corresponding simulator.
const CSimulatorInfo & getSimulatorInfo() const
Simulator info object.
static const aviation::CCallsign & testAltitudeOffsetCallsign()
Wildcard callsign.
Direct in memory access to elevation data.
@ AtcInfo
Can accept ATIS responses.
@ IcaoEquipment
Process aircraft ICAO in flightplan as ICAO equipment code (e.g.
@ FastPos
Can send/receive fast position updates (pilot only).
@ AircraftConfig
Aircraft Config.
@ VisPos
Can send/receive visual position updates (pilot only).
@ AircraftInfo
Can send/receive modern model packets.
bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator)
Free functions in swift::misc.
SWIFT_MISC_EXPORT const QString & boolToOnOff(bool v)
Bool to on/off.
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QString number(double n, char format, int precision)
QByteArray toLocal8Bit() const const
Milliseconds minimum/maximum/mean.