From 3fb10eeef4790e9588b5b30b82dca0c5d018c992 Mon Sep 17 00:00:00 2001 From: biver Date: Sun, 21 Aug 2022 20:52:32 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20sysext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/SysExt/SysExt.cpp | 78 ++++++++++++++-------------- src/modules/exec/SysExt/modinfo.json | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/modules/exec/SysExt/SysExt.cpp b/src/modules/exec/SysExt/SysExt.cpp index 99f58677..b14c06a4 100644 --- a/src/modules/exec/SysExt/SysExt.cpp +++ b/src/modules/exec/SysExt/SysExt.cpp @@ -29,32 +29,32 @@ class SysExt : public IoTItem { // String command - имя команды после ID. (ID.Команда()) // param - вектор ("массив") значений параметров переданных вместе с командой: ID.Команда("пар1", 22, 33) -> param[0].ValS = "пар1", param[1].ValD = 22 - if (command == "reboot") { // выполняем код при вызове спец команды из сценария: ID.reboot(); - ESP.restart(); - } else if (command == "digitalRead") { - if (param.size()) { - IoTgpio.pinMode(param[0].valD, INPUT); - value.valD = IoTgpio.digitalRead(param[0].valD); - return value; - } - } else if (command == "analogRead") { - if (param.size()) { - IoTgpio.pinMode(param[0].valD, INPUT); - value.valD = IoTgpio.analogRead(param[0].valD); - return value; - } - } else if (command == "digitalWrite") { - if (param.size() == 2) { - IoTgpio.pinMode(param[0].valD, OUTPUT); - IoTgpio.digitalWrite(param[0].valD, param[1].valD); - return {}; - } - } else if (command == "digitalInvert") { - if (param.size()) { - IoTgpio.pinMode(param[0].valD, OUTPUT); - IoTgpio.digitalInvert(param[0].valD); - return {}; - } + // if (command == "reboot") { // выполняем код при вызове спец команды из сценария: ID.reboot(); + // ESP.restart(); + // } else if (command == "digitalRead") { + // if (param.size()) { + // IoTgpio.pinMode(param[0].valD, INPUT); + // value.valD = IoTgpio.digitalRead(param[0].valD); + // return value; + // } + // } else if (command == "analogRead") { + // if (param.size()) { + // IoTgpio.pinMode(param[0].valD, INPUT); + // value.valD = IoTgpio.analogRead(param[0].valD); + // return value; + // } + // } else if (command == "digitalWrite") { + // if (param.size() == 2) { + // IoTgpio.pinMode(param[0].valD, OUTPUT); + // IoTgpio.digitalWrite(param[0].valD, param[1].valD); + // return {}; + // } + // } else if (command == "digitalInvert") { + // if (param.size()) { + // IoTgpio.pinMode(param[0].valD, OUTPUT); + // IoTgpio.digitalInvert(param[0].valD); + // return {}; + // } //} else if (command == "getTime") { // if (param.size()) { // value.isDecimal = false; @@ -81,19 +81,19 @@ class SysExt : public IoTItem { // value.valD = watch->day; // День месяца 1-31 // value.isDecimal = true; // return value; - } else if (command == "deepSleep") { - if (param.size()) { - Serial.printf("Ушел спать на %d сек...", (int)param[0].valD); -#ifdef ESP32 - esp_sleep_enable_timer_wakeup(param[0].valD * 1000000); - delay(1000); - esp_deep_sleep_start(); -#else - ESP.deepSleep(param[0].valD * 1000000); -#endif - } - return {}; - } +// } else if (command == "deepSleep") { +// if (param.size()) { +// Serial.printf("Ушел спать на %d сек...", (int)param[0].valD); +// #ifdef ESP32 +// esp_sleep_enable_timer_wakeup(param[0].valD * 1000000); +// delay(1000); +// esp_deep_sleep_start(); +// #else +// ESP.deepSleep(param[0].valD * 1000000); +// #endif +// } + // return {}; + //} // } else if (command == "ModemSleep") { // Serial.printf("Выключил все радио..."); // #ifdef ESP32 diff --git a/src/modules/exec/SysExt/modinfo.json b/src/modules/exec/SysExt/modinfo.json index dfbfa3c1..709c9aeb 100644 --- a/src/modules/exec/SysExt/modinfo.json +++ b/src/modules/exec/SysExt/modinfo.json @@ -25,7 +25,7 @@ } }, - "defActive": true, + "defActive": false, "devices": { "esp32_4mb": [], From 8809bad02d2bc88768fff39d47f088e04a33c723 Mon Sep 17 00:00:00 2001 From: biver Date: Sun, 21 Aug 2022 20:53:49 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20sysext=20?= =?UTF-8?q?=D0=B2=20=D1=8F=D0=B4=D1=80=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 172 ++++++++++++++++++++++++++++++++++-- 1 file changed, 167 insertions(+), 5 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 65c6baf9..a9b3cac8 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -5,7 +5,7 @@ #include "classes/IoTItem.h" #include "classes/IoTScenario.h" #include "utils/FileUtils.h" - +#include "NTP.h" bool isIotScenException; // признак исключения и попытки прекратить выполнение сценария заранее @@ -25,6 +25,7 @@ enum Token { tok_if = -6, tok_then = -7, tok_else = -8 }; + //===----------------------------------------------------------------------===// // Abstract Syntax Tree (Абстрактное Синтаксическое Дерево или Дерево Парсинга) //===----------------------------------------------------------------------===// @@ -274,6 +275,165 @@ public: } }; + +// Для сокращения количества преобразований используем числовые коды для фиксации названия системной функции, +// которые поддерживает прошивка +enum SysOp { + sysop_notfound = 0, + sysop_reboot = 1, + sysop_digitalRead, + sysop_analogRead, // + sysop_digitalWrite, // + sysop_digitalInvert, // + sysop_deepSleep, // + sysop_getTime, // + sysop_getHours, // + sysop_getMinutes, // + sysop_getSeconds, // + sysop_getMonth, // + sysop_getDay, + sysop_getIP +}; + +IoTValue sysExecute(SysOp command, std::vector& param) { + IoTValue value; + Serial.printf("Call from sysExecute %d\n", command); + switch (command) { + case sysop_reboot: + ESP.restart(); + break; + case sysop_digitalRead: + if (param.size()) { + IoTgpio.pinMode(param[0].valD, INPUT); + value.valD = IoTgpio.digitalRead(param[0].valD); + return value; + } + break; + case sysop_analogRead: + if (param.size()) { + IoTgpio.pinMode(param[0].valD, INPUT); + value.valD = IoTgpio.analogRead(param[0].valD); + return value; + } + break; + case sysop_digitalWrite: + if (param.size() == 2) { + IoTgpio.pinMode(param[0].valD, OUTPUT); + IoTgpio.digitalWrite(param[0].valD, param[1].valD); + return {}; + } + break; + case sysop_digitalInvert: + if (param.size()) { + IoTgpio.pinMode(param[0].valD, OUTPUT); + IoTgpio.digitalInvert(param[0].valD); + return {}; + } + break; + case sysop_deepSleep: + if (param.size()) { + Serial.printf("Ушел спать на %d сек...", (int)param[0].valD); +#ifdef ESP32 + esp_sleep_enable_timer_wakeup(param[0].valD * 1000000); + delay(1000); + esp_deep_sleep_start(); +#else + ESP.deepSleep(param[0].valD * 1000000); +#endif + } + break; + case sysop_getTime: + if (param.size()) { + value.isDecimal = false; + value.valS = getTimeStr(param[0].valS.c_str()); + return value; + } + break; + case sysop_getHours: + value.valD = _time_local.hour; + return value; + break; + case sysop_getMinutes: + value.valD = _time_local.minute; + return value; + break; + case sysop_getSeconds: + value.valD = _time_local.second; + return value; + break; + case sysop_getMonth: + value.valD = _time_local.month; + return value; + break; + case sysop_getDay: + value.valD = _time_local.day_of_month; + return value; + break; + case sysop_getIP: + value.valS = jsonReadStr(settingsFlashJson, F("ip")); + value.isDecimal = false; + return value; + break; + } + + return {}; +} + +/// SysCallExprAST - Класс узла выражения для вызова системных команд. +class SysCallExprAST : public ExprAST { + String Callee; + std::vector Args; + IoTValue ret; // хранение возвращаемого значения, т.к. возврат по ссылке осуществляется + //bool ItemIsLocal = false; + SysOp operation; + +public: + SysCallExprAST(const String &callee, std::vector &args) + : Callee(callee), Args(args) { + if (Callee == "reboot") operation = sysop_reboot; else + if (Callee == "digitalRead") operation = sysop_digitalRead; else + if (Callee == "analogRead") operation = sysop_analogRead; else + if (Callee == "digitalWrite") operation = sysop_digitalWrite; else + if (Callee == "digitalInvert") operation = sysop_digitalInvert; else + if (Callee == "deepSleep") operation = sysop_deepSleep; else + if (Callee == "getTime") operation = sysop_getTime; else + if (Callee == "getHours") operation = sysop_getHours; else + if (Callee == "getMinutes") operation = sysop_getMinutes; else + if (Callee == "getSeconds") operation = sysop_getSeconds; else + if (Callee == "getMonth") operation = sysop_getMonth; else + if (Callee == "getDay") operation = sysop_getDay; else + if (Callee == "getIP") operation = sysop_getIP; else + operation = sysop_notfound; + } + + IoTValue* exec() { + Serial.printf("Call from SysCallExprAST exec %d\n", operation); + + if (isIotScenException) return nullptr; // если прерывание, то сразу выходим + + // готовим параметры для передачи в в функцию интерпретатор действий + std::vector ArgsAsIoTValue; + for (unsigned int i = 0; i < Args.size(); i++) { + if (Args[i] == nullptr) return nullptr; + IoTValue *tmp = Args[i]->exec(); + if (tmp != nullptr) ArgsAsIoTValue.push_back(*tmp); + else return nullptr; + } + + ret = sysExecute(operation, ArgsAsIoTValue); // вызываем функцию интерпретатор с передачей всех аргументов + + return &ret; + } + + ~SysCallExprAST() { + for (unsigned int i = 0; i < Args.size(); i++) { + if (Args[i]) delete Args[i]; + } + Args.clear(); + //Serial.printf("Call from CallExprAST delete\n"); + } +}; + /// IfExprAST - Класс узла выражения для if/then/else. class IfExprAST : public ExprAST { ExprAST *Cond, *Then, *Else; @@ -533,12 +693,14 @@ public: } } - // Получаем ')'. + // Получаем ';'. getNextToken(); - //if (tmpItem) - return new CallExprAST(IdName, Cmd, Args, tmpItem); // создаем объект запуска функции в любом случае даж если не нашли Item - //else return new StringExprAST("id " + IdName + " not_found"); + if (Cmd == "") + return new SysCallExprAST(IdName, Args); // создаем объект запуска системной функции + else + return new CallExprAST(IdName, Cmd, Args, tmpItem); // создаем объект запуска функции в любом случае даж если не нашли Item + } /// numberexpr ::= number From 2bf63798e5f87203cc049789e0b0cd3e932d6c16 Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 22 Aug 2022 15:21:44 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=D0=B1=D0=BE=D1=80=D1=89?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index c5d77da7..94798627 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -19,7 +19,6 @@ import configparser import os, json, sys, getopt from pathlib import Path - config = configparser.ConfigParser() # создаём объекта парсера INI def printHelp(): @@ -85,7 +84,7 @@ if Path(profile).is_file(): # sortedModules = {} # for sortedModulName in sortedList: - print(profJson) + # print(profJson) with open(profile, "w", encoding='utf-8') as write_file: json.dump(profJson, write_file, ensure_ascii=False, indent=4, sort_keys=False) @@ -183,6 +182,12 @@ config["platformio"]["default_envs"] = deviceName config["platformio"]["data_dir"] = profJson['projectProp']['platformio']['data_dir'] with open("platformio.ini", 'w') as configFile: config.write(configFile) + +import ctypes # An included library with Python install. +if update: + ctypes.windll.user32.MessageBoxW(0, "Модули профиля " + profile + " обновлены, а сам профиль применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0) +else: + ctypes.windll.user32.MessageBoxW(0, "Профиль " + profile + " применен, можно запускать компиляцию и прошивку.", "Операция завершена.", 0) \ No newline at end of file From 5aef3091543994f9bed757e5f9b8ffc04d682e30 Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 22 Aug 2022 21:03:20 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=83?= =?UTF-8?q?=D1=8E=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=B2=20MQTT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index a9b3cac8..d8a1d69f 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -292,12 +292,12 @@ enum SysOp { sysop_getSeconds, // sysop_getMonth, // sysop_getDay, - sysop_getIP + sysop_getIP, + sysop_mqttPub }; IoTValue sysExecute(SysOp command, std::vector& param) { IoTValue value; - Serial.printf("Call from sysExecute %d\n", command); switch (command) { case sysop_reboot: ESP.restart(); @@ -374,6 +374,13 @@ IoTValue sysExecute(SysOp command, std::vector& param) { value.isDecimal = false; return value; break; + case sysop_mqttPub: + if (param.size() == 2) { + //Serial.printf("Call from sysExecute %s %s\n", param[0].valS.c_str(), param[1].valS.c_str()); + value.valD = mqtt.publish(param[0].valS.c_str(), param[1].valS.c_str(), false); + return value; + } + break; } return {}; @@ -403,6 +410,7 @@ public: if (Callee == "getMonth") operation = sysop_getMonth; else if (Callee == "getDay") operation = sysop_getDay; else if (Callee == "getIP") operation = sysop_getIP; else + if (Callee == "mqttPub") operation = sysop_mqttPub; else operation = sysop_notfound; } From 4ed7996309a4322574d2a7145f011d54c4b842bd Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 22 Aug 2022 21:23:26 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index d8a1d69f..b2537259 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -285,13 +285,15 @@ enum SysOp { sysop_analogRead, // sysop_digitalWrite, // sysop_digitalInvert, // - sysop_deepSleep, // - sysop_getTime, // + sysop_deepSleep, // sysop_getHours, // sysop_getMinutes, // sysop_getSeconds, // sysop_getMonth, // sysop_getDay, + sysop_gethhmm, + sysop_gethhmmss, + sysop_getTime, sysop_getIP, sysop_mqttPub }; @@ -342,13 +344,6 @@ IoTValue sysExecute(SysOp command, std::vector& param) { #endif } break; - case sysop_getTime: - if (param.size()) { - value.isDecimal = false; - value.valS = getTimeStr(param[0].valS.c_str()); - return value; - } - break; case sysop_getHours: value.valD = _time_local.hour; return value; @@ -369,6 +364,21 @@ IoTValue sysExecute(SysOp command, std::vector& param) { value.valD = _time_local.day_of_month; return value; break; + case sysop_gethhmm: + value.isDecimal = false; + value.valS = getTimeLocal_hhmm(); + return value; + break; + case sysop_gethhmmss: + value.isDecimal = false; + value.valS = getTimeLocal_hhmmss(); + return value; + break; + case sysop_getTime: + value.isDecimal = false; + value.valS = getDateTimeDotFormated(); + return value; + break; case sysop_getIP: value.valS = jsonReadStr(settingsFlashJson, F("ip")); value.isDecimal = false; @@ -411,6 +421,9 @@ public: if (Callee == "getDay") operation = sysop_getDay; else if (Callee == "getIP") operation = sysop_getIP; else if (Callee == "mqttPub") operation = sysop_mqttPub; else + if (Callee == "gethhmm") operation = sysop_gethhmm; else + if (Callee == "gethhmmss") operation = sysop_gethhmmss; else + if (Callee == "getTime") operation = sysop_getTime; else operation = sysop_notfound; } From 62d6cc586a591d385c94d38d1ef7bd613b53f5a3 Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 22 Aug 2022 21:25:12 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20SysExt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/items.json | 19 ++++--------------- platformio.ini | 5 ++--- src/modules/API.cpp | 2 -- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/data_svelte/items.json b/data_svelte/items.json index 6668aad2..df00ea79 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -455,22 +455,11 @@ "apin": -1, "num": 34 }, - { - "name": "35. Доп. функции системы", - "type": "Reading", - "subtype": "SysExt", - "id": "SysExt", - "widget": "", - "page": "", - "descr": "", - "int": 15, - "num": 35 - }, { "header": "Экраны" }, { - "name": "36. LCD экран 2004", + "name": "35. LCD экран 2004", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -482,10 +471,10 @@ "size": "20,4", "coord": "0,0", "id2show": "id датчика", - "num": 36 + "num": 35 }, { - "name": "37. LCD экран 1602", + "name": "36. LCD экран 1602", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -497,6 +486,6 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика", - "num": 37 + "num": 36 } ] \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index e8940188..5067c0ce 100644 --- a/platformio.ini +++ b/platformio.ini @@ -89,7 +89,6 @@ build_src_filter = + + + - + + [env:esp32_4mb_fromitems] @@ -111,8 +110,10 @@ lib_deps = dfrobot/DFRobotDFPlayerMini @ ^1.0.5 marcoschwartz/LiquidCrystal_I2C@^1.1.4 build_src_filter = + + + + + + + + + @@ -128,11 +129,9 @@ build_src_filter = + + + - + + + + + - + + diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 33431763..e570b3b6 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -23,7 +23,6 @@ void* getAPI_IoTServo(String subtype, String params); void* getAPI_Mcp23017(String subtype, String params); void* getAPI_Mp3(String subtype, String params); void* getAPI_Pwm8266(String subtype, String params); -void* getAPI_SysExt(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); void* getAPI(String subtype, String params) { @@ -51,7 +50,6 @@ if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; return nullptr; } \ No newline at end of file