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; }