diff --git a/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.cpp b/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.cpp index 1eb4adff..cab84283 100644 --- a/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.cpp +++ b/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.cpp @@ -31,6 +31,7 @@ #include "zigbeehardwareresourceimplementation.h" #include "loggingcategories.h" #include "nymeasettings.h" +#include "hardware/zigbee/zigbeehandler.h" #include #include @@ -60,6 +61,33 @@ bool ZigbeeHardwareResourceImplementation::enabled() const return m_enabled; } + +void ZigbeeHardwareResourceImplementation::registerHandler(ZigbeeHandler *handler, HandlerType type) +{ + qCDebug(dcZigbeeResource()) << "Registering new zigbee handler" << handler->name() << "with type" << type; + m_handlers.insert(type, handler); +} + +ZigbeeNode *ZigbeeHardwareResourceImplementation::getNode(const QUuid &networkUuid, const ZigbeeAddress &extendedAddress) +{ + ZigbeeNetwork *network = m_zigbeeManager->zigbeeNetworks().value(networkUuid); + if (!network) { + qCWarning(dcZigbeeResource()) << "Network" << networkUuid << "not found."; + return nullptr; + } + return network->getZigbeeNode(extendedAddress); +} + +ZigbeeNetwork::State ZigbeeHardwareResourceImplementation::networkState(const QUuid &networkUuid) +{ + ZigbeeNetwork *network = m_zigbeeManager->zigbeeNetworks().value(networkUuid); + if (!network) { + qCWarning(dcZigbeeResource()) << "Network" << networkUuid << "not found."; + return ZigbeeNetwork::StateUninitialized; + } + return network->state(); +} + void ZigbeeHardwareResourceImplementation::setEnabled(bool enabled) { qCDebug(dcZigbeeResource()) << "Set" << (enabled ? "enabled" : "disabled"); @@ -116,6 +144,18 @@ void ZigbeeHardwareResourceImplementation::onZigbeeAvailableChanged(bool availab void ZigbeeHardwareResourceImplementation::onZigbeeNodeAdded(const QUuid &networkUuid, ZigbeeNode *node) { qCDebug(dcZigbeeResource()) << node << "joined the network" << m_zigbeeManager->zigbeeNetworks().value(networkUuid); + ZigbeeHandler *handler = nullptr; + foreach (ZigbeeHandler *tmp, m_handlers) { + if (tmp->handleNode(node, networkUuid)) { + handler = tmp; + qCDebug(dcZigbeeResource()) << "Node" << node << "taken by handler" << handler->name(); + break; + } + } + if (!handler) { + qCWarning(dcZigbeeResource()) << "No zigbee handler available to handle node" << node; + return; + } } void ZigbeeHardwareResourceImplementation::onZigbeeNodeRemoved(const QUuid &networkUuid, ZigbeeNode *node) diff --git a/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.h b/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.h index 480826cb..1d3afb72 100644 --- a/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.h +++ b/libnymea-core/hardware/zigbee/zigbeehardwareresourceimplementation.h @@ -34,7 +34,7 @@ #include #include "zigbee/zigbeemanager.h" -#include "hardware/zigbee/zigbeehardwarereource.h" +#include "hardware/zigbee/zigbeehardwareresource.h" namespace nymeaserver { @@ -48,23 +48,30 @@ public: bool available() const override; bool enabled() const override; -private: - bool m_available = false; - bool m_enabled = false; - ZigbeeManager *m_zigbeeManager = nullptr; + void registerHandler(ZigbeeHandler *handler, HandlerType type = HandlerTypeVendor) override; -protected: - void setEnabled(bool enabled) override; + ZigbeeNode* getNode(const QUuid &networkUuid, const ZigbeeAddress &extendedAddress) override; + ZigbeeNetwork::State networkState(const QUuid &networkUuid) override; public slots: bool enable(); bool disable(); +protected: + void setEnabled(bool enabled) override; + private slots: void onZigbeeAvailableChanged(bool available); void onZigbeeNodeAdded(const QUuid &networkUuid, ZigbeeNode *node); void onZigbeeNodeRemoved(const QUuid &networkUuid, ZigbeeNode *node); +private: + bool m_available = false; + bool m_enabled = false; + ZigbeeManager *m_zigbeeManager = nullptr; + + QMultiMap m_handlers; + }; } diff --git a/libnymea/hardware/zigbee/zigbeehandler.cpp b/libnymea/hardware/zigbee/zigbeehandler.cpp new file mode 100644 index 00000000..a11a697d --- /dev/null +++ b/libnymea/hardware/zigbee/zigbeehandler.cpp @@ -0,0 +1,6 @@ +#include "zigbeehandler.h" + +ZigbeeHandler::ZigbeeHandler() +{ + +} diff --git a/libnymea/hardware/zigbee/zigbeehandler.h b/libnymea/hardware/zigbee/zigbeehandler.h new file mode 100644 index 00000000..f346e6ad --- /dev/null +++ b/libnymea/hardware/zigbee/zigbeehandler.h @@ -0,0 +1,16 @@ +#ifndef ZIGBEEHANDLER_H +#define ZIGBEEHANDLER_H + +#include "zigbeenode.h" + +class ZigbeeHandler +{ +public: + ZigbeeHandler(); + virtual ~ZigbeeHandler() = default; + + virtual QString name() const = 0; + virtual bool handleNode(ZigbeeNode *node, const QUuid &networkUuid) = 0; +}; + +#endif // ZIGBEEHANDLER_H diff --git a/libnymea/hardware/zigbee/zigbeehardwarereource.cpp b/libnymea/hardware/zigbee/zigbeehardwareresource.cpp similarity index 97% rename from libnymea/hardware/zigbee/zigbeehardwarereource.cpp rename to libnymea/hardware/zigbee/zigbeehardwareresource.cpp index c1e5bfd4..4ca1fea0 100644 --- a/libnymea/hardware/zigbee/zigbeehardwarereource.cpp +++ b/libnymea/hardware/zigbee/zigbeehardwareresource.cpp @@ -28,7 +28,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include "zigbeehardwarereource.h" +#include "zigbeehardwareresource.h" ZigbeeHardwareResource::ZigbeeHardwareResource(QObject *parent) : HardwareResource("Zigbee hardware resource", parent) diff --git a/libnymea/hardware/zigbee/zigbeehardwarereource.h b/libnymea/hardware/zigbee/zigbeehardwareresource.h similarity index 74% rename from libnymea/hardware/zigbee/zigbeehardwarereource.h rename to libnymea/hardware/zigbee/zigbeehardwareresource.h index f97fcb56..157bf408 100644 --- a/libnymea/hardware/zigbee/zigbeehardwarereource.h +++ b/libnymea/hardware/zigbee/zigbeehardwareresource.h @@ -35,14 +35,32 @@ #include "hardwareresource.h" +#include +#include + +class ZigbeeHandler; +class ZigbeeNode; + class ZigbeeHardwareResource : public HardwareResource { Q_OBJECT public: + enum HandlerType { + HandlerTypeBranding, + HandlerTypeVendor, + HandlerTypeCatchAll + }; + Q_ENUM(HandlerType) explicit ZigbeeHardwareResource(QObject *parent = nullptr); virtual ~ZigbeeHardwareResource() = default; + virtual void registerHandler(ZigbeeHandler *handler, HandlerType type = HandlerTypeVendor) = 0; + virtual ZigbeeNode* getNode(const QUuid &networkUuid, const ZigbeeAddress &extendedAddress) = 0; + virtual ZigbeeNetwork::State networkState(const QUuid &networkUuid) = 0; + +signals: + void networkStateChanged(const QUuid &networkUuid, ZigbeeNetwork::State state); }; diff --git a/libnymea/libnymea.pro b/libnymea/libnymea.pro index a5fb1ba4..39b8db54 100644 --- a/libnymea/libnymea.pro +++ b/libnymea/libnymea.pro @@ -10,7 +10,8 @@ DEFINES += LIBNYMEA_LIBRARY QMAKE_LFLAGS += -fPIC HEADERS += \ - hardware/zigbee/zigbeehardwarereource.h \ + hardware/zigbee/zigbeehandler.h \ + hardware/zigbee/zigbeehardwareresource.h \ integrations/browseractioninfo.h \ integrations/browseritemactioninfo.h \ integrations/browseritemresult.h \ @@ -103,7 +104,8 @@ HEADERS += \ experiences/experienceplugin.h \ SOURCES += \ - hardware/zigbee/zigbeehardwarereource.cpp \ + hardware/zigbee/zigbeehandler.cpp \ + hardware/zigbee/zigbeehardwareresource.cpp \ integrations/browseractioninfo.cpp \ integrations/browseritemactioninfo.cpp \ integrations/browseritemresult.cpp \