mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Merge pull request #253 from biveraxe/ver4dev
Исправления ошибок в сценарии при работе с округлением и строками в бинарных операциях
This commit is contained in:
@@ -6,7 +6,7 @@ void mqttInit() {
|
||||
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
|
||||
[&](void*) {
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
SerialPrint("i", F("WIFI"), F("OK"));
|
||||
SerialPrint("i", F("WIFI"), "OK: " + jsonReadStr(settingsFlashJson, F("ip")));
|
||||
wifiUptimeCalc();
|
||||
if (mqtt.connected()) {
|
||||
SerialPrint("i", F("MQTT"), "OK");
|
||||
|
||||
@@ -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,15 +118,19 @@ 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;
|
||||
|
||||
char buf[15];
|
||||
sprintf(buf, ("%1." + (String)_round + "f").c_str(), value.valD);
|
||||
return (String)buf;
|
||||
value.valS = (String)buf;
|
||||
return value.valS;
|
||||
} else {
|
||||
return (String)value.valD;
|
||||
value.valS = (String)value.valD;
|
||||
return value.valS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@ class VariableExprAST : public ExprAST {
|
||||
// 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());
|
||||
Item->getRoundValue();
|
||||
return &(Item->value);
|
||||
}
|
||||
|
||||
@@ -125,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)
|
||||
@@ -139,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(); // получаем значение правого операнда для возможного использования в операции присваивания
|
||||
@@ -170,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;
|
||||
@@ -185,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;
|
||||
@@ -218,37 +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;
|
||||
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
||||
85
src/modules/exec/Mcp23008/Mcp23008.cpp
Normal file
85
src/modules/exec/Mcp23008/Mcp23008.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#include "Global.h"
|
||||
#include "classes/IoTItem.h"
|
||||
#include "classes/IoTGpio.h"
|
||||
#include <Adafruit_MCP23X08.h>
|
||||
|
||||
class Mcp23008Driver : public IoTGpio {
|
||||
private:
|
||||
Adafruit_MCP23X08 _mcp;
|
||||
|
||||
public:
|
||||
Mcp23008Driver(int index, String addr) : IoTGpio(index) {
|
||||
if (!_mcp.begin_I2C(hexStringToUint8(addr))) {
|
||||
Serial.println("MCP23X08 Init Error.");
|
||||
}
|
||||
}
|
||||
|
||||
void pinMode(uint8_t pin, uint8_t mode) {
|
||||
_mcp.pinMode(pin, mode);
|
||||
}
|
||||
|
||||
void digitalWrite(uint8_t pin, uint8_t val) {
|
||||
_mcp.digitalWrite(pin, val);
|
||||
}
|
||||
|
||||
int digitalRead(uint8_t pin) {
|
||||
return _mcp.digitalRead(pin);
|
||||
}
|
||||
|
||||
void digitalInvert(uint8_t pin) {
|
||||
_mcp.digitalWrite(pin, 1 - _mcp.digitalRead(pin));
|
||||
}
|
||||
|
||||
~Mcp23008Driver() {};
|
||||
};
|
||||
|
||||
|
||||
class Mcp23008 : public IoTItem {
|
||||
private:
|
||||
Mcp23008Driver* _driver;
|
||||
String _addr;
|
||||
|
||||
public:
|
||||
Mcp23008(String parameters) : IoTItem(parameters) {
|
||||
_driver = nullptr;
|
||||
|
||||
jsonRead(parameters, "addr", _addr);
|
||||
if (_addr == "") {
|
||||
scanI2C();
|
||||
return;
|
||||
}
|
||||
|
||||
int index;
|
||||
jsonRead(parameters, "index", index);
|
||||
if (index > 4) {
|
||||
Serial.println("MCP23X08 wrong index. Must be 0 - 4");
|
||||
return;
|
||||
}
|
||||
|
||||
_driver = new Mcp23008Driver(index, _addr);
|
||||
}
|
||||
|
||||
void doByInterval() {
|
||||
if (_addr == "") {
|
||||
scanI2C();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//возвращает ссылку на экземпляр класса Mcp23008Driver
|
||||
IoTGpio* getGpioDriver() {
|
||||
return _driver;
|
||||
}
|
||||
|
||||
~Mcp23008() {
|
||||
delete _driver;
|
||||
};
|
||||
};
|
||||
|
||||
void* getAPI_Mcp23008(String subtype, String param) {
|
||||
if (subtype == F("Mcp23008")) {
|
||||
return new Mcp23008(param);
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
67
src/modules/exec/Mcp23008/modinfo.json
Normal file
67
src/modules/exec/Mcp23008/modinfo.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"menuSection": "Исполнительные устройства",
|
||||
|
||||
"configItem": [{
|
||||
"global": 0,
|
||||
"name": "Расширитель портов Mcp23008",
|
||||
"type": "Reading",
|
||||
"subtype": "Mcp23008",
|
||||
"id": "Mcp",
|
||||
"widget": "",
|
||||
"page": "",
|
||||
"descr": "",
|
||||
|
||||
"int": "0",
|
||||
"addr": "0x20",
|
||||
"index": 1
|
||||
}],
|
||||
|
||||
"about": {
|
||||
"authorName": "Ilya Belyakov",
|
||||
"authorContact": "https://t.me/Biveraxe",
|
||||
"authorGit": "https://github.com/biveraxe",
|
||||
"specialThanks": "",
|
||||
"moduleName": "Mcp23008",
|
||||
"moduleVersion": "1.0",
|
||||
"usedRam": {
|
||||
"esp32_4mb": 15,
|
||||
"esp8266_4mb": 15
|
||||
},
|
||||
"title": "Расширитель портов Mcp23008",
|
||||
"moduleDesc": "Добавляет в систему дополнительные GPIO для элементов, которые поддерживают такую функцию.",
|
||||
"propInfo": {
|
||||
"int": "Не используется",
|
||||
"addr": "Адрес устройства на шине, обычно 0x20",
|
||||
"index": "Значения от 1 до 4, где при выборе 1 будет нумерация pin 100-115, при выборе 2 200-215 и т.д."
|
||||
}
|
||||
},
|
||||
|
||||
"defActive": false,
|
||||
|
||||
"usedLibs": {
|
||||
"esp32_4mb": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8266_4mb": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8266_1mb": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8266_1mb_ota": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8285_1mb": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
],
|
||||
"esp8285_1mb_ota": [
|
||||
"adafruit/Adafruit Mcp23017 Arduino Library@^2.1.0",
|
||||
"adafruit/Adafruit BusIO @ ^1.13.2"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -169,13 +169,15 @@ class UART : public IoTItem {
|
||||
IoTValue execute(String command, std::vector<IoTValue> ¶m) {
|
||||
if (command == "println") {
|
||||
if (param.size() == 1) {
|
||||
if (param[0].isDecimal) uartPrintln((String)param[0].valD);
|
||||
else uartPrintln(param[0].valS);
|
||||
//if (param[0].isDecimal) uartPrintln((String)param[0].valD);
|
||||
//else uartPrintln(param[0].valS);
|
||||
uartPrintln(param[0].valS);
|
||||
}
|
||||
} else if (command == "print") {
|
||||
if (param.size() == 1) {
|
||||
if (param[0].isDecimal) uartPrint((String)param[0].valD);
|
||||
else uartPrint(param[0].valS);
|
||||
//if (param[0].isDecimal) uartPrint((String)param[0].valD);
|
||||
//else uartPrint(param[0].valS);
|
||||
uartPrintln(param[0].valS);
|
||||
}
|
||||
} else if (command == "printHex") {
|
||||
if (param.size() == 1) {
|
||||
@@ -184,10 +186,11 @@ class UART : public IoTItem {
|
||||
} else if (command == "printFFF") {
|
||||
if (param.size() == 2) {
|
||||
String strToUart = "";
|
||||
if (param[0].isDecimal)
|
||||
strToUart = param[0].valD;
|
||||
else
|
||||
strToUart = param[0].valS;
|
||||
// if (param[0].isDecimal)
|
||||
// strToUart = param[0].valD;
|
||||
// else
|
||||
// strToUart = param[0].valS;
|
||||
strToUart = param[0].valS;
|
||||
|
||||
if (param[1].valD)
|
||||
uartPrintFFF("\"" + strToUart + "\"");
|
||||
|
||||
Reference in New Issue
Block a user