From 9871963cbb38744038445ea63a3518531c7e56fa Mon Sep 17 00:00:00 2001 From: biver Date: Thu, 22 Dec 2022 15:00:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B8=D0=BD=D0=B0=D1=80=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=B2=20=D1=81=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA=D0=BE=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=B8=D0=B7=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=B2=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=87=D0=B8=D1=81=D0=BB=D0=BE=20=D0=B8=D0=BB=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0=20=D0=94=D0=BE?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC?= =?UTF-8?q?=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B8=D0=B7=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D1=81=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=20-=20(=D0=BC=D0=B8=D0=BD=D1=83=D1=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTItem.cpp | 6 ++- src/classes/IoTScenario.cpp | 81 ++++++++++++++----------------------- 2 files changed, 36 insertions(+), 51 deletions(-) diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 34d4b21b..702e96aa 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -63,6 +63,7 @@ void IoTItem::setValue(const String& valStr, bool genEvent) { if (value.isDecimal) { value.valD = valStr.toFloat(); + getRoundValue(); } else { value.valS = valStr; } @@ -117,6 +118,8 @@ void IoTItem::regEvent(const String& value, const String& consoleInfo, bool erro } String IoTItem::getRoundValue() { + if (!value.isDecimal) return value.valS; + if (_round >= 0 && _round <= 6) { int sot = _round ? pow(10, (int)_round) : 1; value.valD = round(value.valD * sot) / sot; @@ -126,7 +129,8 @@ String IoTItem::getRoundValue() { value.valS = (String)buf; return value.valS; } else { - return (String)value.valD; + value.valS = (String)value.valD; + return value.valS; } } diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 1643751c..bd6eaf26 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -126,7 +126,7 @@ class BinaryExprAST : public ExprAST { signed char Op; ExprAST *LHS, *RHS; IoTValue val; - String lhsStr, rhsStr; + //String lhsStr, rhsStr; public: BinaryExprAST(signed char op, ExprAST *lhs, ExprAST *rhs) @@ -140,21 +140,6 @@ class BinaryExprAST : public ExprAST { IoTValue *exec() { if (isIotScenException) return nullptr; - // String printStr = ""; - - // if (Op == tok_equal) - // printStr = "=="; - // else if (Op == tok_notequal) - // printStr = "!="; - // else if (Op == tok_lesseq) - // printStr = "<="; - // else if (Op == tok_greateq) - // printStr = ">="; - // else - // printStr = printStr + (char)Op; - - // Serial.printf("Call from BinaryExprAST: %s\n", printStr.c_str()); - if (RHS == nullptr || LHS == nullptr) return nullptr; IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания @@ -171,8 +156,12 @@ class BinaryExprAST : public ExprAST { IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда if (lhs == nullptr) return nullptr; - - if (lhs->isDecimal && rhs->isDecimal) { + // все бинарные операции кроме +, - и == обязаны работать с числами + if (Op != '+' && Op != '-' && Op != tok_equal) { + // поэтому преобразовываем строки в булевые интерпретации + if (!lhs->isDecimal) lhs->valD = lhs->valS != ""; // пустая строка = false + if (!rhs->isDecimal) rhs->valD = rhs->valS != ""; // пустая строка = false + switch (Op) { case '>': val.valD = lhs->valD > rhs->valD; @@ -186,19 +175,10 @@ class BinaryExprAST : public ExprAST { case tok_greateq: val.valD = lhs->valD >= rhs->valD; break; - case tok_equal: - val.valD = lhs->valD == rhs->valD; - break; case tok_notequal: val.valD = lhs->valD != rhs->valD; break; - case '+': - val.valD = lhs->valD + rhs->valD; - break; - case '-': - val.valD = lhs->valD - rhs->valD; - break; case '*': val.valD = lhs->valD * rhs->valD; break; @@ -219,39 +199,40 @@ class BinaryExprAST : public ExprAST { default: break; } - return &val; - } - - if (!lhs->isDecimal || !rhs->isDecimal) { - // if (lhs->isDecimal) - // lhsStr = (String)lhs->valD; - // else - // lhsStr = lhs->valS; - - // if (rhs->isDecimal) - // rhsStr = (String)rhs->valD; - // else - // rhsStr = rhs->valS; - lhsStr = lhs->valS; - rhsStr = rhs->valS; - + } else { // иначе имеем дело с операциями + или - или ==, которые могут работать с разными типами данных switch (Op) { case tok_equal: - val.valD = compStr(lhsStr, rhsStr); + if (lhs->isDecimal && rhs->isDecimal) + val.valD = lhs->valD == rhs->valD; + else + val.valD = compStr(lhs->valS, rhs->valS); break; case '+': - val.valS = lhsStr + rhsStr; - val.valD = 1; - val.isDecimal = false; + if (lhs->isDecimal && rhs->isDecimal) + val.valD = lhs->valD + rhs->valD; + else { + val.valS = lhs->valS + rhs->valS; + val.valD = 1; + val.isDecimal = false; + } + break; + + case '-': + if (lhs->isDecimal && rhs->isDecimal) + val.valD = lhs->valD - rhs->valD; + else { + val.valS = lhs->valS; + val.valS.replace(rhs->valS, ""); + val.valD = 1; + val.isDecimal = false; + } break; default: break; } - return &val; - } - + } return &val; }