2022-09-26 21:56:54 +02:00
|
|
|
|
|
|
|
|
|
|
#include "Global.h"
|
|
|
|
|
|
#include "classes/IoTItem.h"
|
|
|
|
|
|
#include <Arduino.h>
|
2022-09-27 00:52:53 +02:00
|
|
|
|
|
2022-09-27 01:24:22 +02:00
|
|
|
|
#include "modules/sensors/UART/Uart.h"
|
2022-09-26 21:56:54 +02:00
|
|
|
|
|
|
|
|
|
|
#ifdef ESP8266
|
2022-11-04 17:01:12 +03:00
|
|
|
|
SoftwareSerial* myUART = nullptr;
|
2022-09-26 21:56:54 +02:00
|
|
|
|
#else
|
2022-11-04 17:01:12 +03:00
|
|
|
|
HardwareSerial* myUART = nullptr;
|
2022-09-26 21:56:54 +02:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2022-09-27 01:24:22 +02:00
|
|
|
|
class UART : public IoTItem {
|
2022-09-26 21:56:54 +02:00
|
|
|
|
private:
|
2022-11-04 17:01:12 +03:00
|
|
|
|
int _tx;
|
|
|
|
|
|
int _rx;
|
|
|
|
|
|
int _speed;
|
|
|
|
|
|
int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef ESP8266
|
|
|
|
|
|
SoftwareSerial* _myUART = nullptr;
|
|
|
|
|
|
#else
|
|
|
|
|
|
HardwareSerial* _myUART = nullptr;
|
|
|
|
|
|
#endif
|
2022-09-26 21:56:54 +02:00
|
|
|
|
|
|
|
|
|
|
public:
|
2022-09-27 01:24:22 +02:00
|
|
|
|
UART(String parameters) : IoTItem(parameters) {
|
2022-11-04 17:01:12 +03:00
|
|
|
|
jsonRead(parameters, "tx", _tx);
|
|
|
|
|
|
jsonRead(parameters, "rx", _rx);
|
|
|
|
|
|
jsonRead(parameters, "speed", _speed);
|
|
|
|
|
|
jsonRead(parameters, "eventFormat", _eventFormat);
|
2022-09-26 21:56:54 +02:00
|
|
|
|
|
|
|
|
|
|
#ifdef ESP8266
|
2022-11-04 17:01:12 +03:00
|
|
|
|
myUART = _myUART = new SoftwareSerial(_tx, _rx);
|
|
|
|
|
|
_myUART->begin(_speed);
|
2022-09-26 21:56:54 +02:00
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef ESP32
|
2022-11-04 17:01:12 +03:00
|
|
|
|
_myUART = new HardwareSerial(2);
|
2022-11-06 13:07:52 +03:00
|
|
|
|
_myUART->begin(_speed, SERIAL_8N1, _rx, _tx);
|
2022-09-26 21:56:54 +02:00
|
|
|
|
#endif
|
2022-11-04 17:01:12 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// проверяем формат и если событие, то регистрируем его
|
|
|
|
|
|
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
|
2022-11-07 12:03:46 +03:00
|
|
|
|
if (msg.indexOf("=") == -1) { // если входящее сообщение не по формату, то работаем как в режиме 0
|
|
|
|
|
|
setValue(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2022-11-04 17:01:12 +03:00
|
|
|
|
String id = selectToMarker(msg, "=");
|
|
|
|
|
|
String valStr = selectToMarkerLast(msg, "=");
|
|
|
|
|
|
valStr.replace("\"", "");
|
2022-11-04 17:15:59 +03:00
|
|
|
|
generateOrder(id, valStr);
|
2022-11-04 17:01:12 +03:00
|
|
|
|
break;
|
2022-09-26 21:56:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void uartHandle() {
|
2022-11-04 17:01:12 +03:00
|
|
|
|
if (!_myUART) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (_myUART->available()) {
|
|
|
|
|
|
static String inStr = "";
|
|
|
|
|
|
char inc;
|
2022-11-04 18:58:13 +03:00
|
|
|
|
|
2022-11-04 17:01:12 +03:00
|
|
|
|
inc = _myUART->read();
|
2022-11-04 18:58:13 +03:00
|
|
|
|
if (inc == 0xFF) {
|
|
|
|
|
|
inc = _myUART->read();
|
|
|
|
|
|
inc = _myUART->read();
|
|
|
|
|
|
inStr = "";
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (inc == '\r') return;
|
|
|
|
|
|
|
2022-11-04 17:01:12 +03:00
|
|
|
|
if (inc == '\n') {
|
|
|
|
|
|
analyzeString(inStr);
|
|
|
|
|
|
inStr = "";
|
2022-11-04 18:58:13 +03:00
|
|
|
|
} else inStr += inc;
|
2022-09-26 21:56:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-04 17:01:12 +03:00
|
|
|
|
void onRegEvent(IoTItem* eventItem) {
|
2022-11-07 17:29:45 +03:00
|
|
|
|
if (!_myUART || !eventItem) return;
|
2022-11-04 17:01:12 +03:00
|
|
|
|
|
|
|
|
|
|
String printStr = "";
|
|
|
|
|
|
switch (_eventFormat) {
|
|
|
|
|
|
case 0: return; // не указан формат, значит не следим за событиями
|
|
|
|
|
|
case 1: // формат событий IoTM с использованием json
|
2022-11-07 17:29:45 +03:00
|
|
|
|
if (eventItem->isGlobal()) {
|
|
|
|
|
|
eventItem->getNetEvent(printStr);
|
|
|
|
|
|
_myUART->println(printStr);
|
|
|
|
|
|
}
|
2022-11-04 17:01:12 +03:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF
|
|
|
|
|
|
printStr += eventItem->getID();
|
2022-11-07 17:29:45 +03:00
|
|
|
|
if (printStr.indexOf("_") == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol
|
|
|
|
|
|
if (printStr.indexOf("_val") > 0) {
|
|
|
|
|
|
printStr.replace("_val", ".val=");
|
|
|
|
|
|
printStr += eventItem->getValue();
|
|
|
|
|
|
} else if (printStr.indexOf("_txt") > 0) {
|
|
|
|
|
|
printStr.replace("_txt", ".txt=");
|
2022-11-04 17:01:12 +03:00
|
|
|
|
printStr += "\"";
|
2022-11-07 17:29:45 +03:00
|
|
|
|
printStr += eventItem->getValue();
|
2022-11-04 17:01:12 +03:00
|
|
|
|
printStr += "\"";
|
2022-11-07 17:29:45 +03:00
|
|
|
|
} else return;
|
|
|
|
|
|
uartPrintFFF(printStr);
|
2022-11-04 17:01:12 +03:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virtual void loop() {
|
|
|
|
|
|
uartHandle();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-07 17:29:45 +03:00
|
|
|
|
void uartPrintFFF(const String& msg) {
|
|
|
|
|
|
if (_myUART) {
|
|
|
|
|
|
_myUART->print(msg);
|
|
|
|
|
|
_myUART->write(0xff);
|
|
|
|
|
|
_myUART->write(0xff);
|
|
|
|
|
|
_myUART->write(0xff);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void uartPrintln(const String& msg) {
|
2022-11-04 17:01:12 +03:00
|
|
|
|
if (_myUART) {
|
|
|
|
|
|
_myUART->println(msg);
|
|
|
|
|
|
}
|
2022-09-26 21:56:54 +02:00
|
|
|
|
}
|
2022-09-27 01:07:50 +02:00
|
|
|
|
|
2022-11-07 17:29:45 +03:00
|
|
|
|
void uartPrint(const String& msg) {
|
|
|
|
|
|
if (_myUART) {
|
|
|
|
|
|
_myUART->print(msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-04 17:01:12 +03:00
|
|
|
|
void uartPrintHex(const String& msg) {
|
|
|
|
|
|
if (!_myUART) return;
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char Hi, Lo;
|
|
|
|
|
|
uint8_t byteTx;
|
|
|
|
|
|
const char* strPtr = msg.c_str();
|
|
|
|
|
|
while ((Hi = *strPtr++) && (Lo = *strPtr++)) {
|
|
|
|
|
|
byteTx = (ChartoHex(Hi) << 4) | ChartoHex(Lo);
|
|
|
|
|
|
_myUART->write(byteTx);
|
|
|
|
|
|
}
|
2022-09-27 01:07:50 +02:00
|
|
|
|
}
|
2022-11-04 17:01:12 +03:00
|
|
|
|
|
|
|
|
|
|
IoTValue execute(String command, std::vector<IoTValue> ¶m) {
|
2022-11-07 17:29:45 +03:00
|
|
|
|
if (command == "println") {
|
2022-11-04 17:01:12 +03:00
|
|
|
|
if (param.size() == 1) {
|
2022-11-07 17:29:45 +03:00
|
|
|
|
if (param[0].isDecimal) uartPrintln((String)param[0].valD);
|
|
|
|
|
|
else uartPrintln(param[0].valS);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (command == "print") {
|
|
|
|
|
|
if (param.size() == 1) {
|
|
|
|
|
|
if (param[0].isDecimal) uartPrint((String)param[0].valD);
|
|
|
|
|
|
else uartPrint(param[0].valS);
|
2022-11-04 17:01:12 +03:00
|
|
|
|
}
|
|
|
|
|
|
} else if (command == "printHex") {
|
|
|
|
|
|
if (param.size() == 1) {
|
|
|
|
|
|
uartPrintHex(param[0].valS);
|
|
|
|
|
|
}
|
2022-11-07 17:29:45 +03:00
|
|
|
|
} else if (command == "printFFF") {
|
|
|
|
|
|
if (param.size() == 2) {
|
|
|
|
|
|
String strToUart = "";
|
|
|
|
|
|
if (param[0].isDecimal)
|
|
|
|
|
|
strToUart = param[0].valD;
|
|
|
|
|
|
else
|
|
|
|
|
|
strToUart = param[0].valS;
|
|
|
|
|
|
|
|
|
|
|
|
if (param[1].valD)
|
|
|
|
|
|
uartPrintFFF("\"" + strToUart + "\"");
|
|
|
|
|
|
else
|
|
|
|
|
|
uartPrintFFF(strToUart);
|
|
|
|
|
|
}
|
2022-11-04 17:01:12 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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 UART(param);
|
2022-09-26 21:56:54 +02:00
|
|
|
|
} else {
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|