mirror of
https://github.com/Fishwaldo/qt-openzwave.git
synced 2025-03-15 19:41:24 +00:00
Tidy up the Source a bit
This commit is contained in:
parent
7095f863f4
commit
910ac8c39a
7 changed files with 382 additions and 355 deletions
93
qt-ozwdaemon/mqttNodes.cpp
Normal file
93
qt-ozwdaemon/mqttNodes.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
|
||||
#include "qt-openzwave/qtozwmanager.h"
|
||||
#include "mqttNodes.h"
|
||||
#include "qtrj.h"
|
||||
|
||||
|
||||
Q_LOGGING_CATEGORY(ozwmpnode, "ozw.mqtt.publisher.node");
|
||||
|
||||
mqttNodeModel::mqttNodeModel(QObject *parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QVariant mqttNodeModel::getNodeData(quint8 node, NodeColumns col) {
|
||||
int row = this->getNodeRow(node);
|
||||
return this->data(this->index(row, col), Qt::DisplayRole);
|
||||
}
|
||||
|
||||
bool mqttNodeModel::isValidNode(quint8 node) {
|
||||
if (this->getNodeRow(node) == -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool mqttNodeModel::populateJsonObject(rapidjson::Document &jsonobject, quint8 node, QTOZWManager *mgr) {
|
||||
if (jsonobject.IsNull())
|
||||
jsonobject.SetObject();
|
||||
|
||||
for (int i = 0; i < this->columnCount(QModelIndex()); i++) {
|
||||
QVariant data = this->getNodeData(node, static_cast<NodeColumns>(i));
|
||||
if (data.type() == QVariant::Invalid) {
|
||||
continue;
|
||||
}
|
||||
switch (static_cast<NodeColumns>(i)) {
|
||||
case NodeColumns::NodeFlags: {
|
||||
QBitArray flag = data.toBitArray();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<nodeFlags>();
|
||||
for (int j = 0; j < nodeFlags::flagCount; j++) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(j), flag.at(j));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<NodeColumns>();
|
||||
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
|
||||
QT2JS::SetString(jsonobject, metaEnum.valueToKey(i), data.toString());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(i), data.toBool());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
|
||||
QT2JS::SetInt(jsonobject, metaEnum.valueToKey(i), data.toInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
|
||||
QT2JS::SetUint(jsonobject, metaEnum.valueToKey(i), data.toUInt());
|
||||
} else {
|
||||
qCWarning(ozwmpnode) << "Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << node;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* MetaData */
|
||||
rapidjson::Value metadata;
|
||||
if (!jsonobject.HasMember("MetaData")) {
|
||||
rapidjson::Value metadata;
|
||||
metadata.SetObject();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<QTOZWManagerSource::QTOZWMetaDataField>();
|
||||
if (metadata.IsNull()) {
|
||||
metadata.SetObject();
|
||||
}
|
||||
for (int i = 0; i < QTOZWManagerSource::Identifier; i++) {
|
||||
metadata.AddMember(
|
||||
rapidjson::Value(metaEnum.valueToKey(i), jsonobject.GetAllocator()).Move(),
|
||||
rapidjson::Value(mgr->GetMetaData(node, static_cast<QTOZWManagerSource::QTOZWMetaDataField>(i)).toStdString().c_str(), jsonobject.GetAllocator()).Move(),
|
||||
jsonobject.GetAllocator());
|
||||
}
|
||||
metadata.AddMember(rapidjson::Value("ProductPicBase64").Move(),
|
||||
rapidjson::Value(QString(mgr->GetMetaDataProductPic(node).toBase64()).toStdString().c_str(), jsonobject.GetAllocator()).Move(),
|
||||
jsonobject.GetAllocator());
|
||||
|
||||
jsonobject.AddMember(rapidjson::Value("MetaData"), metadata, jsonobject.GetAllocator());
|
||||
}
|
||||
/* Neighbors */
|
||||
QVector<quint8> neighbors = mgr->GetNodeNeighbors(node);
|
||||
if (neighbors.size() > 0) {
|
||||
rapidjson::Value N(rapidjson::kArrayType);
|
||||
for (int i = 0; i < neighbors.count(); i++) {
|
||||
N.PushBack(neighbors[i], jsonobject.GetAllocator());
|
||||
}
|
||||
jsonobject.AddMember(rapidjson::Value("Neighbors").Move(), N, jsonobject.GetAllocator());
|
||||
}
|
||||
return true;
|
||||
}
|
19
qt-ozwdaemon/mqttNodes.h
Normal file
19
qt-ozwdaemon/mqttNodes.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef MQTTNODES_H
|
||||
#define MQTTNODES_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QVariant>
|
||||
#include <rapidjson/document.h>
|
||||
#include "qt-openzwave/qtozwnodemodel.h"
|
||||
|
||||
class mqttNodeModel : public QTOZW_Nodes {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit mqttNodeModel(QObject *parent = nullptr);
|
||||
QVariant getNodeData(quint8, NodeColumns);
|
||||
bool populateJsonObject(rapidjson::Document &, quint8, QTOZWManager *);
|
||||
bool isValidNode(quint8);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
242
qt-ozwdaemon/mqttValues.cpp
Normal file
242
qt-ozwdaemon/mqttValues.cpp
Normal file
|
@ -0,0 +1,242 @@
|
|||
#include "qt-openzwave/qtozwmanager.h"
|
||||
#include "mqttValues.h"
|
||||
#include "qtrj.h"
|
||||
|
||||
|
||||
Q_LOGGING_CATEGORY(ozwmpvalue, "ozw.mqtt.publisher.value");
|
||||
|
||||
mqttValueIDModel::mqttValueIDModel(QObject *parent) {
|
||||
|
||||
}
|
||||
QVariant mqttValueIDModel::getValueData(quint64 vidKey, ValueIdColumns col) {
|
||||
int row = this->getValueRow(vidKey);
|
||||
return this->data(this->index(row, col), Qt::DisplayRole);
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::isValidValueID(quint64 vidKey) {
|
||||
if (this->getValueRow(vidKey) == -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool mqttValueIDModel::populateJsonObject(rapidjson::Document &jsonobject, quint64 vidKey, QTOZWManager *mgr) {
|
||||
for (int i = 0; i < ValueIdColumns::ValueIdCount; i++) {
|
||||
QVariant data = this->getValueData(vidKey, static_cast<ValueIdColumns>(i));
|
||||
switch (static_cast<ValueIdColumns>(i)) {
|
||||
case ValueFlags: {
|
||||
QBitArray flag = data.toBitArray();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIDFlags>();
|
||||
for (int j = 0; j < ValueIDFlags::FlagCount; j++) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(j), flag.at(j));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Value: {
|
||||
this->encodeValue(jsonobject, vidKey);
|
||||
break;
|
||||
}
|
||||
case Genre: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdGenres>();
|
||||
QT2JS::SetString(jsonobject, "Genre", metaEnum.valueToKey(data.toInt()));
|
||||
break;
|
||||
}
|
||||
case Type: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdTypes>();
|
||||
QT2JS::SetString(jsonobject, "Type", metaEnum.valueToKey(data.toInt()));
|
||||
break;
|
||||
}
|
||||
case CommandClass: {
|
||||
QT2JS::SetString(jsonobject, "CommandClass", mgr->getCommandClassString(data.toInt()));
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdColumns>();
|
||||
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
|
||||
QT2JS::SetString(jsonobject, metaEnum.valueToKey(i), data.toString());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(i), data.toBool());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
|
||||
QT2JS::SetInt(jsonobject, metaEnum.valueToKey(i), data.toInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
|
||||
QT2JS::SetUint(jsonobject, metaEnum.valueToKey(i), data.toUInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float) {
|
||||
QT2JS::SetDouble(jsonobject, metaEnum.valueToKey(i), data.toDouble());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::ULongLong) {
|
||||
QT2JS::SetUInt64(jsonobject, metaEnum.valueToKey(i), static_cast<qint64>(data.toULongLong()));
|
||||
} else {
|
||||
qCWarning(ozwmpvalue) << "mqttValueIDModel::populateJsonObject: Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << vidKey;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::encodeValue(rapidjson::Document &value, quint64 vidKey) {
|
||||
QVariant data = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Value);
|
||||
QTOZW_ValueIds::ValueIdTypes type = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Type).value<QTOZW_ValueIds::ValueIdTypes>();
|
||||
bool changed = false;
|
||||
switch (type) {
|
||||
case QTOZW_ValueIds::ValueIdTypes::BitSet: {
|
||||
if (!value.HasMember("Value")) {
|
||||
rapidjson::Value bitsets(rapidjson::kArrayType);
|
||||
bitsets.SetArray();
|
||||
QTOZW_ValueIDBitSet vidbs = data.value<QTOZW_ValueIDBitSet>();
|
||||
int size = vidbs.mask.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (vidbs.mask[i] == 1) {
|
||||
rapidjson::Value bitset;
|
||||
bitset.SetObject();
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Label", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.label[i].toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Help", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.help[i].toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.values[i]),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Position", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(i),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitsets.PushBack(bitset, value.GetAllocator());
|
||||
}
|
||||
}
|
||||
value.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
bitsets,
|
||||
value.GetAllocator()
|
||||
);
|
||||
changed = true;
|
||||
} else {
|
||||
/* Value Already Exists, Just Check for Changes */
|
||||
rapidjson::Value bitsets = value["Value"].GetArray();
|
||||
QTOZW_ValueIDBitSet vidbs = data.value<QTOZW_ValueIDBitSet>();
|
||||
for (unsigned int i = 0; i < bitsets.Size(); i++) {
|
||||
rapidjson::Value bitset = bitsets[i].GetObject();
|
||||
if (bitset.HasMember("Position") && bitset.HasMember("Value") && bitset["Position"].IsInt() && bitset["Value"].IsBool()) {
|
||||
int pos = bitset["Position"].GetInt();
|
||||
bool val = bitset["Value"].GetBool();
|
||||
if (vidbs.values[pos] != val) {
|
||||
bitset["Value"].SetBool(val);
|
||||
changed = true;
|
||||
}
|
||||
} else {
|
||||
qCWarning(ozwmpvalue) << "Bitset is Missing Position or Value Members, or Incorrect Types: " << QT2JS::getJSON(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Bool: {
|
||||
changed = QT2JS::SetBool(value, "Value", data.toBool());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Button: {
|
||||
changed = QT2JS::SetBool(value, "Value", data.toBool());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Byte: {
|
||||
changed = QT2JS::SetInt(value, "Value", data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Decimal: {
|
||||
changed = QT2JS::SetDouble(value, "Value", data.toDouble());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Int:{
|
||||
changed = QT2JS::SetInt(value, "Value", data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::List: {
|
||||
QTOZW_ValueIDList vidlist = data.value<QTOZW_ValueIDList>();
|
||||
int size = vidlist.values.count();
|
||||
rapidjson::Value list(rapidjson::kArrayType);
|
||||
list.SetArray();
|
||||
if (!value.HasMember("Value")) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
rapidjson::Value entry;
|
||||
entry.SetObject();
|
||||
entry.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
vidlist.values[i],
|
||||
value.GetAllocator()
|
||||
);
|
||||
entry.AddMember(
|
||||
rapidjson::Value("Label", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidlist.labels[i].toStdString().c_str(), value.GetAllocator()),
|
||||
value.GetAllocator()
|
||||
);
|
||||
list.PushBack(entry, value.GetAllocator());
|
||||
}
|
||||
rapidjson::Value var(rapidjson::kObjectType);
|
||||
var.SetObject();
|
||||
var.AddMember(
|
||||
rapidjson::Value("List", value.GetAllocator()).Move(),
|
||||
list,
|
||||
value.GetAllocator()
|
||||
);
|
||||
var.AddMember(
|
||||
rapidjson::Value("Selected", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidlist.selectedItem.toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
value.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
var,
|
||||
value.GetAllocator()
|
||||
);
|
||||
changed = true;
|
||||
} else {
|
||||
/* Value Array exists, so just check/update the Values */
|
||||
QString selected = value["Value"]["Selected"].GetString();
|
||||
if (selected != vidlist.selectedItem) {
|
||||
value["Value"]["Selected"].SetString(vidlist.selectedItem.toStdString().c_str(), value.GetAllocator());
|
||||
changed = true;
|
||||
} else {
|
||||
qCDebug(ozwmpvalue) << "List Selected Value has Not Changed: " << vidlist.selectedItem;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Raw: {
|
||||
qCWarning(ozwmpvalue) << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet";
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Schedule: {
|
||||
qCWarning(ozwmpvalue) << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet";
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Short: {
|
||||
changed = QT2JS::SetInt(value, "Value" ,data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::String: {
|
||||
changed = QT2JS::SetString(value, "Value", data.toString());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::TypeCount: {
|
||||
qCWarning(ozwmpvalue) << "Unhandled ValueID Type" << type << "in mqttValueIdModel::encodeValue" << vidKey << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Label).toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::setData(quint64 vidKey, QVariant data) {
|
||||
return QTOZW_ValueIds::setData(this->index(this->getValueRow(vidKey), QTOZW_ValueIds::ValueIdColumns::Value), data, Qt::EditRole);
|
||||
}
|
||||
|
||||
|
22
qt-ozwdaemon/mqttValues.h
Normal file
22
qt-ozwdaemon/mqttValues.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef MQTTVALUES_H
|
||||
#define MQTTVALUES_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QVariant>
|
||||
#include <rapidjson/document.h>
|
||||
#include "qt-openzwave/qtozwvalueidmodel.h"
|
||||
|
||||
|
||||
class mqttValueIDModel : public QTOZW_ValueIds {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit mqttValueIDModel(QObject *parent = nullptr);
|
||||
QVariant getValueData(quint64, ValueIdColumns);
|
||||
bool populateJsonObject(rapidjson::Document &, quint64, QTOZWManager *);
|
||||
bool encodeValue(rapidjson::Document &, quint64);
|
||||
bool isValidValueID(quint64);
|
||||
bool setData(quint64, QVariant);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -8,332 +8,6 @@
|
|||
|
||||
|
||||
Q_LOGGING_CATEGORY(ozwmp, "ozw.mqtt.publisher");
|
||||
Q_LOGGING_CATEGORY(ozwmpnode, "ozw.mqtt.publisher.node");
|
||||
Q_LOGGING_CATEGORY(ozwmpvalue, "ozw.mqtt.publisher.value");
|
||||
|
||||
|
||||
|
||||
mqttNodeModel::mqttNodeModel(QObject *parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QVariant mqttNodeModel::getNodeData(quint8 node, NodeColumns col) {
|
||||
int row = this->getNodeRow(node);
|
||||
return this->data(this->index(row, col), Qt::DisplayRole);
|
||||
}
|
||||
|
||||
bool mqttNodeModel::isValidNode(quint8 node) {
|
||||
if (this->getNodeRow(node) == -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool mqttNodeModel::populateJsonObject(rapidjson::Document &jsonobject, quint8 node, QTOZWManager *mgr) {
|
||||
if (jsonobject.IsNull())
|
||||
jsonobject.SetObject();
|
||||
|
||||
for (int i = 0; i < this->columnCount(QModelIndex()); i++) {
|
||||
QVariant data = this->getNodeData(node, static_cast<NodeColumns>(i));
|
||||
if (data.type() == QVariant::Invalid) {
|
||||
continue;
|
||||
}
|
||||
switch (static_cast<NodeColumns>(i)) {
|
||||
case NodeColumns::NodeFlags: {
|
||||
QBitArray flag = data.toBitArray();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<nodeFlags>();
|
||||
for (int j = 0; j < nodeFlags::flagCount; j++) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(j), flag.at(j));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<NodeColumns>();
|
||||
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
|
||||
QT2JS::SetString(jsonobject, metaEnum.valueToKey(i), data.toString());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(i), data.toBool());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
|
||||
QT2JS::SetInt(jsonobject, metaEnum.valueToKey(i), data.toInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
|
||||
QT2JS::SetUint(jsonobject, metaEnum.valueToKey(i), data.toUInt());
|
||||
} else {
|
||||
qCWarning(ozwmpvalue) << "Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << node;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* MetaData */
|
||||
rapidjson::Value metadata;
|
||||
if (!jsonobject.HasMember("MetaData")) {
|
||||
rapidjson::Value metadata;
|
||||
metadata.SetObject();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<QTOZWManagerSource::QTOZWMetaDataField>();
|
||||
if (metadata.IsNull()) {
|
||||
metadata.SetObject();
|
||||
}
|
||||
for (int i = 0; i < QTOZWManagerSource::Identifier; i++) {
|
||||
metadata.AddMember(
|
||||
rapidjson::Value(metaEnum.valueToKey(i), jsonobject.GetAllocator()).Move(),
|
||||
rapidjson::Value(mgr->GetMetaData(node, static_cast<QTOZWManagerSource::QTOZWMetaDataField>(i)).toStdString().c_str(), jsonobject.GetAllocator()).Move(),
|
||||
jsonobject.GetAllocator());
|
||||
}
|
||||
metadata.AddMember(rapidjson::Value("ProductPicBase64").Move(),
|
||||
rapidjson::Value(QString(mgr->GetMetaDataProductPic(node).toBase64()).toStdString().c_str(), jsonobject.GetAllocator()).Move(),
|
||||
jsonobject.GetAllocator());
|
||||
|
||||
jsonobject.AddMember(rapidjson::Value("MetaData"), metadata, jsonobject.GetAllocator());
|
||||
}
|
||||
/* Neighbors */
|
||||
QVector<quint8> neighbors = mgr->GetNodeNeighbors(node);
|
||||
if (neighbors.size() > 0) {
|
||||
rapidjson::Value N(rapidjson::kArrayType);
|
||||
for (int i = 0; i < neighbors.count(); i++) {
|
||||
N.PushBack(neighbors[i], jsonobject.GetAllocator());
|
||||
}
|
||||
jsonobject.AddMember(rapidjson::Value("Neighbors").Move(), N, jsonobject.GetAllocator());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
mqttValueIDModel::mqttValueIDModel(QObject *parent) {
|
||||
|
||||
}
|
||||
QVariant mqttValueIDModel::getValueData(quint64 vidKey, ValueIdColumns col) {
|
||||
int row = this->getValueRow(vidKey);
|
||||
return this->data(this->index(row, col), Qt::DisplayRole);
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::isValidValueID(quint64 vidKey) {
|
||||
if (this->getValueRow(vidKey) == -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool mqttValueIDModel::populateJsonObject(rapidjson::Document &jsonobject, quint64 vidKey, QTOZWManager *mgr) {
|
||||
for (int i = 0; i < ValueIdColumns::ValueIdCount; i++) {
|
||||
QVariant data = this->getValueData(vidKey, static_cast<ValueIdColumns>(i));
|
||||
switch (static_cast<ValueIdColumns>(i)) {
|
||||
case ValueFlags: {
|
||||
QBitArray flag = data.toBitArray();
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIDFlags>();
|
||||
for (int j = 0; j < ValueIDFlags::FlagCount; j++) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(j), flag.at(j));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Value: {
|
||||
this->encodeValue(jsonobject, vidKey);
|
||||
break;
|
||||
}
|
||||
case Genre: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdGenres>();
|
||||
QT2JS::SetString(jsonobject, "Genre", metaEnum.valueToKey(data.toInt()));
|
||||
break;
|
||||
}
|
||||
case Type: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdTypes>();
|
||||
QT2JS::SetString(jsonobject, "Type", metaEnum.valueToKey(data.toInt()));
|
||||
break;
|
||||
}
|
||||
case CommandClass: {
|
||||
QT2JS::SetString(jsonobject, "CommandClass", mgr->getCommandClassString(data.toInt()));
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<ValueIdColumns>();
|
||||
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
|
||||
QT2JS::SetString(jsonobject, metaEnum.valueToKey(i), data.toString());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
|
||||
QT2JS::SetBool(jsonobject, metaEnum.valueToKey(i), data.toBool());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
|
||||
QT2JS::SetInt(jsonobject, metaEnum.valueToKey(i), data.toInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
|
||||
QT2JS::SetUint(jsonobject, metaEnum.valueToKey(i), data.toUInt());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float) {
|
||||
QT2JS::SetDouble(jsonobject, metaEnum.valueToKey(i), data.toDouble());
|
||||
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::ULongLong) {
|
||||
QT2JS::SetUInt64(jsonobject, metaEnum.valueToKey(i), static_cast<qint64>(data.toULongLong()));
|
||||
} else {
|
||||
qCWarning(ozwmpvalue) << "mqttValueIDModel::populateJsonObject: Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << vidKey;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::encodeValue(rapidjson::Document &value, quint64 vidKey) {
|
||||
QVariant data = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Value);
|
||||
QTOZW_ValueIds::ValueIdTypes type = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Type).value<QTOZW_ValueIds::ValueIdTypes>();
|
||||
bool changed = false;
|
||||
switch (type) {
|
||||
case QTOZW_ValueIds::ValueIdTypes::BitSet: {
|
||||
if (!value.HasMember("Value")) {
|
||||
rapidjson::Value bitsets(rapidjson::kArrayType);
|
||||
bitsets.SetArray();
|
||||
QTOZW_ValueIDBitSet vidbs = data.value<QTOZW_ValueIDBitSet>();
|
||||
int size = vidbs.mask.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (vidbs.mask[i] == 1) {
|
||||
rapidjson::Value bitset;
|
||||
bitset.SetObject();
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Label", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.label[i].toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Help", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.help[i].toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidbs.values[i]),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitset.AddMember(
|
||||
rapidjson::Value("Position", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(i),
|
||||
value.GetAllocator()
|
||||
);
|
||||
bitsets.PushBack(bitset, value.GetAllocator());
|
||||
}
|
||||
}
|
||||
value.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
bitsets,
|
||||
value.GetAllocator()
|
||||
);
|
||||
changed = true;
|
||||
} else {
|
||||
/* Value Already Exists, Just Check for Changes */
|
||||
rapidjson::Value bitsets = value["Value"].GetArray();
|
||||
QTOZW_ValueIDBitSet vidbs = data.value<QTOZW_ValueIDBitSet>();
|
||||
for (unsigned int i = 0; i < bitsets.Size(); i++) {
|
||||
rapidjson::Value bitset = bitsets[i].GetObject();
|
||||
if (bitset.HasMember("Position") && bitset.HasMember("Value") && bitset["Position"].IsInt() && bitset["Value"].IsBool()) {
|
||||
int pos = bitset["Position"].GetInt();
|
||||
bool val = bitset["Value"].GetBool();
|
||||
if (vidbs.values[pos] != val) {
|
||||
bitset["Value"].SetBool(val);
|
||||
changed = true;
|
||||
}
|
||||
} else {
|
||||
qCWarning(ozwmpvalue) << "Bitset is Missing Position or Value Members, or Incorrect Types: " << QT2JS::getJSON(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Bool: {
|
||||
changed = QT2JS::SetBool(value, "Value", data.toBool());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Button: {
|
||||
changed = QT2JS::SetBool(value, "Value", data.toBool());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Byte: {
|
||||
changed = QT2JS::SetInt(value, "Value", data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Decimal: {
|
||||
changed = QT2JS::SetDouble(value, "Value", data.toDouble());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Int:{
|
||||
changed = QT2JS::SetInt(value, "Value", data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::List: {
|
||||
QTOZW_ValueIDList vidlist = data.value<QTOZW_ValueIDList>();
|
||||
int size = vidlist.values.count();
|
||||
rapidjson::Value list(rapidjson::kArrayType);
|
||||
list.SetArray();
|
||||
if (!value.HasMember("Value")) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
rapidjson::Value entry;
|
||||
entry.SetObject();
|
||||
entry.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
vidlist.values[i],
|
||||
value.GetAllocator()
|
||||
);
|
||||
entry.AddMember(
|
||||
rapidjson::Value("Label", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidlist.labels[i].toStdString().c_str(), value.GetAllocator()),
|
||||
value.GetAllocator()
|
||||
);
|
||||
list.PushBack(entry, value.GetAllocator());
|
||||
}
|
||||
rapidjson::Value var(rapidjson::kObjectType);
|
||||
var.SetObject();
|
||||
var.AddMember(
|
||||
rapidjson::Value("List", value.GetAllocator()).Move(),
|
||||
list,
|
||||
value.GetAllocator()
|
||||
);
|
||||
var.AddMember(
|
||||
rapidjson::Value("Selected", value.GetAllocator()).Move(),
|
||||
rapidjson::Value(vidlist.selectedItem.toStdString().c_str(), value.GetAllocator()).Move(),
|
||||
value.GetAllocator()
|
||||
);
|
||||
value.AddMember(
|
||||
rapidjson::Value("Value", value.GetAllocator()).Move(),
|
||||
var,
|
||||
value.GetAllocator()
|
||||
);
|
||||
changed = true;
|
||||
} else {
|
||||
/* Value Array exists, so just check/update the Values */
|
||||
QString selected = value["Value"]["Selected"].GetString();
|
||||
if (selected != vidlist.selectedItem) {
|
||||
value["Value"]["Selected"].SetString(vidlist.selectedItem.toStdString().c_str(), value.GetAllocator());
|
||||
changed = true;
|
||||
} else {
|
||||
qCDebug(ozwmpvalue) << "List Selected Value has Not Changed: " << vidlist.selectedItem;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Raw: {
|
||||
qCWarning(ozwmpvalue) << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet";
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Schedule: {
|
||||
qCWarning(ozwmpvalue) << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet";
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::Short: {
|
||||
changed = QT2JS::SetInt(value, "Value" ,data.toInt());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::String: {
|
||||
changed = QT2JS::SetString(value, "Value", data.toString());
|
||||
break;
|
||||
}
|
||||
case QTOZW_ValueIds::ValueIdTypes::TypeCount: {
|
||||
qCWarning(ozwmpvalue) << "Unhandled ValueID Type" << type << "in mqttValueIdModel::encodeValue" << vidKey << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Label).toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
bool mqttValueIDModel::setData(quint64 vidKey, QVariant data) {
|
||||
return QTOZW_ValueIds::setData(this->index(this->getValueRow(vidKey), QTOZW_ValueIds::ValueIdColumns::Value), data, Qt::EditRole);
|
||||
}
|
||||
|
||||
|
||||
|
||||
mqttpublisher::mqttpublisher(QSettings *settings, QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
@ -687,9 +361,6 @@ bool mqttpublisher::delValueTopic(quint64 vidKey) {
|
|||
return false;
|
||||
}
|
||||
this->m_client->publish(QMqttTopicName(getValueTopic(MQTT_OZW_VID_TOPIC, node, instance, cc, vidKey)), NULL, 0, true);
|
||||
/* XXX TODO: Scan though remaining Values, and see if any other Values are under the same CC or instance
|
||||
* if not - Then we should delete the CC/instance topic as well
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -835,9 +506,6 @@ void mqttpublisher::nodeRemoved(quint8 node) {
|
|||
if (this->m_nodes.find(node) == this->m_nodes.end()) {
|
||||
this->m_nodes.remove(node);
|
||||
}
|
||||
/* XXX TODO: Scan Through Instance, CC and Value Lists and make sure
|
||||
* they are all deleted as well
|
||||
*/
|
||||
}
|
||||
void mqttpublisher::nodeReset(quint8 node) {
|
||||
qCDebug(ozwmp) << "Publishing Event nodeReset:" << node;
|
||||
|
@ -845,9 +513,6 @@ void mqttpublisher::nodeReset(quint8 node) {
|
|||
if (this->m_nodes.find(node) == this->m_nodes.end()) {
|
||||
this->m_nodes.remove(node);
|
||||
}
|
||||
/* XXX TODO: Scan Through Instance, CC and Value Lists and make sure
|
||||
* they are all deleted as well
|
||||
*/
|
||||
}
|
||||
void mqttpublisher::nodeNaming(quint8 node) {
|
||||
qCDebug(ozwmp) << "Publishing Event nodeNaming:" << node;
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include <rapidjson/document.h>
|
||||
|
||||
#include "qtozwdaemon.h"
|
||||
#include "mqttNodes.h"
|
||||
#include "mqttValues.h"
|
||||
#include "mqttcommands/mqttcommands.h"
|
||||
|
||||
class MqttCommands;
|
||||
|
@ -24,26 +26,6 @@ class MqttCommands;
|
|||
#define MQTT_OZW_RESPONSE_TOPIC "event/%1/"
|
||||
|
||||
|
||||
class mqttNodeModel : public QTOZW_Nodes {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit mqttNodeModel(QObject *parent = nullptr);
|
||||
QVariant getNodeData(quint8, NodeColumns);
|
||||
bool populateJsonObject(rapidjson::Document &, quint8, QTOZWManager *);
|
||||
bool isValidNode(quint8);
|
||||
};
|
||||
|
||||
class mqttValueIDModel : public QTOZW_ValueIds {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit mqttValueIDModel(QObject *parent = nullptr);
|
||||
QVariant getValueData(quint64, ValueIdColumns);
|
||||
bool populateJsonObject(rapidjson::Document &, quint64, QTOZWManager *);
|
||||
bool encodeValue(rapidjson::Document &, quint64);
|
||||
bool isValidValueID(quint64);
|
||||
bool setData(quint64, QVariant);
|
||||
};
|
||||
|
||||
class mqttpublisher : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
|
|
@ -23,6 +23,8 @@ qtHaveModule(mqtt) {
|
|||
QT += mqtt
|
||||
DEFINES += HAVE_MQTT
|
||||
SOURCES += mqttpublisher.cpp \
|
||||
mqttNodes.cpp \
|
||||
mqttValues.cpp \
|
||||
qtrj.cpp \
|
||||
mqttcommands/mqttcommands.cpp \
|
||||
mqttcommands/ping.cpp \
|
||||
|
@ -59,6 +61,8 @@ qtHaveModule(mqtt) {
|
|||
|
||||
HEADERS += mqttpublisher.h \
|
||||
qtrj.h \
|
||||
mqttNodes.h \
|
||||
mqttValues.h \
|
||||
mqttcommands/mqttcommands.h \
|
||||
mqttcommands/ping.h \
|
||||
mqttcommands/open.h \
|
||||
|
|
Loading…
Add table
Reference in a new issue