From 69d46815cd3d6931842153ba6fbcadacb18cac60 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 22 Feb 2022 20:16:33 +0100 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B4=D0=B2=D0=B0=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=B0,=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D1=8E=20=D1=8D=D1=81=D1=82=D0=B0=D1=84=D0=B5?= =?UTF-8?q?=D1=82=D1=83=20=D0=98=D0=BB=D1=8C=D0=B5!!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/EventsAndOrders.h | 8 +++++++ include/Main.h | 1 + include/MqttClient.h | 1 + src/DeviceList.cpp | 2 +- src/EventsAndOrders.cpp | 47 +++++++++++++++++++++++++++++++++++++++ src/Main.cpp | 4 ++++ src/MqttClient.cpp | 20 +++++------------ src/classes/IoTItem.cpp | 3 ++- 8 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 include/EventsAndOrders.h create mode 100644 src/EventsAndOrders.cpp diff --git a/include/EventsAndOrders.h b/include/EventsAndOrders.h new file mode 100644 index 00000000..15a1f358 --- /dev/null +++ b/include/EventsAndOrders.h @@ -0,0 +1,8 @@ +#pragma once +#include "Global.h" + +extern void generateOrder(const String& id, const String& value); +extern void handleOrder(); + +extern void generateEvent(const String& id, const String& value); +extern void handleEvent(); \ No newline at end of file diff --git a/include/Main.h b/include/Main.h index 11b849dc..46f0bc72 100644 --- a/include/Main.h +++ b/include/Main.h @@ -12,3 +12,4 @@ #include "DeviceList.h" #include "PeriodicTasks.h" #include "classes/IoTScenario.h" +#include "EventsAndOrders.h" diff --git a/include/MqttClient.h b/include/MqttClient.h index cd766bd1..df8c6119 100644 --- a/include/MqttClient.h +++ b/include/MqttClient.h @@ -3,6 +3,7 @@ #include "classes/NotAsync.h" #include "Global.h" #include "utils/WiFiUtils.h" +#include "EventsAndOrders.h" void mqttInit(); void selectBroker(); diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 0836143b..b8a25c21 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -38,7 +38,7 @@ void asyncUdpInit() { String data = uint8tToString(packet.data(), packet.length()); // Serial.println(data); if (udpPacketValidation(data)) { - SerialPrint("i", F("UDP"), "Udp packet received, IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); + SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); // Serial.println(data); jsonMergeArrays(devListHeapJson, data); // Serial.println(devListHeapJson); diff --git a/src/EventsAndOrders.cpp b/src/EventsAndOrders.cpp new file mode 100644 index 00000000..6ca7e08e --- /dev/null +++ b/src/EventsAndOrders.cpp @@ -0,0 +1,47 @@ +#include "EventsAndOrders.h" + +// orderBuf - буфер прямых команд, которые нужно выпонить сразу, нажали на кнопку в приложении, сработало условие сценария +//необходимо тут же изменить параметр, записать новое значение + +// eventBuf - буфер событий, в нем как на конвеере едут события, и каждое событие проверяется через все условия сценариев +//его главное отличие от orderBuf в том что события в нем не для выполнения, а для проверки в условиях сценариев +//события в нем лишь вызывают другие команды, помещенные в блоке сценария, если условие совпало. + +//эта функция будет вызываться: +// 1.на приеме сообщений в mqtt (см mqttCallback строку 142 в mqttClient.cpp) +// 2.на приеме сообщений в ws +// 3.в сценарях когда надо выполнить команды +void generateOrder(const String& id, const String& value) { + String event = id + " " + value + ","; + orderBuf += event; +} + +//эта функция будет вызываться в loop() +void handleOrder() { + if (orderBuf.length()) { + String order = selectToMarker(orderBuf, ","); + Serial.println("order: " + order); + //здесь нужно перебрать все методы execute всех векторов и выполнить те id которых совпали с id события + orderBuf = deleteBeforeDelimiter(orderBuf, ","); + } +} + +//эта функция будет вызываться: +// 1.в местах где событие только что произошло (IoTItem::regEvent) +void generateEvent(const String& id, const String& value) { + String event = id + " " + value + ","; + eventBuf += event; +} + +//эта функция будет вызываться в loop() +void handleEvent() { + if (eventBuf.length()) { + String event = selectToMarker(eventBuf, ","); + Serial.println("event: " + event); + //здесь нужно пропускать данное событие через условия сценариев + //и если оно есть в условии сценария и совподает + //то нужно поместить все команды этого блока сценария в generateOrder(order1, order2, ....) + //который в свою очередь их выполнит + eventBuf = deleteBeforeDelimiter(eventBuf, ","); + } +} \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 901a7417..997c2422 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -98,5 +98,9 @@ void loop() { IoTItems[i]->loop(); } + handleOrder(); + + handleEvent(); + // iotScen.ExecScenario(); } diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index c96921d1..37e3c324 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -139,20 +139,12 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { #endif } - // else if (topicStr.indexOf("control") != -1) { - // String key = selectFromMarkerToMarker(topicStr, "/", 3); - // - // String order; - // order += key; - // order += " "; - // order += payloadStr; - // order += ","; - // - // loopCmdAdd(order); - // - // SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr); - //} - // + else if (topicStr.indexOf("control") != -1) { + String key = selectFromMarkerToMarker(topicStr, "/", 3); + generateOrder(key, payloadStr); + SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr); + } + // else if (topicStr.indexOf("event") != -1) { // if (!jsonReadBool(settingsFlashJson, "MqttIn")) { // return; diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 59d6c643..79947001 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -4,6 +4,7 @@ #include "classes/IoTItem.h" #include "WsServer.h" #include "ESPConfiguration.h" +#include "EventsAndOrders.h" IoTItem::IoTItem(String parameters) { jsonRead(parameters, F("int"), _interval); @@ -43,7 +44,7 @@ void IoTItem::loop() { } void IoTItem::regEvent(String value, String consoleInfo = "") { - eventGen2(_id, value); + generateEvent(_id, value); jsonWriteStr(paramsHeapJson, _id, value); publishStatusMqtt(_id, value); publishStatusWs(_id, value);