SoftwareSerial

This commit is contained in:
Yuri Trikoz
2020-06-22 17:40:29 +03:00
parent f7e3515c82
commit 8f395ccc8a
12 changed files with 274 additions and 242 deletions

View File

@@ -25,6 +25,7 @@
#include "Utils\WiFiUtils.h"
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
#include <SoftwareSerial.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <Bounce2.h>
@@ -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();

View File

@@ -0,0 +1,11 @@
#pragma once
#include <Arduino.h>
#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);

View File

@@ -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, ","); //осекаем
}
}

View File

@@ -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, ",");
}

View File

@@ -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;
}

View File

@@ -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));
}

View File

@@ -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();
}

View File

@@ -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();

55
src/Utils/PresetUtils.cpp Normal file
View File

@@ -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;
}

View File

@@ -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");

View File

@@ -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);
}

View File

@@ -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) {