From ca956d2405ed1959509a5932bbc23d7faadcb28b Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 17 Dec 2018 21:52:10 +0100 Subject: [PATCH] fix parsing of rules --- libnymea-app-core/rulemanager.cpp | 23 +++++--- libnymea-common/types/rule.cpp | 89 ++++++++++++++++++++++++++++- libnymea-common/types/rule.h | 3 + nymea-app/ui/MagicPage.qml | 4 +- nymea-app/ui/magic/EditRulePage.qml | 1 + 5 files changed, 108 insertions(+), 12 deletions(-) diff --git a/libnymea-app-core/rulemanager.cpp b/libnymea-app-core/rulemanager.cpp index 832bb95e..b847de6e 100644 --- a/libnymea-app-core/rulemanager.cpp +++ b/libnymea-app-core/rulemanager.cpp @@ -75,7 +75,7 @@ void RuleManager::removeRule(const QUuid &ruleId) void RuleManager::editRule(Rule *rule) { QVariantMap params = JsonTypes::packRule(rule); - qWarning() << "Packed rule:" << params; + qWarning() << "Packed rule:" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented)); m_jsonClient->sendCommand("Rules.EditRule", params, this, "onEditRuleReply"); } @@ -89,10 +89,12 @@ void RuleManager::executeActions(const QString &ruleId) void RuleManager::handleRulesNotification(const QVariantMap ¶ms) { - qDebug() << "rules notification received" << params; + qDebug() << "Rules notification received:" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented)); if (params.value("notification").toString() == "Rules.RuleAdded") { QVariantMap ruleMap = params.value("params").toMap().value("rule").toMap(); - m_rules->insert(parseRule(ruleMap)); + Rule *rule = parseRule(ruleMap); + qDebug() << "Rule added:" << rule; + m_rules->insert(rule); } else if (params.value("notification").toString() == "Rules.RuleRemoved") { QUuid ruleId = params.value("params").toMap().value("ruleId").toUuid(); m_rules->remove(ruleId); @@ -105,7 +107,9 @@ void RuleManager::handleRulesNotification(const QVariantMap ¶ms) return; } m_rules->remove(ruleId); - m_rules->insert(parseRule(ruleMap)); + Rule *newRule = parseRule(ruleMap); + m_rules->insert(newRule); + qDebug() << "Rule changed:" << newRule; } else if (params.value("notification").toString() == "Rules.RuleActiveChanged") { Rule *rule = m_rules->getRule(params.value("params").toMap().value("ruleId").toUuid()); if (!rule) { @@ -163,7 +167,7 @@ void RuleManager::getRuleDetailsReply(const QVariantMap ¶ms) void RuleManager::onAddRuleReply(const QVariantMap ¶ms) { - qDebug() << "Add rule reply" << params; + qDebug() << "Add rule reply:" << params.value("params").toMap().value("ruleError").toString(); emit addRuleReply(params.value("params").toMap().value("ruleError").toString(), params.value("params").toMap().value("ruleId").toString()); } @@ -175,7 +179,7 @@ void RuleManager::removeRuleReply(const QVariantMap ¶ms) void RuleManager::onEditRuleReply(const QVariantMap ¶ms) { - qDebug() << "Edit rule reply:" << params; //params.value("params").toMap().value("ruleError").toString(); + qDebug() << "Edit rule reply:" << params.value("params").toMap().value("ruleError").toString(); emit editRuleReply(params.value("params").toMap().value("ruleError").toString()); } @@ -228,6 +232,7 @@ void RuleManager::parseEventDescriptors(const QVariantList &eventDescriptorList, StateEvaluator *RuleManager::parseStateEvaluator(const QVariantMap &stateEvaluatorMap) { + qDebug() << "Parsing state evaluator. Child count:" << stateEvaluatorMap.value("childEvaluators").toList().count(); if (!stateEvaluatorMap.contains("stateDescriptor")) { return nullptr; } @@ -245,9 +250,9 @@ StateEvaluator *RuleManager::parseStateEvaluator(const QVariantMap &stateEvaluat stateEvaluator->setStateDescriptor(sd); foreach (const QVariant &childEvaluatorVariant, stateEvaluatorMap.value("childEvaluators").toList()) { - StateEvaluator *stateEvaluator = parseStateEvaluator(childEvaluatorVariant.toMap()); - if (stateEvaluator) { - stateEvaluator->childEvaluators()->addStateEvaluator(stateEvaluator); + StateEvaluator *childEvaluator = parseStateEvaluator(childEvaluatorVariant.toMap()); + if (childEvaluator) { + stateEvaluator->childEvaluators()->addStateEvaluator(childEvaluator); } } operatorEnum = QMetaEnum::fromType(); diff --git a/libnymea-common/types/rule.cpp b/libnymea-common/types/rule.cpp index c94e2022..b25c3229 100644 --- a/libnymea-common/types/rule.cpp +++ b/libnymea-common/types/rule.cpp @@ -29,7 +29,6 @@ Rule::Rule(const QUuid &id, QObject *parent) : Rule::~Rule() { - qDebug() << "### Destroying rule" << this; } QUuid Rule::id() const @@ -157,3 +156,91 @@ Rule *Rule::clone() const } return ret; } + +QDebug operator <<(QDebug &dbg, Rule *rule) +{ + dbg << rule->name() << " (Enabled:" << rule->enabled() << "Active:" << rule->active() << ")" << endl; + if (rule->eventDescriptors()->rowCount() > 0) { + dbg << "Event descriptors:" << endl; + } + for (int i = 0; i < rule->eventDescriptors()->rowCount(); i++) { + EventDescriptor *ed = rule->eventDescriptors()->get(i); + dbg << " " << i << ":"; + if (!ed->deviceId().isNull() && !ed->eventTypeId().isNull()) { + dbg << "Device ID:" << ed->deviceId() << "Event Type ID:" << ed->eventTypeId() << endl;; + } else { + dbg << "Interface Name:" << ed->interfaceName() << "Event Name:" << ed->interfaceEvent() << endl;; + } + } + dbg << "State Evaluator:" << endl; + printStateEvaluator(dbg, rule->stateEvaluator()); + + if (rule->actions()->rowCount() > 0) { + dbg << "Actions:" << endl; + } + for (int i = 0; i < rule->actions()->rowCount(); i++) { + RuleAction *ra = rule->actions()->get(i); + dbg << " " << i << ":"; + if (!ra->deviceId().isNull() && !ra->actionTypeId().isNull()) { + dbg << "Device ID:" << ra->deviceId() << "Action Type ID:" << ra->actionTypeId() << endl;; + } else { + dbg << "Interface Name:" << ra->interfaceName() << "Action Name:" << ra->interfaceAction() << endl;; + } + } + + if (rule->exitActions()->rowCount() > 0) { + dbg << "Exit Actions:" << endl; + } + for (int i = 0; i < rule->exitActions()->rowCount(); i++) { + RuleAction *ra = rule->exitActions()->get(i); + dbg << " " << i << ":"; + if (!ra->deviceId().isNull() && !ra->actionTypeId().isNull()) { + dbg << "Device ID:" << ra->deviceId() << "Action Type ID:" << ra->actionTypeId() << endl;; + } else { + dbg << "Interface Name:" << ra->interfaceName() << "Action Name:" << ra->interfaceAction() << endl;; + } + } + return dbg; +} + +QDebug printStateEvaluator(QDebug &dbg, StateEvaluator *stateEvaluator, int indentLevel) +{ + if (stateEvaluator->stateDescriptor()) { + for (int i = 0; i < indentLevel; i++) { dbg << " "; } + dbg << "State Descriptor:"; + if (!stateEvaluator->stateDescriptor()->deviceId().isNull() && !stateEvaluator->stateDescriptor()->stateTypeId().isNull()) { + dbg << "Device ID:" << stateEvaluator->stateDescriptor()->deviceId().toString() << stateEvaluator->stateDescriptor()->stateTypeId().toString(); + } else { + dbg << "Interface name:" << stateEvaluator->stateDescriptor()->interfaceName() << stateEvaluator->stateDescriptor()->interfaceState(); + } + switch (stateEvaluator->stateDescriptor()->valueOperator()) { + case StateDescriptor::ValueOperatorLess: + dbg << "<"; + break; + case StateDescriptor::ValueOperatorEquals: + dbg << "="; + break; + case StateDescriptor::ValueOperatorGreater: + dbg << ">"; + break; + case StateDescriptor::ValueOperatorNotEquals: + dbg << "!="; + break; + case StateDescriptor::ValueOperatorLessOrEqual: + dbg << "<="; + break; + case StateDescriptor::ValueOperatorGreaterOrEqual: + dbg << ">="; + break; + } + dbg << stateEvaluator->stateDescriptor()->value() << endl; + } + if (stateEvaluator->childEvaluators()->rowCount() > 0) { + for (int i = 0; i < indentLevel; i++) { dbg << " "; } + dbg << (stateEvaluator->stateOperator() == StateEvaluator::StateOperatorAnd ? "AND" : "OR") << endl; + } + for (int i = 0; i < stateEvaluator->childEvaluators()->rowCount(); i++) { + printStateEvaluator(dbg, stateEvaluator->childEvaluators()->get(i), indentLevel+1); + } + return dbg; +} diff --git a/libnymea-common/types/rule.h b/libnymea-common/types/rule.h index 89a90a29..db0da471 100644 --- a/libnymea-common/types/rule.h +++ b/libnymea-common/types/rule.h @@ -72,4 +72,7 @@ private: TimeDescriptor *m_timeDescriptor = nullptr; }; +QDebug operator<<(QDebug &dbg, Rule *rule); +QDebug printStateEvaluator(QDebug &dbg, StateEvaluator *stateEvaluator, int indentLevel = 1); + #endif // RULE_H diff --git a/nymea-app/ui/MagicPage.qml b/nymea-app/ui/MagicPage.qml index bf1a0f60..ddd826e5 100644 --- a/nymea-app/ui/MagicPage.qml +++ b/nymea-app/ui/MagicPage.qml @@ -43,7 +43,7 @@ Page { onAddRuleReply: { d.editRulePage.busy = false; if (ruleError == "RuleErrorNoError") { - print("should tag rule now:", d.editRulePage.rule.id, d.editRulePage.ruleIcon, d.editRulePage.ruleColor) +// print("should tag rule now:", d.editRulePage.rule.id, d.editRulePage.ruleIcon, d.editRulePage.ruleColor) engine.tagsManager.tagRule(ruleId, "color", d.editRulePage.ruleColor) engine.tagsManager.tagRule(ruleId, "icon", d.editRulePage.ruleIcon) pageStack.pop(); @@ -56,7 +56,7 @@ Page { onEditRuleReply: { d.editRulePage.busy = false; if (ruleError == "RuleErrorNoError") { - print("should tag rule now:", d.editRulePage.ruleIcon, d.editRulePage.ruleColor) +// print("should tag rule now:", d.editRulePage.ruleIcon, d.editRulePage.ruleColor) engine.tagsManager.tagRule(d.editRulePage.rule.id, "color", d.editRulePage.ruleColor) engine.tagsManager.tagRule(d.editRulePage.rule.id, "icon", d.editRulePage.ruleIcon) pageStack.pop(); diff --git a/nymea-app/ui/magic/EditRulePage.qml b/nymea-app/ui/magic/EditRulePage.qml index af11fec5..2265d8d2 100644 --- a/nymea-app/ui/magic/EditRulePage.qml +++ b/nymea-app/ui/magic/EditRulePage.qml @@ -461,6 +461,7 @@ Page { font.pixelSize: app.mediumFont Layout.fillWidth: true Layout.margins: app.margins + wrapMode: Text.WordWrap font.bold: true visible: { if (root.isEventBased) {