From c61a963a99911f46dd4cde067e08f64aab9c518f Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 18 Jan 2015 22:17:21 +0100 Subject: [PATCH] refs #364, refs #368 contexts: * changed to CSimulatedAircraft / Simulation::CAircraftModel * added new functions such as icons for model * improved ICAO code handling in airspace * removed implicit logging from network context --- src/blackcore/airspace_monitor.cpp | 183 +++++++++++++++----- src/blackcore/airspace_monitor.h | 49 +++--- src/blackcore/context_application_impl.cpp | 2 +- src/blackcore/context_network_impl.cpp | 20 ++- src/blackcore/context_ownaircraft.h | 37 ++-- src/blackcore/context_ownaircraft_impl.cpp | 93 ++++++++-- src/blackcore/context_ownaircraft_impl.h | 37 ++-- src/blackcore/context_ownaircraft_proxy.cpp | 40 +++-- src/blackcore/context_ownaircraft_proxy.h | 61 ++++--- src/blackcore/context_simulator.h | 43 +++-- src/blackcore/context_simulator_impl.cpp | 65 +++++-- src/blackcore/context_simulator_impl.h | 35 ++-- src/blackcore/context_simulator_proxy.cpp | 58 +++++-- src/blackcore/context_simulator_proxy.h | 25 ++- 14 files changed, 534 insertions(+), 214 deletions(-) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 0c33d9ed0..f673b10d6 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -18,6 +18,7 @@ using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::Audio; +using namespace BlackMisc::Simulation; using namespace BlackMisc::Network; using namespace BlackMisc::Geo; using namespace BlackMisc::PhysicalQuantities; @@ -61,7 +62,7 @@ namespace BlackCore CFlightPlan plan; // use cache, but not for own callsign (always reload) - if (this->m_flightPlanCache.contains(callsign)) plan = this->m_flightPlanCache[callsign]; + if (this->m_flightPlanCache.contains(callsign)) { plan = this->m_flightPlanCache[callsign]; } if (!plan.wasSentOrLoaded() || plan.timeDiffSentOrLoadedMs() > 30 * 1000) { // outdated, or not in cache at all @@ -103,7 +104,7 @@ namespace BlackCore CUserList CAirspaceMonitor::getUsersForCallsigns(const CCallsignList &callsigns) const { CUserList users; - if (callsigns.isEmpty()) return users; + if (callsigns.isEmpty()) { return users; } CCallsignList searchList(callsigns); // myself, which is not in the lists below @@ -214,8 +215,15 @@ namespace BlackCore foreach(CAircraft aircraft, this->m_aircraftInRange) { - this->m_network->sendFrequencyQuery(aircraft.getCallsign()); - this->m_network->sendIcaoCodesQuery(aircraft.getCallsign()); + const CCallsign cs(aircraft.getCallsign()); + this->m_network->sendFrequencyQuery(cs); + + // we only query ICAO if we have none yet + // it happens sometimes with some FSD servers (e.g our testserver) a first query is skipped + if (!aircraft.hasValidAircraftDesignator()) + { + this->m_network->sendIcaoCodesQuery(cs); + } } } @@ -238,6 +246,17 @@ namespace BlackCore emit this->changedAtcStationsOnline(); } + void CAirspaceMonitor::clear() + { + m_metarCache.clear(); + m_flightPlanCache.clear(); + m_icaoCodeCache.clear(); + + removeAllOnlineAtcStations(); + removeAllAircraft(); + removeAllOtherClients(); + } + void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname) { if (realname.isEmpty()) return; @@ -251,24 +270,26 @@ namespace BlackCore // Client vm = CPropertyIndexVariantMap({CClient::IndexUser, CUser::IndexRealName}, realname); this->addVoiceCapabilitiesFromDataFile(vm, callsign); + if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); } this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); } void CAirspaceMonitor::ps_capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) { - if (callsign.isEmpty()) return; + if (callsign.isEmpty()) { return; } CPropertyIndexVariantMap capabilities; capabilities.addValue(CClient::FsdAtisCanBeReceived, (flags & INetwork::AcceptsAtisResponses)); capabilities.addValue(CClient::FsdWithInterimPositions, (flags & INetwork::SupportsInterimPosUpdates)); capabilities.addValue(CClient::FsdWithModelDescription, (flags & INetwork::SupportsModelDescriptions)); CPropertyIndexVariantMap vm(CClient::IndexCapabilities, capabilities.toCVariant()); this->addVoiceCapabilitiesFromDataFile(vm, callsign); + if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); } this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); } - void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &, const QString &, const QString &, const QString &model) + void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &airlineIcao, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model) { - if (callsign.isEmpty() || model.isEmpty()) return; + if (callsign.isEmpty() || model.isEmpty()) { return; } // Request of other client, I can get the other's model from that CPropertyIndexVariantMap vm({ CClient::IndexModel, CAircraftModel::IndexModelString }, model); @@ -276,16 +297,33 @@ namespace BlackCore if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { // with custom packets it can happen, - //the packet is received before any other packet + // the packet is received before any other packet this->m_otherClients.push_back(CClient(callsign)); } this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); this->sendFsipiCustomPacket(callsign); // response + + // ICAO response from custom data + if (!aircraftDesignator.isEmpty()) + { + CAircraftIcao icao(aircraftDesignator, combinedAircraftType, airlineIcao, "", ""); // from custom packet + if (this->m_aircraftInRange.containsCallsign(callsign)) + { + // we have that aircraft, set straight away + this->ps_icaoCodesReceived(callsign, icao); + } + else + { + // store in cache + this->m_icaoCodeCache.insert(callsign, icao); + } + } } void CAirspaceMonitor::ps_serverReplyReceived(const CCallsign &callsign, const QString &server) { - if (callsign.isEmpty() || server.isEmpty()) return; + if (callsign.isEmpty() || server.isEmpty()) { return; } + if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); } CPropertyIndexVariantMap vm(CClient::IndexServer, server); this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); } @@ -319,7 +357,7 @@ namespace BlackCore CAircraft me = this->m_ownAircraft; CAircraftIcao icao = me.getIcaoInfo(); QString modelString = this->m_ownAircraftModel.getModelString(); - if (modelString.isEmpty()) modelString = CProject::systemNameAndVersion(); + if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); } this->m_network->sendFsipiCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString); } @@ -328,7 +366,7 @@ namespace BlackCore CAircraft me = this->m_ownAircraft; CAircraftIcao icao = me.getIcaoInfo(); QString modelString = this->m_ownAircraftModel.getModelString(); - if (modelString.isEmpty()) modelString = CProject::systemNameAndVersion(); + if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); } this->m_network->sendFsipirCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString); } @@ -343,7 +381,7 @@ namespace BlackCore } } - void CAirspaceMonitor::removeAllAtcStations() + void CAirspaceMonitor::removeAllOnlineAtcStations() { m_atcWatchdog.removeAll(); m_atcStationsOnline.clear(); @@ -357,6 +395,8 @@ namespace BlackCore emit removedAircraft(aircraft.getCallsign()); } m_aircraftInRange.clear(); + m_flightPlanCache.clear(); + m_icaoCodeCache.clear(); } void CAirspaceMonitor::removeAllOtherClients() @@ -364,6 +404,21 @@ namespace BlackCore m_otherClients.clear(); } + void CAirspaceMonitor::removeFromAircraftCaches(const CCallsign &callsign) + { + if (callsign.isEmpty()) { return; } + this->m_icaoCodeCache.remove(callsign); + this->m_flightPlanCache.remove(callsign); + } + + void CAirspaceMonitor::fireDelayedReadyForModelMatching(const CCallsign &callsign, int trial, int delayMs) + { + BlackMisc::singleShot(delayMs, QThread::currentThread(), [ = ]() + { + this->ps_sendReadyForModelMatching(callsign, trial + 1); + }); + } + void CAirspaceMonitor::ps_receivedBookings(const CAtcStationList &bookedStations) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); @@ -394,11 +449,30 @@ namespace BlackCore } } - void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign) + void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign, int trial) { - CAircraft remoteAircraft = this->m_aircraftInRange.findFirstByCallsign(callsign); + // some checks for special conditions, e.g. logout -> empty list, but still signals pending + if (this->m_aircraftInRange.isEmpty()) { return; } + if (!this->m_aircraftInRange.containsCallsign(callsign)) { return; } + + // build simulated aircraft and crosscheck if all data are available + CSimulatedAircraft remoteAircraft(this->m_aircraftInRange.findFirstByCallsign(callsign)); + Q_ASSERT(remoteAircraft.hasValidCallsign()); CClient remoteClient = this->m_otherClients.findFirstByCallsign(callsign); - emit readyForModelMatching(remoteAircraft, remoteClient); + remoteAircraft.setClient(remoteClient); + remoteAircraft.setModel(remoteClient.getAircraftModel()); + + bool dataComplete = remoteAircraft.hasValidAircraftDesignator() && remoteAircraft.hasValidRealName(); + if (trial < 3 && !dataComplete) + { + // allow another period for the client data to arrive, otherwise go ahead + this->fireDelayedReadyForModelMatching(callsign, trial + 1); + return; + } + + Q_ASSERT(remoteAircraft.hasValidAircraftDesignator()); + Q_ASSERT(remoteAircraft.hasValidRealName()); + emit this->readyForModelMatching(remoteAircraft); } void CAirspaceMonitor::ps_atcPositionUpdate(const CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range) @@ -525,43 +599,35 @@ namespace BlackCore void CAirspaceMonitor::ps_icaoCodesReceived(const CCallsign &callsign, const CAircraftIcao &icaoData) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + Q_ASSERT(!callsign.isEmpty()); // update CPropertyIndexVariantMap vm(CAircraft::IndexIcao, icaoData.toCVariant()); if (!icaoData.hasAircraftDesignator()) { // empty so far, try to fetch from data file - CLogMessage(this).debug() << "Empty ICAO info for %1 %2" << callsign << icaoData; - CAircraftIcao icaoDataDataFile = this->m_vatsimDataFileReader->getIcaoInfo(callsign); - if (!icaoDataDataFile.hasAircraftDesignator()) return; // give up! - vm = CPropertyIndexVariantMap(CAircraft::IndexIcao, icaoData.toCVariant()); + CLogMessage(this).warning("Empty ICAO info for %1 %2") << callsign.toQString() << icaoData.toQString(); + CAircraftIcao icaoDataFromDataFile = this->m_vatsimDataFileReader->getIcaoInfo(callsign); + if (!icaoDataFromDataFile.hasAircraftDesignator()) { return; } // give up! + vm = CPropertyIndexVariantMap(CAircraft::IndexIcao, icaoDataFromDataFile.toCVariant()); + } + // ICAO code received when aircraft is already removed or not yet ready + if (!this->m_aircraftInRange.containsCallsign(callsign)) + { + this->m_icaoCodeCache.insert(callsign, icaoData); + return; } - int changed = this->m_aircraftInRange.applyIf(&CAircraft::getCallsign, callsign, vm, true); - if (changed > 0) { emit this->changedAircraftInRange(); } - // we have most important data for model matching - // but do we already have the client - if (this->m_otherClients.contains(&CClient::getCallsign, callsign)) - { - // yes, client with possible model string is there - ps_sendReadyForModelMatching(callsign); - } - else - { - // allow another period for the client data to arrive, otherwise go ahead - BlackMisc::singleShot(5000, QThread::currentThread(), [ = ]() - { - ps_sendReadyForModelMatching(callsign); - }); - } + // update + int c = this->m_aircraftInRange.applyIfCallsign(callsign, vm); + if (c > 0) {ps_sendReadyForModelMatching(callsign, 1); } } void CAirspaceMonitor::ps_aircraftUpdateReceived(const CCallsign &callsign, const CAircraftSituation &situation, const CTransponder &transponder) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); - - CAircraftList list = this->m_aircraftInRange.findByCallsign(callsign); - if (list.isEmpty()) + bool exists = this->m_aircraftInRange.containsCallsign(callsign); + if (!exists) { // new aircraft CAircraft aircraft; @@ -569,11 +635,21 @@ namespace BlackCore aircraft.setSituation(situation); aircraft.setTransponder(transponder); aircraft.setCalculcatedDistanceToPosition(this->m_ownAircraft.getPosition()); // distance from myself + + // ICAO from cache if avialable + bool setIcao = false; + if (this->m_icaoCodeCache.contains(callsign)) + { + CAircraftIcao icao = this->m_icaoCodeCache.value(callsign); + this->m_icaoCodeCache.remove(callsign); + aircraft.setIcaoInfo(icao); + setIcao = true; + } + this->m_vatsimDataFileReader->updateWithVatsimDataFileData(aircraft); this->m_aircraftInRange.push_back(aircraft); - // and new client, there is a chance it has been created by - // custom packet first + // new client, there is a chance it has been already created by custom packet if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { CClient c(callsign); @@ -583,18 +659,28 @@ namespace BlackCore if (this->m_network->isConnected()) { // only if still connected + // the order here makes some sense, as we hope to receive ICAO codes last, and everthing else already in place + this->sendFsipirCustomPacket(callsign); // own aircraft model this->m_network->sendFrequencyQuery(callsign); this->m_network->sendRealNameQuery(callsign); - this->m_network->sendIcaoCodesQuery(callsign); this->m_network->sendCapabilitiesQuery(callsign); this->m_network->sendServerQuery(callsign); - this->sendFsipirCustomPacket(callsign); // own aircraft model - } - this->m_aircraftWatchdog.addCallsign(callsign); - emit this->addedAircraft(callsign, situation); + // keep as last + if (setIcao) + { + this->fireDelayedReadyForModelMatching(callsign); + } + else + { + this->m_network->sendIcaoCodesQuery(callsign); + } + + this->m_aircraftWatchdog.addCallsign(callsign); + emit this->addedAircraft(callsign, situation); + } // connected } - else + else // not exists yet { // update CLength distance = this->m_ownAircraft.calculcateDistanceToPosition(situation.getPosition()); @@ -605,7 +691,7 @@ namespace BlackCore vm.addValue(CAircraft::IndexDistance, distance); // here I expect always a changed value - this->m_aircraftInRange.applyIf(&CAircraft::getCallsign, callsign, vm, false); + this->m_aircraftInRange.applyIfCallsign(callsign, vm); this->m_aircraftWatchdog.resetCallsign(callsign); emit this->changedAircraftSituation(callsign, situation); } @@ -622,6 +708,7 @@ namespace BlackCore { this->m_aircraftInRange.removeIf(&CAircraft::getCallsign, callsign); this->m_otherClients.removeIf(&CClient::getCallsign, callsign); + this->removeFromAircraftCaches(callsign); emit this->removedAircraft(callsign); } } diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index a6ae3e075..daf5facc9 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -12,6 +12,7 @@ #ifndef BLACKCORE_AIRSPACE_MONITOR_H #define BLACKCORE_AIRSPACE_MONITOR_H +#include "blackmisc/simulation/simulatedaircraft.h" #include "blackmisc/avatcstationlist.h" #include "blackmisc/avaircraftlist.h" #include "blackmisc/nwclientlist.h" @@ -44,6 +45,7 @@ namespace BlackCore BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const; //! Returns the flightplan for the given callsign + //! \remarks pseudo synchronous, call the async functions and waits for result BlackMisc::Aviation::CFlightPlan loadFlightPlanFromNetwork(const BlackMisc::Aviation::CCallsign &callsign); //! Returns this list of other clients we know about @@ -99,25 +101,18 @@ namespace BlackCore void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign); //! Read for model matching - void readyForModelMatching(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient); + void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft); public slots: //! Own aircraft updated void setOwnAircraft(const BlackMisc::Aviation::CAircraft &ownAircraft) { m_ownAircraft = ownAircraft; } //! Own aircraft model updated - void setOwnAircraftModel(const BlackMisc::Network::CAircraftModel &model) { m_ownAircraftModel = model; } + void setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model) { m_ownAircraftModel = model; } public: //! Clear the contents - void clear() - { - removeAllAtcStations(); - removeAllAircraft(); - removeAllOtherClients(); - m_metarCache.clear(); - m_flightPlanCache.clear(); - } + void clear(); private: BlackMisc::Aviation::CAtcStationList m_atcStationsOnline; @@ -125,14 +120,15 @@ namespace BlackCore BlackMisc::Aviation::CAircraftList m_aircraftInRange; BlackMisc::Network::CClientList m_otherClients; QMap m_metarCache; - QMap m_flightPlanCache; + QMap m_flightPlanCache; + QMap m_icaoCodeCache; - BlackMisc::Aviation::CAircraft m_ownAircraft; - BlackMisc::Network::CAircraftModel m_ownAircraftModel; + BlackMisc::Aviation::CAircraft m_ownAircraft; + BlackMisc::Simulation::CAircraftModel m_ownAircraftModel; INetwork *m_network = nullptr; - CVatsimBookingReader *m_vatsimBookingReader; - CVatsimDataFileReader *m_vatsimDataFileReader; + CVatsimBookingReader *m_vatsimBookingReader = nullptr; + CVatsimDataFileReader *m_vatsimDataFileReader = nullptr; CAirspaceWatchdog m_atcWatchdog; CAirspaceWatchdog m_aircraftWatchdog; @@ -144,14 +140,28 @@ namespace BlackCore //! Helper method, add voice capabilites if available void addVoiceCapabilitiesFromDataFile(BlackMisc::CPropertyIndexVariantMap &vm, const BlackMisc::Aviation::CCallsign &callsign); - void removeAllAtcStations(); + //! Remove ATC online stations + void removeAllOnlineAtcStations(); + + //! Remove all aircraft in range void removeAllAircraft(); + + //! Remove all clients void removeAllOtherClients(); + //! Remove data from caches + void removeFromAircraftCaches(const BlackMisc::Aviation::CCallsign &callsign); + + //! Schedule a ready for model matching + void fireDelayedReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial = 1, int delayMs = 2500); + private slots: + //! Create aircraft in range, this is the only place where a new aircraft should be added + void ps_aircraftUpdateReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); + void ps_realNameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); void ps_capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); - void ps_fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &, const QString &, const QString &, const QString &model); + void ps_fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &p1, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model); void ps_serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &server); void ps_metarReceived(const QString &metarMessage); void ps_flightPlanReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CFlightPlan &flightPlan); @@ -161,14 +171,13 @@ namespace BlackCore void ps_atisVoiceRoomReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url); void ps_atisLogoffTimeReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime); void ps_icaoCodesReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData); - void ps_aircraftUpdateReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); void ps_pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency); void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations); void ps_receivedDataFile(); - // non network related slots - void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign); + //! Send the information if aircraft and(!) client are vailable + void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial); }; } // namespace diff --git a/src/blackcore/context_application_impl.cpp b/src/blackcore/context_application_impl.cpp index 45fa78ab1..453a8e696 100644 --- a/src/blackcore/context_application_impl.cpp +++ b/src/blackcore/context_application_impl.cpp @@ -108,7 +108,7 @@ namespace BlackCore void CContextApplication::processHotkeyFuncEvent(const BlackMisc::Event::CEventHotkeyFunction &event) { CInputManager::getInstance()->callFunctionsBy(event.getFunction(), event.getFunctionArgument()); - qDebug() << "Calling function from origin" << event.getEventOriginator().toQString(); + CLogMessage(this, CLogCategory::contextSlot()).debug() << "Calling function from origin" << event.getEventOriginator().toQString(); } } // namespace diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index ca30ee62c..5f1163f6e 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -76,6 +76,8 @@ namespace BlackCore connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationOnlineConnectionStatus, this, &CContextNetwork::changedAtcStationOnlineConnectionStatus); connect(this->m_airspace, &CAirspaceMonitor::changedAircraftInRange, this, &CContextNetwork::changedAircraftInRange); connect(this->m_airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextNetwork::changedAircraftSituation); + + //! \todo Should be set in runtime, but this would require airspace to be a context connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraft, this->m_airspace, &CAirspaceMonitor::setOwnAircraft); connect(this->getIContextSimulator(), &IContextSimulator::ownAircraftModelChanged, this->m_airspace, &CAirspaceMonitor::setOwnAircraftModel); } @@ -107,23 +109,23 @@ namespace BlackCore QString msg; if (!server.getUser().isValid()) { - return CLogMessage(this).error("Invalid user credentials"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid user credentials"); } else if (!this->ownAircraft().getIcaoInfo().hasAircraftAndAirlineDesignator()) { - return CLogMessage(this).error("Invalid ICAO data for own aircraft"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid ICAO data for own aircraft"); } else if (!CNetworkUtils::canConnect(server, msg, 2000)) { - return CLogMessage(this).error(msg); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, msg); } else if (this->m_network->isConnected()) { - return CLogMessage(this).error("Already connected"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Already connected"); } else if (this->isPendingConnection()) { - return CLogMessage(this).error("Pending connection, please wait"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Pending connection, please wait"); } else { @@ -137,7 +139,7 @@ namespace BlackCore this->m_network->presetIcaoCodes(ownAircraft.getIcaoInfo()); this->m_network->setOwnAircraft(ownAircraft); this->m_network->initiateConnection(); - return CLogMessage(this).info("Connection pending %1 %2") << server.getAddress() << server.getPort(); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection pending " + server.getAddress() + " " + QString::number(server.getPort())); } } @@ -152,15 +154,15 @@ namespace BlackCore this->m_currentStatus = INetwork::Disconnecting; // as semaphore we are going to disconnect this->m_network->terminateConnection(); this->m_airspace->clear(); - return CLogMessage(this).info("Connection terminating"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection terminating"); } else if (this->isPendingConnection()) { - return CLogMessage(this).warning("Pending connection, please wait"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Pending connection, please wait"); } else { - return CLogMessage(this).warning("Already disconnected"); + return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityWarning, "Already disconnected"); } } diff --git a/src/blackcore/context_ownaircraft.h b/src/blackcore/context_ownaircraft.h index b0fd87cf9..48d63de05 100644 --- a/src/blackcore/context_ownaircraft.h +++ b/src/blackcore/context_ownaircraft.h @@ -13,8 +13,8 @@ #define BLACKCORE_CONTEXTOWNAIRCRAFT_H #include "blackcore/context.h" -#include "blackmisc/avaircraft.h" -#include "blackmisc/avatcstation.h" +#include "blackmisc/simulation/simulatedaircraft.h" +#include "blackmisc/avaircrafticao.h" #include "blackmisc/voiceroomlist.h" #include "blackmisc/avselcal.h" @@ -32,7 +32,7 @@ namespace BlackCore { - //! \brief Own context proxy + //! Own context proxy //! \ingroup dbus class IContextOwnAircraft : public CContext { @@ -66,19 +66,19 @@ namespace BlackCore signals: //! Aircraft changed //! \remarks local only - void changedAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + void changedAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator); //! Aircraft situation update //! \remarks local only - void changedAircraftSituation(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + void changedAircraftSituation(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator); //! Aircraft position update //! \remarks local only - void changedAircraftPosition(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + void changedAircraftPosition(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator); //! Aircraft cockpit update //! \remarks DBus and local - void changedAircraftCockpit(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + void changedAircraftCockpit(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator); //! Changed SELCAL code //! \remarks DBus and local @@ -87,27 +87,32 @@ namespace BlackCore public slots: //! Get own aircraft - virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0; + virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0; //! Own aircraft - //! \todo remove "own", left over from past - virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0; + virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0; + + //! Own aircraft + virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0; //! Own position, be aware height is terrain height - //! \todo remove "own", left over from past - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0; + virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0; //! Complete situation update - //! \todo remove "own", left over from past - virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0; + virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0; //! Update own cockpit - //! \todo remove "own", left over from past - virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0; + virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0; //! Tune in a com frequency virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) = 0; + //! Update model + virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) = 0; + + //! Update client + virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) = 0; + //! Set current pilot virtual bool updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator) = 0; diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 765bccc83..d094d3c4b 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -21,6 +21,8 @@ using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Geo; using namespace BlackMisc::Audio; +using namespace BlackMisc::Simulation; + namespace BlackCore { @@ -97,34 +99,87 @@ namespace BlackCore /* * Own Aircraft */ - void CContextOwnAircraft::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) + bool CContextOwnAircraft::updateAircraft(const CSimulatedAircraft &aircraft, const QString &originator) + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator; + + bool changedAircraft = this->updateAircraft(static_cast(aircraft), originator); + + bool changedModel = this->updateModel(aircraft.getModel(), originator); + bool changedClient = this->updateClient(aircraft.getClient(), originator); + if (changedModel || changedClient) + { + if (!changedAircraft) + { + // no signal so far + emit this->changedAircraft(this->m_ownAircraft, originator); + } + } + + bool changed = changedModel || changedClient || changedAircraft; + return changed; + } + + + /* + * Own Aircraft + */ + bool CContextOwnAircraft::updateAircraft(const CAircraft &aircraft, const QString &originator) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator; // trigger the correct signals - bool changedCockpit = this->updateOwnCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator); - bool changedPosition = this->updateOwnPosition(aircraft.getPosition(), aircraft.getAltitude() , originator); - bool changedSituation = this->updateOwnSituation(aircraft.getSituation(), originator); + bool changedCockpit = this->updateCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator); + bool changedPosition = this->updatePosition(aircraft.getPosition(), aircraft.getAltitude() , originator); + bool changedSituation = this->updateSituation(aircraft.getSituation(), originator); bool changed = changedCockpit || changedPosition || changedSituation; // new voice rooms, cockpit has changed - if (changedCockpit) this->resolveVoiceRooms(); + if (changedCockpit) { this->resolveVoiceRooms(); } // any change triggers a global updated aircraft signal // comparison is not to avoid setting the value, but avoid wrong signals - if (changed || this->m_ownAircraft != aircraft) + if (changed || this->getAviationAircraft() != aircraft) { emit this->changedAircraft(aircraft, originator); // now set value - this->m_ownAircraft = aircraft; + this->m_ownAircraft.update(aircraft); + changed = true; } + return changed; + } + + /* + * Client + */ + bool CContextOwnAircraft::updateClient(const CClient &client, const QString &originator) + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << client << originator; + + bool changed = this->m_ownAircraft.getClient() != client; + if (!changed) { return false; } + this->m_ownAircraft.setClient(client); + return true; + } + + /* + * Model + */ + bool CContextOwnAircraft::updateModel(const CAircraftModel &model, const QString &originator) + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << model << originator; + + bool changed = this->m_ownAircraft.getModel() != model; + if (!changed) { return false; } + this->m_ownAircraft.setModel(model); + return true; } /* * Own position */ - bool CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) + bool CContextOwnAircraft::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude << originator; bool changed = (this->m_ownAircraft.getPosition() != position); @@ -147,7 +202,7 @@ namespace BlackCore /* * Update own situation */ - bool CContextOwnAircraft::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) + bool CContextOwnAircraft::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << situation; bool changed = this->m_ownAircraft.getSituation() != situation; @@ -165,7 +220,7 @@ namespace BlackCore /* * Own cockpit data */ - bool CContextOwnAircraft::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) + bool CContextOwnAircraft::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << com1 << com2 << transponder; bool changed = this->m_ownAircraft.hasChangedCockpitData(com1, com2, transponder); @@ -198,7 +253,7 @@ namespace BlackCore { com2.setFrequencyActive(frequency); } - return updateOwnCockpit(com1, com2, xpdr, originator); + return updateCockpit(com1, com2, xpdr, originator); } /* @@ -287,7 +342,7 @@ namespace BlackCore /* * Own aircraft */ - CAircraft CContextOwnAircraft::getOwnAircraft() const + CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << this->m_ownAircraft; return this->m_ownAircraft; @@ -316,14 +371,14 @@ namespace BlackCore if (CTransponder::isValidTransponderCode(xprCode)) { transponder.setTransponderCode(xprCode); - this->updateOwnCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); + this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); return true; } else { CTransponder::TransponderMode mode = CTransponder::modeFromString(parser.part(1)); transponder.setTransponderMode(mode); - this->updateOwnCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); + this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); return true; } } @@ -346,7 +401,7 @@ namespace BlackCore { return false; } - this->updateOwnCockpit(com1, com2, ownAircraft.getTransponder(), "commandline"); + this->updateCockpit(com1, com2, ownAircraft.getTransponder(), "commandline"); return true; } } @@ -361,4 +416,12 @@ namespace BlackCore return false; } + /* + * Helper + */ + const CAircraft &CContextOwnAircraft::getAviationAircraft() const + { + return static_cast(this->m_ownAircraft); + } + } // namespace diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index 895f67b7d..9318ee561 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -16,6 +16,7 @@ #include "blackcore/context_settings.h" #include "blackcore/context_runtime.h" #include "blackcore/dbus_server.h" +#include "blackmisc/avatcstation.h" namespace BlackCore { @@ -33,27 +34,36 @@ namespace BlackCore virtual ~CContextOwnAircraft(); //! Own aircraft - const BlackMisc::Aviation::CAircraft &ownAircraft() const { return this->m_ownAircraft; } + const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const { return this->m_ownAircraft; } //! Own aircraft - BlackMisc::Aviation::CAircraft &ownAircraft() { return this->m_ownAircraft; } + BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() { return this->m_ownAircraft; } public slots: // IContextOwnAircraft overrides //! \copydoc IContextOwnAircraft::getOwnAircraft() - virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; + virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; - //! \copydoc IContextOwnAircraft::setOwnAircraft - virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateAircraft + virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnPosition - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateAircraft + virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnSituation - virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateModel + virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnCockpit - virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateClient + virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updatePosition + virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updateSituation + virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updateCockpit + virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateComFrequency virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override; @@ -108,7 +118,7 @@ namespace BlackCore void ps_changedAtcStationOnlineConnectionStatus(const BlackMisc::Aviation::CAtcStation &atcStation, bool connected); private: - BlackMisc::Aviation::CAircraft m_ownAircraft; //!< my aircraft + BlackMisc::Simulation::CSimulatedAircraft m_ownAircraft; //!< my aircraft bool m_automaticVoiceRoomResolution = true; //!< automatic voice room resolution, or disable for override QString m_voiceRoom1UrlOverride; //!< overridden voice room url QString m_voiceRoom2UrlOverride; //!< overridden voice room url @@ -119,6 +129,9 @@ namespace BlackCore //! Resolve voice rooms void resolveVoiceRooms(); + //! Own aircraft + const BlackMisc::Aviation::CAircraft &getAviationAircraft() const; + }; } diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index c4d0b5f28..0874d1f6a 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -10,6 +10,7 @@ using namespace BlackMisc; using namespace BlackMisc::Aviation; +using namespace BlackMisc::Simulation; namespace BlackCore { @@ -31,7 +32,7 @@ namespace BlackCore void CContextOwnAircraftProxy::relaySignals(const QString &serviceName, QDBusConnection &connection) { bool s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), - "changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Aviation::CAircraft, QString))); + "changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Simulation::CSimulatedAircraft, QString))); Q_ASSERT(s); s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), "changedSelcal", this, SIGNAL(changedSelcal(BlackMisc::Aviation::CSelcal, QString))); @@ -39,29 +40,44 @@ namespace BlackCore Q_UNUSED(s); } - BlackMisc::Aviation::CAircraft CContextOwnAircraftProxy::getOwnAircraft() const + BlackMisc::Simulation::CSimulatedAircraft CContextOwnAircraftProxy::getOwnAircraft() const { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraft")); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraft")); } - void CContextOwnAircraftProxy::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) + bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnAircraft"), aircraft, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateAircraft"), aircraft, originator); } - bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) + bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnPosition"), position, altitude, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateAircraft"), aircraft, originator); } - bool CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) + bool CContextOwnAircraftProxy::updateModel(const Simulation::CAircraftModel &model, const QString &originator) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnSituation"), situation, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateModel"), model, originator); } - bool CContextOwnAircraftProxy::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) + bool CContextOwnAircraftProxy::updateClient(const Network::CClient &client, const QString &originator) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnCockpit"), com1, com2, transponder, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateClient"), client, originator); + } + + bool CContextOwnAircraftProxy::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) + { + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updatePosition"), position, altitude, originator); + } + + bool CContextOwnAircraftProxy::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) + { + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateSituation"), situation, originator); + } + + bool CContextOwnAircraftProxy::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) + { + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateCockpit"), com1, com2, transponder, originator); } bool CContextOwnAircraftProxy::updateComFrequency(const PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) @@ -91,7 +107,7 @@ namespace BlackCore void CContextOwnAircraftProxy::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnCockpitOutputVolumes"), outputVolumeCom1, outputVolumeCom2); + this->m_dBusInterface->callDBus(QLatin1Literal("updateCockpitOutputVolumes"), outputVolumeCom1, outputVolumeCom2); } void CContextOwnAircraftProxy::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) diff --git a/src/blackcore/context_ownaircraft_proxy.h b/src/blackcore/context_ownaircraft_proxy.h index f6db6e60d..3ce022d80 100644 --- a/src/blackcore/context_ownaircraft_proxy.h +++ b/src/blackcore/context_ownaircraft_proxy.h @@ -14,12 +14,13 @@ #include "blackcore/context_ownaircraft.h" #include "blackmisc/genericdbusinterface.h" -#include "blackmisc/avallclasses.h" +#include "blackmisc/avaircrafticao.h" +#include "blackmisc/simulation/simulatedaircraft.h" namespace BlackCore { - //! \brief Own aircraft context proxy + //! Own aircraft context proxy //! \ingroup dbus class CContextOwnAircraftProxy : public IContextOwnAircraft { @@ -31,35 +32,31 @@ namespace BlackCore //! Destructor virtual ~CContextOwnAircraftProxy() {} - private: - BlackMisc::CGenericDBusInterface *m_dBusInterface; /*!< DBus interface */ - - //! \brief Relay connection signals to local signals. - void relaySignals(const QString &serviceName, QDBusConnection &connection); - - protected: - //! \brief Constructor - CContextOwnAircraftProxy(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextOwnAircraft(mode, runtime), m_dBusInterface(nullptr) {} - - //! \brief DBus version constructor - CContextOwnAircraftProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime); - public slots: // IContextOwnAircraft overrides //! \copydoc IContextOwnAircraft::getOwnAircraft() - virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; + virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; - //! \copydoc IContextOwnAircraft::setOwnAircraft() - virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateAircraft + virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnPosition - virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateAircraft + virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnSituation - virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateModel + virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override; - //! \copydoc IContextOwnAircraft::updateOwnCockpit - virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateClient + virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updatePosition + virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updateSituation + virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; + + //! \copydoc IContextOwnAircraft::updateCockpit + virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateComFrequency virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override; @@ -80,7 +77,7 @@ namespace BlackCore virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) override; //! \copydoc IContextOwnAircraft::setAudioVoiceRoomOverrideUrls - virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url,const QString &voiceRoom2Url); + virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url); //! \copydoc IContextOwnAircraft::enableAutomaticVoiceRoomResolution virtual void enableAutomaticVoiceRoomResolution(bool enable); @@ -88,6 +85,20 @@ namespace BlackCore //! \copydoc IContextOwnAircraft::parseCommandLine virtual bool parseCommandLine(const QString &commandLine) override; + protected: + //! \brief Constructor + CContextOwnAircraftProxy(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextOwnAircraft(mode, runtime), m_dBusInterface(nullptr) {} + + //! \brief DBus version constructor + CContextOwnAircraftProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime); + + private: + BlackMisc::CGenericDBusInterface *m_dBusInterface; //!< DBus interface */ + + //! \brief Relay connection signals to local signals. + void relaySignals(const QString &serviceName, QDBusConnection &connection); + + }; } diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 8a6973987..a424ba8fc 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -26,12 +26,14 @@ #include "context.h" #include "blackcore/dbus_server.h" #include "blackcore/context_runtime.h" +#include "blackmisc/simulation/aircraftmodellist.h" #include "blacksim/simulatorinfo.h" #include "blacksim/simulatorinfolist.h" -#include "blackmisc/nwaircraftmodellist.h" #include "blackmisc/avaircraft.h" +#include "blackmisc/simulation/simulatedaircraftlist.h" #include "blackmisc/avairportlist.h" #include "blackmisc/project.h" +#include "blackmisc/pixmap.h" #include namespace BlackCore @@ -79,19 +81,23 @@ namespace BlackCore //! Installed aircraft models ready or changed void installedAircraftModelsChanged(); - //! A single model has been matched - void modelMatchingCompleted(BlackMisc::Network::CAircraftModel model); + //! A single model has been matched for given Aircraft + void modelMatchingCompleted(BlackMisc::Simulation::CSimulatedAircraft aircraft); + + //! A remote aircraft got changed + void remoteAircraftChanged(BlackMisc::Simulation::CSimulatedAircraft aircraft); //! Emitted when own aircraft model changes //! \todo move to own aircraft context? - void ownAircraftModelChanged(BlackMisc::Network::CAircraftModel model); + void ownAircraftModelChanged(BlackMisc::Simulation::CSimulatedAircraft aircraft); public slots: //! Return list of available simulator plugins virtual BlackSim::CSimulatorInfoList getAvailableSimulatorPlugins() const = 0; - //! Returns true when simulator is connected and available + //! Returns true when simulator is connected + //! \sa isSimulating virtual bool isConnected() const = 0; //! Can we connect? @@ -106,8 +112,8 @@ namespace BlackCore //! Disconnect from simulator virtual bool disconnectFrom() = 0; - //! Returns true when simulator is running - virtual bool isRunning() const = 0; + //! Returns true when simulator is running / simulating + virtual bool isSimulating() const = 0; //! Simulator info virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0; @@ -116,13 +122,17 @@ namespace BlackCore virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0; //! Aircraft model - virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0; + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const = 0; //! Installed models in simulator eco system - virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const = 0; + virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const = 0; - //! Remote aircraft in range having a valid model matching (which should be all aircraft in range) - virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const = 0; + //! Simulated other aircraft in range + virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const = 0; + + //! Changed remote aircraft (e.g. by disabling aircraft) + //! \todo tbd No add/remove remote aircraft function as those are added implicitly by accessing airspace monitor + virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changeValues) = 0; //! Set time synchronization between simulator and user's computer time //! \remarks not all drivers implement this, e.g. if it is an intrinsic simulator feature @@ -131,6 +141,12 @@ namespace BlackCore //! Is time synchronization on? virtual bool isTimeSynchronized() const = 0; + //! Max. number of remote aircraft rendered + virtual int getMaxRenderedRemoteAircraft() const = 0; + + //! Max. number of remote aircraft rendered + virtual void setMaxRenderedRemoteAircraft(int number) = 0; + //! Time synchronization offset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const = 0; @@ -143,7 +159,7 @@ namespace BlackCore //! Unload simulator plugin virtual void unloadSimulatorPlugin() = 0; - //! Simulator avialable? + //! Simulator avialable (driver available)? bool isSimulatorAvailable() const { return BlackMisc::CProject::isCompiledWithFlightSimulatorSupport() && !getSimulatorInfo().isUnspecified(); } //! Simulator paused? @@ -152,6 +168,9 @@ namespace BlackCore //! Settings have been changed virtual void settingsChanged(uint type) = 0; + //! Icon representing the model + virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const = 0; + protected: //! Constructor IContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContext(mode, runtime) {} diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 4dfb0c69f..d941600d3 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -13,6 +13,7 @@ #include "context_application.h" #include "context_network_impl.h" #include "context_runtime.h" +#include "blackmisc/propertyindexvariantmap.h" #include "blackmisc/logmessage.h" #include "blackmisc/loghandler.h" #include @@ -22,6 +23,7 @@ using namespace BlackMisc; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; +using namespace BlackMisc::Simulation; using namespace BlackMisc::Geo; using namespace BlackSim; using namespace BlackSim::Settings; @@ -97,11 +99,11 @@ namespace BlackCore return m_simulator->getSimulatorInfo(); } - Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const + Simulation::CAircraftModel CContextSimulator::getOwnAircraftModel() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; // If no ISimulator object is available, return a dummy. - if (!m_simulator) { return Network::CAircraftModel(); } + if (!m_simulator) { return Simulation::CAircraftModel(); } return this->m_simulator->getOwnAircraftModel(); } @@ -124,13 +126,26 @@ namespace BlackCore return this->m_simulator->getInstalledModels(); } - CAircraftModelList CContextSimulator::getCurrentlyMatchedModels() const + CSimulatedAircraftList CContextSimulator::getRemoteAircraft() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; // If no ISimulator object is available, return a dummy. - if (!m_simulator) { return CAircraftModelList(); } + if (!m_simulator) { return CSimulatedAircraftList(); } - return this->m_simulator->getCurrentlyMatchedModels(); + return this->m_simulator->getRemoteAircraft(); + } + + int CContextSimulator::changeRemoteAircraft(const CSimulatedAircraft &changedAircraft, const CPropertyIndexVariantMap &changedValues) + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (!m_simulator) { return 0; } + int c = this->m_simulator->changeRemoteAircraft(changedAircraft, changedValues); + if (c > 0) + { + // really changed something + emit this->remoteAircraftChanged(changedAircraft); + } + return c; } void CContextSimulator::setTimeSynchronization(bool enable, CTime offset) @@ -147,6 +162,20 @@ namespace BlackCore return this->m_simulator->isTimeSynchronized(); } + int CContextSimulator::getMaxRenderedRemoteAircraft() const + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (!m_simulator) return 0; + return 13; + } + + void CContextSimulator::setMaxRenderedRemoteAircraft(int number) + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + //! \todo implement + Q_UNUSED(number); + } + CTime CContextSimulator::getTimeSynchronizationOffset() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; @@ -194,14 +223,17 @@ namespace BlackCore connect(m_simulator, &ISimulator::simulatorStatusChanged, this, &CContextSimulator::simulatorStatusChanged); connect(m_simulator, &ISimulator::ownAircraftModelChanged, this, &IContextSimulator::ownAircraftModelChanged); connect(m_simulator, &ISimulator::modelMatchingCompleted, this, &IContextSimulator::modelMatchingCompleted); + connect(m_simulator, &ISimulator::installedAircraftModelsChanged, this, &IContextSimulator::installedAircraftModelsChanged); - // log + // log from context to simulator connect(CLogHandler::instance(), &CLogHandler::localMessageLogged, m_simulator, &ISimulator::displayStatusMessage); connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, m_simulator, &ISimulator::displayStatusMessage); // connect with network + //! \todo using airspace monitor directly is maybe wrong (KB: I think it is). It assumes simulator and network + //! context reside in the same process, which is not guranteed IMHO CAirspaceMonitor *airspace = this->getRuntime()->getCContextNetwork()->getAirspaceMonitor(); - // connect(airspace, &CAirspaceMonitor::addedAircraft, this, &CContextSimulator::ps_addRemoteAircraft); + // use readyForModelMatching instead of CAirspaceMonitor::addedAircraft, as it contains client information connect(airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft); connect(airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation); connect(airspace, &CAirspaceMonitor::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft); @@ -209,7 +241,9 @@ namespace BlackCore { Q_ASSERT(!aircraft.getCallsign().isEmpty()); CClient client = airspace->getOtherClients().findFirstByCallsign(aircraft.getCallsign()); - m_simulator->addRemoteAircraft(aircraft, client); + CSimulatedAircraft simAircraft(aircraft); + simAircraft.setClient(client); + m_simulator->addRemoteAircraft(simAircraft); } // apply latest settings @@ -257,6 +291,7 @@ namespace BlackCore if (m_simulator) { // depending on shutdown order, network might already have been deleted + //! \todo why do we need to disconnet context when we unload driver? if (this->getRuntime()->getIContextNetwork()->isUsingImplementingObject()) { CContextNetwork *network = this->getRuntime()->getCContextNetwork(); @@ -288,16 +323,16 @@ namespace BlackCore { // the method will check, if an update is really required // these are local (non DBus) calls - this->getIContextOwnAircraft()->updateOwnAircraft(contextAircraft, this->getPathAndContextId()); + this->getIContextOwnAircraft()->updateAircraft(contextAircraft, this->getPathAndContextId()); } } - void CContextSimulator::ps_addRemoteAircraft(const CAircraft &remoteAircraft, const CClient &remoteClient) + void CContextSimulator::ps_addRemoteAircraft(const CSimulatedAircraft &remoteAircraft) { Q_ASSERT(this->m_simulator); Q_ASSERT(!remoteAircraft.getCallsign().isEmpty()); if (!this->m_simulator) { return; } - this->m_simulator->addRemoteAircraft(remoteAircraft, remoteClient); + this->m_simulator->addRemoteAircraft(remoteAircraft); } void CContextSimulator::ps_addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation) @@ -380,13 +415,19 @@ namespace BlackCore this->m_simulator->setTimeSynchronization(timeSync, syncOffset); } + CPixmap CContextSimulator::iconForModel(const QString &modelString) const + { + if (!this->m_simulator) { return CPixmap(); } + return this->m_simulator->iconForModel(modelString); + } + bool CContextSimulator::isPaused() const { if (!this->m_simulator) return false; return this->m_simulator->isPaused(); } - bool CContextSimulator::isRunning() const + bool CContextSimulator::isSimulating() const { if (!this->m_simulator) return false; return this->m_simulator->isSimulating(); diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 3bcd266a4..a87176143 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -15,10 +15,10 @@ #include "blackcore/context_simulator.h" #include "blackcore/context_network.h" #include "blackcore/simulator.h" - #include "blacksim/simulatorinfo.h" #include "blacksim/simulatorinfolist.h" - +#include "blackmisc/pixmap.h" +#include "blackmisc/simulation/simulatedaircraftlist.h" #include #include #include @@ -62,23 +62,26 @@ namespace BlackCore //! \copydoc IContextSimulator::isPaused virtual bool isPaused() const override; - //! \copydoc IContextSimulator::isRunning - virtual bool isRunning() const override; + //! \copydoc IContextSimulator::isSimulating + virtual bool isSimulating() const override; //! \copydoc IContextSimulator::getSimulatorInfo() virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; //! \copydoc IContextSimulator::getAircraftModel() - virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override; + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override; - //! \copydoc IContextSimulator::getAirportsInRange() + //! \copydoc IContextSimulator::getAirportsInRange virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; - //! \copydoc IContextSimulator::getInstalledModels() - virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override; + //! \copydoc IContextSimulator::getInstalledModels + virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const override; - //! \copydoc IContextSimulator::getCurrentlyMatchedModels() - virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override; + //! \copydoc IContextSimulator::getRemoteAircraft + virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const override; + + //! \copydoc IContextSimulator::changeRemoteAircraft + virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changedValues) override; //! \copydoc IContextSimulator::setTimeSynchronization virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; @@ -86,6 +89,12 @@ namespace BlackCore //! \copydoc IContextSimulator::isTimeSynchronized virtual bool isTimeSynchronized() const override; + //! \copydoc IContextSimulator::getMaxRenderedRemoteAircraft + virtual int getMaxRenderedRemoteAircraft() const override; + + //! \copydoc IContextSimulator::setMaxRenderedRemoteAircraft + virtual void setMaxRenderedRemoteAircraft(int number) override; + //! \copydoc IContextSimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override; @@ -101,6 +110,9 @@ namespace BlackCore //! \copydoc IContextSimulator::settingsChanged virtual void settingsChanged(uint type) override; + //! \copydoc IContextSimulator::iconForModel + virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; + protected: //! \brief Constructor CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime); @@ -118,8 +130,7 @@ namespace BlackCore void ps_updateOwnAircraftContext(); //! \copydoc ISimulator::addRemoteAircraft - // void ps_addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation); - void ps_addRemoteAircraft(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient); + void ps_addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft); //! \copydoc ISimulator::addAircraftSituation void ps_addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation); diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index b95210b81..55714eb8c 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -1,7 +1,11 @@ -/* Copyright (C) 2013 VATSIM Community / authors - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/* Copyright (C) 2013 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ #include "blackcore/context_simulator_proxy.h" #include @@ -13,6 +17,7 @@ using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Geo; +using namespace BlackMisc::Simulation; using namespace BlackSim; namespace BlackCore @@ -38,11 +43,16 @@ namespace BlackCore "simulatorStatusChanged", this, SIGNAL(simulatorStatusChanged(bool, bool, bool))); Q_ASSERT(s); s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), - "ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Network::CAircraftModel))); + "installedAircraftModelsChanged", this, SIGNAL(installedAircraftModelsChanged())); Q_ASSERT(s); - s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), - "modelMatchingCompleted", this, SIGNAL(modelMatchingCompleted(BlackMisc::Network::CAircraftModel))); + "ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Simulation::CSimulatedAircraft))); + Q_ASSERT(s); + s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), + "modelMatchingCompleted", this, SIGNAL(modelMatchingCompleted(BlackMisc::Simulation::CSimulatedAircraft))); + Q_ASSERT(s); + s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), + "remoteAircraftChanged", this, SIGNAL(remoteAircraftChanged(BlackMisc::Simulation::CSimulatedAircraft))); Q_ASSERT(s); Q_UNUSED(s); } @@ -77,9 +87,9 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("disconnectFrom")); } - BlackMisc::Network::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const + BlackMisc::Simulation::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const { - return m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraftModel")); + return m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraftModel")); } CAirportList CContextSimulatorProxy::getAirportsInRange() const @@ -89,12 +99,17 @@ namespace BlackCore CAircraftModelList CContextSimulatorProxy::getInstalledModels() const { - return m_dBusInterface->callDBusRet(QLatin1Literal("getInstalledModels")); + return m_dBusInterface->callDBusRet(QLatin1Literal("getInstalledModels")); } - CAircraftModelList CContextSimulatorProxy::getCurrentlyMatchedModels() const + CSimulatedAircraftList CContextSimulatorProxy::getRemoteAircraft() const { - return m_dBusInterface->callDBusRet(QLatin1Literal("getCurrentlyMatchedModels")); + return m_dBusInterface->callDBusRet(QLatin1Literal("getRemoteAircraft")); + } + + int CContextSimulatorProxy::changeRemoteAircraft(const CSimulatedAircraft &changedAircraft, const CPropertyIndexVariantMap &changedValues) + { + return m_dBusInterface->callDBusRet(QLatin1Literal("changeRemoteAircraft"), changedAircraft, changedValues); } BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const @@ -112,6 +127,16 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("isTimeSynchronized")); } + void CContextSimulatorProxy::setMaxRenderedRemoteAircraft(int number) + { + m_dBusInterface->callDBus(QLatin1Literal("setMaxRenderedRemoteAircraft"), number); + } + + int CContextSimulatorProxy::getMaxRenderedRemoteAircraft() const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("getMaxRenderedRemoteAircraft")); + } + CTime CContextSimulatorProxy::getTimeSynchronizationOffset() const { return m_dBusInterface->callDBusRet(QLatin1Literal("getTimeSynchronizationOffset")); @@ -137,14 +162,19 @@ namespace BlackCore m_dBusInterface->callDBus(QLatin1Literal("settingsChanged"), type); } + CPixmap CContextSimulatorProxy::iconForModel(const QString &modelString) const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("iconForModel"), modelString); + } + bool CContextSimulatorProxy::isPaused() const { return m_dBusInterface->callDBusRet(QLatin1Literal("isPaused")); } - bool CContextSimulatorProxy::isRunning() const + bool CContextSimulatorProxy::isSimulating() const { return m_dBusInterface->callDBusRet(QLatin1Literal("isRunning")); } -} // namespace BlackCore +} // namespace diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index 4fa6540f5..1c6c61a75 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -14,6 +14,7 @@ #include "blackcore/context_simulator.h" #include "blackmisc/genericdbusinterface.h" +#include "blackmisc/pixmap.h" namespace BlackCore { @@ -61,23 +62,26 @@ namespace BlackCore //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFrom() override; - //! \copydoc IContextSimulator::isRunning - virtual bool isRunning() const override; + //! \copydoc IContextSimulator::isSimulating + virtual bool isSimulating() const override; //! \copydoc IContextSimulator::isPaused virtual bool isPaused() const override; //! \copydoc IContextSimulator::getAircraftModel() - virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override; + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override; //! \copydoc IContextSimulator::getAirportsInRange() virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; //! \copydoc IContextSimulator::getInstalledModels() - virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override; + virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const override; - //! \copydoc IContextSimulator::getCurrentlyMatchedModels() - virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override; + //! \copydoc IContextSimulator::getRemoteAircraft + virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const override; + + //! \copydoc IContextSimulator::changeRemoteAircraft + virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changedValues) override; //! \copydoc IContextSimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; @@ -88,6 +92,12 @@ namespace BlackCore //! \copydoc IContextSimulator::isTimeSynchronized virtual bool isTimeSynchronized() const override; + //! \copydoc IContextSimulator::getMaxRenderedRemoteAircraft + virtual int getMaxRenderedRemoteAircraft() const override; + + //! \copydoc IContextSimulator::setMaxRenderedRemoteAircraft + virtual void setMaxRenderedRemoteAircraft(int number) override; + //! \copydoc IContextSimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override; @@ -103,6 +113,9 @@ namespace BlackCore //! \copydoc IContextSimulator::settingsChanged virtual void settingsChanged(uint type) override; + //! \copydoc IContextSimulator::iconForModel + virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; + }; } // namespace BlackCore