diff --git a/include/Class/Item.h b/include/Class/Item.h new file mode 100644 index 00000000..753ef9d5 --- /dev/null +++ b/include/Class/Item.h @@ -0,0 +1,151 @@ +#pragma once + +#include + +#include "Global.h" + +class Item { + private: + String type; + String key; + String file; + String page; + String descr; + String order; + + String addr; + String pin; + String map; + String c; + String inv; + String state; + + public: + Item() : type{""}, + key{""}, + file{""}, + page{""}, + descr{""}, + order{""}, + addr{""}, + pin{""}, + map{""}, + c{""}, + inv{""}, + state{""} + + {}; + + void update() { + //String order = sCmd.order(); + //pm.info("create '" + order + "'"); + for (int i = 1; i < 12; i++) { + if (i == 1) type = sCmd.next(); + if (i == 2) key = sCmd.next(); + if (i == 3) file = sCmd.next(); + if (i == 4) page = sCmd.next(); + if (i == 5) descr = sCmd.next(); + if (i == 6) order = sCmd.next(); + } + + for (int i = 1; i < 6; i++) { + String arg = sCmd.next(); + if (arg != "") { + if (arg.indexOf("pin[") != -1) { + pin = extractInner(arg); + } + if (arg.indexOf("inv[") != -1) { + inv = extractInner(arg); + } + if (arg.indexOf("st[") != -1) { + state = extractInner(arg); + } + } + } + createWidgetClass(descr, page, order, file, key); + } + + String gtype() { + return type; + } + String gkey() { + return key; + } + String gfile() { + return file; + } + String gpage() { + return page; + } + String gdescr() { + return descr; + } + String gorder() { + return order; + } + String gpin() { + return pin; + } + String ginv() { + return inv; + } + String gstate() { + return state; + } + + void clear() { + type = ""; + key = ""; + file = ""; + page = ""; + descr = ""; + order = ""; + addr = ""; + pin = ""; + map = ""; + c = ""; + inv = ""; + state = ""; + } + + String extractInnerDigit(String str) { + int p1 = str.indexOf("["); + int p2 = str.indexOf("]"); + return str.substring(p1 + 1, p2); + } + + void createWidgetClass(String descr, String page, String order, String filename, String topic) { + String buf = "{}"; + if (!loadWidgetClass(filename, buf)) { + return; + } + descr.replace("#", " "); + page.replace("#", " "); + + jsonWriteStr(buf, "page", page); + jsonWriteStr(buf, "order", order); + jsonWriteStr(buf, "descr", descr); + jsonWriteStr(buf, "topic", prex + "/" + topic); + +#ifdef LAYOUT_IN_RAM + all_widgets += widget + "\r\n"; +#else + addFile("layout.txt", buf); +#endif + } + + bool loadWidgetClass(const String& filename, String& buf) { + buf = readFile(getWidgetFileClass(filename), 2048); + bool res = !(buf == "Failed" || buf == "Large"); + if (!res) { + //pm.error("on load" + filename); + } + return res; + } + + const String getWidgetFileClass(const String& name) { + return "/widgets/" + name + ".json"; + } +}; + +extern Item* myItem; \ No newline at end of file diff --git a/src/Class/Item.cpp b/src/Class/Item.cpp new file mode 100644 index 00000000..04b24dee --- /dev/null +++ b/src/Class/Item.cpp @@ -0,0 +1,4 @@ +#include "Class/Item.h" + + +Item* myItem; \ No newline at end of file diff --git a/src/Cmd.cpp b/src/Cmd.cpp index d9e16d91..e646f2bc 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -1,5 +1,6 @@ #include "Cmd.h" +#include "Class/Item.h" #include "Global.h" #include "Module/Terminal.h" #include "Servo/Servos.h" @@ -21,14 +22,7 @@ void getData(); void cmd_init() { sCmd.addCommand("button", button); - //sCmd.addCommand("buttonSet", buttonSet); - sCmd.addCommand("buttonChange", buttonChange); - - sCmd.addCommand("pinSet", pinSet); - sCmd.addCommand("pinChange", pinChange); - sCmd.addCommand("pwm", pwm); - sCmd.addCommand("pwmSet", pwmSet); sCmd.addCommand("switch", switch_); @@ -105,134 +99,94 @@ void cmd_init() { sCmd.addCommand("firmwareVersion", firmwareVersion); handle_time_init(); + + myItem = new Item(); } //==========================================Модуль кнопок=================================================== //button out light toggle Кнопки Свет 1 pin[12] inv[1] st[1] -//void button() { -// void itemInit(); -//} - //========================================================================================================== - void button() { - String command = sCmd.order(); - pm.info("create '" + command + "'"); - String type = sCmd.next(); - String key = sCmd.next(); - String file = sCmd.next(); - String page = sCmd.next(); - String descr = sCmd.next(); - String order = sCmd.next(); - - String pin; - String inv; - String state; - - for (int i = 1; i < 6; i++) { - String arg = sCmd.next(); - if (arg != "") { - if (arg.indexOf("pin[") != -1) { - pin = extractInner(arg); - } - if (arg.indexOf("inv[") != -1) { - inv = extractInner(arg); - } - if (arg.indexOf("st[") != -1) { - state = extractInner(arg); - } - } - } - - createWidget(descr, page, order, file, key); + myItem->update(); + String key = myItem->gkey(); + String pin = myItem->gpin(); + String inv = myItem->ginv(); + String state = myItem->gstate(); + myItem->clear(); sCmd.addCommand(key.c_str(), buttonSet); if (pin != "") { pinMode(pin.toInt(), OUTPUT); - jsonWriteStr(configOptionJson, key + "_pin", pin); + jsonWriteInt(configOptionJson, key + "_pin", pin.toInt()); + } + + if (inv != "") { + digitalWrite(pin.toInt(), !state.toInt()); + jsonWriteStr(configLiveJson, key, state); + MqttClient::publishStatus(key, state); } if (state != "") { digitalWrite(pin.toInt(), state.toInt()); jsonWriteStr(configLiveJson, key, state); + MqttClient::publishStatus(key, state); } } void buttonSet() { String key = sCmd.order(); String state = sCmd.next(); - int pin = jsonReadInt(configOptionJson, key + "_pin"); - digitalWrite(pin, state.toInt()); + if (state == "change") { + int newState = !digitalRead(pin); + digitalWrite(pin, newState); + eventGen(key, ""); + jsonWriteStr(configLiveJson, key, String(newState)); + MqttClient::publishStatus(key, String(newState)); + } + + if (state == "0" || state == "1") { + digitalWrite(pin, state.toInt()); + eventGen(key, ""); + jsonWriteStr(configLiveJson, key, state); + MqttClient::publishStatus(key, state); + } +} + +//==========================================Модуль управления ШИМ=================================================== +//pwm out volume range Кнопки Свет 1 pin[12] st[500] +//================================================================================================================== +void pwm() { + myItem->update(); + String key = myItem->gkey(); + String pin = myItem->gpin(); + String state = myItem->gstate(); + myItem->clear(); + + sCmd.addCommand(key.c_str(), pwmSet); + + if (pin != "") { + jsonWriteInt(configOptionJson, key + "_pin", pin.toInt()); + analogWrite(pin.toInt(), state.toInt()); + jsonWriteInt(configLiveJson, key, state.toInt()); + MqttClient::publishStatus(key, String(state)); + } +} + +void pwmSet() { + String key = sCmd.order(); + String state = sCmd.next(); + int pin = jsonReadInt(configOptionJson, key + "_pin"); + + analogWrite(pin, state.toInt()); eventGen(key, ""); jsonWriteStr(configLiveJson, key, state); MqttClient::publishStatus(key, state); } -void buttonChange() { - String button_number = sCmd.next(); - if (!isDigitStr(button_number)) { - pm.error("wrong button " + button_number); - return; - } - String name = "button" + button_number; - bool current_state = !jsonReadBool(configLiveJson, name); - String stateStr = current_state ? "1" : "0"; - jsonWriteStr(configLiveJson, name, stateStr); - addCommandLoop("buttonSet " + button_number + " " + stateStr); - MqttClient::publishStatus(name, stateStr); -} - -void pinSet() { - String pin_number = sCmd.next(); - String pin_state = sCmd.next(); - pinMode(pin_number.toInt(), OUTPUT); - digitalWrite(pin_number.toInt(), pin_state.toInt()); -} - -void pinChange() { - String pin_number = sCmd.next(); - pinMode(pin_number.toInt(), OUTPUT); - digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt())); -} -//================================================================================================================== -//==========================================Модуль управления ШИМ=================================================== -void pwm() { - //static boolean flag = true; - String pwm_number = sCmd.next(); - String pwm_pin = sCmd.next(); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - String start_state = sCmd.next(); - String page_number = sCmd.next(); - - uint8_t pwm_pin_int = pwm_pin.toInt(); - jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin); - pinMode(pwm_pin_int, INPUT); - analogWrite(pwm_pin_int, start_state.toInt()); - - jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state); - createWidget(widget_name, page_name, page_number, "range", "pwm" + pwm_number); -} - -void pwmSet() { - String pwm_number = sCmd.next(); - String pwm_state = sCmd.next(); - int pwm_state_int = pwm_state.toInt(); - - int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number); - analogWrite(pin, pwm_state_int); - - eventGen("pwm", pwm_number); - - jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); - - MqttClient::publishStatus("pwm" + pwm_number, pwm_state); -} //================================================================================================================== //==========================================Модуль физической кнопки================================================ void switch_() { diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index d71da238..9841fefe 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -238,7 +238,7 @@ void publishWidgets() { void publishWidgets() { auto file = seekFile("layout.txt"); if (!file) { - pm.error("on seek layout.txt"); + pm.error("no file layout.txt"); return; } while (file.available()) {