From 4e11b01c787de272aecca240cbe6631d024c70fc Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Thu, 16 Nov 2023 22:37:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BE=D1=81=D0=BE=D0=B1=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20?= =?UTF-8?q?=D1=81=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B0=D0=BC=D0=B8=20Dwi?= =?UTF-8?q?n=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/DwinI/DwinI.cpp | 172 ++++++++++++++++++++----- src/modules/display/DwinI/modinfo.json | 71 ++++++---- 2 files changed, 183 insertions(+), 60 deletions(-) diff --git a/src/modules/display/DwinI/DwinI.cpp b/src/modules/display/DwinI/DwinI.cpp index 0e43b29c..3df8fe8e 100644 --- a/src/modules/display/DwinI/DwinI.cpp +++ b/src/modules/display/DwinI/DwinI.cpp @@ -1,47 +1,149 @@ #include "Global.h" -#include "classes/IoTItem.h" +#include "classes/IoTUart.h" -#ifdef ESP8266 -#include -#else -#include -#endif -class DwinI : public IoTItem { +class DwinI : public IoTUart { private: -#ifdef ESP8266 - SoftwareSerial* _myUART; -#else - HardwareSerial* _myUART; -#endif + uint8_t _headerBuf[260]; // буфер для приема пакета dwin + int _headerIndex = 0; // счетчик принятых байт пакета public: - DwinI(String parameters) : IoTItem(parameters) { - int _tx, _rx, _speed, _line; - jsonRead(parameters, "RX", _rx); - jsonRead(parameters, "TX", _tx); - jsonRead(parameters, "speed", _speed); - jsonRead(parameters, "line", _line); - -#ifdef ESP8266 - _myUART = new SoftwareSerial(_rx, _tx); - _myUART->begin(_speed); -#endif -#ifdef ESP32 - _myUART = new HardwareSerial(_line); - _myUART->begin(_speed, SERIAL_8N1, _rx, _tx); -#endif - } - - void doByInterval() { - Serial.println("ddddddddddddd"); - } - - IoTValue execute(String command, std::vector ¶m) { // будет возможным использовать, когда сценарии запустятся + DwinI(String parameters) : IoTUart(parameters) { - return {}; } + void uartHandle() { + if (!_myUART) return; + + if (_myUART->available()) { + _headerBuf[_headerIndex] = _myUART->read(); + + // ищем валидный заголовок пакета dwin, проверяя каждый следующий байт + if (_headerIndex == 0 && _headerBuf[_headerIndex] != 0x5A || + _headerIndex == 1 && _headerBuf[_headerIndex] != 0xA5 || + _headerIndex == 2 && _headerBuf[_headerIndex] == 0 || + _headerIndex == 3 && _headerBuf[_headerIndex] == 0x82 ) { + _headerIndex = 0; + return; + } + + if (_headerIndex == _headerBuf[2] + 2) { // получили все данные из пакета + // Serial.print("ffffffff"); + // for (int i=0; i<=_headerIndex; i++) + // Serial.printf("%#x ", _headerBuf[i]); + // Serial.println("!!!"); + + String valStr, id = "_"; + if (_headerIndex == 8) { // предполагаем, что получили int16 + valStr = (String)((_headerBuf[7] << 8) | _headerBuf[8]); + } + + char buf[5]; + hex2string(_headerBuf + 4, 2, buf); + id += (String)buf; + + IoTItem* item = findIoTItemByPartOfName(id); + if (item) { + //Serial.printf("received data: %s for VP: %s for ID: %s\n", valStr, buf, item->getID()); + generateOrder(item->getID(), valStr); + } + + _headerIndex = 0; + return; + } + + _headerIndex++; + } + } + + void onRegEvent(IoTItem* eventItem) { + if (!_myUART || !eventItem) return; + int indexOf_; + String printStr = ""; + + printStr = eventItem->getID(); + indexOf_ = printStr.indexOf("_"); + uint8_t sizeOfVPPart = printStr.length() - indexOf_ - 1; + if (indexOf_ == -1 || !_myUART || sizeOfVPPart < 4 || indexOf_ == 0) return; // пропускаем событие, если нет признака _ или признак пустой + + char typeOfVP = sizeOfVPPart == 5 ? printStr.charAt(indexOf_ + 5) : 0; + String VP = printStr.substring(indexOf_ + 1, indexOf_ + 5); + + if (typeOfVP == 0) { // если не указан тип, то додумываем на основании типа данных источника + if (eventItem->value.isDecimal) + typeOfVP = 'i'; + else + typeOfVP = 's'; + } + + if (typeOfVP == 'i') { + _myUART->write(0x5A); + _myUART->write(0xA5); + _myUART->write(0x05); // размер данных отправляемых с учетом целых чисел int + _myUART->write(0x82); // требуем запись в память + uartPrintHex(VP); // отправляем адрес в памяти VP + + if (!eventItem->value.isDecimal) { + eventItem->value.valD = atoi(eventItem->value.valS.c_str()); + } + + _myUART->write(highByte((int)eventItem->value.valD)); + _myUART->write(lowByte((int)eventItem->value.valD)); + } + + if (typeOfVP == 's') { + if (eventItem->value.isDecimal) { + eventItem->value.valS = eventItem->getValue(); + } + + // подсчитываем количество символов отличающихся от ASCII, для понимания сколько символов состоит из дух байт + int u16counter = 0; + const char* valSptr = eventItem->value.valS.c_str(); + for (int i=0; i < eventItem->value.valS.length(); i++) { + if (valSptr[i] > 200) u16counter++; + } + + _myUART->write(0x5A); + _myUART->write(0xA5); + _myUART->write((eventItem->value.valS.length() - u16counter) * 2 + 5); // подсчитываем и отправляем размер итоговой строки + служебные байты + _myUART->write(0x82); // требуем запись в память + uartPrintHex(VP); // отправляем адрес в памяти VP + uartPrintStrInUTF16(eventItem->value.valS.c_str(), eventItem->value.valS.length()); // отправляем строку для записи + _myUART->write(0xFF); // терминируем строку, чтоб экран очистил все остальное в элементе своем + _myUART->write(0xFF); + + //Serial.printf("fffffffff %#x %#x %#x %#x \n", Data[0], Data[1], Data[2], Data[3]); + } + + if (typeOfVP == 'f') { + _myUART->write(0x5A); + _myUART->write(0xA5); + _myUART->write(0x07); // размер данных отправляемых с учетом дробных чисел dword + _myUART->write(0x82); // требуем запись в память + uartPrintHex(VP); // отправляем адрес в памяти VP + + byte hex[4] = {0}; + if (!eventItem->value.isDecimal) { + eventItem->value.valD = atof(eventItem->value.valS.c_str()); + } + + byte* f_byte = reinterpret_cast(&(eventItem->value.valD)); + memcpy(hex, f_byte, 4); + + _myUART->write(hex[3]); + _myUART->write(hex[2]); + _myUART->write(hex[1]); + _myUART->write(hex[0]); + } + } + + void onModuleOrder(String &key, String &value) { + if (key == "uploadUI") { + //SerialPrint("i", F("DwinI"), "Устанавливаем UI: " + value); + + } + } + ~DwinI(){ }; diff --git a/src/modules/display/DwinI/modinfo.json b/src/modules/display/DwinI/modinfo.json index 5f89a4c1..ac021f03 100644 --- a/src/modules/display/DwinI/modinfo.json +++ b/src/modules/display/DwinI/modinfo.json @@ -2,7 +2,6 @@ "menuSection": "screens", "configItem": [ { - "global": 0, "name": "LCD Dwin экран", "type": "Reading", "subtype": "DwinI", @@ -10,11 +9,11 @@ "widget": "", "page": "", "descr": "", - "int": 15, - "TX": 17, - "RX": 16, + "tx": 17, + "rx": 16, "line": 2, - "speed": 115200 + "speed": 9600, + "btn-uploadUI": "" } ], "about": { @@ -28,28 +27,50 @@ "esp32_4mb": 15, "esp8266_4mb": 15 }, - "moduleDesc": "Позволяет выводить на графические экраны фирмы Dwin информацию от элементов конфигурации в автоматическом режиме.", - "propInfo": { - "int": "" - }, + "subTypes": [ + "DwinI" + ], "title": "Экраны от компании Dwin", - "funcInfo": [ - { - "name": "rrrr", - "descr": "rrrr", - "params": [] - } - ] + "moduleDesc": "Позволяет выводить на графические экраны фирмы Dwin информацию от элементов конфигурации в автоматическом режиме. Отправляться будут события тех элементов, которые имеют суффикс в ИД с указанием адреса VP для записи значения, например ID_5000. Для вывода числа используется суффикс i, для дробных - f, для строк - s", + "propInfo": { + "tx": "TX пин", + "rx": "RX пин", + "speed": "Скорость UART", + "line": "Актуально только для ESP32: номер линии hardUART. =2 rx=16 tx=17", + "btn-uploadUI": "Формирует автоматически графический интерфейс на базе конфигурации и выгружает в экран. Занимает продолжительное время! (в разработке)" + } }, - "defActive": false, + "defActive": true, "usedLibs": { - "esp32_4mb": [], - "esp32_4mb3f": [], - "esp32cam_4mb": [], - "esp8266_4mb": [], - "esp8266_1mb": [], - "esp8266_1mb_ota": [], - "esp8285_1mb": [], - "esp8285_1mb_ota": [] + "esp32_4mb": [ + "plerup/EspSoftwareSerial" + ], + "esp32_4mb3f": [ + "plerup/EspSoftwareSerial" + ], + "esp32cam_4mb": [ + "plerup/EspSoftwareSerial" + ], + "esp8266_4mb": [ + "plerup/EspSoftwareSerial" + ], + "esp8266_1mb": [ + "plerup/EspSoftwareSerial" + ], + "esp8266_1mb_ota": [ + "plerup/EspSoftwareSerial" + ], + "esp8266_2mb": [ + "plerup/EspSoftwareSerial" + ], + "esp8266_2mb_ota": [ + "plerup/EspSoftwareSerial" + ], + "esp8285_1mb": [ + "plerup/EspSoftwareSerial" + ], + "esp8285_1mb_ota": [ + "plerup/EspSoftwareSerial" + ] } } \ No newline at end of file