From d4c2eeb752747b33a48c69a14f831eea71db7fe3 Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 28 Nov 2022 07:46:15 +0300 Subject: [PATCH 1/4] =?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=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D1=83=20Mcp23008?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/Mcp23008/Mcp23008.cpp | 85 ++++++++++++++++++++++++++ src/modules/exec/Mcp23008/modinfo.json | 67 ++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 src/modules/exec/Mcp23008/Mcp23008.cpp create mode 100644 src/modules/exec/Mcp23008/modinfo.json diff --git a/src/modules/exec/Mcp23008/Mcp23008.cpp b/src/modules/exec/Mcp23008/Mcp23008.cpp new file mode 100644 index 00000000..fef91121 --- /dev/null +++ b/src/modules/exec/Mcp23008/Mcp23008.cpp @@ -0,0 +1,85 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "classes/IoTGpio.h" +#include + +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; + } +} diff --git a/src/modules/exec/Mcp23008/modinfo.json b/src/modules/exec/Mcp23008/modinfo.json new file mode 100644 index 00000000..6181b062 --- /dev/null +++ b/src/modules/exec/Mcp23008/modinfo.json @@ -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" + ] + } +} \ No newline at end of file From 4d1ef99939607c08773699fa6c45b0530f2e6615 Mon Sep 17 00:00:00 2001 From: biver Date: Fri, 2 Dec 2022 13:56:31 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9E=D0=BA=D1=80=D1=83=D0=B3=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTItem.cpp | 3 ++- src/classes/IoTScenario.cpp | 19 +++++++++++-------- src/modules/sensors/UART/Uart.cpp | 19 +++++++++++-------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index e8afe357..f75b86fc 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -122,7 +122,8 @@ String IoTItem::getRoundValue() { 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; } diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 8173ffb9..1643751c 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -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); } @@ -222,15 +223,17 @@ class BinaryExprAST : public ExprAST { } if (!lhs->isDecimal || !rhs->isDecimal) { - if (lhs->isDecimal) - lhsStr = (String)lhs->valD; - else - lhsStr = lhs->valS; + // if (lhs->isDecimal) + // lhsStr = (String)lhs->valD; + // else + // lhsStr = lhs->valS; - if (rhs->isDecimal) - rhsStr = (String)rhs->valD; - else - rhsStr = rhs->valS; + // if (rhs->isDecimal) + // rhsStr = (String)rhs->valD; + // else + // rhsStr = rhs->valS; + lhsStr = lhs->valS; + rhsStr = rhs->valS; switch (Op) { case tok_equal: diff --git a/src/modules/sensors/UART/Uart.cpp b/src/modules/sensors/UART/Uart.cpp index a6d5040e..c75b7db1 100644 --- a/src/modules/sensors/UART/Uart.cpp +++ b/src/modules/sensors/UART/Uart.cpp @@ -169,13 +169,15 @@ class UART : public IoTItem { IoTValue execute(String command, std::vector ¶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 + "\""); From 8d6ab1ee8a3e6a6faef7768b581a1c5c4e1bd258 Mon Sep 17 00:00:00 2001 From: biver Date: Thu, 22 Dec 2022 11:01:44 +0300 Subject: [PATCH 3/4] =?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=B2=D1=8B=D0=B2=D0=BE=D0=B4=20IP=20=D0=B0?= =?UTF-8?q?=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20=D0=B2=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=81=D0=BE=D0=BB=D1=8C=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=81=D0=B0=20WIFI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MqttClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 75dec971..a74c66ca 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -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"); From 9871963cbb38744038445ea63a3518531c7e56fa Mon Sep 17 00:00:00 2001 From: biver Date: Thu, 22 Dec 2022 15:00:25 +0300 Subject: [PATCH 4/4] =?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; }