mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 20:09:14 +03:00
Исправляем ошибку выполнения бинарных опираций в сценарии
когда один из операндов не число или не строка Дополнительно добавляем функцию вырезания подстроки из строки с использованием оператора - (минус)
This commit is contained in:
@@ -63,6 +63,7 @@ void IoTItem::setValue(const String& valStr, bool genEvent) {
|
|||||||
|
|
||||||
if (value.isDecimal) {
|
if (value.isDecimal) {
|
||||||
value.valD = valStr.toFloat();
|
value.valD = valStr.toFloat();
|
||||||
|
getRoundValue();
|
||||||
} else {
|
} else {
|
||||||
value.valS = valStr;
|
value.valS = valStr;
|
||||||
}
|
}
|
||||||
@@ -117,6 +118,8 @@ void IoTItem::regEvent(const String& value, const String& consoleInfo, bool erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
String IoTItem::getRoundValue() {
|
String IoTItem::getRoundValue() {
|
||||||
|
if (!value.isDecimal) return value.valS;
|
||||||
|
|
||||||
if (_round >= 0 && _round <= 6) {
|
if (_round >= 0 && _round <= 6) {
|
||||||
int sot = _round ? pow(10, (int)_round) : 1;
|
int sot = _round ? pow(10, (int)_round) : 1;
|
||||||
value.valD = round(value.valD * sot) / sot;
|
value.valD = round(value.valD * sot) / sot;
|
||||||
@@ -126,7 +129,8 @@ String IoTItem::getRoundValue() {
|
|||||||
value.valS = (String)buf;
|
value.valS = (String)buf;
|
||||||
return value.valS;
|
return value.valS;
|
||||||
} else {
|
} else {
|
||||||
return (String)value.valD;
|
value.valS = (String)value.valD;
|
||||||
|
return value.valS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ class BinaryExprAST : public ExprAST {
|
|||||||
signed char Op;
|
signed char Op;
|
||||||
ExprAST *LHS, *RHS;
|
ExprAST *LHS, *RHS;
|
||||||
IoTValue val;
|
IoTValue val;
|
||||||
String lhsStr, rhsStr;
|
//String lhsStr, rhsStr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BinaryExprAST(signed char op, ExprAST *lhs, ExprAST *rhs)
|
BinaryExprAST(signed char op, ExprAST *lhs, ExprAST *rhs)
|
||||||
@@ -140,21 +140,6 @@ class BinaryExprAST : public ExprAST {
|
|||||||
|
|
||||||
IoTValue *exec() {
|
IoTValue *exec() {
|
||||||
if (isIotScenException) return nullptr;
|
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;
|
if (RHS == nullptr || LHS == nullptr) return nullptr;
|
||||||
|
|
||||||
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
||||||
@@ -171,8 +156,12 @@ class BinaryExprAST : public ExprAST {
|
|||||||
IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда
|
IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда
|
||||||
if (lhs == nullptr) return nullptr;
|
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) {
|
switch (Op) {
|
||||||
case '>':
|
case '>':
|
||||||
val.valD = lhs->valD > rhs->valD;
|
val.valD = lhs->valD > rhs->valD;
|
||||||
@@ -186,19 +175,10 @@ class BinaryExprAST : public ExprAST {
|
|||||||
case tok_greateq:
|
case tok_greateq:
|
||||||
val.valD = lhs->valD >= rhs->valD;
|
val.valD = lhs->valD >= rhs->valD;
|
||||||
break;
|
break;
|
||||||
case tok_equal:
|
|
||||||
val.valD = lhs->valD == rhs->valD;
|
|
||||||
break;
|
|
||||||
case tok_notequal:
|
case tok_notequal:
|
||||||
val.valD = lhs->valD != rhs->valD;
|
val.valD = lhs->valD != rhs->valD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '+':
|
|
||||||
val.valD = lhs->valD + rhs->valD;
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
val.valD = lhs->valD - rhs->valD;
|
|
||||||
break;
|
|
||||||
case '*':
|
case '*':
|
||||||
val.valD = lhs->valD * rhs->valD;
|
val.valD = lhs->valD * rhs->valD;
|
||||||
break;
|
break;
|
||||||
@@ -219,39 +199,40 @@ class BinaryExprAST : public ExprAST {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return &val;
|
} else { // иначе имеем дело с операциями + или - или ==, которые могут работать с разными типами данных
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
switch (Op) {
|
switch (Op) {
|
||||||
case tok_equal:
|
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;
|
break;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
val.valS = lhsStr + rhsStr;
|
if (lhs->isDecimal && rhs->isDecimal)
|
||||||
val.valD = 1;
|
val.valD = lhs->valD + rhs->valD;
|
||||||
val.isDecimal = false;
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return &val;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return &val;
|
return &val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user