Ref T709, changed to settings provider

* CPlugin is the provider
* it is "kept" in DBus object for traffic, service, weather
This commit is contained in:
Klaus Basan
2019-07-30 01:01:36 +02:00
committed by Mat Sutcliffe
parent 97926eee26
commit f9c87326fb
10 changed files with 63 additions and 46 deletions

View File

@@ -9,10 +9,18 @@
#include "dbusobject.h" #include "dbusobject.h"
#include <cassert> #include <cassert>
XSwiftBus::ISettingsProvider *XSwiftBus::CDBusObject::s_settingsProvider = nullptr;
namespace XSwiftBus namespace XSwiftBus
{ {
CDBusObject::CDBusObject() CDBusObject::CDBusObject(ISettingsProvider *settingsProvider)
{ } {
if (!CDBusObject::s_settingsProvider)
{
// we expect a single pointer
CDBusObject::s_settingsProvider = settingsProvider;
}
}
CDBusObject::~CDBusObject() CDBusObject::~CDBusObject()
{ {
@@ -73,6 +81,18 @@ namespace XSwiftBus
} }
} }
CSettings CDBusObject::getSettings() const
{
if (s_settingsProvider) { return s_settingsProvider->getSettings(); }
return CSettings();
}
bool CDBusObject::setSettings(const CSettings &s)
{
if (s_settingsProvider) { s_settingsProvider->setSettings(s); }
return false;
}
void CDBusObject::dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data) void CDBusObject::dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data)
{ {
(void)connection; // unused (void)connection; // unused

View File

@@ -10,6 +10,7 @@
#define BLACKSIM_XSWIFTBUS_DBUSOBJECT_H #define BLACKSIM_XSWIFTBUS_DBUSOBJECT_H
#include "dbusconnection.h" #include "dbusconnection.h"
#include "settings.h"
#include <XPLM/XPLMDisplay.h> #include <XPLM/XPLMDisplay.h>
#include <mutex> #include <mutex>
#include <deque> #include <deque>
@@ -21,7 +22,7 @@ namespace XSwiftBus
{ {
public: public:
//! Constructor //! Constructor
CDBusObject(); CDBusObject(ISettingsProvider *settingsProvider);
//! Destructor //! Destructor
virtual ~CDBusObject(); virtual ~CDBusObject();
@@ -79,6 +80,14 @@ namespace XSwiftBus
//! Invoke all pending DBus calls. They will be executed in the calling thread. //! Invoke all pending DBus calls. They will be executed in the calling thread.
void invokeQueuedDBusCalls(); void invokeQueuedDBusCalls();
//! Get the settings
CSettings getSettings() const;
//! Set the settings
bool setSettings(const CSettings &s);
static ISettingsProvider *s_settingsProvider; //!< get the settings from here, still protected for the static functions
private: private:
static void dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data); static void dbusObjectPathUnregisterFunction(DBusConnection *connection, void *data);
static DBusHandlerResult dbusObjectPathMessageFunction(DBusConnection *connection, DBusMessage *message, void *data); static DBusHandlerResult dbusObjectPathMessageFunction(DBusConnection *connection, DBusMessage *message, void *data);
@@ -87,7 +96,7 @@ namespace XSwiftBus
std::string m_interfaceName; std::string m_interfaceName;
std::string m_objectPath; std::string m_objectPath;
std::mutex m_mutex; std::mutex m_mutex; //!< DBus calls
std::deque<std::function<void()>> m_qeuedDBusCalls; std::deque<std::function<void()>> m_qeuedDBusCalls;
const DBusObjectPathVTable m_dbusObjectPathVTable = { dbusObjectPathUnregisterFunction, dbusObjectPathMessageFunction, nullptr, nullptr, nullptr, nullptr }; const DBusObjectPathVTable m_dbusObjectPathVTable = { dbusObjectPathUnregisterFunction, dbusObjectPathMessageFunction, nullptr, nullptr, nullptr, nullptr };

View File

@@ -26,8 +26,6 @@ namespace
namespace XSwiftBus namespace XSwiftBus
{ {
CSettings CPlugin::s_pluginSettings = CSettings();
CPlugin::CPlugin() CPlugin::CPlugin()
: m_dbusConnection(std::make_shared<CDBusConnection>()), m_menu(CMenu::mainMenu().subMenu("XSwiftBus")) : m_dbusConnection(std::make_shared<CDBusConnection>()), m_menu(CMenu::mainMenu().subMenu("XSwiftBus"))
{ {
@@ -99,9 +97,9 @@ namespace XSwiftBus
readConfig(); readConfig();
m_service = std::make_unique<CService>(&CPlugin::s_pluginSettings); m_service = std::make_unique<CService>(this);
m_traffic = std::make_unique<CTraffic>(&CPlugin::s_pluginSettings); m_traffic = std::make_unique<CTraffic>(this);
m_weather = std::make_unique<CWeather>(&CPlugin::s_pluginSettings); m_weather = std::make_unique<CWeather>(this);
m_traffic->setPlaneViewMenu(m_planeViewSubMenu); m_traffic->setPlaneViewMenu(m_planeViewSubMenu);

View File

@@ -41,7 +41,7 @@ namespace XSwiftBus
/*! /*!
* Main plugin class * Main plugin class
*/ */
class CPlugin class CPlugin : public ISettingsProvider
{ {
public: public:
//! Constructor //! Constructor
@@ -57,8 +57,6 @@ namespace XSwiftBus
void onAircraftRepositioned(); void onAircraftRepositioned();
private: private:
static CSettings s_pluginSettings; //!< needs to used in static in static functions
CConfig m_pluginConfig; CConfig m_pluginConfig;
CDBusDispatcher m_dbusDispatcher; CDBusDispatcher m_dbusDispatcher;
std::unique_ptr<CDBusServer> m_dbusP2PServer; std::unique_ptr<CDBusServer> m_dbusP2PServer;

View File

@@ -6,6 +6,7 @@
* or distributed except according to the terms contained in the LICENSE file. * or distributed except according to the terms contained in the LICENSE file.
*/ */
#include "plugin.h"
#include "service.h" #include "service.h"
#include "utils.h" #include "utils.h"
#include "blackmisc/simulation/xplane/qtfreeutils.h" #include "blackmisc/simulation/xplane/qtfreeutils.h"
@@ -21,11 +22,8 @@ using namespace BlackMisc::Simulation::XPlane::QtFreeUtils;
namespace XSwiftBus namespace XSwiftBus
{ {
CSettings *CService::s_pluginSettings = nullptr; CService::CService(ISettingsProvider *settingsProvider) : CDBusObject(settingsProvider)
CService::CService(CSettings *staticSettings) : CDBusObject()
{ {
CService::s_pluginSettings = staticSettings;
updateAirportsInRange(); updateAirportsInRange();
} }
@@ -161,13 +159,14 @@ namespace XSwiftBus
std::string CService::getSettings() const std::string CService::getSettings() const
{ {
return CService::s_pluginSettings->toXSwiftBusJsonString(); return s_settingsProvider->getSettings().toXSwiftBusJsonString();
} }
void CService::setSettings(const std::string &jsonString) void CService::setSettings(const std::string &jsonString)
{ {
CService::s_pluginSettings->parseXSwiftBusString(jsonString); const CSettings s(jsonString);
INFO_LOG("Received settings " + s_pluginSettings->convertToString()); s_settingsProvider->setSettings(s);
INFO_LOG("Received settings " + s.convertToString());
} }
void CService::readAirportsDatabase() void CService::readAirportsDatabase()

View File

@@ -19,7 +19,6 @@
#include "datarefs.h" #include "datarefs.h"
#include "messages.h" #include "messages.h"
#include "navdatareference.h" #include "navdatareference.h"
#include "settings.h"
#include <XPLM/XPLMNavigation.h> #include <XPLM/XPLMNavigation.h>
#include <string> #include <string>
#include <chrono> #include <chrono>
@@ -38,7 +37,7 @@ namespace XSwiftBus
{ {
public: public:
//! Constructor //! Constructor
CService(CSettings *staticSettings); CService(ISettingsProvider *settingsProvider);
//! Destructor //! Destructor
virtual ~CService() override = default; virtual ~CService() override = default;
@@ -260,7 +259,6 @@ namespace XSwiftBus
bool m_disappearMessageWindow = true; bool m_disappearMessageWindow = true;
std::chrono::system_clock::time_point m_disappearMessageWindowTime; std::chrono::system_clock::time_point m_disappearMessageWindowTime;
std::vector<CNavDataReference> m_airports; std::vector<CNavDataReference> m_airports;
static CSettings *s_pluginSettings;
void readAirportsDatabase(); void readAirportsDatabase();
std::vector<CNavDataReference> findClosestAirports(int number, double latitude, double longitude); std::vector<CNavDataReference> findClosestAirports(int number, double latitude, double longitude);

View File

@@ -11,6 +11,7 @@
#ifndef NOMINMAX #ifndef NOMINMAX
#define NOMINMAX #define NOMINMAX
#endif #endif
#include "plugin.h"
#include "traffic.h" #include "traffic.h"
#include "utils.h" #include "utils.h"
#include "XPMPMultiplayer.h" #include "XPMPMultiplayer.h"
@@ -31,8 +32,6 @@
namespace XSwiftBus namespace XSwiftBus
{ {
CSettings *CTraffic::s_pluginSettings = nullptr;
CTraffic::Plane::Plane(void *id_, const std::string &callsign_, const std::string &aircraftIcao_, const std::string &airlineIcao_, const std::string &livery_, const std::string &modelName_) CTraffic::Plane::Plane(void *id_, const std::string &callsign_, const std::string &aircraftIcao_, const std::string &airlineIcao_, const std::string &livery_, const std::string &modelName_)
: id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_), modelName(modelName_) : id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_), modelName(modelName_)
{ {
@@ -48,17 +47,16 @@ namespace XSwiftBus
} }
// *INDENT-OFF* // *INDENT-OFF*
CTraffic::CTraffic(CSettings *staticSettings) : CTraffic::CTraffic(ISettingsProvider *settingsProvider) :
CDBusObject(), CDBusObject(settingsProvider),
m_followPlaneViewNextCommand("org/swift-project/xswiftbus/follow_next_plane", "Changes plane view to follow next plane in sequence", [this] { followNextPlane(); }), m_followPlaneViewNextCommand("org/swift-project/xswiftbus/follow_next_plane", "Changes plane view to follow next plane in sequence", [this] { followNextPlane(); }),
m_followPlaneViewPreviousCommand("org/swift-project/xswiftbus/follow_previous_plane", "Changes plane view to follow previous plane in sequence", [this] { followPreviousPlane(); }) m_followPlaneViewPreviousCommand("org/swift-project/xswiftbus/follow_previous_plane", "Changes plane view to follow previous plane in sequence", [this] { followPreviousPlane(); })
{ {
CTraffic::s_pluginSettings = staticSettings;
XPLMRegisterDrawCallback(drawCallback, xplm_Phase_Airplanes, 1, this); XPLMRegisterDrawCallback(drawCallback, xplm_Phase_Airplanes, 1, this);
XPLMRegisterKeySniffer(spaceKeySniffer, 1, this); XPLMRegisterKeySniffer(spaceKeySniffer, 1, this);
// init labels // init labels
this->setDrawingLabels(CTraffic::s_pluginSettings->isDrawingLabels()); this->setDrawingLabels(this->getSettings().isDrawingLabels());
} }
// *INDENT-ON* // *INDENT-ON*
@@ -84,6 +82,7 @@ namespace XSwiftBus
std::string related = dir + "related.txt"; std::string related = dir + "related.txt";
std::string doc8643 = dir + "Doc8643.txt"; std::string doc8643 = dir + "Doc8643.txt";
std::string lights = dir + "lights.png"; std::string lights = dir + "lights.png";
auto err = XPMPMultiplayerInitLegacyData(csl.c_str(), related.c_str(), lights.c_str(), doc8643.c_str(), auto err = XPMPMultiplayerInitLegacyData(csl.c_str(), related.c_str(), lights.c_str(), doc8643.c_str(),
"C172", preferences, preferences); "C172", preferences, preferences);
if (*err) { s_legacyDataOK = false; } if (*err) { s_legacyDataOK = false; }
@@ -217,7 +216,7 @@ namespace XSwiftBus
{ {
if (strcmp(section, "planes") == 0 && strcmp(name, "max_full_count") == 0) if (strcmp(section, "planes") == 0 && strcmp(name, "max_full_count") == 0)
{ {
return CTraffic::s_pluginSettings->getMaxPlanes(); return s_settingsProvider->getSettings().getMaxPlanes();
} }
else if (strcmp(section, "debug") == 0 && strcmp(name, "allow_obj8_async_load") == 0) else if (strcmp(section, "debug") == 0 && strcmp(name, "allow_obj8_async_load") == 0)
{ {
@@ -232,7 +231,7 @@ namespace XSwiftBus
{ {
if (strcmp(section, "planes") == 0 && strcmp(name, "full_distance") == 0) if (strcmp(section, "planes") == 0 && strcmp(name, "full_distance") == 0)
{ {
return static_cast<float>(CTraffic::s_pluginSettings->getMaxDrawDistanceNM()); return static_cast<float>(s_settingsProvider->getSettings().getMaxDrawDistanceNM());
} }
return def; return def;
} }
@@ -256,7 +255,7 @@ namespace XSwiftBus
void CTraffic::setDrawingLabels(bool drawing) void CTraffic::setDrawingLabels(bool drawing)
{ {
CTraffic::s_pluginSettings->setDrawingLabels(drawing); s_settingsProvider->getSettings().setDrawingLabels(drawing);
if (drawing) if (drawing)
{ {
XPMPEnableAircraftLabels(); XPMPEnableAircraftLabels();
@@ -274,12 +273,12 @@ namespace XSwiftBus
void CTraffic::setMaxPlanes(int planes) void CTraffic::setMaxPlanes(int planes)
{ {
CTraffic::s_pluginSettings->setMaxPlanes(planes); s_settingsProvider->getSettings().setMaxPlanes(planes);
} }
void CTraffic::setMaxDrawDistance(double nauticalMiles) void CTraffic::setMaxDrawDistance(double nauticalMiles)
{ {
CTraffic::s_pluginSettings->setMaxDrawDistanceNM(nauticalMiles); s_settingsProvider->getSettings().setMaxDrawDistanceNM(nauticalMiles);
} }
void CTraffic::addPlane(const std::string &callsign, const std::string &modelName, const std::string &aircraftIcao, const std::string &airlineIcao, const std::string &livery) void CTraffic::addPlane(const std::string &callsign, const std::string &modelName, const std::string &aircraftIcao, const std::string &airlineIcao, const std::string &livery)
@@ -898,7 +897,7 @@ namespace XSwiftBus
// Now calculate where the camera should be positioned to be x // Now calculate where the camera should be positioned to be x
// meters from the plane and pointing at the plane at the pitch and // meters from the plane and pointing at the plane at the pitch and
// heading we wanted above. // heading we wanted above.
const double distanceMeterM = static_cast<double>(std::max(10, CTraffic::s_pluginSettings->getFollowAircraftDistanceM())); const double distanceMeterM = static_cast<double>(std::max(10, s_settingsProvider->getSettings().getFollowAircraftDistanceM()));
static const double PI = std::acos(-1); static const double PI = std::acos(-1);
traffic->m_deltaCameraPosition.dx = -distanceMeterM * sin(traffic->m_deltaCameraPosition.heading * PI / 180.0); traffic->m_deltaCameraPosition.dx = -distanceMeterM * sin(traffic->m_deltaCameraPosition.heading * PI / 180.0);
traffic->m_deltaCameraPosition.dz = distanceMeterM * cos(traffic->m_deltaCameraPosition.heading * PI / 180.0); traffic->m_deltaCameraPosition.dz = distanceMeterM * cos(traffic->m_deltaCameraPosition.heading * PI / 180.0);

View File

@@ -12,11 +12,11 @@
//! \file //! \file
#include "dbusobject.h" #include "dbusobject.h"
#include "settings.h"
#include "command.h" #include "command.h"
#include "datarefs.h" #include "datarefs.h"
#include "terrainprobe.h" #include "terrainprobe.h"
#include "menus.h" #include "menus.h"
#include "settings.h"
#include "XPMPMultiplayer.h" #include "XPMPMultiplayer.h"
#include "XPLMCamera.h" #include "XPLMCamera.h"
#include <XPLM/XPLMDisplay.h> #include <XPLM/XPLMDisplay.h>
@@ -37,7 +37,7 @@ namespace XSwiftBus
{ {
public: public:
//! Constructor //! Constructor
CTraffic(CSettings *staticSettings); CTraffic(ISettingsProvider *settingsProvider);
//! Destructor //! Destructor
~CTraffic() override; ~CTraffic() override;
@@ -129,11 +129,14 @@ namespace XSwiftBus
std::string ownAircraftString() const { return "ownAircraft"; } std::string ownAircraftString() const { return "ownAircraft"; }
protected: protected:
//! Handler
virtual void dbusDisconnectedHandler() override; virtual void dbusDisconnectedHandler() override;
//! Handler
DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) override; DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) override;
private: private:
//! Camera
struct DeltaCameraPosition struct DeltaCameraPosition
{ {
double dx = 0.0; double dx = 0.0;
@@ -144,8 +147,6 @@ namespace XSwiftBus
bool isInitialized = false; bool isInitialized = false;
}; };
static CSettings *s_pluginSettings; //!< needs to be static for static functions
bool m_initialized = false; bool m_initialized = false;
bool m_enabledMultiplayer = false; bool m_enabledMultiplayer = false;
CTerrainProbe m_terrainProbe; CTerrainProbe m_terrainProbe;

View File

@@ -13,11 +13,9 @@
namespace XSwiftBus namespace XSwiftBus
{ {
CSettings *CWeather::s_pluginSettings = nullptr; CWeather::CWeather(ISettingsProvider *settingsProvider) : CDBusObject(settingsProvider)
CWeather::CWeather(CSettings *staticSettings)
{ {
CWeather::s_pluginSettings = staticSettings; // void
} }
//! Set cloud layer //! Set cloud layer

View File

@@ -16,7 +16,6 @@
#endif #endif
#include "dbusobject.h" #include "dbusobject.h"
#include "datarefs.h" #include "datarefs.h"
#include "settings.h"
//! \cond PRIVATE //! \cond PRIVATE
#define XSWIFTBUS_WEATHER_INTERFACENAME "org.swift_project.xswiftbus.weather" #define XSWIFTBUS_WEATHER_INTERFACENAME "org.swift_project.xswiftbus.weather"
@@ -32,7 +31,7 @@ namespace XSwiftBus
{ {
public: public:
//! Constructor //! Constructor
CWeather(CSettings *staticSettings); CWeather(ISettingsProvider *settingsProvider);
//! DBus interface name //! DBus interface name
static const std::string &InterfaceName() static const std::string &InterfaceName()
@@ -103,8 +102,6 @@ namespace XSwiftBus
virtual DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) override; virtual DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) override;
private: private:
static CSettings *s_pluginSettings; //!< needs to be static for static functions;
DataRef<xplane::data::sim::weather::use_real_weather_bool> m_useRealWeather; DataRef<xplane::data::sim::weather::use_real_weather_bool> m_useRealWeather;
DataRef<xplane::data::sim::weather::visibility_reported_m> m_visibilityM; DataRef<xplane::data::sim::weather::visibility_reported_m> m_visibilityM;
DataRef<xplane::data::sim::weather::rain_percent> m_precipRatio; DataRef<xplane::data::sim::weather::rain_percent> m_precipRatio;