From 8f395ccc8aba0258b8489a030836971ba3d4720b Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Mon, 22 Jun 2020 17:40:29 +0300 Subject: [PATCH] SoftwareSerial --- include/Global.h | 16 ++-- include/Utils/PresetUtils.h | 11 +++ src/Cmd.cpp | 57 ++++++++------ src/Mqtt.cpp | 67 ++++++++++------- src/Scenario.cpp | 20 +++-- src/Sensors.cpp | 46 ++++++------ src/Timers.cpp | 144 ++++++++++++++++++------------------ src/Utils/FileUtils.cpp | 25 ++++--- src/Utils/PresetUtils.cpp | 55 ++++++++++++++ src/Web.cpp | 59 +-------------- src/main.cpp | 14 ++-- src/udp.cpp | 2 +- 12 files changed, 274 insertions(+), 242 deletions(-) create mode 100644 include/Utils/PresetUtils.h create mode 100644 src/Utils/PresetUtils.cpp diff --git a/include/Global.h b/include/Global.h index 5897743d..fec124c4 100644 --- a/include/Global.h +++ b/include/Global.h @@ -25,6 +25,7 @@ #include "Utils\WiFiUtils.h" //=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК=============== +#include #include #include #include @@ -62,7 +63,7 @@ extern AsyncWebServer server; extern DallasTemperature sensors; extern boolean but[NUM_BUTTONS]; -extern Bounce *buttons; +extern Bounce* buttons; /* * Global vars @@ -205,11 +206,10 @@ extern boolean connectMQTT(); extern boolean publishData(const String& topic, const String& data); extern boolean publishChart(const String& topic, const String& data); +extern boolean publishStatus(const String& topic, const String& state); extern boolean publishControl(String id, String topic, String state); -extern boolean sendSTATUS(String topic, String state); - -extern void do_mqtt_connection(); +extern void reconnectMQTT(); //Scenario extern void eventGen(String event_name, String number); @@ -284,10 +284,10 @@ extern void do_mqtt_send_settings_to_udp(); extern void Web_server_init(); // iot_firmware -extern void handleCMD_loop(); -extern void handleButton(); -extern void handleScenario(); -extern void handleUdp(); +extern void loopCmd(); +extern void loopButton(); +extern void loopScenario(); +extern void loopUdp(); extern void do_upgrade_url(); extern void do_upgrade(); diff --git a/include/Utils/PresetUtils.h b/include/Utils/PresetUtils.h new file mode 100644 index 00000000..552da5ca --- /dev/null +++ b/include/Utils/PresetUtils.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +#include "CommonTypes.h" + +const String getPresetFile(uint8_t preset, ConfigType_t type); + +const String getItemName(Item_t item); + +const Item_t getPresetItem(uint8_t preset); diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 303c3111..a86012fc 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -5,6 +5,7 @@ Bounce *buttons = new Bounce[NUM_BUTTONS]; Servo myServo1; Servo myServo2; +SoftwareSerial *mySerial = nullptr; void CMD_init() { sCmd.addCommand("button", button); @@ -165,12 +166,14 @@ void buttonSet() { eventGen("button", button_number); jsonWriteStr(configLiveJson, "button" + button_number, button_state); - sendSTATUS("button" + button_number, button_state); + + publishStatus("button" + button_number, button_state); } void buttonChange() { String button_number = sCmd.next(); String current_state = jsonReadStr(configLiveJson, "button" + button_number); + if (current_state == "1") { current_state = "0"; } else if (current_state == "0") { @@ -178,7 +181,7 @@ void buttonChange() { } order_loop += "buttonSet " + button_number + " " + current_state + ","; jsonWriteStr(configLiveJson, "button" + button_number, current_state); - sendSTATUS("button" + button_number, current_state); + publishStatus("button" + button_number, current_state); } void pinSet() { @@ -226,7 +229,8 @@ void pwmSet() { eventGen("pwm", pwm_number); jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); - sendSTATUS("pwm" + pwm_number, pwm_state); + + publishStatus("pwm" + pwm_number, pwm_state); } //================================================================================================================== //==========================================Модуль физической кнопки================================================ @@ -240,7 +244,7 @@ void switch_() { but[switch_number.toInt()] = true; } -void handleButton() { +void loopButton() { static uint8_t switch_number = 1; if (but[switch_number]) { @@ -257,7 +261,9 @@ void handleButton() { } } switch_number++; - if (switch_number == NUM_BUTTONS) switch_number = 0; + if (switch_number == NUM_BUTTONS) { + switch_number = 0; + } } //===================================================================================================================================== @@ -279,7 +285,7 @@ void digitSet() { String number = sCmd.next(); String value = sCmd.next(); jsonWriteStr(configLiveJson, "digit" + number, value); - sendSTATUS("digit" + number, value); + publishStatus("digit" + number, value); } //===================================================================================================================================== @@ -301,7 +307,7 @@ void timeSet() { String number = sCmd.next(); String value = sCmd.next(); jsonWriteStr(configLiveJson, "time" + number, value); - sendSTATUS("time" + number, value); + publishStatus("time" + number, value); } void handle_time_init() { @@ -341,7 +347,7 @@ void textSet() { } jsonWriteStr(configLiveJson, "text" + number, text); - sendSTATUS("text" + number, text); + publishStatus("text" + number, text); } //===================================================================================================================================== //=========================================Модуль шагового мотора====================================================================== @@ -496,23 +502,29 @@ void servoSet() { eventGen("servo", servo_number); jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); - sendSTATUS("servo" + servo_number, servo_state); + + publishStatus("servo" + servo_number, servo_state); } #endif -//==================================================================================================================================================== -//===================================================================================serial=========================================================== + #ifdef SERIAL_ENABLED void serialBegin() { - //String s_speed = sCmd.next(); - //String rxPin = sCmd.next(); - //String txPin = sCmd.next(); - //SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt()); - //mySerial.begin(s_speed.toInt()); + String s_speed = sCmd.next(); + String rxPin = sCmd.next(); + String txPin = sCmd.next(); + + if (mySerial) { + delete mySerial; + } + mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt()); + mySerial->begin(s_speed.toInt()); } void serialWrite() { - //String text = sCmd.next(); - //mySerial.println(text); + String payload = sCmd.next(); + if (mySerial) { + mySerial->println(payload); + } } #endif //==================================================================================================================================================== @@ -549,15 +561,14 @@ void firmwareVersion() { choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firmver"); } - //============================================================================================================================== //============================выполнение команд (в лупе) по очереди из строки order============================================= -void handleCMD_loop() { +void loopCmd() { if (order_loop != "") { - String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1, - sCmd.readStr(tmp); //выполняем первую команду + String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1, + sCmd.readStr(tmp); //выполняем Serial.println("[ORDER] => " + order_loop); - order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду + order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем } } diff --git a/src/Mqtt.cpp b/src/Mqtt.cpp index d73c43ac..be729ade 100644 --- a/src/Mqtt.cpp +++ b/src/Mqtt.cpp @@ -11,12 +11,13 @@ int mqtt_lost_error = 0; // Session params String mqttPrefix; +String mqttRootDevice; void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length); const String getMqttStateStr(); void sendAllData(); void sendAllWigets(); -boolean sendSTATUS(String topic, String state); +boolean publicStatus(String topic, String state); void outcoming_date(); void initMQTT() { @@ -43,7 +44,7 @@ void initMQTT() { nullptr, true); } -void do_mqtt_connection() { +void reconnectMQTT() { if (mqttParamsChanged) { mqtt.disconnect(); connectMQTT(); @@ -63,12 +64,12 @@ void subscribe() { // Для приема получения HELLOW и подтверждения связи // Подписываемся на топики control // Подписываемся на топики order - mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); - mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/+/control").c_str()); - mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/order").c_str()); - mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/update").c_str()); - mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devc").c_str()); - mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devs").c_str()); + mqtt.subscribe(mqttPrefix.c_str()); + mqtt.subscribe((mqttRootDevice + "/+/control").c_str()); + mqtt.subscribe((mqttRootDevice + "/order").c_str()); + mqtt.subscribe((mqttRootDevice + "/update").c_str()); + mqtt.subscribe((mqttRootDevice + "/devc").c_str()); + mqtt.subscribe((mqttRootDevice + "/devs").c_str()); } boolean connectMQTT() { @@ -77,15 +78,19 @@ boolean connectMQTT() { } String addr = jsonReadStr(configSetupJson, "mqttServer"); - int port = jsonReadInt(configSetupJson, "mqttPort"); - String user = jsonReadStr(configSetupJson, "mqttUser"); - String pass = jsonReadStr(configSetupJson, "mqttPass"); - mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix"); - if (!addr) { pm.error("no broker address"); return false; } + + int port = jsonReadInt(configSetupJson, "mqttPort"); + String user = jsonReadStr(configSetupJson, "mqttUser"); + String pass = jsonReadStr(configSetupJson, "mqttPass"); + + //Session params + mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix"); + mqttRootDevice = mqttPrefix + "/" + chipId; + pm.info("broker " + addr + ":" + String(port, DEC)); setLedStatus(LED_FAST); mqtt.setServer(addr.c_str(), port); @@ -164,7 +169,7 @@ boolean publish(const String& topic, const String& data) { } boolean publishData(const String& topic, const String& data) { - String path = mqttPrefix + "/" + chipId + "/" + topic; + String path = mqttRootDevice + "/" + topic; if (!publish(path, data)) { pm.error("on publish data"); return false; @@ -173,7 +178,7 @@ boolean publishData(const String& topic, const String& data) { } boolean publishChart(const String& topic, const String& data) { - String path = mqttPrefix + "/" + chipId + "/" + topic + "/status"; + String path = mqttRootDevice + "/" + topic + "/status"; if (!publish(path, data)) { pm.error("on publish chart"); return false; @@ -187,15 +192,15 @@ boolean publishControl(String id, String topic, String state) { } boolean sendCHART_test(String topic, String data) { - topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status"; + topic = mqttRootDevice + "/" + topic + "/status"; return mqtt.publish(topic.c_str(), data.c_str(), false); } -boolean sendSTATUS(String topic, String state) { - topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status"; - String json_ = "{}"; - jsonWriteStr(json_, "status", state); - return mqtt.publish(topic.c_str(), json_.c_str(), false); +boolean publishStatus(const String& topic, const String& data) { + String path = mqttRootDevice + "/" + topic + "/status"; + String json = "{}"; + jsonWriteStr(json, "status", data); + return mqtt.publish(topic.c_str(), json.c_str(), false); } //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== @@ -239,23 +244,29 @@ void sendAllWigets() { #endif //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== -void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает - String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} +void sendAllData() { + // берет строку json и ключи превращает в топики а значения колючей в них посылает + // {"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} + // "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1" + // "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1", + String current_config = configLiveJson; printMemoryStatus("[I] after send all date"); current_config.replace("{", ""); - current_config.replace("}", ""); //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1" - current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1", + current_config.replace("}", ""); + current_config += ","; - while (current_config.length() != 0) { + while (current_config.length()) { String tmp = selectToMarker(current_config, ","); + String topic = selectToMarker(tmp, ":"); topic.replace("\"", ""); + String state = selectToMarkerLast(tmp, ":"); state.replace("\"", ""); + if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) { - sendSTATUS(topic, state); - //Serial.println("-->" + topic + " " + state); + publishStatus(topic, state); } current_config = deleteBeforeDelimiter(current_config, ","); } diff --git a/src/Scenario.cpp b/src/Scenario.cpp index ab9e4d0c..67fa00fa 100644 --- a/src/Scenario.cpp +++ b/src/Scenario.cpp @@ -1,6 +1,6 @@ #include "Global.h" -void handleScenario() { +void loopScenario() { if (jsonReadStr(configSetupJson, "scen") == "1") { if ((jsonReadStr(configOptionJson, "scenario_status") != "")) { int i = 0; @@ -15,7 +15,6 @@ void handleScenario() { i++; if (scenario_line_status[i] == 1) { - //Serial.println(i); String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) String param_name = selectFromMarkerToMarker(condition, " ", 0); String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий @@ -72,24 +71,23 @@ void handleScenario() { } } -void eventGen(String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1 - +//событие выглядит как имя плюс set плюс номер: button+Set+1 +void eventGen(String event_name, String number) { if (jsonReadStr(configSetupJson, "scen") == "1") { String tmp = jsonReadStr(configOptionJson, "scenario_status"); //генерирование события - //Serial.println(event_name); jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ","); } } -String add_set(String param_name) { - String num1 = param_name.substring(param_name.length() - 1); - String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1); +String add_set(String str) { + String num1 = str.substring(str.length() - 1); + String num2 = str.substring(str.length() - 2, str.length() - 1); if (isDigitStr(num1) && isDigitStr(num2)) { - param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1; + str = str.substring(0, str.length() - 2) + "Set" + num2 + num1; } else { if (isDigitStr(num1)) { - param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1; + str = str.substring(0, str.length() - 1) + "Set" + num1; } } - return param_name; + return str; } \ No newline at end of file diff --git a/src/Sensors.cpp b/src/Sensors.cpp index 61ab8fd3..5b8c851c 100644 --- a/src/Sensors.cpp +++ b/src/Sensors.cpp @@ -4,11 +4,11 @@ OneWire *oneWire; GMedian<10, int> medianFilter; DHTesp dht; -Adafruit_BMP280 bmp; +Adafruit_BMP280 bmp; Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor(); Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor(); -Adafruit_BME280 bme; +Adafruit_BME280 bme; Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); @@ -146,12 +146,12 @@ void ultrasonic_reading() { jsonWriteInt(configLiveJson, levelPr_value_name, level); eventGen(levelPr_value_name, ""); - sendSTATUS(levelPr_value_name, String(level)); + publishStatus(levelPr_value_name, String(level)); Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level)); jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm); eventGen(ultrasonicCm_value_name, ""); - sendSTATUS(ultrasonicCm_value_name, String(distance_cm)); + publishStatus(ultrasonicCm_value_name, String(distance_cm)); Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm)); } } @@ -201,7 +201,7 @@ void analog_reading1() { jsonReadInt(configOptionJson, value_name + "_end_out")); jsonWriteInt(configLiveJson, value_name, analog); eventGen(value_name, ""); - sendSTATUS(value_name, String(analog)); + publishStatus(value_name, String(analog)); Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); } @@ -220,7 +220,7 @@ void analog_reading2() { jsonReadInt(configOptionJson, value_name + "_end_out")); jsonWriteInt(configLiveJson, value_name, analog); eventGen(value_name, ""); - sendSTATUS(value_name, String(analog)); + publishStatus(value_name, String(analog)); Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); } #endif @@ -249,7 +249,7 @@ void dallas_reading() { temp = sensors.getTempCByIndex(0); jsonWriteStr(configLiveJson, "dallas", String(temp)); eventGen("dallas", ""); - sendSTATUS("dallas", String(temp)); + publishStatus("dallas", String(temp)); Serial.println("[I] sensor 'dallas' send date " + String(temp)); } #endif @@ -280,7 +280,7 @@ void dhtT_reading() { float value = 0; static int counter; if (dht.getStatus() != 0 && counter < 5) { - sendSTATUS(dhtT_value_name, String(dht.getStatusString())); + publishStatus(dhtT_value_name, String(dht.getStatusString())); counter++; } else { counter = 0; @@ -288,7 +288,7 @@ void dhtT_reading() { if (String(value) != "nan") { eventGen(dhtT_value_name, ""); jsonWriteStr(configLiveJson, dhtT_value_name, String(value)); - sendSTATUS(dhtT_value_name, String(value)); + publishStatus(dhtT_value_name, String(value)); Serial.println("[I] sensor '" + dhtT_value_name + "' data: " + String(value)); } } @@ -318,7 +318,7 @@ void dhtH_reading() { float value = 0; static int counter; if (dht.getStatus() != 0 && counter < 5) { - sendSTATUS(dhtH_value_name, String(dht.getStatusString())); + publishStatus(dhtH_value_name, String(dht.getStatusString())); counter++; } else { counter = 0; @@ -326,7 +326,7 @@ void dhtH_reading() { if (String(value) != "nan") { eventGen(dhtH_value_name, ""); jsonWriteStr(configLiveJson, dhtH_value_name, String(value)); - sendSTATUS(dhtH_value_name, String(value)); + publishStatus(dhtH_value_name, String(value)); Serial.println("[I] sensor '" + dhtH_value_name + "' data: " + String(value)); } } @@ -344,13 +344,13 @@ void dhtP() { void dhtP_reading() { byte value; if (dht.getStatus() != 0) { - sendSTATUS("dhtPerception", String(dht.getStatusString())); + publishStatus("dhtPerception", String(dht.getStatusString())); } else { value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); String final_line = perception(value); jsonWriteStr(configLiveJson, "dhtPerception", final_line); eventGen("dhtPerception", ""); - sendSTATUS("dhtPerception", final_line); + publishStatus("dhtPerception", final_line); if (mqtt.connected()) { Serial.println("[I] sensor 'dhtPerception' data: " + final_line); } @@ -402,13 +402,13 @@ void dhtC() { void dhtC_reading() { ComfortState cf; if (dht.getStatus() != 0) { - sendSTATUS("dhtComfort", String(dht.getStatusString())); + publishStatus("dhtComfort", String(dht.getStatusString())); } else { dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); String final_line = get_comfort_status(cf); jsonWriteStr(configLiveJson, "dhtComfort", final_line); eventGen("dhtComfort", ""); - sendSTATUS("dhtComfort", final_line); + publishStatus("dhtComfort", final_line); Serial.println("[I] sensor 'dhtComfort' send date " + final_line); } } @@ -462,12 +462,12 @@ void dhtD() { void dhtD_reading() { float value; if (dht.getStatus() != 0) { - sendSTATUS("dhtDewpoint", String(dht.getStatusString())); + publishStatus("dhtDewpoint", String(dht.getStatusString())); } else { value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); jsonWriteInt(configLiveJson, "dhtDewpoint", value); eventGen("dhtDewpoint", ""); - sendSTATUS("dhtDewpoint", String(value)); + publishStatus("dhtDewpoint", String(value)); Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value)); } } @@ -503,7 +503,7 @@ void bmp280T_reading() { value = temp_event.temperature; jsonWriteStr(configLiveJson, bmp280T_value_name, String(value)); eventGen(bmp280T_value_name, ""); - sendSTATUS(bmp280T_value_name, String(value)); + publishStatus(bmp280T_value_name, String(value)); Serial.println("[I] sensor '" + bmp280T_value_name + "' data: " + String(value)); } @@ -535,7 +535,7 @@ void bmp280P_reading() { value = value / 1.333224; jsonWriteStr(configLiveJson, bmp280P_value_name, String(value)); eventGen(bmp280P_value_name, ""); - sendSTATUS(bmp280P_value_name, String(value)); + publishStatus(bmp280P_value_name, String(value)); Serial.println("[I] sensor '" + bmp280P_value_name + "' data: " + String(value)); } @@ -560,7 +560,7 @@ void bme280T_reading() { value = bme.readTemperature(); jsonWriteStr(configLiveJson, bme280T_value_name, String(value)); eventGen(bme280T_value_name, ""); - sendSTATUS(bme280T_value_name, String(value)); + publishStatus(bme280T_value_name, String(value)); Serial.println("[I] sensor '" + bme280T_value_name + "' data: " + String(value)); } @@ -584,7 +584,7 @@ void bme280P_reading() { value = value / 1.333224; jsonWriteStr(configLiveJson, bme280P_value_name, String(value)); eventGen(bme280P_value_name, ""); - sendSTATUS(bme280P_value_name, String(value)); + publishStatus(bme280P_value_name, String(value)); Serial.println("[I] sensor '" + bme280P_value_name + "' data: " + String(value)); } @@ -607,7 +607,7 @@ void bme280H_reading() { value = bme.readHumidity(); jsonWriteStr(configLiveJson, bme280H_value_name, String(value)); eventGen(bme280H_value_name, ""); - sendSTATUS(bme280H_value_name, String(value)); + publishStatus(bme280H_value_name, String(value)); Serial.println("[I] sensor '" + bme280H_value_name + "' data: " + String(value)); } @@ -630,6 +630,6 @@ void bme280A_reading() { value = bme.readAltitude(1013.25); jsonWriteStr(configLiveJson, bme280A_value_name, String(value)); eventGen(bme280A_value_name, ""); - sendSTATUS(bme280A_value_name, String(value)); + publishStatus(bme280A_value_name, String(value)); Serial.println("[I] sensor '" + bme280A_value_name + "' data: " + String(value)); } diff --git a/src/Timers.cpp b/src/Timers.cpp index 6cef52ba..dbf451ba 100644 --- a/src/Timers.cpp +++ b/src/Timers.cpp @@ -3,89 +3,89 @@ //================================================================================================================ //=========================================Таймеры================================================================= void Timer_countdown_init() { - - ts.add(TIMER_COUNTDOWN, 1000, [&](void*) { - - String old_line = jsonReadStr(configOptionJson, "timers"); - if (old_line != "") { - //Serial.println(old_line); - int i = 0; - do { - String timer = selectFromMarkerToMarker(old_line, "," , i); - Serial.print("timer no " + String (i) + ": "); - Serial.println(timer); - if (timer == "not found" || timer == "") return; - int number = selectToMarker (timer, ":").toInt(); - int time = readTimer(number); - if (time == 0) { - delTimer (String (number)); - jsonWriteStr(configLiveJson, "timer" + String(number), "0"); - eventGen ("timer", String(number)); - } else { - time--; - addTimer(String (number), String (time)); - } - i++; - } while (i <= 9); - } - }, nullptr, true); + ts.add( + TIMER_COUNTDOWN, 1000, [&](void*) { + String old_line = jsonReadStr(configOptionJson, "timers"); + if (old_line != "") { + //Serial.println(old_line); + int i = 0; + do { + String timer = selectFromMarkerToMarker(old_line, ",", i); + Serial.print("timer no " + String(i) + ": "); + Serial.println(timer); + if (timer == "not found" || timer == "") return; + int number = selectToMarker(timer, ":").toInt(); + int time = readTimer(number); + if (time == 0) { + delTimer(String(number)); + jsonWriteStr(configLiveJson, "timer" + String(number), "0"); + eventGen("timer", String(number)); + } else { + time--; + addTimer(String(number), String(time)); + } + i++; + } while (i <= 9); + } + }, + nullptr, true); } void timerStart_() { - String number = sCmd.next(); - String period_of_time = sCmd.next(); - String type = sCmd.next(); - if (period_of_time.indexOf("digit") != -1) { - //period_of_time = add_set(period_of_time); - period_of_time = jsonReadStr(configLiveJson, period_of_time); - } - if (type == "sec") period_of_time = period_of_time; - if (type == "min") period_of_time = String(period_of_time.toInt() * 60); - if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); - addTimer(number, period_of_time); - jsonWriteStr(configLiveJson, "timer" + number, "1"); + String number = sCmd.next(); + String period_of_time = sCmd.next(); + String type = sCmd.next(); + if (period_of_time.indexOf("digit") != -1) { + //period_of_time = add_set(period_of_time); + period_of_time = jsonReadStr(configLiveJson, period_of_time); + } + if (type == "sec") period_of_time = period_of_time; + if (type == "min") period_of_time = String(period_of_time.toInt() * 60); + if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); + addTimer(number, period_of_time); + jsonWriteStr(configLiveJson, "timer" + number, "1"); } void addTimer(String number, String time) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - String new_timer = number + ":" + time; - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить - ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) - tmp.replace(timer + ",", ""); - tmp += new_timer + ","; - } else { //если его нет - tmp += new_timer + ","; - } - jsonWriteStr(configOptionJson, "timers", tmp); - //Serial.println("ura"); + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + String new_timer = number + ":" + time; + int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить + ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) + tmp.replace(timer + ",", ""); + tmp += new_timer + ","; + } else { //если его нет + tmp += new_timer + ","; + } + jsonWriteStr(configOptionJson, "timers", tmp); + //Serial.println("ura"); } void timerStop_() { - String number = sCmd.next(); - delTimer(number); + String number = sCmd.next(); + delTimer(number); } -void delTimer (String number) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить - tmp.replace(timer, ""); //удаляем таймер - jsonWriteStr(configOptionJson, "timers", tmp); - } +void delTimer(String number) { + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить + tmp.replace(timer, ""); //удаляем таймер + jsonWriteStr(configOptionJson, "timers", tmp); + } } int readTimer(int number) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать - String timer; - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать - timer = deleteBeforeDelimiter(timer, ":"); - } - return timer.toInt(); + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать + String timer; + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать + timer = deleteBeforeDelimiter(timer, ":"); + } + return timer.toInt(); } \ No newline at end of file diff --git a/src/Utils/FileUtils.cpp b/src/Utils/FileUtils.cpp index 5671c37d..8f98c472 100644 --- a/src/Utils/FileUtils.cpp +++ b/src/Utils/FileUtils.cpp @@ -55,25 +55,26 @@ String addFile(const String filename, const String str) { } bool copyFile(const String src, const String dst, bool overwrite) { - String source = filepath(src); - String destination = filepath(dst); - if (!LittleFS.exists(source)) { - pm.error("source not exist: " + source); + String srcPath = filepath(src); + String dstPath = filepath(dst); + if (!LittleFS.exists(srcPath)) { + pm.error("not exist: " + srcPath); return false; } - if (LittleFS.exists(destination)) { + if (LittleFS.exists(dstPath)) { if (!overwrite) { - pm.error("destination already exist: " + destination); + pm.error("already exist: " + dstPath); return false; } - LittleFS.remove(destination); + LittleFS.remove(dstPath); } - auto srcFile = LittleFS.open(source, "r"); - auto dstFile = LittleFS.open(destination, "w"); + auto srcFile = LittleFS.open(srcPath, "r"); + auto dstFile = LittleFS.open(dstPath, "w"); - static uint8_t buf[512]; - while (srcFile.read(buf, 512)) { - dstFile.write(buf, 512); + uint8_t buf[512]; + while (srcFile.available()) { + size_t len = srcFile.read(buf, 512); + dstFile.write(buf, len); } srcFile.close(); dstFile.close(); diff --git a/src/Utils/PresetUtils.cpp b/src/Utils/PresetUtils.cpp new file mode 100644 index 00000000..f9f0cb13 --- /dev/null +++ b/src/Utils/PresetUtils.cpp @@ -0,0 +1,55 @@ +#include "Utils/PresetUtils.h" + +static const char* item_names[NUM_ITEMS] = {"relay", "pwm", + "dht11", "dht22", "analog", + "bmp280", "bme280", "dallas", + "termostat", "ultrasonic", + "motion", "stepper", + "servo", "firmware"}; + +static const char* config_file_fmt = "configs/%d-%s.%s.txt"; + +const String getPresetFile(uint8_t preset, ConfigType_t type) { + Item_t item = getPresetItem(preset); + char buf[64]; + sprintf(buf, config_file_fmt, preset, getItemName(item).c_str(), type == CT_MACRO ? "c" : "s"); + return String(buf); +} + +const String getItemName(Item_t item) { + return String(item_names[item]); +} + +const Item_t getPresetItem(uint8_t num) { + Item_t res = NUM_ITEMS; + if (num >= 1 && num <= 7) { + res = RELAY; + } else if (num == 8) { + res = PWM; + } else if (num == 9) { + res = DHT11; + } else if (num == 10) { + res = DHT22; + } else if (num == 11) { + res = ANALOG; + } else if (num == 12) { + res = BMP280; + } else if (num == 13) { + res = BME280; + } else if (num == 14) { + res = DALLAS; + } else if (num == 15) { + res = TERMOSTAT; + } else if (num == 16) { + res = ULTRASONIC; + } else if (num >= 17 || num <= 18) { + res = MOTION; + } else if (num == 19) { + res = STEPPER; + } else if (num == 20) { + res = SERVO; + } else if (num == 21) { + res = FIRMWARE; + } + return res; +} \ No newline at end of file diff --git a/src/Web.cpp b/src/Web.cpp index c2ea46c3..f47dc71e 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -1,5 +1,7 @@ #include "Global.h" +#include "Utils/PresetUtils.h" + static const char* MODULE = "Web"; static const uint8_t MIN_PRESET = 1; @@ -17,68 +19,13 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) { return false; } -static const char* item_names[NUM_ITEMS] = {"relay", "pwm", - "dht11", "dht22", "analog", - "bmp280", "bme280", "dallas", - "termostat", "ultrasonic", - "motion", "stepper", - "servo", "firmware"}; - -const char* getItemName(Item_t item) { - return item_names[item]; -} - -static const char* config_file_fmt = "configs/%d-%s.%s.txt"; - -const String getPresetFile(uint8_t preset, ConfigType_t type) { - Item_t item = getPresetItem(preset); - char buf[64]; - sprintf(buf, config_file_fmt, preset, getItemName(item), type == CT_MACRO ? "c" : "s"); - return String(buf); -} - -const Item_t getPresetItem(uint8_t preset) { - Item_t res = NUM_ITEMS; - if (preset >= 1 && preset <= 7) { - res = RELAY; - } else if (preset == 8) { - res = PWM; - } else if (preset == 9) { - res = DHT11; - } else if (preset == 10) { - res = DHT22; - } else if (preset == 11) { - res = ANALOG; - } else if (preset == 12) { - res = BMP280; - } else if (preset == 13) { - res = BME280; - } else if (preset == 14) { - res = DALLAS; - } else if (preset == 15) { - res = TERMOSTAT; - } else if (preset == 16) { - res = ULTRASONIC; - } else if (preset >= 17 || preset <= 18) { - res = MOTION; - } else if (preset == 19) { - res = STEPPER; - } else if (preset == 20) { - res = SERVO; - } else if (preset == 21) { - res = FIRMWARE; - } - return res; -} - void web_init() { server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) { uint8_t preset; if (parseRequestForPreset(request, preset)) { String srcMacro = preset == 21 ? "configs/firmware.c.txt" : getPresetFile(preset, CT_MACRO); String srcScenario = preset == 21 ? "configs/firmware.s.txt" : getPresetFile(preset, CT_SCENARIO); - pm.info("activate " + srcMacro); - pm.info("activate " + srcScenario); + pm.info("activate " + getItemName(getPresetItem(preset))); copyFile(srcMacro, "firmware.c.txt"); copyFile(srcScenario, "firmware.s.txt"); diff --git a/src/main.cpp b/src/main.cpp index d88adfe6..6fadabd2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,17 +86,17 @@ void loop() { not_async_actions(); loopMQTT(); - handleCMD_loop(); - handleButton(); - handleScenario(); + loopCmd(); + loopButton(); + loopScenario(); #ifdef UDP_ENABLED - handleUdp(); + loopUdp(); #endif ts.update(); } void not_async_actions() { - do_mqtt_connection(); + reconnectMQTT(); do_upgrade_url(); do_upgrade(); @@ -123,15 +123,13 @@ String getURL(const String& urls) { } void safeDataToFile(String data, String Folder) { - //String fileName = GetDate(); String fileName; fileName.toLowerCase(); fileName = deleteBeforeDelimiter(fileName, " "); fileName.replace(" ", "."); fileName.replace("..", "."); fileName = Folder + "/" + fileName + ".txt"; - // addFile(fileName, GetTime() + "/" + data); - Serial.println(fileName); + jsonWriteStr(configLiveJson, "test", fileName); } diff --git a/src/udp.cpp b/src/udp.cpp index 95c8c4ff..f2a9be5a 100644 --- a/src/udp.cpp +++ b/src/udp.cpp @@ -54,7 +54,7 @@ void UDP_init() { nullptr, false); } -void handleUdp() { +void loopUdp() { #ifdef ESP8266 if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (WiFi.status() == WL_CONNECTED) {