From 15da6dd973764ed3a604c7ee8699eb352b04223b Mon Sep 17 00:00:00 2001 From: biver Date: Fri, 4 Nov 2022 17:01:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D1=88=D0=B8=D1=80=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20UART=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=9C=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/UART/Uart.cpp | 141 +++++++++++++++++++++----- src/modules/sensors/UART/modinfo.json | 9 +- 2 files changed, 118 insertions(+), 32 deletions(-) diff --git a/src/modules/sensors/UART/Uart.cpp b/src/modules/sensors/UART/Uart.cpp index 052acb61..444dc31f 100644 --- a/src/modules/sensors/UART/Uart.cpp +++ b/src/modules/sensors/UART/Uart.cpp @@ -6,58 +6,143 @@ #include "modules/sensors/UART/Uart.h" #ifdef ESP8266 -SoftwareSerial* myUART = nullptr; + SoftwareSerial* myUART = nullptr; #else -HardwareSerial* myUART = nullptr; + HardwareSerial* myUART = nullptr; #endif class UART : public IoTItem { private: - int tx; - int rx; - int speed; + int _tx; + int _rx; + int _speed; + int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion + +#ifdef ESP8266 + SoftwareSerial* _myUART = nullptr; +#else + HardwareSerial* _myUART = nullptr; +#endif public: UART(String parameters) : IoTItem(parameters) { - tx = jsonReadInt(parameters, "tx"); - rx = jsonReadInt(parameters, "rx"); - speed = jsonReadInt(parameters, "speed"); + jsonRead(parameters, "tx", _tx); + jsonRead(parameters, "rx", _rx); + jsonRead(parameters, "speed", _speed); + jsonRead(parameters, "eventFormat", _eventFormat); - if (!myUART) { #ifdef ESP8266 - myUART = new SoftwareSerial(tx, rx); - myUART->begin(speed); + myUART = _myUART = new SoftwareSerial(_tx, _rx); + _myUART->begin(_speed); #endif #ifdef ESP32 - myUART = new HardwareSerial(2); - myUART->begin(speed, SERIAL_8N1, rx, tx); + _myUART = new HardwareSerial(2); + _myUART->begin(speed, SERIAL_8N1, rx, tx); #endif + } + + // проверяем формат и если событие, то регистрируем его + void analyzeString(const String& msg) { + switch (_eventFormat) { + case 0: // не указан формат, значит все полученные данные воспринимаем как общее значение из UART + setValue(msg); + break; + + case 1: // формат событий IoTM с использованием json, значит создаем временную копию + analyzeMsgFromNet(msg); + break; + + case 2: // формат команд от Nextion ID=Value + String id = selectToMarker(msg, "="); + IoTItem *item = findIoTItem(id); + if (!item) return; + String valStr = selectToMarkerLast(msg, "="); + valStr.replace("\"", ""); + item->setValue(valStr); + break; } - SerialPrint("i", F("UART"), F("UART Init")); } void uartHandle() { - if (myUART) { - static String incStr; - if (myUART->available()) { - char inc; - inc = myUART->read(); - incStr += inc; - if (inc == '\n') { - parse(incStr); - incStr = ""; - } + if (!_myUART) return; + + if (_myUART->available()) { + static String inStr = ""; + char inc; + inc = _myUART->read(); + inStr += inc; + if (inc == '\n') { + analyzeString(inStr); + inStr = ""; } } } - void parse(String& incStr) { - SerialPrint("I", "=>UART", incStr); + void onRegEvent(IoTItem* eventItem) { + if (!_myUART) return; + + String printStr = ""; + switch (_eventFormat) { + case 0: return; // не указан формат, значит не следим за событиями + case 1: // формат событий IoTM с использованием json + eventItem->getNetEvent(printStr); + _myUART->println(printStr); + break; + + case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF + printStr += eventItem->getID(); + printStr += "="; + if (eventItem->value.isDecimal) + printStr += eventItem->value.valD; + else { + printStr += "\""; + printStr += eventItem->value.valS; + printStr += "\""; + } + _myUART->print(printStr); + _myUART->write(0xff); + _myUART->write(0xff); + _myUART->write(0xff); + break; + } } - void uartPrint(String msg) { - myUART->print(msg); + virtual void loop() { + uartHandle(); } + + void uartPrint(const String& msg) { + if (_myUART) { + _myUART->println(msg); + } + } + + void uartPrintHex(const String& msg) { + if (!_myUART) return; + + unsigned char Hi, Lo; + uint8_t byteTx; + const char* strPtr = msg.c_str(); + while ((Hi = *strPtr++) && (Lo = *strPtr++)) { + byteTx = (ChartoHex(Hi) << 4) | ChartoHex(Lo); + _myUART->write(byteTx); + } + } + + IoTValue execute(String command, std::vector ¶m) { + if (command == "print") { + if (param.size() == 1) { + uartPrint(param[0].valS); + } + } else if (command == "printHex") { + if (param.size() == 1) { + uartPrintHex(param[0].valS); + } + } + + return {}; + } + }; void* getAPI_UART(String subtype, String param) { diff --git a/src/modules/sensors/UART/modinfo.json b/src/modules/sensors/UART/modinfo.json index ff4f9710..02a35f33 100644 --- a/src/modules/sensors/UART/modinfo.json +++ b/src/modules/sensors/UART/modinfo.json @@ -2,7 +2,6 @@ "menuSection": "Сенсоры", "configItem": [ { - "global": 0, "name": "UART", "type": "Reading", "subtype": "UART", @@ -12,7 +11,8 @@ "id": "u", "tx": 12, "rx": 13, - "speed": 9600 + "speed": 9600, + "eventFormat": 0 } ], "about": { @@ -30,11 +30,12 @@ "SoftUART" ], "title": "Software uart для esp8266 или hardware uart для esp32", - "moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами, в последствии будет доработан для связи с arduino платами", + "moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами. Пригоден для обмена данными с другими контроллерами в ручном режиме или с автоматической трансляцией событий как по сети.", "propInfo": { "tx": "TX пин", "rx": "RX пин", - "speed": "Скорость UART" + "speed": "Скорость UART", + "eventFormat": "Выбор формата обмена сообщениями с другими контроллерами. =0 - не указан формат, значит не следим за событиями, =1 - формат событий IoTM с использованием json, =2 - формат событий для Nextion отправка событий: ID=Value0xFF0xFF0xFF прием ордеров: ID=Value" } }, "defActive": true,