Pass nodes into the zigbee resource and implement available for resource

This commit is contained in:
Simon Stürz 2020-11-02 16:02:54 +01:00
parent cdf8b171f9
commit c3508acc23
8 changed files with 84 additions and 60 deletions

View File

@ -41,15 +41,18 @@ NYMEA_LOGGING_CATEGORY(dcZigbeeResource, "ZigbeeResource")
namespace nymeaserver { namespace nymeaserver {
ZigbeeHardwareResourceImplementation::ZigbeeHardwareResourceImplementation(QObject *parent) : ZigbeeHardwareResourceImplementation::ZigbeeHardwareResourceImplementation(ZigbeeManager *zigbeeManager, QObject *parent) :
ZigbeeHardwareResource(parent) ZigbeeHardwareResource(parent),
m_zigbeeManager(zigbeeManager)
{ {
connect(m_zigbeeManager, &ZigbeeManager::nodeAdded, this, &ZigbeeHardwareResourceImplementation::onZigbeeNodeAdded);
connect(m_zigbeeManager, &ZigbeeManager::nodeRemoved, this, &ZigbeeHardwareResourceImplementation::onZigbeeNodeRemoved);
connect(m_zigbeeManager, &ZigbeeManager::availableChanged, this, &ZigbeeHardwareResourceImplementation::onZigbeeAvailableChanged);
} }
bool ZigbeeHardwareResourceImplementation::available() const bool ZigbeeHardwareResourceImplementation::available() const
{ {
return m_available; return m_zigbeeManager->available();
} }
bool ZigbeeHardwareResourceImplementation::enabled() const bool ZigbeeHardwareResourceImplementation::enabled() const
@ -57,18 +60,6 @@ bool ZigbeeHardwareResourceImplementation::enabled() const
return m_enabled; return m_enabled;
} }
void ZigbeeHardwareResourceImplementation::setZigbeeNetwork(ZigbeeNetwork *network)
{
// Clean up
if (m_zigbeeNetwork) {
disconnect(m_zigbeeNetwork, &ZigbeeNetwork::stateChanged, this, &ZigbeeHardwareResourceImplementation::onZigbeeNetworkStateChanged);
}
// Set new network
m_zigbeeNetwork = network;
connect(m_zigbeeNetwork, &ZigbeeNetwork::stateChanged, this, &ZigbeeHardwareResourceImplementation::onZigbeeNetworkStateChanged);
}
void ZigbeeHardwareResourceImplementation::setEnabled(bool enabled) void ZigbeeHardwareResourceImplementation::setEnabled(bool enabled)
{ {
qCDebug(dcZigbeeResource()) << "Set" << (enabled ? "enabled" : "disabled"); qCDebug(dcZigbeeResource()) << "Set" << (enabled ? "enabled" : "disabled");
@ -93,33 +84,43 @@ void ZigbeeHardwareResourceImplementation::setEnabled(bool enabled)
} }
} }
void ZigbeeHardwareResourceImplementation::onZigbeeNetworkStateChanged(ZigbeeNetwork::State state)
{
qCDebug(dcZigbeeResource()) << "Network state changed" << state;
}
bool ZigbeeHardwareResourceImplementation::enable() bool ZigbeeHardwareResourceImplementation::enable()
{ {
qCDebug(dcZigbeeResource()) << "Enable hardware resource"; qCDebug(dcZigbeeResource()) << "Enable hardware resource. Not implemented yet.";
if (!m_zigbeeNetwork) { // TODO: enable all networks in the zigbee manager
qCDebug(dcZigbeeResource()) << "There is no zigbee network configured as hardware resource";
} else {
// TODO: start network
}
return true; return true;
} }
bool ZigbeeHardwareResourceImplementation::disable() bool ZigbeeHardwareResourceImplementation::disable()
{ {
qCDebug(dcZigbeeResource()) << "Disable hardware resource"; qCDebug(dcZigbeeResource()) << "Disable hardware resource. Not implemented yet.";
if (!m_zigbeeNetwork) {
qCDebug(dcZigbeeResource()) << "There is no zigbee network configured as hardware resource"; // TODO: disable all networks in the zigbee manager
}
// TODO: stop network
return true; return true;
} }
void ZigbeeHardwareResourceImplementation::onZigbeeAvailableChanged(bool available)
{
if (available) {
qCDebug(dcZigbeeResource()) << "Zigbee is now available";
} else {
qCWarning(dcZigbeeResource()) << "Zigbee is not available any more";
}
emit availableChanged(available);
}
void ZigbeeHardwareResourceImplementation::onZigbeeNodeAdded(const QUuid &networkUuid, ZigbeeNode *node)
{
qCDebug(dcZigbeeResource()) << node << "joined the network" << m_zigbeeManager->zigbeeNetworks().value(networkUuid);
}
void ZigbeeHardwareResourceImplementation::onZigbeeNodeRemoved(const QUuid &networkUuid, ZigbeeNode *node)
{
qCDebug(dcZigbeeResource()) << node << "left the network" << m_zigbeeManager->zigbeeNetworks().value(networkUuid);
}
} }

View File

@ -33,7 +33,7 @@
#include <QObject> #include <QObject>
#include "zigbeenetwork.h" #include "zigbee/zigbeemanager.h"
#include "hardware/zigbee/zigbeehardwarereource.h" #include "hardware/zigbee/zigbeehardwarereource.h"
namespace nymeaserver { namespace nymeaserver {
@ -43,29 +43,28 @@ class ZigbeeHardwareResourceImplementation : public ZigbeeHardwareResource
Q_OBJECT Q_OBJECT
public: public:
explicit ZigbeeHardwareResourceImplementation(QObject *parent = nullptr); explicit ZigbeeHardwareResourceImplementation(ZigbeeManager *zigbeeManager, QObject *parent = nullptr);
bool available() const override; bool available() const override;
bool enabled() const override; bool enabled() const override;
void setZigbeeNetwork(ZigbeeNetwork *network);
private: private:
bool m_available = false; bool m_available = false;
bool m_enabled = false; bool m_enabled = false;
ZigbeeManager *m_zigbeeManager = nullptr;
ZigbeeNetwork *m_zigbeeNetwork = nullptr;
protected: protected:
void setEnabled(bool enabled) override; void setEnabled(bool enabled) override;
private slots:
void onZigbeeNetworkStateChanged(ZigbeeNetwork::State state);
public slots: public slots:
bool enable(); bool enable();
bool disable(); bool disable();
private slots:
void onZigbeeAvailableChanged(bool available);
void onZigbeeNodeAdded(const QUuid &networkUuid, ZigbeeNode *node);
void onZigbeeNodeRemoved(const QUuid &networkUuid, ZigbeeNode *node);
}; };
} }

View File

@ -46,7 +46,7 @@
namespace nymeaserver { namespace nymeaserver {
HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, QObject *parent) : HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent) :
HardwareManager(parent), HardwareManager(parent),
m_platform(platform) m_platform(platform)
{ {
@ -71,10 +71,7 @@ HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform,
m_i2cManager = new I2CManagerImplementation(this); m_i2cManager = new I2CManagerImplementation(this);
m_zigbeeManager = new ZigbeeHardwareResourceImplementation(this); m_zigbeeResource = new ZigbeeHardwareResourceImplementation(zigbeeManager, this);
qCDebug(dcHardware()) << "Hardware manager initialized successfully";
// Enable all the resources // Enable all the resources
setResourceEnabled(m_pluginTimerManager, true); setResourceEnabled(m_pluginTimerManager, true);
@ -93,6 +90,7 @@ HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform,
setResourceEnabled(m_bluetoothLowEnergyManager, true); setResourceEnabled(m_bluetoothLowEnergyManager, true);
m_mqttProvider = new MqttProviderImplementation(mqttBroker, this); m_mqttProvider = new MqttProviderImplementation(mqttBroker, this);
qCDebug(dcHardware()) << "Hardware manager initialized successfully";
} }
HardwareManagerImplementation::~HardwareManagerImplementation() HardwareManagerImplementation::~HardwareManagerImplementation()
@ -139,9 +137,9 @@ I2CManager *HardwareManagerImplementation::i2cManager()
return m_i2cManager; return m_i2cManager;
} }
ZigbeeHardwareResource *HardwareManagerImplementation::zigbeeManager() ZigbeeHardwareResource *HardwareManagerImplementation::zigbeeResource()
{ {
return m_zigbeeManager; return m_zigbeeResource;
} }
} }

View File

@ -41,13 +41,14 @@ namespace nymeaserver {
class Platform; class Platform;
class MqttBroker; class MqttBroker;
class ZigbeeManager;
class HardwareManagerImplementation : public HardwareManager class HardwareManagerImplementation : public HardwareManager
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, QObject *parent = nullptr); explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent = nullptr);
~HardwareManagerImplementation() override; ~HardwareManagerImplementation() override;
Radio433 *radio433() override; Radio433 *radio433() override;
@ -58,7 +59,7 @@ public:
BluetoothLowEnergyManager *bluetoothLowEnergyManager() override; BluetoothLowEnergyManager *bluetoothLowEnergyManager() override;
MqttProvider *mqttProvider() override; MqttProvider *mqttProvider() override;
I2CManager *i2cManager() override; I2CManager *i2cManager() override;
ZigbeeHardwareResource *zigbeeManager() override; ZigbeeHardwareResource *zigbeeResource() override;
private: private:
QNetworkAccessManager *m_networkAccessManager = nullptr; QNetworkAccessManager *m_networkAccessManager = nullptr;
@ -73,7 +74,7 @@ private:
BluetoothLowEnergyManager *m_bluetoothLowEnergyManager = nullptr; BluetoothLowEnergyManager *m_bluetoothLowEnergyManager = nullptr;
MqttProvider *m_mqttProvider = nullptr; MqttProvider *m_mqttProvider = nullptr;
I2CManager *m_i2cManager = nullptr; I2CManager *m_i2cManager = nullptr;
ZigbeeHardwareResource *m_zigbeeManager = nullptr; ZigbeeHardwareResource *m_zigbeeResource = nullptr;
}; };
} }

View File

@ -110,7 +110,7 @@ void NymeaCore::init() {
m_zigbeeManager = new ZigbeeManager(this); m_zigbeeManager = new ZigbeeManager(this);
qCDebug(dcCore) << "Creating Hardware Manager"; qCDebug(dcCore) << "Creating Hardware Manager";
m_hardwareManager = new HardwareManagerImplementation(m_platform, m_serverManager->mqttBroker(), this); m_hardwareManager = new HardwareManagerImplementation(m_platform, m_serverManager->mqttBroker(), m_zigbeeManager, this);
qCDebug(dcCore) << "Creating Thing Manager (locale:" << m_configuration->locale() << ")"; qCDebug(dcCore) << "Creating Thing Manager (locale:" << m_configuration->locale() << ")";
m_thingManager = new ThingManagerImplementation(m_hardwareManager, m_configuration->locale(), this); m_thingManager = new ThingManagerImplementation(m_hardwareManager, m_configuration->locale(), this);

View File

@ -84,7 +84,7 @@ ZigbeeManager::ZigbeeManager(QObject *parent) :
bool ZigbeeManager::available() const bool ZigbeeManager::available() const
{ {
return !m_zigbeeNetworks.isEmpty(); return m_available;
} }
bool ZigbeeManager::enabled() const bool ZigbeeManager::enabled() const
@ -296,16 +296,15 @@ ZigbeeNetwork *ZigbeeManager::buildNetworkObject(const QUuid &networkId, ZigbeeA
void ZigbeeManager::addNetwork(ZigbeeNetwork *network) void ZigbeeManager::addNetwork(ZigbeeNetwork *network)
{ {
connect(network, &ZigbeeNetwork::stateChanged, this, [this, network](ZigbeeNetwork::State state){ connect(network, &ZigbeeNetwork::stateChanged, this, [this, network](ZigbeeNetwork::State state){
qCDebug(dcZigbee()) << "Network state changed" << network->networkUuid().toString() << state; Q_UNUSED(state)
qCDebug(dcZigbee()) << "Network state changed" << network;
// TODO: set state of zigbee resource depending on the state evaluateZigbeeAvailable();
emit zigbeeNetworkChanged(network); emit zigbeeNetworkChanged(network);
}); });
connect(network, &ZigbeeNetwork::errorOccured, this, [network](ZigbeeNetwork::Error error){ connect(network, &ZigbeeNetwork::errorOccured, this, [this, network](ZigbeeNetwork::Error error){
qCWarning(dcZigbee()) << "Network error occured for" << network << error; qCWarning(dcZigbee()) << "Network error occured for" << network << error;
evaluateZigbeeAvailable();
// TODO: handle error // TODO: handle error
}); });
@ -382,4 +381,24 @@ ZigbeeAdapter ZigbeeManager::convertUartAdapterToAdapter(const ZigbeeUartAdapter
return adapter; return adapter;
} }
void ZigbeeManager::evaluateZigbeeAvailable()
{
bool zigbeeAvailable = false;
if (!m_zigbeeNetworks.isEmpty()) {
foreach (ZigbeeNetwork *network, m_zigbeeNetworks.values()) {
if (network->state() == ZigbeeNetwork::StateRunning) {
zigbeeAvailable = true;
break;
}
}
}
if (m_available == zigbeeAvailable)
return;
qCDebug(dcZigbee()) << "Zigbee is" << (zigbeeAvailable ? "now available" : "not available any more.");
m_available = zigbeeAvailable;
emit availableChanged(m_available);
}
} }

View File

@ -80,6 +80,7 @@ private:
ZigbeeAdapters m_adapters; ZigbeeAdapters m_adapters;
ZigbeeUartAdapterMonitor *m_adapterMonitor = nullptr; ZigbeeUartAdapterMonitor *m_adapterMonitor = nullptr;
QHash<QUuid, ZigbeeNetwork *> m_zigbeeNetworks; QHash<QUuid, ZigbeeNetwork *> m_zigbeeNetworks;
bool m_available = false;
void saveNetwork(ZigbeeNetwork *network); void saveNetwork(ZigbeeNetwork *network);
void loadZigbeeNetworks(); void loadZigbeeNetworks();
@ -88,8 +89,11 @@ private:
void addNetwork(ZigbeeNetwork *network); void addNetwork(ZigbeeNetwork *network);
ZigbeeAdapter convertUartAdapterToAdapter(const ZigbeeUartAdapter &uartAdapter); ZigbeeAdapter convertUartAdapterToAdapter(const ZigbeeUartAdapter &uartAdapter);
void evaluateZigbeeAvailable();
signals: signals:
void availableChanged(bool available);
void availableAdapterAdded(const ZigbeeAdapter &adapter); void availableAdapterAdded(const ZigbeeAdapter &adapter);
void availableAdapterRemoved(const ZigbeeAdapter &adapter); void availableAdapterRemoved(const ZigbeeAdapter &adapter);
@ -97,6 +101,8 @@ signals:
void zigbeeNetworkRemoved(const QUuid networkUuid); void zigbeeNetworkRemoved(const QUuid networkUuid);
void zigbeeNetworkChanged(ZigbeeNetwork *zigbeeNetwork); void zigbeeNetworkChanged(ZigbeeNetwork *zigbeeNetwork);
void nodeAdded(const QUuid &networkUuid, ZigbeeNode *node);
void nodeRemoved(const QUuid &networkUuid, ZigbeeNode *node);
}; };
} }

View File

@ -62,7 +62,7 @@ public:
virtual BluetoothLowEnergyManager *bluetoothLowEnergyManager() = 0; virtual BluetoothLowEnergyManager *bluetoothLowEnergyManager() = 0;
virtual MqttProvider *mqttProvider() = 0; virtual MqttProvider *mqttProvider() = 0;
virtual I2CManager *i2cManager() = 0; virtual I2CManager *i2cManager() = 0;
virtual ZigbeeHardwareResource *zigbeeManager() = 0; virtual ZigbeeHardwareResource *zigbeeResource() = 0;
protected: protected:
void setResourceEnabled(HardwareResource* resource, bool enabled); void setResourceEnabled(HardwareResource* resource, bool enabled);