2023-03-07 16:03:52 +03:00
|
|
|
|
#include "Global.h"
|
2023-11-16 22:37:02 +03:00
|
|
|
|
#include "classes/IoTUart.h"
|
2023-03-07 16:03:52 +03:00
|
|
|
|
|
|
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
class DwinI : public IoTUart {
|
2023-03-07 16:03:52 +03:00
|
|
|
|
private:
|
2023-11-16 22:37:02 +03:00
|
|
|
|
uint8_t _headerBuf[260]; // буфер для приема пакета dwin
|
|
|
|
|
|
int _headerIndex = 0; // счетчик принятых байт пакета
|
2023-03-07 16:03:52 +03:00
|
|
|
|
|
|
|
|
|
|
public:
|
2023-11-16 22:37:02 +03:00
|
|
|
|
DwinI(String parameters) : IoTUart(parameters) {
|
|
|
|
|
|
|
2023-03-07 16:03:52 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
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++;
|
|
|
|
|
|
}
|
2023-03-07 16:03:52 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
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; // пропускаем событие, если нет признака _ или признак пустой
|
2023-03-07 16:03:52 +03:00
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
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]);
|
|
|
|
|
|
}
|
2023-03-07 16:03:52 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
void onModuleOrder(String &key, String &value) {
|
|
|
|
|
|
if (key == "uploadUI") {
|
|
|
|
|
|
//SerialPrint("i", F("DwinI"), "Устанавливаем UI: " + value);
|
2025-05-15 12:35:32 +03:00
|
|
|
|
if (value != "") uartPrintHex(value.c_str());
|
|
|
|
|
|
|
2023-11-16 22:37:02 +03:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-07 16:03:52 +03:00
|
|
|
|
~DwinI(){
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void *getAPI_DwinI(String subtype, String param) {
|
|
|
|
|
|
if (subtype == F("DwinI")) {
|
|
|
|
|
|
return new DwinI(param);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|