Расширяем модуль UART для обмена сообщениями с другими МК

This commit is contained in:
2022-11-04 17:01:12 +03:00
parent 67e9c160ea
commit 15da6dd973
2 changed files with 118 additions and 32 deletions

View File

@@ -6,58 +6,143 @@
#include "modules/sensors/UART/Uart.h"
#ifdef ESP8266
SoftwareSerial* myUART = nullptr;
SoftwareSerial* myUART = nullptr;
#else
HardwareSerial* myUART = nullptr;
HardwareSerial* myUART = nullptr;
#endif
class UART : public IoTItem {
private:
int tx;
int rx;
int speed;
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
public:
UART(String parameters) : IoTItem(parameters) {
tx = jsonReadInt(parameters, "tx");
rx = jsonReadInt(parameters, "rx");
speed = jsonReadInt(parameters, "speed");
jsonRead(parameters, "tx", _tx);
jsonRead(parameters, "rx", _rx);
jsonRead(parameters, "speed", _speed);
jsonRead(parameters, "eventFormat", _eventFormat);
if (!myUART) {
#ifdef ESP8266
myUART = new SoftwareSerial(tx, rx);
myUART->begin(speed);
myUART = _myUART = new SoftwareSerial(_tx, _rx);
_myUART->begin(_speed);
#endif
#ifdef ESP32
myUART = new HardwareSerial(2);
myUART->begin(speed, SERIAL_8N1, rx, tx);
_myUART = new HardwareSerial(2);
_myUART->begin(speed, SERIAL_8N1, rx, tx);
#endif
}
// проверяем формат и если событие, то регистрируем его
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
String id = selectToMarker(msg, "=");
IoTItem *item = findIoTItem(id);
if (!item) return;
String valStr = selectToMarkerLast(msg, "=");
valStr.replace("\"", "");
item->setValue(valStr);
break;
}
SerialPrint("i", F("UART"), F("UART Init"));
}
void uartHandle() {
if (myUART) {
static String incStr;
if (myUART->available()) {
char inc;
inc = myUART->read();
incStr += inc;
if (inc == '\n') {
parse(incStr);
incStr = "";
}
if (!_myUART) return;
if (_myUART->available()) {
static String inStr = "";
char inc;
inc = _myUART->read();
inStr += inc;
if (inc == '\n') {
analyzeString(inStr);
inStr = "";
}
}
}
void parse(String& incStr) {
SerialPrint("I", "=>UART", incStr);
void onRegEvent(IoTItem* eventItem) {
if (!_myUART) return;
String printStr = "";
switch (_eventFormat) {
case 0: return; // не указан формат, значит не следим за событиями
case 1: // формат событий IoTM с использованием json
eventItem->getNetEvent(printStr);
_myUART->println(printStr);
break;
case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF
printStr += eventItem->getID();
printStr += "=";
if (eventItem->value.isDecimal)
printStr += eventItem->value.valD;
else {
printStr += "\"";
printStr += eventItem->value.valS;
printStr += "\"";
}
_myUART->print(printStr);
_myUART->write(0xff);
_myUART->write(0xff);
_myUART->write(0xff);
break;
}
}
void uartPrint(String msg) {
myUART->print(msg);
virtual void loop() {
uartHandle();
}
void uartPrint(const String& msg) {
if (_myUART) {
_myUART->println(msg);
}
}
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);
}
}
IoTValue execute(String command, std::vector<IoTValue> &param) {
if (command == "print") {
if (param.size() == 1) {
uartPrint(param[0].valS);
}
} else if (command == "printHex") {
if (param.size() == 1) {
uartPrintHex(param[0].valS);
}
}
return {};
}
};
void* getAPI_UART(String subtype, String param) {

View File

@@ -2,7 +2,6 @@
"menuSection": "Сенсоры",
"configItem": [
{
"global": 0,
"name": "UART",
"type": "Reading",
"subtype": "UART",
@@ -12,7 +11,8 @@
"id": "u",
"tx": 12,
"rx": 13,
"speed": 9600
"speed": 9600,
"eventFormat": 0
}
],
"about": {
@@ -30,11 +30,12 @@
"SoftUART"
],
"title": "Software uart для esp8266 или hardware uart для esp32",
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами, в последствии будет доработан для связи с arduino платами",
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами. Пригоден для обмена данными с другими контроллерами в ручном режиме или с автоматической трансляцией событий как по сети.",
"propInfo": {
"tx": "TX пин",
"rx": "RX пин",
"speed": "Скорость UART"
"speed": "Скорость UART",
"eventFormat": "Выбор формата обмена сообщениями с другими контроллерами. =0 - не указан формат, значит не следим за событиями, =1 - формат событий IoTM с использованием json, =2 - формат событий для Nextion отправка событий: ID=Value0xFF0xFF0xFF прием ордеров: ID=Value"
}
},
"defActive": true,