From 673bce61ff1e039a1770f914edf5ee17d4c6a797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 8 Feb 2021 16:20:51 +0100 Subject: [PATCH] Initialize modbus manager and clean up class hirarchy --- .../modbusrtuhardwareresourceimplementation.cpp | 4 ++-- .../modbusrtuhardwareresourceimplementation.h | 6 ++++-- libnymea-core/hardwaremanagerimplementation.cpp | 8 ++++++-- libnymea-core/hardwaremanagerimplementation.h | 8 +++++--- libnymea-core/libnymea-core.pro | 3 ++- libnymea-core/modbus/modbusrtumanager.cpp | 15 ++++++++------- libnymea-core/modbus/modbusrtumanager.h | 3 +-- libnymea-core/nymeacore.cpp | 12 +++++++++++- libnymea-core/nymeacore.h | 3 +++ .../hardware/modbus/modbusrtuhardwareresource.cpp | 1 + .../hardware/modbus/modbusrtuhardwareresource.h | 6 +++--- libnymea/hardwaremanager.h | 4 ++-- tests/auto/autotests.pri | 12 ++++++++++++ tests/testlib/testlib.pro | 8 ++++++++ 14 files changed, 68 insertions(+), 25 deletions(-) diff --git a/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.cpp b/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.cpp index 2e76b0b5..96c9c19e 100644 --- a/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.cpp +++ b/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.cpp @@ -49,12 +49,12 @@ QList ModbusRtuHardwareResourceImplementation::modbusRtuMaste return m_modbusRtuManager->modbusRtuMasters(); } -bool ModbusRtuHardwareResourceImplementation::hasModbusRtuMaster(const QUuid &modbusUuid) +bool ModbusRtuHardwareResourceImplementation::hasModbusRtuMaster(const QUuid &modbusUuid) const { return m_modbusRtuManager->hasModbusRtuMaster(modbusUuid); } -ModbusRtuMaster *ModbusRtuHardwareResourceImplementation::getModbusRtuMaster(const QUuid &modbusUuid) +ModbusRtuMaster *ModbusRtuHardwareResourceImplementation::getModbusRtuMaster(const QUuid &modbusUuid) const { return m_modbusRtuManager->getModbusRtuMaster(modbusUuid); } diff --git a/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.h b/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.h index edf2873f..a26be359 100644 --- a/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.h +++ b/libnymea-core/hardware/modbus/modbusrtuhardwareresourceimplementation.h @@ -34,6 +34,7 @@ #include #include "modbus/modbusrtumanager.h" +#include "hardware/modbus/modbusrtumaster.h" #include "hardware/modbus/modbusrtuhardwareresource.h" namespace nymeaserver { @@ -43,10 +44,11 @@ class ModbusRtuHardwareResourceImplementation : public ModbusRtuHardwareResource Q_OBJECT public: explicit ModbusRtuHardwareResourceImplementation(ModbusRtuManager *modbusRtuManager, QObject *parent = nullptr); + ~ModbusRtuHardwareResourceImplementation() override = default; QList modbusRtuMasters() const override; - bool hasModbusRtuMaster(const QUuid &modbusUuid) override; - ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid) override; + bool hasModbusRtuMaster(const QUuid &modbusUuid) const override; + ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid) const override; bool available() const override; bool enabled() const override; diff --git a/libnymea-core/hardwaremanagerimplementation.cpp b/libnymea-core/hardwaremanagerimplementation.cpp index 754924f0..aece0d95 100644 --- a/libnymea-core/hardwaremanagerimplementation.cpp +++ b/libnymea-core/hardwaremanagerimplementation.cpp @@ -43,11 +43,13 @@ #include "hardware/network/mqtt/mqttproviderimplementation.h" #include "hardware/i2c/i2cmanagerimplementation.h" #include "hardware/zigbee/zigbeehardwareresourceimplementation.h" + +#include "modbus/modbusrtumanager.h" #include "hardware/modbus/modbusrtuhardwareresourceimplementation.h" namespace nymeaserver { -HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent) : +HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, ModbusRtuManager *modbusRtuManager, QObject *parent) : HardwareManager(parent), m_platform(platform) { @@ -74,6 +76,8 @@ HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, m_zigbeeResource = new ZigbeeHardwareResourceImplementation(zigbeeManager, this); + m_modbusRtuResource = new ModbusRtuHardwareResourceImplementation(modbusRtuManager, this); + // Enable all the resources setResourceEnabled(m_pluginTimerManager, true); setResourceEnabled(m_radio433, true); @@ -143,7 +147,7 @@ ZigbeeHardwareResource *HardwareManagerImplementation::zigbeeResource() return m_zigbeeResource; } -ModbusRtuHardwareResouce *HardwareManagerImplementation::modbusRtuResource() +ModbusRtuHardwareResource *HardwareManagerImplementation::modbusRtuResource() { return m_modbusRtuResource; } diff --git a/libnymea-core/hardwaremanagerimplementation.h b/libnymea-core/hardwaremanagerimplementation.h index 3d799adf..c808b0d2 100644 --- a/libnymea-core/hardwaremanagerimplementation.h +++ b/libnymea-core/hardwaremanagerimplementation.h @@ -43,13 +43,15 @@ class Platform; class MqttBroker; class ZigbeeManager; class ZigbeeHardwareResourceImplementation; +class ModbusRtuManager; +class ModbusRtuHardwareResourceImplementation; class HardwareManagerImplementation : public HardwareManager { Q_OBJECT public: - explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent = nullptr); + explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, ModbusRtuManager *modbusRtuManager, QObject *parent = nullptr); ~HardwareManagerImplementation() override; Radio433 *radio433() override; @@ -61,7 +63,7 @@ public: MqttProvider *mqttProvider() override; I2CManager *i2cManager() override; ZigbeeHardwareResource *zigbeeResource() override; - ModbusRtuHardwareResouce *modbusRtuResource() override; + ModbusRtuHardwareResource *modbusRtuResource() override; public slots: void thingsLoaded(); @@ -80,7 +82,7 @@ private: MqttProvider *m_mqttProvider = nullptr; I2CManager *m_i2cManager = nullptr; ZigbeeHardwareResourceImplementation *m_zigbeeResource = nullptr; - ModbusRtuHardwareResouce *m_modbusRtuResource = nullptr; + ModbusRtuHardwareResourceImplementation *m_modbusRtuResource = nullptr; }; } diff --git a/libnymea-core/libnymea-core.pro b/libnymea-core/libnymea-core.pro index 7227a848..1668715f 100644 --- a/libnymea-core/libnymea-core.pro +++ b/libnymea-core/libnymea-core.pro @@ -40,7 +40,8 @@ CONFIG(withoutpython) { # Let's check if the package exists, not the qt version packagesExist(Qt5SerialBus) { message("Building with QtSerialBus support.") - Qt += serialbus + # Qt += serialbus + PKGCONFIG += Qt5SerialBus DEFINES += WITH_QTSERIALBUS } else { message("Qt5SerialBus package not found. Building without QtSerialBus support.") diff --git a/libnymea-core/modbus/modbusrtumanager.cpp b/libnymea-core/modbus/modbusrtumanager.cpp index 148b63e4..f6101364 100644 --- a/libnymea-core/modbus/modbusrtumanager.cpp +++ b/libnymea-core/modbus/modbusrtumanager.cpp @@ -31,6 +31,7 @@ #include "modbusrtumanager.h" #include "nymeasettings.h" #include "loggingcategories.h" + #include "modbusrtumasterimpl.h" NYMEA_LOGGING_CATEGORY(dcModbusRtu, "ModbusRtu") @@ -39,6 +40,12 @@ namespace nymeaserver { ModbusRtuManager::ModbusRtuManager(QObject *parent) : QObject(parent) { + // Load uart configurations + loadRtuMasters(); + + // Connect signals + + // Enable autoconnect for each modbus rtu master } @@ -61,9 +68,8 @@ ModbusRtuMaster *ModbusRtuManager::getModbusRtuMaster(const QUuid &modbusUuid) return nullptr; } -void ModbusRtuManager::init() +void ModbusRtuManager::loadRtuMasters() { - // Load uart configurations NymeaSettings settings(NymeaSettings::SettingsRoleModbusRtu); qCDebug(dcModbusRtu()) << "Loading modbus RTU resources from" << settings.fileName(); @@ -85,11 +91,6 @@ void ModbusRtuManager::init() } settings.endGroup(); // ModbusRtuMasters - - // Connect signals - - // Enable autoconnect for each modbus rtu master - } void ModbusRtuManager::saveModbusRtuMaster(ModbusRtuMaster *modbusRtuMaster) diff --git a/libnymea-core/modbus/modbusrtumanager.h b/libnymea-core/modbus/modbusrtumanager.h index 95497e00..0ee8ca82 100644 --- a/libnymea-core/modbus/modbusrtumanager.h +++ b/libnymea-core/modbus/modbusrtumanager.h @@ -50,8 +50,6 @@ public: bool hasModbusRtuMaster(const QUuid &modbusUuid) const; ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid); - void init(); - signals: void modbusRtuMasterAdded(const QUuid &modbusUuid); void modbusRtuMasterRemoved(const QUuid &modbusUuid); @@ -60,6 +58,7 @@ signals: private: QHash m_modbusRtuMasters; + void loadRtuMasters(); void saveModbusRtuMaster(ModbusRtuMaster *modbusRtuMaster); }; diff --git a/libnymea-core/nymeacore.cpp b/libnymea-core/nymeacore.cpp index a746f8b8..4f8d9330 100644 --- a/libnymea-core/nymeacore.cpp +++ b/libnymea-core/nymeacore.cpp @@ -53,6 +53,8 @@ #include "zigbee/zigbeemanager.h" +#include "modbus/modbusrtumanager.h" + #include #include @@ -108,8 +110,11 @@ void NymeaCore::init(const QStringList &additionalInterfaces) { qCDebug(dcCore()) << "Create Zigbee Manager"; m_zigbeeManager = new ZigbeeManager(this); + qCDebug(dcCore()) << "Create Modbus RTU Manager"; + m_modbusRtuManager = new ModbusRtuManager(this); + qCDebug(dcCore) << "Creating Hardware Manager"; - m_hardwareManager = new HardwareManagerImplementation(m_platform, m_serverManager->mqttBroker(), m_zigbeeManager, this); + m_hardwareManager = new HardwareManagerImplementation(m_platform, m_serverManager->mqttBroker(), m_zigbeeManager, m_modbusRtuManager, this); qCDebug(dcCore) << "Creating Thing Manager (locale:" << m_configuration->locale() << ")"; m_thingManager = new ThingManagerImplementation(m_hardwareManager, m_configuration->locale(), this); @@ -645,6 +650,11 @@ ZigbeeManager *NymeaCore::zigbeeManager() const return m_zigbeeManager; } +ModbusRtuManager *NymeaCore::modbusRtuManager() const +{ + return m_modbusRtuManager; +} + void NymeaCore::gotEvent(const Event &event) { emit eventTriggered(event); diff --git a/libnymea-core/nymeacore.h b/libnymea-core/nymeacore.h index 3201b4d6..2514f7d4 100644 --- a/libnymea-core/nymeacore.h +++ b/libnymea-core/nymeacore.h @@ -67,6 +67,7 @@ class ExperienceManager; class ScriptEngine; class CloudManager; class ZigbeeManager; +class ModbusRtuManager; class NymeaCore : public QObject { @@ -107,6 +108,7 @@ public: TagsStorage *tagsStorage() const; Platform *platform() const; ZigbeeManager *zigbeeManager() const; + ModbusRtuManager *modbusRtuManager() const; static QStringList getAvailableLanguages(); static QStringList loggingFilters(); @@ -151,6 +153,7 @@ private: System *m_system; ExperienceManager *m_experienceManager; ZigbeeManager *m_zigbeeManager; + ModbusRtuManager *m_modbusRtuManager; QList m_executingRules; diff --git a/libnymea/hardware/modbus/modbusrtuhardwareresource.cpp b/libnymea/hardware/modbus/modbusrtuhardwareresource.cpp index 15756334..ddab12a7 100644 --- a/libnymea/hardware/modbus/modbusrtuhardwareresource.cpp +++ b/libnymea/hardware/modbus/modbusrtuhardwareresource.cpp @@ -29,6 +29,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "modbusrtuhardwareresource.h" +#include "modbusrtumaster.h" ModbusRtuHardwareResource::ModbusRtuHardwareResource(QObject *parent) : HardwareResource("Modbus RTU resource", parent) diff --git a/libnymea/hardware/modbus/modbusrtuhardwareresource.h b/libnymea/hardware/modbus/modbusrtuhardwareresource.h index 55356537..9be1a590 100644 --- a/libnymea/hardware/modbus/modbusrtuhardwareresource.h +++ b/libnymea/hardware/modbus/modbusrtuhardwareresource.h @@ -34,16 +34,16 @@ #include #include -#include "modbusrtumaster.h" #include "hardwareresource.h" +#include "modbusrtumaster.h" class ModbusRtuHardwareResource : public HardwareResource { Q_OBJECT public: virtual QList modbusRtuMasters() const = 0; - virtual bool hasModbusRtuMaster(const QUuid &modbusUuid) = 0; - virtual ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid) = 0; + virtual bool hasModbusRtuMaster(const QUuid &modbusUuid) const = 0; + virtual ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid) const = 0; protected: explicit ModbusRtuHardwareResource(QObject *parent = nullptr); diff --git a/libnymea/hardwaremanager.h b/libnymea/hardwaremanager.h index 711a0995..4dab713e 100644 --- a/libnymea/hardwaremanager.h +++ b/libnymea/hardwaremanager.h @@ -44,7 +44,7 @@ class MqttProvider; class I2CManager; class ZigbeeHardwareResource; class HardwareResource; -class ModbusRtuHardwareResouce; +class ModbusRtuHardwareResource; class HardwareManager : public QObject { @@ -64,7 +64,7 @@ public: virtual MqttProvider *mqttProvider() = 0; virtual I2CManager *i2cManager() = 0; virtual ZigbeeHardwareResource *zigbeeResource() = 0; - virtual ModbusRtuHardwareResouce *modbusRtuResource() = 0; + virtual ModbusRtuHardwareResource *modbusRtuResource() = 0; protected: void setResourceEnabled(HardwareResource* resource, bool enabled); diff --git a/tests/auto/autotests.pri b/tests/auto/autotests.pri index e2572913..5d2153e6 100644 --- a/tests/auto/autotests.pri +++ b/tests/auto/autotests.pri @@ -2,6 +2,18 @@ QT += dbus testlib network sql websockets CONFIG += testcase CONFIG += link_pkgconfig +# Qt serial bus module is officially available since Qt 5.8 +# but not all platforms host the qt serialbus package. +# Let's check if the package exists, not the qt version +packagesExist(Qt5SerialBus) { + message("Building with QtSerialBus support.") + # Qt += serialbus + PKGCONFIG += Qt5SerialBus + DEFINES += WITH_QTSERIALBUS +} else { + message("Qt5SerialBus package not found. Building without QtSerialBus support.") +} + INCLUDEPATH += $$top_srcdir/libnymea \ $$top_srcdir/libnymea-core \ $$top_srcdir/tests/testlib/ \ diff --git a/tests/testlib/testlib.pro b/tests/testlib/testlib.pro index 2c27f65e..b1768333 100644 --- a/tests/testlib/testlib.pro +++ b/tests/testlib/testlib.pro @@ -5,6 +5,14 @@ include(../../nymea.pri) QT += testlib dbus network sql websockets +# Qt serial bus module is officially available since Qt 5.8 +# but not all platforms host the qt serialbus package. +# Let's check if the package exists, not the qt version +packagesExist(Qt5SerialBus) { + Qt += serialbus + DEFINES += WITH_QTSERIALBUS +} + INCLUDEPATH += $$top_srcdir/libnymea \ $$top_srcdir/libnymea-core