first stab on the adding a plugin api

This commit is contained in:
Michael Zanetti 2020-10-29 11:10:01 +01:00 committed by Simon Stürz
parent 033d62a98d
commit af09702c31
7 changed files with 99 additions and 10 deletions

View File

@ -31,6 +31,7 @@
#include "zigbeehardwareresourceimplementation.h"
#include "loggingcategories.h"
#include "nymeasettings.h"
#include "hardware/zigbee/zigbeehandler.h"
#include <QDir>
#include <QFileInfo>
@ -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)

View File

@ -34,7 +34,7 @@
#include <QObject>
#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<ZigbeeHardwareResource::HandlerType, ZigbeeHandler*> m_handlers;
};
}

View File

@ -0,0 +1,6 @@
#include "zigbeehandler.h"
ZigbeeHandler::ZigbeeHandler()
{
}

View File

@ -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

View File

@ -28,7 +28,7 @@
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "zigbeehardwarereource.h"
#include "zigbeehardwareresource.h"
ZigbeeHardwareResource::ZigbeeHardwareResource(QObject *parent) :
HardwareResource("Zigbee hardware resource", parent)

View File

@ -35,14 +35,32 @@
#include "hardwareresource.h"
#include <zigbeeaddress.h>
#include <zigbeenetwork.h>
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);
};

View File

@ -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 \