diff --git a/qt-ozwdaemon/mqttcommands/hasNodeFailed.h b/qt-ozwdaemon/mqttcommands/hasNodeFailed.h index 8ed72b9..686b183 100644 --- a/qt-ozwdaemon/mqttcommands/hasNodeFailed.h +++ b/qt-ozwdaemon/mqttcommands/hasNodeFailed.h @@ -7,7 +7,7 @@ class MqttCommand_HasNodeFailed : public MqttCommand { Q_OBJECT public: static MqttCommand *Create(QObject *parent = nullptr); - static QString StaticGetCommand() { return "HadNodeFailed";}; + static QString StaticGetCommand() { return "HasNodeFailed";}; QString GetCommand() override { return StaticGetCommand(); }; bool processMessage(QJsonDocument) override; private: diff --git a/qt-ozwdaemon/mqttcommands/mqttcommands.h b/qt-ozwdaemon/mqttcommands/mqttcommands.h index e2aeed8..441ed2f 100644 --- a/qt-ozwdaemon/mqttcommands/mqttcommands.h +++ b/qt-ozwdaemon/mqttcommands/mqttcommands.h @@ -12,6 +12,7 @@ #include "mqttpublisher.h" + class mqttpublisher; class MqttCommand : public QObject { diff --git a/qt-ozwdaemon/mqttpublisher.cpp b/qt-ozwdaemon/mqttpublisher.cpp index 6f83cee..5f5c32d 100644 --- a/qt-ozwdaemon/mqttpublisher.cpp +++ b/qt-ozwdaemon/mqttpublisher.cpp @@ -1,6 +1,7 @@ #include #include "mqttpublisher.h" +#include "mqttcommands/mqttcommands.h" mqttNodeModel::mqttNodeModel(QObject *parent) { @@ -122,7 +123,7 @@ bool mqttValueIDModel::populateJsonObject(QJsonObject *jsonobject, quint64 vidKe } else if (static_cast(data.type()) == QMetaType::ULongLong) { jsonobject->insert(metaEnum.valueToKey(i), static_cast(data.toULongLong())); } else { - qWarning() << "Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << vidKey; + qWarning() << "mqttValueIDModel::populateJsonObject: Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << vidKey; } break; } @@ -137,22 +138,81 @@ bool mqttValueIDModel::populateJsonObject(QJsonObject *jsonobject, quint64 vidKe QJsonValue mqttValueIDModel::encodeValue(quint64 vidKey) { QJsonValue value; QVariant data = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Value); - if (static_cast(data.type()) == QMetaType::QString) { - value = data.toString(); - } else if (static_cast(data.type()) == QMetaType::Bool) { - value = data.toBool(); - } else if (static_cast(data.type()) == QMetaType::Int) { - value = data.toInt(); - } else if (static_cast(data.type()) == QMetaType::UInt) { - value = data.toInt(); - } else if (static_cast(data.type()) == QMetaType::Float) { - value = data.toDouble(); - } else if (static_cast(data.type()) == QMetaType::ULongLong) { - value = static_cast(data.toULongLong()); - } else if (static_cast(data.type()) == QMetaType::Short) { - value = static_cast(data.toInt()); - } else { - qWarning() << "Can't Convert " << data.type() << " to store in JsonObject: " << vidKey << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Label).toString() << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Type); + QTOZW_ValueIds::ValueIdTypes type = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Type).value(); + switch (type) { + case QTOZW_ValueIds::ValueIdTypes::BitSet: { + QJsonArray bitsets; + QTOZW_ValueIDBitSet vidbs = data.value(); + int size = vidbs.mask.size(); + for (int i = 0; i < size; i++) { + if (vidbs.mask[i] == 1) { + QJsonObject bitset; + bitset["Label"] = vidbs.label[i]; + bitset["Help"] = vidbs.help[i]; + bitset["Value"] = static_cast(vidbs.values[i]); + bitset["Position"] = i; + bitsets.push_back(bitset); + } + } + value = bitsets; + break; + } + case QTOZW_ValueIds::ValueIdTypes::Bool: { + value = data.toBool(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::Button: { + value = data.toBool(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::Byte: { + value = data.toInt(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::Decimal: { + value = data.toFloat(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::Int:{ + value = data.toInt(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::List: { + QTOZW_ValueIDList vidlist = data.value(); + int size = vidlist.values.count(); + QJsonArray list; + for (int i = 0; i < size; i++) { + QJsonObject entry; + entry["Value"] = static_cast(vidlist.values[i]); + entry["Label"] = vidlist.labels[i]; + list.push_back(entry); + } + QJsonObject var; + var["List"] = list; + var["Selected"] = vidlist.selectedItem; + value = var; + break; + } + case QTOZW_ValueIds::ValueIdTypes::Raw: { + qWarning() << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet"; + break; + } + case QTOZW_ValueIds::ValueIdTypes::Schedule: { + qWarning() << "Raw ValueType not handled in mqttValueIdModel::encodeValue yet"; + break; + } + case QTOZW_ValueIds::ValueIdTypes::Short: { + value = data.toInt(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::String: { + value = data.toString(); + break; + } + case QTOZW_ValueIds::ValueIdTypes::TypeCount: { + qWarning() << "Unhandled ValueID Type" << type << "in mqttValueIdModel::encodeValue" << vidKey << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Label).toString(); + break; + } } return value; } @@ -521,7 +581,96 @@ void mqttpublisher::driverAwakeNodesQueried() { } void mqttpublisher::controllerCommand(quint8 node, NotificationTypes::QTOZW_Notification_Controller_Cmd command, NotificationTypes::QTOZW_Notification_Controller_State state, NotificationTypes::QTOZW_Notification_Controller_Error error) { qDebug() << "Publishing Event controllerCommand" << node << command << state << error; - + QJsonObject js; + if (node > 0) + js["Node"] = node; + QMetaEnum metaEnum = QMetaEnum::fromType(); + js["State"] = metaEnum.valueToKey(state); + if (error != NotificationTypes::QTOZW_Notification_Controller_Error::Ctrl_Error_None) { + metaEnum = QMetaEnum::fromType(); + js["Error"] = metaEnum.valueToKey(error); + } + + switch(command) { + case NotificationTypes::Ctrl_Cmd_None: { + qWarning() << "Got a controllerCommand Event with no Controller Command" << command << state << error; + break; + } + case NotificationTypes::Ctrl_Cmd_AddNode: { + this->sendCommandUpdate("AddNode", js); + break; + } + case NotificationTypes::Ctrl_Cmd_AssignReturnRoute: { + this->sendCommandUpdate("AssignReturnRoute", js); + break; + } + case NotificationTypes::Ctrl_Cmd_CreateButton: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_CreateNewPrimary: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_DeleteAllReturnRoute: { + this->sendCommandUpdate("DeleteAllReturnRoute", js); + break; + } + case NotificationTypes::Ctrl_Cmd_DeleteButton: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_HasNodeFailed: { + this->sendCommandUpdate("HasNodeFailed", js); + break; + } + case NotificationTypes::Ctrl_Cmd_ReceiveConfiguration: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_RemoveFailedNode: { + this->sendCommandUpdate("RemoveFailedNode", js); + break; + } + case NotificationTypes::Ctrl_Cmd_RemoveNode: { + this->sendCommandUpdate("RemoveNode", js); + break; + } + case NotificationTypes::Ctrl_Cmd_ReplaceFailedNode: { + this->sendCommandUpdate("ReplaceFailedNode", js); + break; + } + case NotificationTypes::Ctrl_Cmd_ReplicationSend: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_RequestNetworkUpdate: { + this->sendCommandUpdate("RequestNetworkUpdate", js); + break; + } + case NotificationTypes::Ctrl_Cmd_RequestNodeNeighborUpdate: { + this->sendCommandUpdate("RequestNodeNeighborUpdate", js); + break; + } + case NotificationTypes::Ctrl_Cmd_SendNodeInformation: { + this->sendCommandUpdate("SendNodeInformation", js); + break; + } + case NotificationTypes::Ctrl_Cmd_TransferPrimaryRole: { + js["Command"] = QMetaEnum::fromType().valueToKey(command); + this->sendCommandUpdate("ControllerCommand", js); + break; + } + case NotificationTypes::Ctrl_Cmd_count: { + qWarning() << "Recieved controllerCommand for a unknown Command:" << command; + return; + } + }; } void mqttpublisher::ozwNotification(quint8 node, NotificationTypes::QTOZW_Notification_Code event) { qDebug() << "Publishing Event ozwNotification";