Обособляем работу с экранами Dwin в отдельный модуль

This commit is contained in:
2023-11-16 22:37:02 +03:00
parent 561245a5e5
commit 4e11b01c78
2 changed files with 183 additions and 60 deletions

View File

@@ -1,47 +1,149 @@
#include "Global.h"
#include "classes/IoTItem.h"
#include "classes/IoTUart.h"
#ifdef ESP8266
#include <SoftwareSerial.h>
#else
#include <HardwareSerial.h>
#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<IoTValue> &param) { // будет возможным использовать, когда сценарии запустятся
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<byte*>(&(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(){
};

View File

@@ -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"
]
}
}