From 304c5528722d930a9833c8028602010384908c04 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 17 Mar 2017 19:05:51 +0100 Subject: [PATCH] refs #916, interpolator mode for XP --- .../simulator/xplane/simulatorxplane.cpp | 10 ++++++- .../simulator/xplane/simulatorxplane.h | 1 + .../simulator/xplane/xbustrafficproxy.cpp | 5 ++++ .../simulator/xplane/xbustrafficproxy.h | 3 ++ src/xbus/traffic.cpp | 28 +++++++++---------- src/xbus/traffic.h | 7 ++--- 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index dbdd43c61..75a2f2dfb 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -381,11 +381,19 @@ namespace BlackSimPlugin Q_UNUSED(offset); if (enable) { - CLogMessage(this).info("X-Plane provides real time synchronization, use this on"); + CLogMessage(this).info("X-Plane provides real time synchronization, use this one"); } return false; } + bool CSimulatorXPlane::setInterpolatorMode(CInterpolatorMulti::Mode mode, const CCallsign &callsign) + { + if (!isConnected()) { return false; } + + m_traffic->setInterpolatorMode(callsign.asString(), mode == CInterpolatorMulti::ModeSpline); + return true; + } + QDBusConnection CSimulatorXPlane::connectionFromString(const QString &str) { if (str == BlackMisc::CDBusServer::sessionBusAddress()) diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index 89f61758a..98b23157a 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -97,6 +97,7 @@ namespace BlackSimPlugin virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; virtual bool setTimeSynchronization(bool enable, const BlackMisc::PhysicalQuantities::CTime &offset) override; virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override { return BlackMisc::PhysicalQuantities::CTime(0, BlackMisc::PhysicalQuantities::CTimeUnit::hrmin()); } + virtual bool setInterpolatorMode(BlackMisc::Simulation::CInterpolatorMulti::Mode mode, const BlackMisc::Aviation::CCallsign &callsign) override; //! @} //! Creates an appropriate dbus connection from the string describing it diff --git a/src/plugins/simulator/xplane/xbustrafficproxy.cpp b/src/plugins/simulator/xplane/xbustrafficproxy.cpp index 738af5613..f796dd225 100644 --- a/src/plugins/simulator/xplane/xbustrafficproxy.cpp +++ b/src/plugins/simulator/xplane/xbustrafficproxy.cpp @@ -103,5 +103,10 @@ namespace BlackSimPlugin m_dbusInterface->callDBus(QLatin1String("setPlaneTransponder"), callsign, code, modeC, ident); } + void CXBusTrafficProxy::setInterpolatorMode(const QString &callsign, bool spline) + { + m_dbusInterface->callDBus(QLatin1String("setInterpolatorMode"), callsign, spline); + } + } } diff --git a/src/plugins/simulator/xplane/xbustrafficproxy.h b/src/plugins/simulator/xplane/xbustrafficproxy.h index e1f355284..902fc46cb 100644 --- a/src/plugins/simulator/xplane/xbustrafficproxy.h +++ b/src/plugins/simulator/xplane/xbustrafficproxy.h @@ -111,6 +111,9 @@ namespace BlackSimPlugin //! \copydoc XBus::CTraffic::setPlaneTransponder void setPlaneTransponder(const QString &callsign, int code, bool modeC, bool ident); + + //! \copydoc XBus::CTraffic::setInterpolatorMode + void setInterpolatorMode(const QString &callsign, bool spline); }; } diff --git a/src/xbus/traffic.cpp b/src/xbus/traffic.cpp index 014b81872..d3e304abc 100644 --- a/src/xbus/traffic.cpp +++ b/src/xbus/traffic.cpp @@ -223,7 +223,6 @@ namespace XBus if (id) { auto plane = new Plane(id, callsign, aircraftIcao, airlineIcao, livery); - plane->interpolator.setMode(m_interpolatorMode); m_planesByCallsign[callsign] = plane; m_planesById[id] = plane; } @@ -315,6 +314,20 @@ namespace XBus } } + void CTraffic::setInterpolatorMode(const QString &callsign, bool spline) + { + const auto plane = m_planesByCallsign.value(callsign, nullptr); + if (plane) + { + plane->interpolator.setMode(spline ? BlackMisc::Simulation::CInterpolatorMulti::ModeSpline + : BlackMisc::Simulation::CInterpolatorMulti::ModeLinear); + } + else if (callsign.isEmpty()) + { + for (const auto &callsign : m_planesByCallsign.keys()) { setInterpolatorMode(callsign, spline); } + } + } + //! memcmp function which ignores the header ("size" member) and compares only the payload (the rest of the struct) template int memcmpPayload(T *dst, T *src) @@ -391,19 +404,6 @@ namespace XBus } } - void CTraffic::toggleInterpolatorMode() - { - switch (m_interpolatorMode) - { - case BlackMisc::Simulation::CInterpolatorMulti::ModeLinear: m_interpolatorMode = BlackMisc::Simulation::CInterpolatorMulti::ModeSpline; break; - case BlackMisc::Simulation::CInterpolatorMulti::ModeSpline: m_interpolatorMode = BlackMisc::Simulation::CInterpolatorMulti::ModeLinear; break; - } - for (auto plane : m_planesByCallsign) - { - plane->interpolator.setMode(m_interpolatorMode); - } - } - } //! \endcond diff --git a/src/xbus/traffic.h b/src/xbus/traffic.h index fdc7f99c2..a10dec5ed 100644 --- a/src/xbus/traffic.h +++ b/src/xbus/traffic.h @@ -14,7 +14,6 @@ #include "datarefs.h" #include "terrainprobe.h" -#include "command.h" #include "blackmisc/aviation/aircraftsituationlist.h" #include "blackmisc/aviation/aircraftpartslist.h" #include "blackmisc/simulation/interpolatormulti.h" @@ -115,6 +114,9 @@ namespace XBus //! Set the transponder of a traffic aircraft void setPlaneTransponder(const QString &callsign, int code, bool modeC, bool ident); + //! Set interpolation mode for a traffic aircraft + void setInterpolatorMode(const QString &callsign, bool spline); + private: bool m_initialized = false; bool m_enabled = false; @@ -141,9 +143,6 @@ namespace XBus }; QHash m_planesByCallsign; QHash m_planesById; - BlackMisc::Simulation::CInterpolatorMulti::Mode m_interpolatorMode = BlackMisc::Simulation::CInterpolatorMulti::ModeSpline; - CCommand m_interpolatorModeCommand { "org/swift-project/xbus/toggle_lerp_mode", "Toggle interpolation mode", [this] { toggleInterpolatorMode(); } }; - void toggleInterpolatorMode(); int getPlaneData(void *id, int dataType, void *io_data); static int getPlaneData(void *id, int dataType, void *io_data, void *self)