From 1166bcd053be47004b061d2ded074d47eff02779 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 28 May 2014 01:47:20 +0200 Subject: [PATCH] refs #246, own context for aircraft --- src/blackcore/context_ownaircraft.h | 25 +++-- src/blackcore/context_ownaircraft_impl.cpp | 104 +++++++++++++++++--- src/blackcore/context_ownaircraft_impl.h | 29 +++++- src/blackcore/context_ownaircraft_proxy.cpp | 36 ++++--- src/blackcore/context_ownaircraft_proxy.h | 20 +++- src/blackcore/context_runtime.cpp | 10 +- 6 files changed, 181 insertions(+), 43 deletions(-) diff --git a/src/blackcore/context_ownaircraft.h b/src/blackcore/context_ownaircraft.h index dc9e1dd1f..af501bc05 100644 --- a/src/blackcore/context_ownaircraft.h +++ b/src/blackcore/context_ownaircraft.h @@ -8,6 +8,7 @@ #include "blackcore/context.h" #include "blackmisc/avallclasses.h" +#include "blackmisc/voiceroomlist.h" #define BLACKCORE_CONTEXTOWNAIRCRAFT_INTERFACENAME "net.vatsim.PilotClient.BlackCore.ContextOwnAircraft" #define BLACKCORE_CONTEXTOWNAIRCRAFT_OBJECTPATH "/OwnAircraft" @@ -41,14 +42,16 @@ namespace BlackCore signals: //! Aircraft situation update + //! \remarks local only void changedAircraftSituation(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator); + //! Aircraft position update + //! \remarks local only + void changedAircraftPosition(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 @@ -58,13 +61,23 @@ namespace BlackCore 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, const QString &originator) = 0; + virtual bool 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, const QString &originator) = 0; + virtual bool 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, const QString &originator) = 0; + virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0; + + //! Output volumens, volumes 0..100 + virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) = 0; + + //! Set individual voice rooms (overrides voice rooms) + //! \remarks Empty string "" disables voice room override + virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) = 0; + + //! Automatic voice room resolution for frequencies + virtual void enableAutomaticVoiceRoomResolution(bool enable) = 0; protected: //! Constructor diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 0403f82b5..eb8480963 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -4,15 +4,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "context_ownaircraft_impl.h" +#include "context_network.h" +#include "context_audio.h" #include "context_runtime.h" #include "context_settings.h" - using namespace BlackMisc; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Geo; +using namespace BlackMisc::Audio; namespace BlackCore { @@ -21,15 +23,13 @@ namespace BlackCore * Init this context */ CContextOwnAircraft::CContextOwnAircraft(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : - IContextOwnAircraft(mode, runtime) + IContextOwnAircraft(mode, runtime), m_automaticVoiceRoomResolution(true) { Q_ASSERT(this->getRuntime()); Q_ASSERT(this->getRuntime()->getIContextSettings()); // 1. Init own aircraft this->initOwnAircraft(); - - // 2. connect signals and slots } /* @@ -60,6 +60,40 @@ namespace BlackCore // Own callsign, plane ICAO status, model used this->m_ownAircraft.setCallsign(CCallsign("BLACK")); this->m_ownAircraft.setIcaoInfo(CAircraftIcao("C172", "L1P", "GA", "GA", "0000ff")); + + // voice rooms + this->resolveVoiceRooms(); + } + + /* + * Resolve voice rooms + */ + void CContextOwnAircraft::resolveVoiceRooms() + { + if (this->getRuntime()->isSlotLogForOwnAircraftEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO); + if (this->m_voiceRoom1UrlOverride.isEmpty() && this->m_voiceRoom2UrlOverride.isEmpty() && !this->m_automaticVoiceRoomResolution) return; + if (!this->getIContextNetwork()) return; // no chance to resolve rooms + if (!this->getIContextAudio()) return; // no place to set rooms + + CVoiceRoomList rooms; + if (this->m_automaticVoiceRoomResolution) + { + // requires correct frequencies set + // but local network uses exactly this object here, so if frequencies are set here, + // they are for network context as well + rooms = this->getIContextNetwork()->getSelectedVoiceRooms(); + } + else + { + rooms.push_back(CVoiceRoom()); + rooms.push_back(CVoiceRoom()); + } + + if (!this->m_voiceRoom1UrlOverride.isEmpty()) rooms[0] = CVoiceRoom(this->m_voiceRoom1UrlOverride); + if (!this->m_voiceRoom2UrlOverride.isEmpty()) rooms[1] = CVoiceRoom(this->m_voiceRoom2UrlOverride); + + // set the rooms + this->getIContextAudio()->setComVoiceRooms(rooms); } /* @@ -67,10 +101,14 @@ namespace BlackCore */ void CContextOwnAircraft::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) { + if (this->getRuntime()->isSlotLogForOwnAircraftEnabled()) this->getRuntime()->logSlot(Q_FUNC_INFO, ownAircraft().toQString(), 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); + 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); + + if (changedCockpit || changedPosition || changedSituation) this->resolveVoiceRooms(); // all the rest this->m_ownAircraft = aircraft; @@ -79,7 +117,7 @@ namespace BlackCore /* * Own position */ - void CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) + bool 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()); bool changed = (this->m_ownAircraft.getPosition() == position); @@ -92,25 +130,27 @@ namespace BlackCore } if (changed) emit this->changedAircraftPosition(this->m_ownAircraft, originator); + return changed; } /* * Update own situation */ - void CContextOwnAircraft::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) + bool 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; + if (!changed) return changed; this->m_ownAircraft.setSituation(situation); emit this->changedAircraftSituation(this->m_ownAircraft, originator); + return changed; } /* * Own cockpit data */ - void CContextOwnAircraft::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) + bool 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; @@ -129,7 +169,47 @@ namespace BlackCore this->m_ownAircraft.setTransponder(transponder); changed = true; } - if (changed) emit this->changedAircraftCockpit(this->m_ownAircraft, originator); + if (changed) + { + emit this->changedAircraftCockpit(this->m_ownAircraft, originator); + this->resolveVoiceRooms(); + } + return changed; + } + + void CContextOwnAircraft::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) + { + CComSystem com1 = this->m_ownAircraft.getCom1System(); + com1.setVolumeOutput(outputVolumeCom1); + this->m_ownAircraft.setCom1System(com1); + + CComSystem com2 = this->m_ownAircraft.getCom2System(); + com2.setVolumeOutput(outputVolumeCom2); + this->m_ownAircraft.setCom2System(com1); + + if (this->getIContextAudio()) this->getIContextAudio()->setVolumes(com1, com2); + } + + /* + * Tune in / out voice room + */ + void CContextOwnAircraft::changedAtcStationOnlineConnectionStatus(const CAtcStation &atcStation, bool connected) + { + // any of our active frequencies? + Q_UNUSED(connected); + if (atcStation.getFrequency() != this->m_ownAircraft.getCom1System().getFrequencyActive() && + atcStation.getFrequency() != this->m_ownAircraft.getCom2System().getFrequencyActive()) return; + this->resolveVoiceRooms(); + } + + /* + * Voice room URLs + */ + void CContextOwnAircraft::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) + { + this->m_voiceRoom1UrlOverride = voiceRoom1Url.trimmed(); + this->m_voiceRoom2UrlOverride = voiceRoom2Url.trimmed(); + this->resolveVoiceRooms(); } /* diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index d7620e97b..1ac2445de 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -33,20 +33,29 @@ namespace BlackCore public slots: // IContextOwnAircraft overrides + //! \copydoc IContextOwnAircraft::getOwnAircraft() + virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; + //! \copydoc IContextOwnAircraft::setOwnAircraft() 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, const QString &originator) override; + virtual bool 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, const QString &originator) override; + virtual bool 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, const QString &originator) override; + virtual bool 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; + //! \copydoc IContextOwnAircraft::setAudioOutputVolumes + virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) override; + + //! \copydoc IContextOwnAircraft::setAudioVoiceRoomOverrideUrls + virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) override; + + //! \copydoc IContextOwnAircraft::enableAutomaticVoiceRoomResolution + virtual void enableAutomaticVoiceRoomResolution(bool enable) override { this->m_automaticVoiceRoomResolution = enable; } protected: //! Constructor, with link to runtime @@ -60,12 +69,22 @@ namespace BlackCore return this; } + private slots: + //! Station has been changed, needed to tune in/out voice room + void changedAtcStationOnlineConnectionStatus(const BlackMisc::Aviation::CAtcStation &atcStation, bool connected); + private: BlackMisc::Aviation::CAircraft m_ownAircraft; //!< my aircraft + bool m_automaticVoiceRoomResolution; //!< voice room override + QString m_voiceRoom1UrlOverride; //!< overridden voice room url + QString m_voiceRoom2UrlOverride; //!< overridden voice room url //! Init my very own aircraft void initOwnAircraft(); + //! Resolve voice rooms + void resolveVoiceRooms(); + }; } diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index 1b390f12d..5cd72b4fb 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -30,14 +30,6 @@ namespace BlackCore 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); } @@ -51,18 +43,34 @@ namespace BlackCore this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnAircraft"), aircraft, originator); } - void CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) + bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnPosition"), position, altitude, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnPosition"), position, altitude, originator); } - void CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) + bool CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) { - this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnSituation"), situation, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnSituation"), situation, originator); } - void CContextOwnAircraftProxy::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) + bool 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, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnCockpit"), com1, com2, transponder, originator); } + + void CContextOwnAircraftProxy::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) + { + this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnCockpitOutputVolumes"), outputVolumeCom1, outputVolumeCom2); + } + + void CContextOwnAircraftProxy::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) + { + this->m_dBusInterface->callDBus(QLatin1Literal("setAudioVoiceRoomOverrideUrls"), voiceRoom1Url, voiceRoom2Url); + } + + void CContextOwnAircraftProxy::enableAutomaticVoiceRoomResolution(bool enable) + { + this->m_dBusInterface->callDBus(QLatin1Literal("enableAutomaticVoiceRoomResolution"), enable); + } + } // namespace diff --git a/src/blackcore/context_ownaircraft_proxy.h b/src/blackcore/context_ownaircraft_proxy.h index 3b592b7b3..f409dfd5a 100644 --- a/src/blackcore/context_ownaircraft_proxy.h +++ b/src/blackcore/context_ownaircraft_proxy.h @@ -39,20 +39,30 @@ namespace BlackCore public slots: // IContextOwnAircraft overrides + //! \copydoc IContextOwnAircraft::getOwnAircraft() + virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; + //! \copydoc IContextOwnAircraft::setOwnAircraft() 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, const QString &originator) override; + virtual bool 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, const QString &originator) override; + virtual bool 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, const QString &originato4) override; + virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originato4) override; + + //! \copydoc IContextOwnAircraft::setAudioOutputVolumes + virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) override; + + //! \copydoc IContextOwnAircraft::setAudioVoiceRoomOverrideUrls + virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url,const QString &voiceRoom2Url); + + //! \copydoc IContextOwnAircraft::enableAutomaticVoiceRoomResolution + virtual void enableAutomaticVoiceRoomResolution(bool enable); - //! \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 85e5fe572..6b753e452 100644 --- a/src/blackcore/context_runtime.cpp +++ b/src/blackcore/context_runtime.cpp @@ -433,7 +433,7 @@ namespace BlackCore if (this->m_contextSimulator && this->m_contextSimulator->usingLocalObjects() && this->m_contextNetwork) { - // only connect if simulator running locally, no roundtrips + // only connect if simulator running locally, no round trips if (this->getCContextSimulator()->m_simulator) { c = connect(this->m_contextNetwork, &IContextNetwork::changedAircraftSituation, @@ -441,6 +441,14 @@ namespace BlackCore Q_ASSERT(c); } } + + if (this->m_contextNetwork && this->m_contextOwnAircraft && this->m_contextNetwork->usingLocalObjects() && this->m_contextOwnAircraft->usingLocalObjects()) + { + // only where network and(!) own aircraft run locally + c = this->connect(this->m_contextNetwork, &IContextNetwork::changedAtcStationOnlineConnectionStatus, + this->getCContextOwnAircraft(), &CContextOwnAircraft::changedAtcStationOnlineConnectionStatus); + Q_ASSERT(c); + } } void CRuntime::gracefulShutdown()