From be662dd497577744b1c4a9206bd5bac1dcbbe749 Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 23 Feb 2022 10:43:53 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D1=81=D1=83=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=89=D0=B5=D0=B3=D0=BE=20=D0=B3=D0=BB=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=85=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/EventsAndOrders.cpp | 2 +- src/classes/IoTScenario.cpp | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/EventsAndOrders.cpp b/src/EventsAndOrders.cpp index 5fc634a1..aa3ebfe5 100644 --- a/src/EventsAndOrders.cpp +++ b/src/EventsAndOrders.cpp @@ -30,7 +30,7 @@ void handleOrder() { if (item) { String valStr = selectToMarkerLast(order, " "); IoTValue value; - if (value.isDecimal = isDigitStr(valStr)) + if (value.isDecimal = isDigitDotCommaStr(valStr)) value.valD = valStr.toFloat(); else value.valS = valStr; diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 22b5b73d..48835001 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -59,6 +59,7 @@ public: class VariableExprAST : public ExprAST { String Name; IoTItem* Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID + IoTValue val; // хранение данных для внешних переменных если не найдены в итемсах public: VariableExprAST(const String &name, IoTItem* item) : Name(name), Item(item) {} @@ -75,7 +76,20 @@ public: if (Item->value.isDecimal) Serial.printf("Call from VariableExprAST: %s = %f\n", Name.c_str(), Item->value.valD); else Serial.printf("Call from VariableExprAST: %s = %s\n", Name.c_str(), Item->value.valS.c_str()); - return &(Item->value); + + // если Итем не был найден по ID (Item == nulptr) значит либо опечатка, либо это ИД из другого контроллера, поэтому осуществляем поиск значения в + // глобальном сетевом хранилище переменных + if (Item) return &(Item->value); + else { + // смотрим в хранилище + String valueStr; + jsonRead(paramsHeapJson, Name, valueStr); + if (val.isDecimal = isDigitDotCommaStr(valueStr)) + val.valD = valueStr.toFloat(); + else + val.valS = valueStr; + return &val; + } } }; @@ -421,8 +435,9 @@ public: } if (CurTok != '(') { // Обычная переменная. - if (tmpItem) return new VariableExprAST(IdName, tmpItem); - else return new StringExprAST("id " + IdName + " not_found"); + //if (tmpItem) + return new VariableExprAST(IdName, tmpItem); + // else return new StringExprAST("id " + IdName + " not_found"); } // Вызов функции. From a2bb357a752bfb2ec5b29347ff635da92096c1fa Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 23 Feb 2022 11:03:09 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20=D0=B3?= =?UTF-8?q?=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B5,=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D0=B2=D1=83?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20=D0=B2=20=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D1=81=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 48835001..e05d3a88 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -56,18 +56,26 @@ public: }; /// VariableExprAST - Класс узла выражения для переменных (например, "a"). -class VariableExprAST : public ExprAST { +class VariableExprAST : public ExprAST, IoTItem { String Name; IoTItem* Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID - IoTValue val; // хранение данных для внешних переменных если не найдены в итемсах + //IoTValue value; // хранение данных для внешних переменных если не найдены в итемсах берем из базового класса IoTItem public: - VariableExprAST(const String &name, IoTItem* item) : Name(name), Item(item) {} + VariableExprAST(const String &name, IoTItem* item) : Name(name), Item(item), IoTItem("") {} - int setValue(IoTValue *val) { + int setValue(IoTValue *valueIn) { if (Item) { //Item->value = *val; // устанавливаем значение в связанном Item модуля напрямую - Item->setValue(*val); + Item->setValue(*valueIn); + } else { + // Итем ноль, значит это переменная отсутсвует в Итемсах, значит пишем в глобальное хранилище + if (valueIn->isDecimal) { + jsonWriteFloat_(paramsHeapJson, Name, valueIn->valD); + } else { + jsonWriteStr_(paramsHeapJson, Name, valueIn->valS); + } + IoTItem::setValue(*valueIn); } return 1; } @@ -84,11 +92,11 @@ public: // смотрим в хранилище String valueStr; jsonRead(paramsHeapJson, Name, valueStr); - if (val.isDecimal = isDigitDotCommaStr(valueStr)) - val.valD = valueStr.toFloat(); + if (value.isDecimal = isDigitDotCommaStr(valueStr)) + value.valD = valueStr.toFloat(); else - val.valS = valueStr; - return &val; + value.valS = valueStr; + return &value; } } };