mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 11:59:12 +03:00
Merge pull request #227 from biveraxe/ver4dev
Расширяем модуль UART для обмена сообщениями с другими МК
This commit is contained in:
@@ -139,7 +139,7 @@ extern Time_t _time_local;
|
|||||||
extern Time_t _time_utc;
|
extern Time_t _time_utc;
|
||||||
extern bool _time_isTrust;
|
extern bool _time_isTrust;
|
||||||
|
|
||||||
extern unsigned long loopPeriod;
|
//extern unsigned long loopPeriod;
|
||||||
|
|
||||||
// extern DynamicJsonDocument settingsFlashJsonDoc;
|
// extern DynamicJsonDocument settingsFlashJsonDoc;
|
||||||
// extern DynamicJsonDocument paramsFlashJsonDoc;
|
// extern DynamicJsonDocument paramsFlashJsonDoc;
|
||||||
|
|||||||
@@ -26,8 +26,9 @@ class IoTItem {
|
|||||||
String getID();
|
String getID();
|
||||||
int getIntFromNet();
|
int getIntFromNet();
|
||||||
virtual String getValue();
|
virtual String getValue();
|
||||||
|
long getInterval();
|
||||||
|
|
||||||
void setInterval(unsigned long interval);
|
void setInterval(long interval);
|
||||||
void setIntFromNet(int interval);
|
void setIntFromNet(int interval);
|
||||||
|
|
||||||
unsigned long currentMillis;
|
unsigned long currentMillis;
|
||||||
@@ -45,6 +46,10 @@ class IoTItem {
|
|||||||
virtual void setValue(const IoTValue& Value, bool genEvent = true);
|
virtual void setValue(const IoTValue& Value, bool genEvent = true);
|
||||||
virtual void setValue(const String& valStr, bool genEvent = true);
|
virtual void setValue(const String& valStr, bool genEvent = true);
|
||||||
String getRoundValue();
|
String getRoundValue();
|
||||||
|
void getNetEvent(String& event);
|
||||||
|
|
||||||
|
// хуки для системных событий
|
||||||
|
virtual void onRegEvent(IoTItem* item);
|
||||||
|
|
||||||
//методы для графиков
|
//методы для графиков
|
||||||
virtual void publishValue();
|
virtual void publishValue();
|
||||||
@@ -56,8 +61,8 @@ class IoTItem {
|
|||||||
protected:
|
protected:
|
||||||
bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash
|
bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash
|
||||||
String _subtype = "";
|
String _subtype = "";
|
||||||
String _id = "";
|
String _id = "errorId"; // если будет попытка создания Item без указания id, то элемент оставит это значение
|
||||||
unsigned long _interval = 1000;
|
long _interval = 0;
|
||||||
int _intFromNet = -2; // количество секунд доверия, пришедших из сети вместе с данными для текущего ИД
|
int _intFromNet = -2; // количество секунд доверия, пришедших из сети вместе с данными для текущего ИД
|
||||||
// -2 - данные не приходили, скорее всего, элемент локальный, доверие есть
|
// -2 - данные не приходили, скорее всего, элемент локальный, доверие есть
|
||||||
// -1 - данные приходили и обратный отсчет дошел до нуля, значит доверия нет
|
// -1 - данные приходили и обратный отсчет дошел до нуля, значит доверия нет
|
||||||
@@ -79,6 +84,8 @@ bool isItemExist(const String& name); // суще
|
|||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
||||||
|
|
||||||
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval);
|
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval);
|
||||||
|
IoTItem* createItemFromNet(const String& msgFromNet);
|
||||||
|
void analyzeMsgFromNet(const String& msg, String altId = "");
|
||||||
|
|
||||||
// class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
// class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class ExprAST {
|
|||||||
virtual ~ExprAST();
|
virtual ~ExprAST();
|
||||||
virtual IoTValue *exec();
|
virtual IoTValue *exec();
|
||||||
virtual int setValue(IoTValue *val, bool generateEvent); // ret 0 - установка значения не поддерживается наследником
|
virtual int setValue(IoTValue *val, bool generateEvent); // ret 0 - установка значения не поддерживается наследником
|
||||||
virtual bool hasEventIdName(String eventIdName);
|
virtual bool hasEventIdName(const String& eventIdName);
|
||||||
};
|
};
|
||||||
|
|
||||||
class IoTScenario {
|
class IoTScenario {
|
||||||
@@ -93,7 +93,7 @@ class IoTScenario {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void loadScenario(String fileName);
|
void loadScenario(String fileName);
|
||||||
void exec(String eventIdName);
|
void exec(const String& eventIdName);
|
||||||
|
|
||||||
IoTScenario();
|
IoTScenario();
|
||||||
~IoTScenario();
|
~IoTScenario();
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ extern String jsonWriteInt(String& json, String name, int value, bool e = true);
|
|||||||
extern String jsonWriteFloat(String& json, String name, float value, bool e = true);
|
extern String jsonWriteFloat(String& json, String name, float value, bool e = true);
|
||||||
extern String jsonWriteBool(String& json, String name, boolean value, bool e = true);
|
extern String jsonWriteBool(String& json, String name, boolean value, bool e = true);
|
||||||
|
|
||||||
extern bool jsonRead(const String& json, String key, unsigned long& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, long& value, bool e = true);
|
||||||
extern bool jsonRead(const String& json, String key, float& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, float& value, bool e = true);
|
||||||
extern bool jsonRead(const String& json, String key, String& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, String& value, bool e = true);
|
||||||
extern bool jsonRead(const String& json, String key, bool& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, bool& value, bool e = true);
|
||||||
|
|||||||
@@ -43,3 +43,5 @@ String prettyBytes(size_t size);
|
|||||||
String uint64ToString(uint64_t input, uint8_t base = 10);
|
String uint64ToString(uint64_t input, uint8_t base = 10);
|
||||||
|
|
||||||
void cleanString(String& str);
|
void cleanString(String& str);
|
||||||
|
|
||||||
|
unsigned char ChartoHex(char ch);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ String mqttRootDevice = "";
|
|||||||
unsigned long unixTime = 0;
|
unsigned long unixTime = 0;
|
||||||
unsigned long unixTimeShort = 0;
|
unsigned long unixTimeShort = 0;
|
||||||
|
|
||||||
unsigned long loopPeriod;
|
//unsigned long loopPeriod;
|
||||||
|
|
||||||
bool isTimeSynch = false;
|
bool isTimeSynch = false;
|
||||||
Time_t _time_local;
|
Time_t _time_local;
|
||||||
|
|||||||
12
src/Main.cpp
12
src/Main.cpp
@@ -89,7 +89,7 @@ void setup() {
|
|||||||
iotScen.loadScenario("/scenario.txt");
|
iotScen.loadScenario("/scenario.txt");
|
||||||
|
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
createItemFromNet("onStart", "1", 1);
|
createItemFromNet("onStart", "1", -4);
|
||||||
|
|
||||||
stInit();
|
stInit();
|
||||||
|
|
||||||
@@ -105,6 +105,8 @@ void setup() {
|
|||||||
// проверяем все элементы на тухлость
|
// проверяем все элементы на тухлость
|
||||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
(*it)->checkIntFromNet();
|
(*it)->checkIntFromNet();
|
||||||
|
|
||||||
|
Serial.printf("[ITEM] size: %d, id: %s, int: %d, intnet: %d\n", sizeof(**it), (*it)->getID(), (*it)->getInterval(), (*it)->getIntFromNet());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nullptr, true);
|
nullptr, true);
|
||||||
@@ -162,10 +164,10 @@ void loop() {
|
|||||||
handleOrder();
|
handleOrder();
|
||||||
handleEvent();
|
handleEvent();
|
||||||
|
|
||||||
#ifdef LOOP_DEBUG
|
// #ifdef LOOP_DEBUG
|
||||||
loopPeriod = millis() - st;
|
// loopPeriod = millis() - st;
|
||||||
if (loopPeriod > 2) Serial.println(loopPeriod);
|
// if (loopPeriod > 2) Serial.println(loopPeriod);
|
||||||
#endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//отправка json
|
//отправка json
|
||||||
|
|||||||
@@ -166,30 +166,8 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
|||||||
if (topicStr.indexOf(chipId) == -1) {
|
if (topicStr.indexOf(chipId) == -1) {
|
||||||
String devId = selectFromMarkerToMarker(topicStr, "/", 2);
|
String devId = selectFromMarkerToMarker(topicStr, "/", 2);
|
||||||
String id = selectFromMarkerToMarker(topicStr, "/", 3);
|
String id = selectFromMarkerToMarker(topicStr, "/", 3);
|
||||||
String valAsStr;
|
analyzeMsgFromNet(payloadStr, id);
|
||||||
if (!jsonRead(payloadStr, F("val"), valAsStr, false)) valAsStr = payloadStr;
|
//SerialPrint("i", F("=>MQTT"), "Received event from other device: '" + devId + "' " + id + " " + valAsStr);
|
||||||
|
|
||||||
unsigned long interval = 0;
|
|
||||||
jsonRead(payloadStr, F("int"), interval);
|
|
||||||
IoTItem* itemExist = findIoTItem(id);
|
|
||||||
if (itemExist) {
|
|
||||||
itemExist->setInterval(interval); // устанавливаем такой же интервал как на источнике события
|
|
||||||
itemExist->setValue(valAsStr, false); // только регистрируем изменения в интерфейсе без создания цикла сетевых событий
|
|
||||||
if (interval) itemExist->setIntFromNet(interval+5); // если пришедший интервал =0, значит не нужно контролировать доверие, иначе даем фору в 5 сек
|
|
||||||
} else {
|
|
||||||
// зафиксируем данные в базе, если локально элемент отсутствует
|
|
||||||
//itemExist = (IoTItem*)new externalVariable(payloadStr);
|
|
||||||
//IoTItems.push_back(itemExist);
|
|
||||||
|
|
||||||
itemExist = new IoTItem(payloadStr);
|
|
||||||
itemExist->setIntFromNet(interval+5); // устанавливаем время жизни 3 сек
|
|
||||||
itemExist->iAmLocal = false;
|
|
||||||
IoTItems.push_back(itemExist);
|
|
||||||
}
|
|
||||||
// запустим проверку его в сценариях
|
|
||||||
generateEvent(id, valAsStr);
|
|
||||||
SerialPrint("i", F("=>MQTT"), "Received event from other device: '" + devId + "' " + id + " " + valAsStr);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
|||||||
configure("/config.json");
|
configure("/config.json");
|
||||||
iotScen.loadScenario("/scenario.txt");
|
iotScen.loadScenario("/scenario.txt");
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
createItemFromNet("onStart", "1", 1);
|
createItemFromNet("onStart", "1", -4);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------//
|
//----------------------------------------------------------------------//
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
//получение параметров в экземпляр класса
|
//получение параметров в экземпляр класса
|
||||||
IoTItem::IoTItem(const String& parameters) {
|
IoTItem::IoTItem(const String& parameters) {
|
||||||
jsonRead(parameters, F("int"), _interval);
|
jsonRead(parameters, F("int"), _interval, false);
|
||||||
if (_interval == 0) enableDoByInt = false;
|
if (_interval <= 0) enableDoByInt = false;
|
||||||
_interval = _interval * 1000;
|
_interval = _interval * 1000;
|
||||||
jsonRead(parameters, F("subtype"), _subtype, false);
|
jsonRead(parameters, F("subtype"), _subtype, false);
|
||||||
jsonRead(parameters, F("id"), _id);
|
jsonRead(parameters, F("id"), _id);
|
||||||
@@ -57,6 +57,8 @@ String IoTItem::getValue() {
|
|||||||
return value.valS;
|
return value.valS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long IoTItem::getInterval() { return _interval; }
|
||||||
|
|
||||||
//определяем тип прилетевшей величины
|
//определяем тип прилетевшей величины
|
||||||
void IoTItem::setValue(const String& valStr, bool genEvent) {
|
void IoTItem::setValue(const String& valStr, bool genEvent) {
|
||||||
value.isDecimal = isDigitDotCommaStr(valStr);
|
value.isDecimal = isDigitDotCommaStr(valStr);
|
||||||
@@ -93,6 +95,11 @@ void IoTItem::regEvent(const String& value, const String& consoleInfo, bool erro
|
|||||||
if (genEvent) {
|
if (genEvent) {
|
||||||
generateEvent(_id, value);
|
generateEvent(_id, value);
|
||||||
|
|
||||||
|
// распространяем событие через хуки
|
||||||
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
|
(*it)->onRegEvent(this);
|
||||||
|
}
|
||||||
|
|
||||||
//отправка события другим устройствам в сети если не было ошибки==============================
|
//отправка события другим устройствам в сети если не было ошибки==============================
|
||||||
if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) {
|
if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) {
|
||||||
String json = "{}";
|
String json = "{}";
|
||||||
@@ -141,6 +148,13 @@ int IoTItem::getIntFromNet() {
|
|||||||
return _intFromNet;
|
return _intFromNet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IoTItem::getNetEvent(String& event) {
|
||||||
|
event = "{}";
|
||||||
|
jsonWriteStr_(event, "id", _id);
|
||||||
|
jsonWriteStr_(event, "val", getValue());
|
||||||
|
jsonWriteInt_(event, "int", _interval/1000);
|
||||||
|
}
|
||||||
|
|
||||||
void IoTItem::setIntFromNet(int interval) {
|
void IoTItem::setIntFromNet(int interval) {
|
||||||
_intFromNet = interval;
|
_intFromNet = interval;
|
||||||
}
|
}
|
||||||
@@ -157,6 +171,8 @@ void IoTItem::checkIntFromNet() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IoTItem::onRegEvent(IoTItem* item) {}
|
||||||
|
|
||||||
void IoTItem::publishValue() {}
|
void IoTItem::publishValue() {}
|
||||||
|
|
||||||
void IoTItem::clearValue() {}
|
void IoTItem::clearValue() {}
|
||||||
@@ -171,7 +187,7 @@ String IoTItem::getID() {
|
|||||||
return _id;
|
return _id;
|
||||||
};
|
};
|
||||||
|
|
||||||
void IoTItem::setInterval(unsigned long interval) {
|
void IoTItem::setInterval(long interval) {
|
||||||
_interval = interval;
|
_interval = interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,6 +195,7 @@ IoTGpio* IoTItem::getGpioDriver() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//сетевое общение====================================================================================================================================
|
//сетевое общение====================================================================================================================================
|
||||||
|
|
||||||
// externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
// externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
||||||
@@ -201,6 +218,7 @@ IoTItem* myIoTItem;
|
|||||||
|
|
||||||
// поиск элемента модуля в существующей конфигурации
|
// поиск элемента модуля в существующей конфигурации
|
||||||
IoTItem* findIoTItem(const String& name) {
|
IoTItem* findIoTItem(const String& name) {
|
||||||
|
if (name == "") return nullptr;
|
||||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
if ((*it)->getID() == name) return *it;
|
if ((*it)->getID() == name) return *it;
|
||||||
}
|
}
|
||||||
@@ -225,6 +243,7 @@ bool isItemExist(const String& name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// создаем временную копию элемента из сети на основе события
|
||||||
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval) {
|
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval) {
|
||||||
String jsonStr = "{\"id\":\"";
|
String jsonStr = "{\"id\":\"";
|
||||||
jsonStr += itemId;
|
jsonStr += itemId;
|
||||||
@@ -234,14 +253,38 @@ IoTItem* createItemFromNet(const String& itemId, const String& value, int interv
|
|||||||
jsonStr += interval;
|
jsonStr += interval;
|
||||||
jsonStr += "}";
|
jsonStr += "}";
|
||||||
|
|
||||||
IoTItem *tmpp = new IoTItem(jsonStr);
|
return createItemFromNet(jsonStr);
|
||||||
tmpp->setIntFromNet(interval); // устанавливаем время жизни 3 сек
|
}
|
||||||
|
|
||||||
|
// создаем временную копию элемента из сети на основе события
|
||||||
|
IoTItem* createItemFromNet(const String& msgFromNet) {
|
||||||
|
IoTItem *tmpp = new IoTItem(msgFromNet);
|
||||||
|
if (tmpp->getInterval()) tmpp->setIntFromNet(tmpp->getInterval()/1000 + 5);
|
||||||
tmpp->iAmLocal = false;
|
tmpp->iAmLocal = false;
|
||||||
IoTItems.push_back(tmpp);
|
IoTItems.push_back(tmpp);
|
||||||
generateEvent(itemId, "1");
|
generateEvent(tmpp->getID(), tmpp->getValue());
|
||||||
return tmpp;
|
return tmpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void analyzeMsgFromNet(const String& msg, String altId) {
|
||||||
|
if (!jsonRead(msg, F("id"), altId, altId == "") && altId == "") return; // ничего не предпринимаем, если ошибка и altId = "", вообще данная конструкция нужна для совместимости с форматом данных 3 версией
|
||||||
|
IoTItem* itemExist = findIoTItem(altId);
|
||||||
|
if (itemExist) {
|
||||||
|
String valAsStr = msg;
|
||||||
|
jsonRead(msg, F("val"), valAsStr, false);
|
||||||
|
long interval = 0;
|
||||||
|
jsonRead(msg, F("int"), interval, false);
|
||||||
|
|
||||||
|
itemExist->setInterval(interval); // устанавливаем такой же интервал как на источнике события
|
||||||
|
itemExist->setValue(valAsStr, false); // только регистрируем изменения в интерфейсе без создания цикла сетевых событий
|
||||||
|
if (interval) itemExist->setIntFromNet(interval+5); // если пришедший интервал =0, значит не нужно контролировать доверие, иначе даем фору в 5 сек
|
||||||
|
generateEvent(altId, valAsStr);
|
||||||
|
} else {
|
||||||
|
// временно зафиксируем данные в базе, если локально элемент отсутствует
|
||||||
|
createItemFromNet(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
||||||
|
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ enum Token {
|
|||||||
ExprAST::~ExprAST() {}
|
ExprAST::~ExprAST() {}
|
||||||
IoTValue *ExprAST::exec() { return nullptr; }
|
IoTValue *ExprAST::exec() { return nullptr; }
|
||||||
int ExprAST::setValue(IoTValue *val, bool generateEvent) { return 0; } // 0 - установка значения не поддерживается наследником
|
int ExprAST::setValue(IoTValue *val, bool generateEvent) { return 0; } // 0 - установка значения не поддерживается наследником
|
||||||
bool ExprAST::hasEventIdName(String eventIdName) { return false; } // по умолчанию все узлы не связаны с ИД события, для которого выполняется сценарий
|
bool ExprAST::hasEventIdName(const String& eventIdName) { return false; } // по умолчанию все узлы не связаны с ИД события, для которого выполняется сценарий
|
||||||
// struct IoTValue zeroIotVal;
|
// struct IoTValue zeroIotVal;
|
||||||
|
|
||||||
/// NumberExprAST - Класс узла выражения для числовых литералов (Например, "1.0").
|
/// NumberExprAST - Класс узла выражения для числовых литералов (Например, "1.0").
|
||||||
@@ -543,7 +543,7 @@ class IfExprAST : public ExprAST {
|
|||||||
_IDNames = "";
|
_IDNames = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasEventIdName(String eventIdName) {
|
bool hasEventIdName(const String& eventIdName) {
|
||||||
// Serial.printf("Call from BinaryExprAST _IDNames:%s\n", _IDNames.c_str());
|
// Serial.printf("Call from BinaryExprAST _IDNames:%s\n", _IDNames.c_str());
|
||||||
return _IDNames.indexOf(" " + eventIdName + " ") >= 0; // определяем встречался ли ИД, для которого исполняем сценарий в выражении IF
|
return _IDNames.indexOf(" " + eventIdName + " ") >= 0; // определяем встречался ли ИД, для которого исполняем сценарий в выражении IF
|
||||||
}
|
}
|
||||||
@@ -1026,7 +1026,7 @@ void IoTScenario::loadScenario(String fileName) { // подготавливае
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoTScenario::exec(String eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST
|
void IoTScenario::exec(const String& eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST
|
||||||
if (mode == 0 && !file) return;
|
if (mode == 0 && !file) return;
|
||||||
|
|
||||||
LastChar = 0;
|
LastChar = 0;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class ButtonIn : public IoTItem {
|
|||||||
String _pinMode;
|
String _pinMode;
|
||||||
int _lastButtonState = LOW;
|
int _lastButtonState = LOW;
|
||||||
unsigned long _lastDebounceTime = 0;
|
unsigned long _lastDebounceTime = 0;
|
||||||
unsigned long _debounceDelay = 50;
|
long _debounceDelay = 50;
|
||||||
int _buttonState;
|
int _buttonState;
|
||||||
int _reading;
|
int _reading;
|
||||||
|
|
||||||
|
|||||||
@@ -6,58 +6,143 @@
|
|||||||
#include "modules/sensors/UART/Uart.h"
|
#include "modules/sensors/UART/Uart.h"
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
SoftwareSerial* myUART = nullptr;
|
SoftwareSerial* myUART = nullptr;
|
||||||
#else
|
#else
|
||||||
HardwareSerial* myUART = nullptr;
|
HardwareSerial* myUART = nullptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class UART : public IoTItem {
|
class UART : public IoTItem {
|
||||||
private:
|
private:
|
||||||
int tx;
|
int _tx;
|
||||||
int rx;
|
int _rx;
|
||||||
int speed;
|
int _speed;
|
||||||
|
int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion
|
||||||
|
|
||||||
|
#ifdef ESP8266
|
||||||
|
SoftwareSerial* _myUART = nullptr;
|
||||||
|
#else
|
||||||
|
HardwareSerial* _myUART = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UART(String parameters) : IoTItem(parameters) {
|
UART(String parameters) : IoTItem(parameters) {
|
||||||
tx = jsonReadInt(parameters, "tx");
|
jsonRead(parameters, "tx", _tx);
|
||||||
rx = jsonReadInt(parameters, "rx");
|
jsonRead(parameters, "rx", _rx);
|
||||||
speed = jsonReadInt(parameters, "speed");
|
jsonRead(parameters, "speed", _speed);
|
||||||
|
jsonRead(parameters, "eventFormat", _eventFormat);
|
||||||
|
|
||||||
if (!myUART) {
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
myUART = new SoftwareSerial(tx, rx);
|
myUART = _myUART = new SoftwareSerial(_tx, _rx);
|
||||||
myUART->begin(speed);
|
_myUART->begin(_speed);
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
myUART = new HardwareSerial(2);
|
_myUART = new HardwareSerial(2);
|
||||||
myUART->begin(speed, SERIAL_8N1, rx, tx);
|
_myUART->begin(speed, SERIAL_8N1, rx, tx);
|
||||||
#endif
|
#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() {
|
void uartHandle() {
|
||||||
if (myUART) {
|
if (!_myUART) return;
|
||||||
static String incStr;
|
|
||||||
if (myUART->available()) {
|
if (_myUART->available()) {
|
||||||
char inc;
|
static String inStr = "";
|
||||||
inc = myUART->read();
|
char inc;
|
||||||
incStr += inc;
|
inc = _myUART->read();
|
||||||
if (inc == '\n') {
|
inStr += inc;
|
||||||
parse(incStr);
|
if (inc == '\n') {
|
||||||
incStr = "";
|
analyzeString(inStr);
|
||||||
}
|
inStr = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse(String& incStr) {
|
void onRegEvent(IoTItem* eventItem) {
|
||||||
SerialPrint("I", "=>UART", incStr);
|
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) {
|
virtual void loop() {
|
||||||
myUART->print(msg);
|
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> ¶m) {
|
||||||
|
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) {
|
void* getAPI_UART(String subtype, String param) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"menuSection": "Сенсоры",
|
"menuSection": "Сенсоры",
|
||||||
"configItem": [
|
"configItem": [
|
||||||
{
|
{
|
||||||
"global": 0,
|
|
||||||
"name": "UART",
|
"name": "UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "UART",
|
"subtype": "UART",
|
||||||
@@ -12,7 +11,8 @@
|
|||||||
"id": "u",
|
"id": "u",
|
||||||
"tx": 12,
|
"tx": 12,
|
||||||
"rx": 13,
|
"rx": 13,
|
||||||
"speed": 9600
|
"speed": 9600,
|
||||||
|
"eventFormat": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"about": {
|
"about": {
|
||||||
@@ -30,11 +30,12 @@
|
|||||||
"SoftUART"
|
"SoftUART"
|
||||||
],
|
],
|
||||||
"title": "Software uart для esp8266 или hardware uart для esp32",
|
"title": "Software uart для esp8266 или hardware uart для esp32",
|
||||||
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами, в последствии будет доработан для связи с arduino платами",
|
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами. Пригоден для обмена данными с другими контроллерами в ручном режиме или с автоматической трансляцией событий как по сети.",
|
||||||
"propInfo": {
|
"propInfo": {
|
||||||
"tx": "TX пин",
|
"tx": "TX пин",
|
||||||
"rx": "RX пин",
|
"rx": "RX пин",
|
||||||
"speed": "Скорость UART"
|
"speed": "Скорость UART",
|
||||||
|
"eventFormat": "Выбор формата обмена сообщениями с другими контроллерами. =0 - не указан формат, значит не следим за событиями, =1 - формат событий IoTM с использованием json, =2 - формат событий для Nextion отправка событий: ID=Value0xFF0xFF0xFF прием ордеров: ID=Value"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defActive": true,
|
"defActive": true,
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class Loging : public IoTItem {
|
|||||||
String prevDate = "";
|
String prevDate = "";
|
||||||
bool firstTimeDate = true;
|
bool firstTimeDate = true;
|
||||||
|
|
||||||
unsigned long interval;
|
long interval;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Loging(String parameters) : IoTItem(parameters) {
|
Loging(String parameters) : IoTItem(parameters) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class LogingDaily : public IoTItem {
|
|||||||
String prevDate = "";
|
String prevDate = "";
|
||||||
bool firstTimeDate = true;
|
bool firstTimeDate = true;
|
||||||
|
|
||||||
unsigned long interval;
|
long interval;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LogingDaily(String parameters) : IoTItem(parameters) {
|
LogingDaily(String parameters) : IoTItem(parameters) {
|
||||||
|
|||||||
@@ -11,21 +11,23 @@ void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new==============================================================================
|
// new==============================================================================
|
||||||
bool jsonRead(const String& json, String key, unsigned long& value, bool e) {
|
bool jsonRead(const String& json, String key, long& value, bool e) {
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
if (e) {
|
||||||
jsonErrorDetected();
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
|
jsonErrorDetected();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("E", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
value = doc[key].as<unsigned long>();
|
value = doc[key].as<long>();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,12 +35,14 @@ bool jsonRead(const String& json, String key, float& value, bool e) {
|
|||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
if (e) {
|
||||||
jsonErrorDetected();
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
|
jsonErrorDetected();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("E", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -51,12 +55,14 @@ bool jsonRead(const String& json, String key, String& value, bool e) {
|
|||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
if (e) {
|
||||||
jsonErrorDetected();
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
|
jsonErrorDetected();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("E", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -76,12 +82,14 @@ bool jsonRead(const String& json, String key, int& value, bool e) {
|
|||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
if (e) {
|
||||||
jsonErrorDetected();
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
|
jsonErrorDetected();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("E", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -97,7 +105,7 @@ bool jsonWriteStr_(String& json, const String& key, const String& value, bool e)
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
ret = false;
|
||||||
@@ -114,7 +122,7 @@ bool jsonWriteBool_(String& json, const String& key, bool value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
ret = false;
|
||||||
@@ -131,7 +139,7 @@ bool jsonWriteInt_(String& json, const String& key, int value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
ret = false;
|
||||||
@@ -148,7 +156,7 @@ bool jsonWriteFloat_(String& json, const String &key, float value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
ret = false;
|
||||||
@@ -177,7 +185,7 @@ bool jsonMergeObjects(String& json1, String& json2, bool e) {
|
|||||||
jsonMergeDocs(doc1.as<JsonObject>(), doc2.as<JsonObject>());
|
jsonMergeDocs(doc1.as<JsonObject>(), doc2.as<JsonObject>());
|
||||||
if (error1 || error2) {
|
if (error1 || error2) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("json"), "jsonMergeObjects error");
|
SerialPrint("E", F("json"), "jsonMergeObjects error");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
ret = false;
|
||||||
@@ -199,7 +207,7 @@ String jsonReadStr(const String& json, String name, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,7 +219,7 @@ boolean jsonReadBool(const String& json, String name, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,7 +231,7 @@ int jsonReadInt(const String& json, String name, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,7 +244,7 @@ String jsonWriteStr(String& json, String name, String value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,7 +259,7 @@ String jsonWriteBool(String& json, String name, boolean value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -266,7 +274,7 @@ String jsonWriteInt(String& json, String name, int value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,7 +289,7 @@ String jsonWriteFloat(String& json, String name, float value, bool e) {
|
|||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonWrite"), error.f_str());
|
SerialPrint("E", F("jsonWrite"), error.f_str());
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ void SerialPrint(const String& errorLevel, const String& module, const String& m
|
|||||||
cleanString(tosend);
|
cleanString(tosend);
|
||||||
// создаем событие об ошибке для возможной реакции в сценарии
|
// создаем событие об ошибке для возможной реакции в сценарии
|
||||||
if (itemId != "") {
|
if (itemId != "") {
|
||||||
createItemFromNet(itemId + "_onError", tosend, 2);
|
createItemFromNet(itemId + "_onError", tosend, -4);
|
||||||
} else {
|
} else {
|
||||||
createItemFromNet("onError", tosend, 2);
|
createItemFromNet("onError", tosend, -4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ void hex2string(byte array[], unsigned int len, char buffer[]) {
|
|||||||
buffer[len * 2] = '\0';
|
buffer[len * 2] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned char ChartoHex(char ch) {
|
unsigned char ChartoHex(char ch) {
|
||||||
return ((ch >= 'A') ? (ch - 'A' + 0xA) : (ch - '0')) & 0x0F;
|
return ((ch >= 'A') ? (ch - 'A' + 0xA) : (ch - '0')) & 0x0F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user