From 6aae5ec88c327e659d4ba3c42fcf929321a2d36d Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 30 Jan 2023 21:47:05 +0300 Subject: [PATCH] =?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=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=BE=D0=B2=20Dwin=20?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20Uart=20(=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=BC=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/UART/Uart.cpp | 81 ++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/src/modules/sensors/UART/Uart.cpp b/src/modules/sensors/UART/Uart.cpp index c75b7db1..5428eecd 100644 --- a/src/modules/sensors/UART/Uart.cpp +++ b/src/modules/sensors/UART/Uart.cpp @@ -92,7 +92,7 @@ class UART : public IoTItem { void onRegEvent(IoTItem* eventItem) { if (!_myUART || !eventItem) return; - + int indexOf_; String printStr = ""; switch (_eventFormat) { case 0: return; // не указан формат, значит не следим за событиями @@ -105,7 +105,7 @@ class UART : public IoTItem { case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF printStr += eventItem->getID(); - int indexOf_ = printStr.indexOf("_"); + indexOf_ = printStr.indexOf("_"); //Serial.println(printStr + " fff " + indexOf_); if (indexOf_ == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol @@ -126,9 +126,86 @@ class UART : public IoTItem { uartPrintFFF(printStr); break; + + case 3: // формат событий для Dwin + //for (int i=0; i<2; i++) { + printStr = eventItem->getID(); + indexOf_ = printStr.indexOf("_"); + if (indexOf_ == -1 || !_myUART) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol + + String VP = selectToMarkerLast(printStr, "_"); + + _myUART->write(0x5A); + _myUART->write(0xA5); + + if (eventItem->value.isDecimal) { // пока отправляем только целые числа + _myUART->write(0x05); // размер данных отправляемых с учетом целых чисел int + _myUART->write(0x82); // требуем запись в память + uartPrintHex(VP); // отправляем адрес в памяти VP + + byte raw[2]; + (int&)raw = eventItem->value.valD; + _myUART->write(raw[1]); + _myUART->write(raw[0]); + } else { + // подсчитываем количество символов отличающихся от ASCII, для понимания сколько символов состоит из дух байт + int u16counter = 0; + const char* valSptr = eventItem->value.valS.c_str(); + //Serial.print("iiiii "); + for (int i=0; i < eventItem->value.valS.length(); i++) { + if (valSptr[i] > 200) u16counter++; + //Serial.printf("%d ", valSptr[i]); + } + //Serial.println(); + + _myUART->write((eventItem->value.valS.length() - u16counter) * 2 + 5); // подсчитываем и отправляем размер итоговой строки + служебные байты + _myUART->write(0x82); // требуем запись в память + uartPrintHex(VP); // отправляем адрес в памяти VP + Serial.println("ffffff " + VP); + //_myUART->write(0x53); + //_myUART->write(0x00); + uartPrintStrInUTF16(eventItem->value.valS.c_str(), eventItem->value.valS.length()); // отправляем строку для записи + _myUART->write(0xFF); // терминируем строку, чтоб экран очистил все остальное в элементе своем + _myUART->write(0xFF); + + //uint8_t Data[8] = {0x00, 0x31, 0x00, 0x44, 0x04, 0x10, 0x00, 0x00}; + //uartPrintArray(Data, 6); + //Serial.printf("fffffffff %#x %#x %#x %#x \n", Data[0], Data[1], Data[2], Data[3]); + } + //} + break; } } + void uartPrintStrInUTF16(const char *strUTF8, int length) { + // очень жесткий но быстрый способ конвертирования UTF-8 в UTF-16, но с поддержкой только кириллицы и двух байт в UTF-8 + // не определяются исключения по формату UTF-8 + for (int i=0; i < length; i++) { + if (strUTF8[i] < 176) { // если байт соответствует коду ASCII, значит берем как есть, но расширяем до двух байт + _myUART->write(0x00); + _myUART->write(strUTF8[i]); + } else { // иначе понимаем, что имеем дело с двумя байтами (да UTF8 может иметь и больше, но это ограничение наше) + _myUART->write(0x04); // указываем номер диапазона символов кириллицы первым байтом на выходе + + if (strUTF8[i] == 208) { // если первый байт символа в первом диапазоне + if (strUTF8[i+1] == 129) _myUART->write(0x01); // исключение для символа 'ё' + else _myUART->write(strUTF8[i+1] - 128); // применяем смещение 128 и отправляем второй байт + } + + if (strUTF8[i] == 209) { // если первый байт символа во втором диапазоне + if (strUTF8[i+1] == 145) _myUART->write(0x51); // исключение для символа 'Ё' + else _myUART->write(strUTF8[i+1] - 64); // применяем смещение 64 и отправляем второй байт + } + + i++; // пропускаем второй байт входной строки + } + } + } + + void uartPrintArray(uint8_t *_Data, uint8_t _Size) { + for (size_t i = 0; i < _Size; i++) _myUART->write(_Data[i]); + } + virtual void loop() { uartHandle(); }