Remove settings and leave that to the stack using application
parent
097254756e
commit
db146a38d0
|
|
@ -32,8 +32,8 @@
|
|||
|
||||
#include <QDataStream>
|
||||
|
||||
ZigbeeNetworkDeconz::ZigbeeNetworkDeconz(QObject *parent) :
|
||||
ZigbeeNetwork(parent)
|
||||
ZigbeeNetworkDeconz::ZigbeeNetworkDeconz(const QUuid &networkUuid, QObject *parent) :
|
||||
ZigbeeNetwork(networkUuid, parent)
|
||||
{
|
||||
m_controller = new ZigbeeBridgeControllerDeconz(this);
|
||||
connect(m_controller, &ZigbeeBridgeControllerDeconz::availableChanged, this, &ZigbeeNetworkDeconz::onControllerAvailableChanged);
|
||||
|
|
@ -59,6 +59,11 @@ ZigbeeBridgeController *ZigbeeNetworkDeconz::bridgeController() const
|
|||
return qobject_cast<ZigbeeBridgeController *>(m_controller);
|
||||
}
|
||||
|
||||
Zigbee::ZigbeeBackendType ZigbeeNetworkDeconz::backendType() const
|
||||
{
|
||||
return Zigbee::ZigbeeBackendTypeDeconz;
|
||||
}
|
||||
|
||||
ZigbeeNetworkReply *ZigbeeNetworkDeconz::sendRequest(const ZigbeeNetworkRequest &request)
|
||||
{
|
||||
ZigbeeNetworkReply *reply = createNetworkReply(request);
|
||||
|
|
|
|||
|
|
@ -49,9 +49,10 @@ public:
|
|||
};
|
||||
Q_ENUM(CreateNetworkState)
|
||||
|
||||
explicit ZigbeeNetworkDeconz(QObject *parent = nullptr);
|
||||
explicit ZigbeeNetworkDeconz(const QUuid &networkUuid, QObject *parent = nullptr);
|
||||
|
||||
ZigbeeBridgeController *bridgeController() const override;
|
||||
Zigbee::ZigbeeBackendType backendType() const override;
|
||||
|
||||
// Sending an APSDE-DATA.request, will be finished on APSDE-DATA.confirm
|
||||
ZigbeeNetworkReply *sendRequest(const ZigbeeNetworkRequest &request) override;
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@
|
|||
|
||||
#include <QDataStream>
|
||||
|
||||
ZigbeeNetworkNxp::ZigbeeNetworkNxp(QObject *parent) :
|
||||
ZigbeeNetwork(parent)
|
||||
ZigbeeNetworkNxp::ZigbeeNetworkNxp(const QUuid &networkUuid, QObject *parent) :
|
||||
ZigbeeNetwork(networkUuid, parent)
|
||||
{
|
||||
m_controller = new ZigbeeBridgeControllerNxp(this);
|
||||
connect(m_controller, &ZigbeeBridgeControllerNxp::availableChanged, this, &ZigbeeNetworkNxp::onControllerAvailableChanged);
|
||||
|
|
@ -71,6 +71,11 @@ ZigbeeBridgeController *ZigbeeNetworkNxp::bridgeController() const
|
|||
return qobject_cast<ZigbeeBridgeController *>(m_controller);
|
||||
}
|
||||
|
||||
Zigbee::ZigbeeBackendType ZigbeeNetworkNxp::backendType() const
|
||||
{
|
||||
return Zigbee::ZigbeeBackendTypeNxp;
|
||||
}
|
||||
|
||||
ZigbeeNetworkReply *ZigbeeNetworkNxp::sendRequest(const ZigbeeNetworkRequest &request)
|
||||
{
|
||||
ZigbeeNetworkReply *reply = createNetworkReply(request);
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@ class ZigbeeNetworkNxp : public ZigbeeNetwork
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ZigbeeNetworkNxp(QObject *parent = nullptr);
|
||||
explicit ZigbeeNetworkNxp(const QUuid &networkUuid, QObject *parent = nullptr);
|
||||
|
||||
ZigbeeBridgeController *bridgeController() const override;
|
||||
|
||||
Zigbee::ZigbeeBackendType backendType() const override;
|
||||
ZigbeeNetworkReply *sendRequest(const ZigbeeNetworkRequest &request) override;
|
||||
ZigbeeNetworkReply *setPermitJoin(quint16 shortAddress = Zigbee::BroadcastAddressAllRouters, quint8 duration = 0xfe);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,12 +34,18 @@
|
|||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
|
||||
ZigbeeNetwork::ZigbeeNetwork(QObject *parent) :
|
||||
QObject(parent)
|
||||
ZigbeeNetwork::ZigbeeNetwork(const QUuid &networkUuid, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_networkUuid(networkUuid)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QUuid ZigbeeNetwork::networkUuid() const
|
||||
{
|
||||
return m_networkUuid;
|
||||
}
|
||||
|
||||
ZigbeeNetwork::State ZigbeeNetwork::state() const
|
||||
{
|
||||
return m_state;
|
||||
|
|
@ -50,18 +56,17 @@ ZigbeeNetwork::Error ZigbeeNetwork::error() const
|
|||
return m_error;
|
||||
}
|
||||
|
||||
QString ZigbeeNetwork::settingsFilenName() const
|
||||
QDir ZigbeeNetwork::settingsDirectory() const
|
||||
{
|
||||
return m_settingsFileName;
|
||||
return m_settingsDirectory;
|
||||
}
|
||||
|
||||
void ZigbeeNetwork::setSettingsFileName(const QString &settingsFileName)
|
||||
void ZigbeeNetwork::setSettingsDirectory(const QDir &settingsDirectory)
|
||||
{
|
||||
qCDebug(dcZigbeeNetwork()) << "Using settings file" << settingsFileName;
|
||||
m_settingsFileName = settingsFileName;
|
||||
emit settingsFileNameChanged(m_settingsFileName);
|
||||
qCDebug(dcZigbeeNetwork()) << "Using settings directory" << settingsDirectory.absolutePath();
|
||||
m_settingsDirectory = settingsDirectory;
|
||||
emit settingsDirectoryChanged(m_settingsDirectory);
|
||||
|
||||
m_settingsDirectory = QDir(QFileInfo(m_settingsFileName).absolutePath());
|
||||
bridgeController()->setSettingsDirectory(m_settingsDirectory);
|
||||
}
|
||||
|
||||
|
|
@ -93,6 +98,20 @@ void ZigbeeNetwork::setSerialBaudrate(qint32 baudrate)
|
|||
emit serialBaudrateChanged(m_serialBaudrate);
|
||||
}
|
||||
|
||||
ZigbeeAddress ZigbeeNetwork::macAddress() const
|
||||
{
|
||||
return m_macAddress;
|
||||
}
|
||||
|
||||
void ZigbeeNetwork::setMacAddress(const ZigbeeAddress &zigbeeAddress)
|
||||
{
|
||||
if (m_macAddress == zigbeeAddress)
|
||||
return;
|
||||
|
||||
m_macAddress = zigbeeAddress;
|
||||
emit macAddressChanged(m_macAddress);
|
||||
}
|
||||
|
||||
quint16 ZigbeeNetwork::panId()
|
||||
{
|
||||
return m_panId;
|
||||
|
|
@ -315,39 +334,39 @@ ZigbeeNode *ZigbeeNetwork::createNode(quint16 shortAddress, const ZigbeeAddress
|
|||
|
||||
void ZigbeeNetwork::saveNetwork()
|
||||
{
|
||||
qCDebug(dcZigbeeNetwork()) << "Save current network configuration to" << m_settingsFileName;
|
||||
QSettings settings(m_settingsFileName, QSettings::IniFormat, this);
|
||||
settings.beginGroup("ZigbeeNetwork");
|
||||
settings.setValue("panId", panId());
|
||||
settings.setValue("channel", channel());
|
||||
settings.setValue("networkKey", securityConfiguration().networkKey().toString());
|
||||
settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString());
|
||||
settings.endGroup();
|
||||
// qCDebug(dcZigbeeNetwork()) << "Save current network configuration to" << m_settingsFileName;
|
||||
// QSettings settings(m_settingsFileName, QSettings::IniFormat, this);
|
||||
// settings.beginGroup("ZigbeeNetwork");
|
||||
// settings.setValue("panId", panId());
|
||||
// settings.setValue("channel", channel());
|
||||
// settings.setValue("networkKey", securityConfiguration().networkKey().toString());
|
||||
// settings.setValue("trustCenterLinkKey", securityConfiguration().globalTrustCenterLinkKey().toString());
|
||||
// settings.endGroup();
|
||||
}
|
||||
|
||||
void ZigbeeNetwork::loadNetwork()
|
||||
{
|
||||
qCDebug(dcZigbeeNetwork()) << "Load current network configuration from" << m_settingsFileName;
|
||||
|
||||
qCDebug(dcZigbeeNetwork()) << "Loading network from settings directory" << m_settingsDirectory.absolutePath();
|
||||
if (!m_database) {
|
||||
QDir storagePath = QFileInfo(m_settingsFileName).absoluteDir();
|
||||
m_database = new ZigbeeNetworkDatabase(this, storagePath.absolutePath() + QDir::separator() + "zigbee-network.db", this);
|
||||
QString networkDatabaseFileName = m_settingsDirectory.absolutePath() + QDir::separator() + QString("zigbee-network-%1.db").arg(m_networkUuid.toString());
|
||||
qCDebug(dcZigbeeNetwork()) << "Using ZigBee network database" << QFileInfo(networkDatabaseFileName).fileName();
|
||||
m_database = new ZigbeeNetworkDatabase(this, networkDatabaseFileName, this);
|
||||
}
|
||||
|
||||
QSettings settings(m_settingsFileName, QSettings::IniFormat, this);
|
||||
settings.beginGroup("ZigbeeNetwork");
|
||||
quint16 panId = static_cast<quint16>(settings.value("panId", 0).toUInt());
|
||||
setPanId(panId);
|
||||
setChannel(settings.value("channel", 0).toUInt());
|
||||
ZigbeeNetworkKey netKey(settings.value("networkKey", QString()).toString());
|
||||
if (netKey.isValid())
|
||||
m_securityConfiguration.setNetworkKey(netKey);
|
||||
// QSettings settings(m_settingsFileName, QSettings::IniFormat, this);
|
||||
// settings.beginGroup("ZigbeeNetwork");
|
||||
// quint16 panId = static_cast<quint16>(settings.value("panId", 0).toUInt());
|
||||
// setPanId(panId);
|
||||
// setChannel(settings.value("channel", 0).toUInt());
|
||||
// ZigbeeNetworkKey netKey(settings.value("networkKey", QString()).toString());
|
||||
// if (netKey.isValid())
|
||||
// m_securityConfiguration.setNetworkKey(netKey);
|
||||
|
||||
ZigbeeNetworkKey tcKey(settings.value("trustCenterLinkKey", QString("5A6967426565416C6C69616E63653039")).toString());
|
||||
if (!tcKey.isValid())
|
||||
m_securityConfiguration.setGlobalTrustCenterlinkKey(tcKey);
|
||||
// ZigbeeNetworkKey tcKey(settings.value("trustCenterLinkKey", QString("5A6967426565416C6C69616E63653039")).toString());
|
||||
// if (!tcKey.isValid())
|
||||
// m_securityConfiguration.setGlobalTrustCenterlinkKey(tcKey);
|
||||
|
||||
settings.endGroup(); // Network
|
||||
// settings.endGroup(); // Network
|
||||
|
||||
QList<ZigbeeNode *> nodes = m_database->loadNodes();
|
||||
foreach (ZigbeeNode *node, nodes) {
|
||||
|
|
@ -358,25 +377,32 @@ void ZigbeeNetwork::loadNetwork()
|
|||
|
||||
void ZigbeeNetwork::clearSettings()
|
||||
{
|
||||
// Note: this clears the database
|
||||
qCDebug(dcZigbeeNetwork()) << "Remove zigbee nodes from network";
|
||||
foreach (ZigbeeNode *node, m_nodes) {
|
||||
removeNode(node);
|
||||
}
|
||||
|
||||
qCDebug(dcZigbeeNetwork()) << "Clear all uninitialized nodes";
|
||||
foreach (ZigbeeNode *node, m_uninitializedNodes) {
|
||||
qCDebug(dcZigbeeNetwork()) << "Remove uninitialized" << node;
|
||||
m_uninitializedNodes.removeAll(node);
|
||||
node->deleteLater();
|
||||
}
|
||||
|
||||
qCDebug(dcZigbeeNetwork()) << "Clear network settings" << m_settingsFileName;
|
||||
QSettings settings(m_settingsFileName, QSettings::IniFormat, this);
|
||||
settings.clear();
|
||||
qCDebug(dcZigbeeNetwork()) << "Delete network database";
|
||||
if (m_database) {
|
||||
if (!m_database->wipeDatabase()) {
|
||||
qCWarning(dcZigbeeNetwork()) << "Failed to wipe the network database" << m_database->databaseName();
|
||||
}
|
||||
}
|
||||
|
||||
// Reset network configurations
|
||||
qCDebug(dcZigbeeNetwork()) << "Clear network properties";
|
||||
m_extendedPanId = 0;
|
||||
m_channel = 0;
|
||||
m_securityConfiguration.clear();
|
||||
setExtendedPanId(0);
|
||||
setChannel(0);
|
||||
setSecurityConfiguration(ZigbeeSecurityConfiguration());
|
||||
setState(StateUninitialized);
|
||||
m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator;
|
||||
}
|
||||
|
||||
|
|
@ -512,6 +538,7 @@ void ZigbeeNetwork::finishNetworkReply(ZigbeeNetworkReply *reply, ZigbeeNetworkR
|
|||
qCWarning(dcZigbeeNetwork()) << "Failed to send request to device" << reply->request() << reply->error();
|
||||
break;
|
||||
}
|
||||
|
||||
// Stop the timer
|
||||
reply->m_timer->stop();
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@
|
|||
#define ZIGBEENETWORK_H
|
||||
|
||||
#include <QDir>
|
||||
#include <QUuid>
|
||||
#include <QObject>
|
||||
#include <QSettings>
|
||||
|
||||
#include <QSqlDatabase>
|
||||
|
||||
#include "zigbeenode.h"
|
||||
|
|
@ -64,16 +64,19 @@ public:
|
|||
};
|
||||
Q_ENUM(Error)
|
||||
|
||||
explicit ZigbeeNetwork(QObject *parent = nullptr);
|
||||
explicit ZigbeeNetwork(const QUuid &networkUuid, QObject *parent = nullptr);
|
||||
|
||||
QUuid networkUuid() const;
|
||||
|
||||
State state() const;
|
||||
|
||||
Error error() const;
|
||||
|
||||
QString settingsFilenName() const;
|
||||
void setSettingsFileName(const QString &settingsFileName);
|
||||
QDir settingsDirectory() const;
|
||||
void setSettingsDirectory(const QDir &settingsDirectory);
|
||||
|
||||
virtual ZigbeeBridgeController *bridgeController() const = 0;
|
||||
virtual Zigbee::ZigbeeBackendType backendType() const = 0;
|
||||
|
||||
// Serial port configuration
|
||||
QString serialPortName() const;
|
||||
|
|
@ -82,6 +85,9 @@ public:
|
|||
qint32 serialBaudrate() const;
|
||||
void setSerialBaudrate(qint32 baudrate);
|
||||
|
||||
ZigbeeAddress macAddress() const;
|
||||
void setMacAddress(const ZigbeeAddress &zigbeeAddress);
|
||||
|
||||
// Network configurations
|
||||
quint16 panId();
|
||||
void setPanId(quint16 panId);
|
||||
|
|
@ -119,11 +125,13 @@ public:
|
|||
void removeZigbeeNode(const ZigbeeAddress &address);
|
||||
|
||||
private:
|
||||
QUuid m_networkUuid;
|
||||
State m_state = StateUninitialized;
|
||||
|
||||
// Serial port configuration
|
||||
QString m_serialPortName = "/dev/ttyUSB0";
|
||||
qint32 m_serialBaudrate = 115200;
|
||||
ZigbeeAddress m_macAddress;
|
||||
|
||||
// Continuouse ASP sequence number for network requests
|
||||
quint8 m_sequenceNumber = 0;
|
||||
|
|
@ -136,7 +144,6 @@ private:
|
|||
ZigbeeDeviceProfile::NodeType m_nodeType = ZigbeeDeviceProfile::NodeTypeCoordinator;
|
||||
|
||||
// Network storage
|
||||
QString m_settingsFileName = "/etc/nymea/nymea-zigbee.conf";
|
||||
QDir m_settingsDirectory = QDir("/etc/nymea/");
|
||||
QList<ZigbeeNode *> m_nodes;
|
||||
QList<ZigbeeNode *> m_uninitializedNodes;
|
||||
|
|
@ -181,9 +188,10 @@ protected:
|
|||
void startWaitingReply(ZigbeeNetworkReply *reply);
|
||||
|
||||
signals:
|
||||
void settingsFileNameChanged(const QString &settingsFileName);
|
||||
void settingsDirectoryChanged(const QDir &settingsDirectory);
|
||||
void serialPortNameChanged(const QString &serialPortName);
|
||||
void serialBaudrateChanged(qint32 serialBaudrate);
|
||||
void macAddressChanged(const ZigbeeAddress &macAddress);
|
||||
|
||||
void panIdChanged(quint16 panId);
|
||||
void extendedPanIdChanged(quint64 extendedPanId);
|
||||
|
|
|
|||
|
|
@ -36,10 +36,11 @@
|
|||
|
||||
ZigbeeNetworkDatabase::ZigbeeNetworkDatabase(ZigbeeNetwork *network, const QString &databaseName, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_network(network)
|
||||
m_network(network),
|
||||
m_databaseName(databaseName)
|
||||
{
|
||||
m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), "zigbee");
|
||||
m_db.setDatabaseName(databaseName);
|
||||
m_db.setDatabaseName(m_databaseName);
|
||||
qCDebug(dcZigbeeNetworkDatabase()) << "Opening zigbee network database" << m_db.databaseName();
|
||||
|
||||
if (!m_db.isValid()) {
|
||||
|
|
@ -63,6 +64,11 @@ ZigbeeNetworkDatabase::~ZigbeeNetworkDatabase()
|
|||
}
|
||||
}
|
||||
|
||||
QString ZigbeeNetworkDatabase::databaseName() const
|
||||
{
|
||||
return m_databaseName;
|
||||
}
|
||||
|
||||
QList<ZigbeeNode *> ZigbeeNetworkDatabase::loadNodes()
|
||||
{
|
||||
qCDebug(dcZigbeeNetworkDatabase()) << "Loading nodes from database" << m_db.databaseName();
|
||||
|
|
@ -177,6 +183,16 @@ bool ZigbeeNetworkDatabase::wipeDatabase()
|
|||
qCWarning(dcZigbeeNetworkDatabase()) << "Could not delete all node database entries." << m_db.lastError().databaseText() << m_db.lastError().driverText();
|
||||
return false;
|
||||
}
|
||||
m_db.close();
|
||||
|
||||
// Delete database file
|
||||
QFile databaseFile(m_databaseName);
|
||||
if (databaseFile.exists()) {
|
||||
if (!databaseFile.remove()) {
|
||||
qCWarning(dcZigbeeNetworkDatabase()) << "Could not delete database file" << m_databaseName;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,11 +46,15 @@ public:
|
|||
explicit ZigbeeNetworkDatabase(ZigbeeNetwork *network, const QString &databaseName, QObject *parent = nullptr);
|
||||
~ZigbeeNetworkDatabase();
|
||||
|
||||
QString databaseName() const;
|
||||
|
||||
QList<ZigbeeNode *> loadNodes();
|
||||
|
||||
bool wipeDatabase();
|
||||
|
||||
private:
|
||||
ZigbeeNetwork *m_network = nullptr;
|
||||
QString m_databaseName;
|
||||
QSqlDatabase m_db;
|
||||
|
||||
bool initDatabase();
|
||||
|
|
|
|||
|
|
@ -38,16 +38,16 @@ QStringList ZigbeeNetworkManager::availableZigbeeBackendTypes()
|
|||
return {"deCONZ", "NXP"};
|
||||
}
|
||||
|
||||
ZigbeeNetwork *ZigbeeNetworkManager::createZigbeeNetwork(Zigbee::ZigbeeBackendType backend, QObject *parent)
|
||||
ZigbeeNetwork *ZigbeeNetworkManager::createZigbeeNetwork(const QUuid &networkUuid, Zigbee::ZigbeeBackendType backend, QObject *parent)
|
||||
{
|
||||
// Note: required for generating random PAN ID
|
||||
srand(static_cast<uint>(QDateTime::currentMSecsSinceEpoch() / 1000));
|
||||
|
||||
switch (backend) {
|
||||
case Zigbee::ZigbeeBackendTypeNxp:
|
||||
return qobject_cast<ZigbeeNetwork *>(new ZigbeeNetworkNxp(parent));
|
||||
return qobject_cast<ZigbeeNetwork *>(new ZigbeeNetworkNxp(networkUuid, parent));
|
||||
case Zigbee::ZigbeeBackendTypeDeconz:
|
||||
return qobject_cast<ZigbeeNetwork *>(new ZigbeeNetworkDeconz(parent));
|
||||
return qobject_cast<ZigbeeNetwork *>(new ZigbeeNetworkDeconz(networkUuid, parent));
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@
|
|||
|
||||
#include <QObject>
|
||||
|
||||
#include "zigbeeuartadapter.h"
|
||||
#include "zigbeenetwork.h"
|
||||
#include "zigbeeuartadapter.h"
|
||||
|
||||
class ZigbeeNetworkManager
|
||||
{
|
||||
|
|
@ -39,7 +39,7 @@ class ZigbeeNetworkManager
|
|||
|
||||
public:
|
||||
static QStringList availableZigbeeBackendTypes();
|
||||
static ZigbeeNetwork *createZigbeeNetwork(Zigbee::ZigbeeBackendType backend, QObject *parent = nullptr);
|
||||
static ZigbeeNetwork *createZigbeeNetwork(const QUuid &networkUuid, Zigbee::ZigbeeBackendType backend, QObject *parent = nullptr);
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(ZigbeeNetworkManager)
|
||||
|
|
|
|||
Loading…
Reference in New Issue