diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 52ca6b400..1ea1ce160 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -599,6 +599,13 @@ namespace BlackSimPlugin return true; } + bool CSimulatorXPlane::followAircraft(const CCallsign &callsign) + { + if (! m_trafficProxy || ! m_trafficProxy->isValid()) { return false; } + m_trafficProxy->setFollowedAircraft(callsign.toQString()); + return true; + } + void CSimulatorXPlane::injectWeatherGrid(const Weather::CWeatherGrid &weatherGrid) { Q_ASSERT(isConnected()); diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index a913fe959..23bdde3c2 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -133,6 +133,7 @@ namespace BlackSimPlugin virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override { return BlackMisc::PhysicalQuantities::CTime(0, BlackMisc::PhysicalQuantities::CTimeUnit::hrmin()); } virtual bool isPhysicallyRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual BlackMisc::Aviation::CCallsignSet physicallyRenderedAircraft() const override; + virtual bool followAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void unload() override; //! @} diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp index 18c4ab23a..f9794cb18 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp @@ -148,5 +148,10 @@ namespace BlackSimPlugin }; m_dbusInterface->callDBusAsync(QLatin1String("getEelevationAtPosition"), callback, callsign.asString(), latitude, longitude, altitude); } + + void CXSwiftBusTrafficProxy::setFollowedAircraft(const QString &callsign) + { + m_dbusInterface->callDBus(QLatin1String("setFollowedAircraft"), callsign); + } } } diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.h b/src/plugins/simulator/xplane/xswiftbustrafficproxy.h index 8a7e8f9b6..51182df2a 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.h +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.h @@ -136,6 +136,9 @@ namespace BlackSimPlugin void getEelevationAtPosition(const BlackMisc::Aviation::CCallsign &callsign, double latitude, double longitude, double altitude, const ElevationCallback &setter); + //! \copydoc XSwiftBus::CTraffic::setFollowedAircraft + void setFollowedAircraft(const QString &callsign); + private: BlackMisc::CGenericDBusInterface *m_dbusInterface = nullptr; }; diff --git a/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml b/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml index e3bb46075..ed86a478a 100644 --- a/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml +++ b/src/xswiftbus/org.swift_project.xswiftbus.traffic.xml @@ -78,5 +78,8 @@ R"( + + + )" diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index 5d9b92b11..ddfc1321c 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -393,6 +393,14 @@ namespace XSwiftBus } } + void CTraffic::setFollowedAircraft(const std::string &callsign) + { + auto planeIt = m_planesByCallsign.find(callsign); + if (planeIt == m_planesByCallsign.end()) { return; } + + orbitRemotePlane(callsign); + } + const char *introspection_traffic = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE #include "org.swift_project.xswiftbus.traffic.xml" @@ -655,6 +663,17 @@ namespace XSwiftBus ; sendDBusMessage(reply); }); } + else if (message.getMethodName() == "setFollowedAircraft") + { + maybeSendEmptyDBusReply(wantsReply, sender, serial); + std::string callsign; + message.beginArgumentRead(); + message.getArgument(callsign); + queueDBusCall([ = ]() + { + setFollowedAircraft(callsign); + }); + } else { // Unknown message. Tell DBus that we cannot handle it diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index 749367334..b9e638230 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -114,6 +114,9 @@ namespace XSwiftBus //! Get the ground elevation at an arbitrary position double getEelevationAtPosition(const std::string &callsign, double latitude, double longitude, double altitude); + //! Sets the aircraft with callsign to be followed in plane view + void setFollowedAircraft(const std::string &callsign); + int processDBus() override; protected: