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 {
ZigbeeHardwareResourceImplementation::ZigbeeHardwareResourceImplementation(QObject *parent) :
ZigbeeHardwareResource(parent)
ZigbeeHardwareResourceImplementation::ZigbeeHardwareResourceImplementation(ZigbeeManager *zigbeeManager, QObject *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
{
return m_available;
return m_zigbeeManager->available();
}
bool ZigbeeHardwareResourceImplementation::enabled() const
@ -57,18 +60,6 @@ bool ZigbeeHardwareResourceImplementation::enabled() const
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)
{
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()
{
qCDebug(dcZigbeeResource()) << "Enable hardware resource";
qCDebug(dcZigbeeResource()) << "Enable hardware resource. Not implemented yet.";
if (!m_zigbeeNetwork) {
qCDebug(dcZigbeeResource()) << "There is no zigbee network configured as hardware resource";
} else {
// TODO: start network
}
// TODO: enable all networks in the zigbee manager
return true;
}
bool ZigbeeHardwareResourceImplementation::disable()
{
qCDebug(dcZigbeeResource()) << "Disable hardware resource";
if (!m_zigbeeNetwork) {
qCDebug(dcZigbeeResource()) << "There is no zigbee network configured as hardware resource";
}
qCDebug(dcZigbeeResource()) << "Disable hardware resource. Not implemented yet.";
// TODO: disable all networks in the zigbee manager
// TODO: stop network
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 "zigbeenetwork.h"
#include "zigbee/zigbeemanager.h"
#include "hardware/zigbee/zigbeehardwarereource.h"
namespace nymeaserver {
@ -43,29 +43,28 @@ class ZigbeeHardwareResourceImplementation : public ZigbeeHardwareResource
Q_OBJECT
public:
explicit ZigbeeHardwareResourceImplementation(QObject *parent = nullptr);
explicit ZigbeeHardwareResourceImplementation(ZigbeeManager *zigbeeManager, QObject *parent = nullptr);
bool available() const override;
bool enabled() const override;
void setZigbeeNetwork(ZigbeeNetwork *network);
private:
bool m_available = false;
bool m_enabled = false;
ZigbeeNetwork *m_zigbeeNetwork = nullptr;
ZigbeeManager *m_zigbeeManager = nullptr;
protected:
void setEnabled(bool enabled) override;
private slots:
void onZigbeeNetworkStateChanged(ZigbeeNetwork::State state);
public slots:
bool enable();
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 {
HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, QObject *parent) :
HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent) :
HardwareManager(parent),
m_platform(platform)
{
@ -71,10 +71,7 @@ HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform,
m_i2cManager = new I2CManagerImplementation(this);
m_zigbeeManager = new ZigbeeHardwareResourceImplementation(this);
qCDebug(dcHardware()) << "Hardware manager initialized successfully";
m_zigbeeResource = new ZigbeeHardwareResourceImplementation(zigbeeManager, this);
// Enable all the resources
setResourceEnabled(m_pluginTimerManager, true);
@ -93,6 +90,7 @@ HardwareManagerImplementation::HardwareManagerImplementation(Platform *platform,
setResourceEnabled(m_bluetoothLowEnergyManager, true);
m_mqttProvider = new MqttProviderImplementation(mqttBroker, this);
qCDebug(dcHardware()) << "Hardware manager initialized successfully";
}
HardwareManagerImplementation::~HardwareManagerImplementation()
@ -139,9 +137,9 @@ I2CManager *HardwareManagerImplementation::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 MqttBroker;
class ZigbeeManager;
class HardwareManagerImplementation : public HardwareManager
{
Q_OBJECT
public:
explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, QObject *parent = nullptr);
explicit HardwareManagerImplementation(Platform *platform, MqttBroker *mqttBroker, ZigbeeManager *zigbeeManager, QObject *parent = nullptr);
~HardwareManagerImplementation() override;
Radio433 *radio433() override;
@ -58,7 +59,7 @@ public:
BluetoothLowEnergyManager *bluetoothLowEnergyManager() override;
MqttProvider *mqttProvider() override;
I2CManager *i2cManager() override;
ZigbeeHardwareResource *zigbeeManager() override;
ZigbeeHardwareResource *zigbeeResource() override;
private:
QNetworkAccessManager *m_networkAccessManager = nullptr;
@ -73,7 +74,7 @@ private:
BluetoothLowEnergyManager *m_bluetoothLowEnergyManager = nullptr;
MqttProvider *m_mqttProvider = 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);
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() << ")";
m_thingManager = new ThingManagerImplementation(m_hardwareManager, m_configuration->locale(), this);

View File

@ -84,7 +84,7 @@ ZigbeeManager::ZigbeeManager(QObject *parent) :
bool ZigbeeManager::available() const
{
return !m_zigbeeNetworks.isEmpty();
return m_available;
}
bool ZigbeeManager::enabled() const
@ -296,16 +296,15 @@ ZigbeeNetwork *ZigbeeManager::buildNetworkObject(const QUuid &networkId, ZigbeeA
void ZigbeeManager::addNetwork(ZigbeeNetwork *network)
{
connect(network, &ZigbeeNetwork::stateChanged, this, [this, network](ZigbeeNetwork::State state){
qCDebug(dcZigbee()) << "Network state changed" << network->networkUuid().toString() << state;
// TODO: set state of zigbee resource depending on the state
Q_UNUSED(state)
qCDebug(dcZigbee()) << "Network state changed" << network;
evaluateZigbeeAvailable();
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;
evaluateZigbeeAvailable();
// TODO: handle error
});
@ -382,4 +381,24 @@ ZigbeeAdapter ZigbeeManager::convertUartAdapterToAdapter(const ZigbeeUartAdapter
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;
ZigbeeUartAdapterMonitor *m_adapterMonitor = nullptr;
QHash<QUuid, ZigbeeNetwork *> m_zigbeeNetworks;
bool m_available = false;
void saveNetwork(ZigbeeNetwork *network);
void loadZigbeeNetworks();
@ -88,8 +89,11 @@ private:
void addNetwork(ZigbeeNetwork *network);
ZigbeeAdapter convertUartAdapterToAdapter(const ZigbeeUartAdapter &uartAdapter);
void evaluateZigbeeAvailable();
signals:
void availableChanged(bool available);
void availableAdapterAdded(const ZigbeeAdapter &adapter);
void availableAdapterRemoved(const ZigbeeAdapter &adapter);
@ -97,6 +101,8 @@ signals:
void zigbeeNetworkRemoved(const QUuid networkUuid);
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 MqttProvider *mqttProvider() = 0;
virtual I2CManager *i2cManager() = 0;
virtual ZigbeeHardwareResource *zigbeeManager() = 0;
virtual ZigbeeHardwareResource *zigbeeResource() = 0;
protected:
void setResourceEnabled(HardwareResource* resource, bool enabled);