Files
IoTManager/src/modules/sensors/UART/Uart.cpp

149 lines
5.6 KiB
C++
Raw Normal View History

2022-09-26 21:56:54 +02:00
#include "Global.h"
#include "classes/IoTUart.h"
2022-09-26 21:56:54 +02:00
#include "classes/IoTItem.h"
#include <Arduino.h>
2022-09-27 01:24:22 +02:00
#include "modules/sensors/UART/Uart.h"
2022-09-26 21:56:54 +02:00
#ifdef ESP8266
SoftwareSerial* myUART = nullptr;
2022-09-26 21:56:54 +02:00
#else
HardwareSerial* myUART = nullptr;
2022-09-26 21:56:54 +02:00
#endif
class IoTmUART : public IoTUart {
2022-09-26 21:56:54 +02:00
private:
int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion
char _inc;
String _inStr = ""; // буфер приема строк в режимах 0, 1, 2
2022-09-26 21:56:54 +02:00
public:
IoTmUART(String parameters) : IoTUart(parameters) {
jsonRead(parameters, "eventFormat", _eventFormat);
}
// проверяем формат и если событие, то регистрируем его
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
if (msg.indexOf("=") == -1) { // если входящее сообщение не по формату, то работаем как в режиме 0
setValue(msg);
break;
}
String id = selectToMarker(msg, "=");
String valStr = selectToMarkerLast(msg, "=");
valStr.replace("\"", "");
id.replace(".val", "_val");
id.replace(".txt", "_txt");
generateOrder(id, valStr);
break;
2022-09-26 21:56:54 +02:00
}
}
void uartHandle() {
if (!_myUART) return;
if (_myUART->available()) {
if (_eventFormat == 3) { // третий режим, значит ожидаем бинарный пакет данных от dwin оставлен для совместимости с предыдущей версией модуля
// используйте новый модуль для dwin DwinI
} else {
_inc = _myUART->read();
if (_inc == 0xFF) {
_inc = _myUART->read();
_inc = _myUART->read();
_inStr = "";
return;
}
if (_inc == '\r') return;
if (_inc == '\n') {
analyzeString(_inStr);
_inStr = "";
} else _inStr += _inc;
}
2022-09-26 21:56:54 +02:00
}
}
void onRegEvent(IoTItem* eventItem) {
if (!_myUART || !eventItem) return;
int indexOf_;
String printStr = "";
switch (_eventFormat) {
case 0: return; // не указан формат, значит не следим за событиями
case 1: // формат событий IoTM с использованием json
if (eventItem->isGlobal()) {
eventItem->getNetEvent(printStr);
_myUART->println(printStr);
}
break;
case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF
printStr += eventItem->getID();
indexOf_ = printStr.indexOf("_");
if (indexOf_ == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol
if (printStr.indexOf("_txt") > 0) {
printStr.replace("_txt", ".txt=\"");
printStr += eventItem->getValue();
printStr += "\"";
} else if (printStr.indexOf("_val") > 0) {
printStr += eventItem->getValue();
printStr.replace(".", "");
printStr.replace("_val", ".val=");
} else {
if (indexOf_ == printStr.length()-1) printStr.replace("_", "");
else printStr.replace("_", ".");
printStr += "=";
printStr += eventItem->getValue();
}
uartPrintFFF(printStr);
break;
}
2022-09-27 01:07:50 +02:00
}
IoTValue execute(String command, std::vector<IoTValue> &param) {
if (command == "printFFF") {
if (param.size() == 2) {
String strToUart = "";
strToUart = param[0].valS;
if (param[1].valD)
uartPrintFFF("\"" + strToUart + "\"");
else
uartPrintFFF(strToUart);
}
} else { // не забываем, что переопределяем execute и нужно проверить что в базовом классе проверяется
return IoTUart::execute(command, param);
}
return {};
}
void uartPrintFFF(const String& msg) {
if (_myUART) {
_myUART->print(msg);
_myUART->write(0xff);
_myUART->write(0xff);
_myUART->write(0xff);
}
}
2022-09-26 21:56:54 +02:00
};
2022-09-27 01:24:22 +02:00
void* getAPI_UART(String subtype, String param) {
if (subtype == F("UART")) {
return new IoTmUART(param);
2022-09-26 21:56:54 +02:00
} else {
return nullptr;
}
}