diff --git a/samples/blackcore/tool.cpp b/samples/blackcore/tool.cpp index 5bbd400c1..07a42b387 100644 --- a/samples/blackcore/tool.cpp +++ b/samples/blackcore/tool.cpp @@ -1,9 +1,5 @@ #include "tool.h" -#include "blackcore/context_runtime.h" -#include "blackcore/context_network.h" -#include "blackcore/context_audio.h" -#include "blackcore/context_settings.h" -#include "blackcore/context_application.h" +#include "blackcore/context_all_interfaces.h" #include "blackmisc/indexvariantmap.h" #include "blackmisc/avallclasses.h" #include "blackmisc/pqallquantities.h" @@ -48,6 +44,8 @@ namespace BlackMiscTest const BlackCore::IContextNetwork *networkContext = runtime->getIContextNetwork(); const BlackCore::IContextAudio *audioContext = runtime->getIContextAudio(); const BlackCore::IContextSettings *settingsContext = runtime->getIContextSettings(); + const BlackCore::IContextOwnAircraft *ownAircraftContext = runtime->getIContextOwnAircraft(); + BlackCore::IContextApplication *applicationContext = runtime->getIContextApplication(); qDebug() << "-------------"; @@ -62,7 +60,7 @@ namespace BlackMiscTest qDebug() << "signal / slot logging:"; qDebug() << "sig + context + [e]nabled/[d]isabled"; qDebug() << "slo + context + [e]nabled/[d]isabled"; - qDebug() << "contexts: app / aud / net / set / sim / all"; + qDebug() << "contexts: app / aud / net / own (aircraft) / set / sim / all"; qDebug() << "examples: sigappd, slonete, slosimd, sloalle"; qDebug() << "-------------"; @@ -95,7 +93,7 @@ namespace BlackMiscTest { qDebug() << "-------------"; qDebug() << "my aircraft"; - qDebug() << networkContext->getOwnAircraft(); + qDebug() << ownAircraftContext->getOwnAircraft(); } else if (line.startsWith("5")) { @@ -121,6 +119,7 @@ namespace BlackMiscTest if (line.startsWith("app")) runtime->signalLogForApplication(enable); else if (line.startsWith("aud")) runtime->signalLogForAudio(enable); else if (line.startsWith("net")) runtime->signalLogForNetwork(enable); + else if (line.startsWith("own")) runtime->signalLogForOwnAircraft(enable); else if (line.startsWith("set")) runtime->signalLogForSettings(enable); else if (line.startsWith("sim")) runtime->signalLogForSimulator(enable); else if (line.startsWith("all")) runtime->signalLog(enable); @@ -133,6 +132,7 @@ namespace BlackMiscTest if (line.startsWith("app")) runtime->slotLogForApplication(enable); else if (line.startsWith("aud")) runtime->slotLogForAudio(enable); else if (line.startsWith("net")) runtime->slotLogForNetwork(enable); + else if (line.startsWith("own")) runtime->signalLogForOwnAircraft(enable); else if (line.startsWith("set")) runtime->slotLogForSettings(enable); else if (line.startsWith("sim")) runtime->slotLogForSimulator(enable); else if (line.startsWith("all")) runtime->slotLog(enable); diff --git a/src/blackcore/context_ownaircraft.h b/src/blackcore/context_ownaircraft.h index fff757520..dc9e1dd1f 100644 --- a/src/blackcore/context_ownaircraft.h +++ b/src/blackcore/context_ownaircraft.h @@ -8,7 +8,6 @@ #include "blackcore/context.h" #include "blackmisc/avallclasses.h" -#include "blackmisc/statusmessagelist.h" #define BLACKCORE_CONTEXTOWNAIRCRAFT_INTERFACENAME "net.vatsim.PilotClient.BlackCore.ContextOwnAircraft" #define BLACKCORE_CONTEXTOWNAIRCRAFT_OBJECTPATH "/OwnAircraft" @@ -42,28 +41,30 @@ namespace BlackCore signals: //! Aircraft situation update - void changedAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation); + void changedAircraftSituation(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + + //! Aircraft cockpit update + void changedAircraftCockpit(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + + //! Aircraft position update + void changedAircraftPosition(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); public slots: //! Get own aircraft virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0; - /*! - * Set own aircraft - * \param aircraft - * \return message list, as aircraft can only be set prior connecting - */ - virtual BlackMisc::CStatusMessageList setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) = 0; + //! Own aircraft + virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0; //! Own position, be aware height is terrain height - virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0; + virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0; //! Complete situation update - virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0; + virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0; //! Update own cockpit - virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder) = 0; + virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0; protected: //! Constructor diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 763f3859b..0403f82b5 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -35,9 +35,7 @@ namespace BlackCore /* * Cleanup */ - CContextOwnAircraft::~CContextOwnAircraft() - { - } + CContextOwnAircraft::~CContextOwnAircraft() { } /* * Init own aircraft @@ -67,35 +65,52 @@ namespace BlackCore /* * Own Aircraft */ - CStatusMessageList CContextOwnAircraft::setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) + void CContextOwnAircraft::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) { + // trigger the correct signals + this->updateOwnCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator); + this->updateOwnPosition(aircraft.getPosition(), aircraft.getAltitude() ,originator); + this->updateOwnSituation(aircraft.getSituation(), originator); + + // all the rest this->m_ownAircraft = aircraft; - return CStatusMessageList(); } /* * Own position */ - void CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + void CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) { if (this->getRuntime()->isSlotLogForOwnAircraftEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO, position.toQString(), altitude.toQString()); - this->m_ownAircraft.setPosition(position); - this->m_ownAircraft.setAltitude(altitude); + bool changed = (this->m_ownAircraft.getPosition() == position); + if (changed) this->m_ownAircraft.setPosition(position); + + if (this->m_ownAircraft.getAltitude() != altitude) + { + changed = true; + this->m_ownAircraft.setAltitude(altitude); + } + + if (changed) emit this->changedAircraftPosition(this->m_ownAircraft, originator); } /* * Update own situation */ - void CContextOwnAircraft::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) + void CContextOwnAircraft::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) { if (this->getRuntime()->isSlotLogForOwnAircraftEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO, situation.toQString()); + bool changed = this->m_ownAircraft.getSituation() == situation; + if (!changed) return; + this->m_ownAircraft.setSituation(situation); + emit this->changedAircraftSituation(this->m_ownAircraft, originator); } /* * Own cockpit data */ - void CContextOwnAircraft::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder) + void CContextOwnAircraft::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) { if (this->getRuntime()->isSlotLogForOwnAircraftEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO, com1.toQString(), com2.toQString(), transponder.toQString()); bool changed = false; @@ -114,8 +129,7 @@ namespace BlackCore this->m_ownAircraft.setTransponder(transponder); changed = true; } - - if (!changed) return; + if (changed) emit this->changedAircraftCockpit(this->m_ownAircraft, originator); } /* diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index bf8326d75..d7620e97b 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -34,16 +34,16 @@ namespace BlackCore public slots: // IContextOwnAircraft overrides //! \copydoc IContextOwnAircraft::setOwnAircraft() - virtual BlackMisc::CStatusMessageList setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) override; + virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnPosition() - virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnSituation() - virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; + virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnCockpit() - virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder) override; + virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; //! \copydoc IContextOwnAircraft::getOwnAircraft() virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; @@ -61,7 +61,7 @@ namespace BlackCore } private: - BlackMisc::Aviation::CAircraft m_ownAircraft; + BlackMisc::Aviation::CAircraft m_ownAircraft; //!< my aircraft //! Init my very own aircraft void initOwnAircraft(); diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index 0ebb2cd2d..1b390f12d 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -27,13 +27,18 @@ namespace BlackCore */ void CContextOwnAircraftProxy::relaySignals(const QString &serviceName, QDBusConnection &connection) { -// bool s; = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), -// "connectionStatusChanged", this, SIGNAL(connectionStatusChanged(uint, uint, const QString &))); -// Q_ASSERT(s); -// s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), -// "changedAtcStationsBooked", this, SIGNAL(changedAtcStationsBooked())); -// Q_ASSERT(s); -// Q_UNUSED(s); + bool s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), + "changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Aviation::CAircraft, QString))); + Q_ASSERT(s); + + s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), + "changedAircraftPosition", this, SIGNAL(changedAircraftPosition(BlackMisc::Aviation::CAircraft, QString))); + Q_ASSERT(s); + + s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), + "changedAircraftPosition", this, SIGNAL(changedAircraftPosition(BlackMisc::Aviation::CAircraft, QString))); + Q_ASSERT(s); + Q_UNUSED(s); } BlackMisc::Aviation::CAircraft CContextOwnAircraftProxy::getOwnAircraft() const @@ -41,23 +46,23 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraft")); } - BlackMisc::CStatusMessageList CContextOwnAircraftProxy::setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) + void CContextOwnAircraftProxy::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("setOwnAircraft"), aircraft); + this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnAircraft"), aircraft, originator); } - void CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + void CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnPosition"), position, altitude); + this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnPosition"), position, altitude, originator); } - void CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) + void CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnSituation"), situation); + this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnSituation"), situation, originator); } - void CContextOwnAircraftProxy::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder) + void CContextOwnAircraftProxy::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnCockpit"), com1, com2, transponder); + this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnCockpit"), com1, com2, transponder, originator); } } // namespace diff --git a/src/blackcore/context_ownaircraft_proxy.h b/src/blackcore/context_ownaircraft_proxy.h index c216ee8d0..3b592b7b3 100644 --- a/src/blackcore/context_ownaircraft_proxy.h +++ b/src/blackcore/context_ownaircraft_proxy.h @@ -40,16 +40,16 @@ namespace BlackCore public slots: // IContextOwnAircraft overrides //! \copydoc IContextOwnAircraft::setOwnAircraft() - virtual BlackMisc::CStatusMessageList setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) override; + virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnPosition() - virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual void updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnSituation() - virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; + virtual void updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override; //! \copydoc IContextOwnAircraft::updateOwnCockpit() - virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder) override; + virtual void updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originato4) override; //! \copydoc IContextOwnAircraft::getOwnAircraft() virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; diff --git a/src/blackcore/context_runtime.cpp b/src/blackcore/context_runtime.cpp index b8265aa94..10b0f046b 100644 --- a/src/blackcore/context_runtime.cpp +++ b/src/blackcore/context_runtime.cpp @@ -164,7 +164,15 @@ namespace BlackCore // connect signal / slots when enabled QMetaObject::Connection con; con = QObject::connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftSituation, - [this](const BlackMisc::Aviation::CAircraftSituation & situation) { QStringList l; l << "changedAircraftSituation" << situation.toQString(); this->logSignal(this->getIContextApplication(), l);}); + [this](const BlackMisc::Aviation::CAircraft & aircraft, const QString & originator) { QStringList l; l << "changedAircraftSituation" << aircraft.toQString() << originator; this->logSignal(this->getIContextApplication(), l);}); + this->m_logSignalConnections.insert("ownaircraft", con); + + con = QObject::connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftCockpit, + [this](const BlackMisc::Aviation::CAircraft & aircraft, const QString & originator) { QStringList l; l << "changedAircraftCockpit" << aircraft.toQString() << originator; this->logSignal(this->getIContextApplication(), l);}); + this->m_logSignalConnections.insert("ownaircraft", con); + + con = QObject::connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftPosition, + [this](const BlackMisc::Aviation::CAircraft & aircraft, const QString & originator) { QStringList l; l << "changedAircraftPosition" << aircraft.toQString() << originator; this->logSignal(this->getIContextApplication(), l);}); this->m_logSignalConnections.insert("ownaircraft", con); } else @@ -319,6 +327,20 @@ namespace BlackCore } times.insert("Application", time.restart()); + switch (config.getModeOwnAircraft()) + { + case CRuntimeConfig::Local: + case CRuntimeConfig::LocalInDbusServer: + this->m_contextOwnAircraft = (new CContextOwnAircraft(config.getModeApplication(), this))->registerWithDBus(this->m_dbusServer); + break; + case CRuntimeConfig::Remote: + this->m_contextOwnAircraft = new BlackCore::CContextOwnAircraftProxy(BlackCore::CDBusServer::ServiceName, this->m_dbusConnection, config.getModeOwnAircraft(), this); + break; + default: + qFatal("Always initialize own aircraft context"); + } + times.insert("Own aircraft", time.restart()); + switch (config.getModeAudio()) { case CRuntimeConfig::Local: @@ -361,6 +383,13 @@ namespace BlackCore } times.insert("Simulator", time.restart()); + // checks -------------- + // 1. own aircraft and simulator should reside in same location + Q_ASSERT(!this->m_contextSimulator || (this->m_contextOwnAircraft->usingLocalObjects() == this->m_contextSimulator->usingLocalObjects())); + + // 2. own aircraft and network should reside in same location + Q_ASSERT(!this->m_contextNetwork || (this->m_contextOwnAircraft->usingLocalObjects() == this->m_contextNetwork->usingLocalObjects())); + // post inits, wiring things among context (e.g. signal slots) this->initPostSetup(); qDebug() << "Init times:" << times; @@ -422,6 +451,12 @@ namespace BlackCore this->getIContextApplication()->deleteLater(); } + if (this->getIContextOwnAircraft()) + { + disconnect(this->getIContextOwnAircraft()); + this->getIContextOwnAircraft()->deleteLater(); + } + if (this->getIContextSimulator()) { // TODO: disconnect from simulator @@ -442,6 +477,7 @@ namespace BlackCore disconnect(this->getIContextAudio()); this->getIContextAudio()->deleteLater(); } + if (this->getIContextSettings()) { disconnect(this->getIContextSettings()); @@ -449,7 +485,7 @@ namespace BlackCore } // mark contexts as invalid - // they will be deleted by the parent object (this runtime) + // objects are already scheduled for deletion this->m_contextApplication = nullptr; this->m_contextAudio = nullptr; this->m_contextNetwork = nullptr;