mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-27 06:32:19 +03:00
Пересматриваем модель формирования сетевых событий и их
контроль.
This commit is contained in:
@@ -146,9 +146,12 @@ void IoTItem::setIntFromNet(int interval) {
|
||||
}
|
||||
|
||||
void IoTItem::checkIntFromNet() {
|
||||
// проверяем элемент на доверие данным.
|
||||
if (_intFromNet >= 0) {
|
||||
if (_intFromNet == 0) {
|
||||
SerialPrint("E", "SYS", "The new data did not come from the network. The level of trust is low.", _id);
|
||||
// если время жизни истекло, то удаляем элемент
|
||||
// если это было уведомление не об ошибке или начале работы, то сообщаем, что сетевое событие давно не приходило
|
||||
if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1) {
|
||||
SerialPrint("E", _id, "The new data did not come from the network. The level of trust is low.", _id);
|
||||
}
|
||||
_intFromNet--;
|
||||
}
|
||||
@@ -178,19 +181,19 @@ IoTGpio* IoTItem::getGpioDriver() {
|
||||
|
||||
//сетевое общение====================================================================================================================================
|
||||
|
||||
externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
||||
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
||||
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
||||
//Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
||||
}
|
||||
// externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
||||
// prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
||||
// iAmLocal = false; // указываем, что это сущность прилетела из сети
|
||||
// //Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
||||
// }
|
||||
|
||||
externalVariable::~externalVariable() {
|
||||
Serial.printf("Call from ~externalVariable: Im dead\n");
|
||||
}
|
||||
// externalVariable::~externalVariable() {
|
||||
// Serial.printf("Call from ~externalVariable: Im dead\n");
|
||||
// }
|
||||
|
||||
void externalVariable::doByInterval() { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
||||
iAmDead = true;
|
||||
}
|
||||
// void externalVariable::doByInterval() { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
||||
// iAmDead = true;
|
||||
// }
|
||||
|
||||
//=========================================================================================================================================
|
||||
|
||||
@@ -222,6 +225,23 @@ bool isItemExist(const String& name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval) {
|
||||
String jsonStr = "{\"id\":\"";
|
||||
jsonStr += itemId;
|
||||
jsonStr += "\",\"val\":\"";
|
||||
jsonStr += value;
|
||||
jsonStr += "\",\"int\":";
|
||||
jsonStr += interval;
|
||||
jsonStr += "}";
|
||||
|
||||
IoTItem *tmpp = new IoTItem(jsonStr);
|
||||
tmpp->setIntFromNet(interval); // устанавливаем время жизни 3 сек
|
||||
tmpp->iAmLocal = false;
|
||||
IoTItems.push_back(tmpp);
|
||||
generateEvent(itemId, "1");
|
||||
return tmpp;
|
||||
}
|
||||
|
||||
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
||||
|
||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
||||
|
||||
@@ -78,15 +78,15 @@ class StringExprAST : public ExprAST {
|
||||
class VariableExprAST : public ExprAST {
|
||||
String Name;
|
||||
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
||||
bool ItemIsLocal = false;
|
||||
//bool ItemIsLocal = false;
|
||||
|
||||
public:
|
||||
VariableExprAST(const String &name, IoTItem *item) : Name(name), Item(item) {
|
||||
if (item) ItemIsLocal = item->iAmLocal;
|
||||
//if (item) ItemIsLocal = item->iAmLocal;
|
||||
}
|
||||
|
||||
int setValue(IoTValue *val, bool generateEvent) {
|
||||
if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||
//if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||
if (Item)
|
||||
Item->setValue(*val, generateEvent);
|
||||
else
|
||||
@@ -97,7 +97,7 @@ class VariableExprAST : public ExprAST {
|
||||
|
||||
IoTValue *exec() {
|
||||
if (isIotScenException) return nullptr;
|
||||
if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||
//if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||
if (Item) {
|
||||
// if (Item->value.isDecimal)
|
||||
// Serial.printf("Call from VariableExprAST: %s = %f\n", Name.c_str(), Item->value.valD);
|
||||
@@ -105,7 +105,7 @@ class VariableExprAST : public ExprAST {
|
||||
return &(Item->value);
|
||||
}
|
||||
|
||||
SerialPrint("E", Name, "Элемент не найден или соединение потеряно", Name);
|
||||
SerialPrint("E", Name, "The element is not found or the connection is lost", Name);
|
||||
return nullptr; // Item не найден.
|
||||
}
|
||||
};
|
||||
@@ -260,12 +260,12 @@ class CallExprAST : public ExprAST {
|
||||
std::vector<ExprAST *> Args;
|
||||
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
||||
IoTValue ret; // хранение возвращаемого значения, т.к. возврат по ссылке осуществляется
|
||||
bool ItemIsLocal = false;
|
||||
//bool ItemIsLocal = false;
|
||||
|
||||
public:
|
||||
CallExprAST(const String &callee, String &cmd, std::vector<ExprAST *> &args, IoTItem *item)
|
||||
: Callee(callee), Cmd(cmd), Args(args), Item(item) {
|
||||
if (item) ItemIsLocal = item->iAmLocal;
|
||||
//if (item) ItemIsLocal = item->iAmLocal;
|
||||
}
|
||||
|
||||
IoTValue *exec() {
|
||||
@@ -283,7 +283,7 @@ class CallExprAST : public ExprAST {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!ItemIsLocal) Item = findIoTItem(Callee); // пробуем найти переменную если она не локальная (могла придти по сети в процессе)
|
||||
//if (!ItemIsLocal) Item = findIoTItem(Callee); // пробуем найти переменную если она не локальная (могла придти по сети в процессе)
|
||||
if (!Item) return nullptr; // ret = zeroIotVal; // если все же не пришла, то либо опечатка, либо уже стерлась - выходим
|
||||
|
||||
if (Cmd == "getIntFromNet") {
|
||||
|
||||
Reference in New Issue
Block a user