diff --git a/data/configs/firmware.c.txt b/data/100c.txt
similarity index 100%
rename from data/configs/firmware.c.txt
rename to data/100c.txt
diff --git a/data/configs/firmware.s.txt b/data/100s.txt
similarity index 100%
rename from data/configs/firmware.s.txt
rename to data/100s.txt
diff --git a/data/configs/1-relay.c.txt b/data/configs/001c.txt
similarity index 100%
rename from data/configs/1-relay.c.txt
rename to data/configs/001c.txt
diff --git a/data/configs/1-relay.s.txt b/data/configs/001s.txt
similarity index 100%
rename from data/configs/1-relay.s.txt
rename to data/configs/001s.txt
diff --git a/data/configs/2-relay.c.txt b/data/configs/002c.txt
similarity index 100%
rename from data/configs/2-relay.c.txt
rename to data/configs/002c.txt
diff --git a/data/configs/2-relay.s.txt b/data/configs/002s.txt
similarity index 100%
rename from data/configs/2-relay.s.txt
rename to data/configs/002s.txt
diff --git a/data/configs/3-relay.c.txt b/data/configs/003c.txt
similarity index 100%
rename from data/configs/3-relay.c.txt
rename to data/configs/003c.txt
diff --git a/data/configs/3-relay.s.txt b/data/configs/003s.txt
similarity index 100%
rename from data/configs/3-relay.s.txt
rename to data/configs/003s.txt
diff --git a/data/configs/4-relay.c.txt b/data/configs/004c.txt
similarity index 100%
rename from data/configs/4-relay.c.txt
rename to data/configs/004c.txt
diff --git a/data/configs/4-relay.s.txt b/data/configs/004s.txt
similarity index 100%
rename from data/configs/4-relay.s.txt
rename to data/configs/004s.txt
diff --git a/data/configs/5-relay.c.txt b/data/configs/005c.txt
similarity index 100%
rename from data/configs/5-relay.c.txt
rename to data/configs/005c.txt
diff --git a/data/configs/5-relay.s.txt b/data/configs/005s.txt
similarity index 100%
rename from data/configs/5-relay.s.txt
rename to data/configs/005s.txt
diff --git a/data/configs/6-relay.c.txt b/data/configs/006c.txt
similarity index 100%
rename from data/configs/6-relay.c.txt
rename to data/configs/006c.txt
diff --git a/data/configs/6-relay.s.txt b/data/configs/006s.txt
similarity index 100%
rename from data/configs/6-relay.s.txt
rename to data/configs/006s.txt
diff --git a/data/configs/7-relay.c.txt b/data/configs/007c.txt
similarity index 100%
rename from data/configs/7-relay.c.txt
rename to data/configs/007c.txt
diff --git a/data/configs/7-relay.s.txt b/data/configs/007s.txt
similarity index 100%
rename from data/configs/7-relay.s.txt
rename to data/configs/007s.txt
diff --git a/data/configs/8-pwm.c.txt b/data/configs/008c.txt
similarity index 100%
rename from data/configs/8-pwm.c.txt
rename to data/configs/008c.txt
diff --git a/data/configs/10-dht22.s.txt b/data/configs/008s.txt
similarity index 100%
rename from data/configs/10-dht22.s.txt
rename to data/configs/008s.txt
diff --git a/data/configs/9-dht11.c.txt b/data/configs/009c.txt
similarity index 100%
rename from data/configs/9-dht11.c.txt
rename to data/configs/009c.txt
diff --git a/data/configs/11-analog.s.txt b/data/configs/009s.txt
similarity index 100%
rename from data/configs/11-analog.s.txt
rename to data/configs/009s.txt
diff --git a/data/configs/10-dht22.c.txt b/data/configs/010c.txt
similarity index 100%
rename from data/configs/10-dht22.c.txt
rename to data/configs/010c.txt
diff --git a/data/configs/12-bmp280.s.txt b/data/configs/010s.txt
similarity index 100%
rename from data/configs/12-bmp280.s.txt
rename to data/configs/010s.txt
diff --git a/data/configs/11-analog.c.txt b/data/configs/011c.txt
similarity index 100%
rename from data/configs/11-analog.c.txt
rename to data/configs/011c.txt
diff --git a/data/configs/13-bme280.s.txt b/data/configs/011s.txt
similarity index 100%
rename from data/configs/13-bme280.s.txt
rename to data/configs/011s.txt
diff --git a/data/configs/12-bmp280.c.txt b/data/configs/012c.txt
similarity index 100%
rename from data/configs/12-bmp280.c.txt
rename to data/configs/012c.txt
diff --git a/data/configs/14-dallas.s.txt b/data/configs/012s.txt
similarity index 100%
rename from data/configs/14-dallas.s.txt
rename to data/configs/012s.txt
diff --git a/data/configs/13-bme280.c.txt b/data/configs/013c.txt
similarity index 100%
rename from data/configs/13-bme280.c.txt
rename to data/configs/013c.txt
diff --git a/data/configs/8-pwm.s.txt b/data/configs/013s.txt
similarity index 100%
rename from data/configs/8-pwm.s.txt
rename to data/configs/013s.txt
diff --git a/data/configs/14-dallas.c.txt b/data/configs/014c.txt
similarity index 100%
rename from data/configs/14-dallas.c.txt
rename to data/configs/014c.txt
diff --git a/data/configs/9-dht11.s.txt b/data/configs/014s.txt
similarity index 100%
rename from data/configs/9-dht11.s.txt
rename to data/configs/014s.txt
diff --git a/data/configs/15-termostat.c.txt b/data/configs/015c.txt
similarity index 100%
rename from data/configs/15-termostat.c.txt
rename to data/configs/015c.txt
diff --git a/data/configs/15-termostat.s.txt b/data/configs/015s.txt
similarity index 100%
rename from data/configs/15-termostat.s.txt
rename to data/configs/015s.txt
diff --git a/data/configs/16-ultrasonic.c.txt b/data/configs/016c.txt
similarity index 100%
rename from data/configs/16-ultrasonic.c.txt
rename to data/configs/016c.txt
diff --git a/data/configs/16-ultrasonic.s.txt b/data/configs/016s.txt
similarity index 100%
rename from data/configs/16-ultrasonic.s.txt
rename to data/configs/016s.txt
diff --git a/data/configs/17-motion.c.txt b/data/configs/017c.txt
similarity index 100%
rename from data/configs/17-motion.c.txt
rename to data/configs/017c.txt
diff --git a/data/configs/17-motion.s.txt b/data/configs/017s.txt
similarity index 100%
rename from data/configs/17-motion.s.txt
rename to data/configs/017s.txt
diff --git a/data/configs/18-motion.c.txt b/data/configs/018c.txt
similarity index 100%
rename from data/configs/18-motion.c.txt
rename to data/configs/018c.txt
diff --git a/data/configs/18-motion.s.txt b/data/configs/018s.txt
similarity index 100%
rename from data/configs/18-motion.s.txt
rename to data/configs/018s.txt
diff --git a/data/configs/19-stepper.c.txt b/data/configs/019c.txt
similarity index 100%
rename from data/configs/19-stepper.c.txt
rename to data/configs/019c.txt
diff --git a/data/configs/19-stepper.s.txt b/data/configs/019s.txt
similarity index 100%
rename from data/configs/19-stepper.s.txt
rename to data/configs/019s.txt
diff --git a/data/configs/20-servo.c.txt b/data/configs/020c.txt
similarity index 100%
rename from data/configs/20-servo.c.txt
rename to data/configs/020c.txt
diff --git a/data/configs/20-servo.s.txt b/data/configs/020s.txt
similarity index 100%
rename from data/configs/20-servo.s.txt
rename to data/configs/020s.txt
diff --git a/data/configs/021c.txt b/data/configs/021c.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/data/configs/021s.txt b/data/configs/021s.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/data/firmware.c.txt b/data/configs/100c.txt
similarity index 100%
rename from data/firmware.c.txt
rename to data/configs/100c.txt
diff --git a/data/firmware.s.txt b/data/configs/100s.txt
similarity index 100%
rename from data/firmware.s.txt
rename to data/configs/100s.txt
diff --git a/data/set.device.json b/data/set.device.json
index 33cd7b9b..7206dbc0 100644
--- a/data/set.device.json
+++ b/data/set.device.json
@@ -55,27 +55,28 @@
"style": "display:inline",
"title": {
"#": "{{SetDevPreset}}",
- "/set?preset=1": "1.Вкл. выкл. локального реле",
- "/set?preset=2": "2.Вкл. выкл. локального реле в определенное время",
- "/set?preset=3": "3.Вкл. выкл. локального реле на определенный период времени",
- "/set?preset=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
- "/set?preset=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
- "/set?preset=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
- "/set?preset=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
- "/set?preset=8": "8.Широтно импульсная модуляция",
- "/set?preset=9": "9.Сенсор DHT11 (темп, влажность) и логгирование",
- "/set?preset=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
- "/set?preset=11": "11.Аналоговый сенсор и логгирование",
- "/set?preset=12": "12.Cенсор bmp280 (темп, давление) и логгирование",
- "/set?preset=13": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
- "/set?preset=14": "12.Сенсор DS18B20 (темп) и логгирование",
- "/set?preset=15": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
- "/set?preset=16": "14.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
- "/set?preset=17": "15.Датчик движения включающий свет",
- "/set?preset=18": "16.Охранный датчик движения",
- "/set?preset=19": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
- "/set?preset=20": "18.Система управления сервоприводами",
- "/set?preset=21": "Настройки по умолчанию"
+ "/set?preset=001": "1.Вкл. выкл. локального реле",
+ "/set?preset=002": "2.Вкл. выкл. локального реле в определенное время",
+ "/set?preset=003": "3.Вкл. выкл. локального реле на определенный период времени",
+ "/set?preset=004": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
+ "/set?preset=005": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
+ "/set?preset=006": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
+ "/set?preset=007": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
+ "/set?preset=008": "8.Широтно импульсная модуляция",
+ "/set?preset=009": "9.Сенсор DHT11 (темп, влажность) и логгирование",
+ "/set?preset=010": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
+ "/set?preset=011": "11.Аналоговый сенсор и логгирование",
+ "/set?preset=012": "12.Cенсор bmp280 (темп, давление) и логгирование",
+ "/set?preset=013": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
+ "/set?preset=014": "14.Сенсор DS18B20 (темп) и логгирование",
+ "/set?preset=015": "15.Термостат на DS18B20 с переключением в ручной режим и логгированием",
+ "/set?preset=016": "16.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
+ "/set?preset=017": "17.Датчик движения включающий свет",
+ "/set?preset=018": "18.Охранный датчик движения",
+ "/set?preset=019": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
+ "/set?preset=020": "20.Система управления сервоприводами",
+ "/set?preset=021": "21.Модуль uart (serial). Двухстороняя связь с устройством через uart. Получение данных и отправка команд",
+ "/set?preset=100": "22.Настройки по умолчанию"
}
},
{
@@ -84,7 +85,7 @@
},
{
"type": "file",
- "state": "firmware.c.txt",
+ "state": "100с.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?devinit",
@@ -103,7 +104,7 @@
},
{
"type": "file",
- "state": "firmware.s.txt",
+ "state": "100s.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?sceninit",
diff --git a/include/CaptiveRequestHandler.h b/include/CaptiveRequestHandler.h
new file mode 100644
index 00000000..97c74370
--- /dev/null
+++ b/include/CaptiveRequestHandler.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include
+
+class CaptiveRequestHandler : public AsyncWebHandler {
+ public:
+ CaptiveRequestHandler(const char *host);
+
+ virtual ~CaptiveRequestHandler();
+
+ bool canHandle(AsyncWebServerRequest *request) override;
+
+ void handleRequest(AsyncWebServerRequest *request) override;
+
+ private:
+ bool isLocalIp(String name);
+ bool isLocalName(String name);
+
+ private:
+ char _local_name[32];
+ IPAddress _local_ip;
+};
diff --git a/include/CommonTypes.h b/include/CommonTypes.h
index e0beebba..7ad65e65 100644
--- a/include/CommonTypes.h
+++ b/include/CommonTypes.h
@@ -1,5 +1,24 @@
#pragma once
+enum TimerTask_t { WIFI_SCAN,
+ WIFI_MQTT_CONNECTION_CHECK,
+ SENSORS,
+ STEPPER1,
+ STEPPER2,
+ LOG1,
+ LOG2,
+ LOG3,
+ LOG4,
+ LOG5,
+ TIMER_COUNTDOWN,
+ TIME,
+ TIME_SYNC,
+ STATISTICS,
+ UPTIME,
+ UDP,
+ UDP_DB,
+ TEST };
+
enum ErrorType_t {
ET_NONE,
ET_FUNCTION,
diff --git a/include/Global.h b/include/Global.h
index fec124c4..ab5ca375 100644
--- a/include/Global.h
+++ b/include/Global.h
@@ -16,6 +16,7 @@
#include "UptimeInterval.h"
#include "Clock.h"
+#include "MqttClient.h"
#include "Utils\FileUtils.h"
#include "Utils\JsonUtils.h"
#include "Utils\StringUtils.h"
@@ -63,31 +64,13 @@ extern AsyncWebServer server;
extern DallasTemperature sensors;
extern boolean but[NUM_BUTTONS];
+
extern Bounce* buttons;
/*
* Global vars
*/
-enum { WIFI_SCAN,
- WIFI_MQTT_CONNECTION_CHECK,
- SENSORS,
- STEPPER1,
- STEPPER2,
- LOG1,
- LOG2,
- LOG3,
- LOG4,
- LOG5,
- TIMER_COUNTDOWN,
- TIME,
- TIME_SYNC,
- STATISTICS,
- UPTIME,
- UDP,
- UDP_DB,
- TEST };
-
extern boolean just_load;
extern String configSetupJson; //все настройки
@@ -199,18 +182,6 @@ extern void servo_();
extern void setLedStatus(LedStatus_t);
-// Mqtt
-extern void initMQTT();
-extern void loopMQTT();
-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 void reconnectMQTT();
-
//Scenario
extern void eventGen(String event_name, String number);
extern String add_set(String param_name);
@@ -284,6 +255,7 @@ extern void do_mqtt_send_settings_to_udp();
extern void Web_server_init();
// iot_firmware
+extern void loopSerial();
extern void loopCmd();
extern void loopButton();
extern void loopScenario();
diff --git a/include/Module/Telnet.h b/include/Module/Telnet.h
index 38ec2a91..ade6e4f2 100644
--- a/include/Module/Telnet.h
+++ b/include/Module/Telnet.h
@@ -24,6 +24,7 @@ class Telnet : public Module {
void sendData(const String&);
bool hasClient();
bool isShellActive();
+ void setCommandShell(CommandShell*);
protected:
bool onInit() override;
diff --git a/include/Module/Terminal.h b/include/Module/Terminal.h
index 859f227d..3d3234d8 100644
--- a/include/Module/Terminal.h
+++ b/include/Module/Terminal.h
@@ -114,7 +114,7 @@ enum State { ST_INACTIVE,
class Terminal : public Print {
public:
Terminal(Stream *stream = nullptr);
- ~Terminal();
+
void setStream(Stream *stream);
void setEOL(EOLType_t code);
void enableControlCodes(bool enabled = true);
@@ -152,12 +152,12 @@ class Terminal : public Print {
uint8_t curY = 0xff;
uint8_t curX = 0xff;
- unsigned long lastReceived = 0;
- State state = ST_INACTIVE;
+ unsigned long _lastReceived = 0;
+ State state;
Stream *_stream;
EditLine _line;
- char cc_buf[32] = {0};
- size_t cc_pos = 0;
+ char _cc_buf[32] = {0};
+ size_t _cc_pos = 0;
bool _color = false;
bool _controlCodes = false;
bool _echo = false;
diff --git a/include/MqttClient.h b/include/MqttClient.h
new file mode 100644
index 00000000..74977ef6
--- /dev/null
+++ b/include/MqttClient.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include
+
+namespace MqttClient {
+
+void init();
+boolean connect();
+void reconnect();
+void loop();
+
+void subscribe();
+
+boolean publish(const String& topic, const String& data);
+boolean publishData(const String& topic, const String& data);
+boolean publishChart(const String& topic, const String& data);
+boolean publishControl(String id, String topic, String state);
+boolean publishChart_test(const String& topic, const String& data);
+boolean publishStatus(const String& topic, const String& data);
+
+void publishWidgets();
+void publishState();
+
+void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
+const String getStateStr();
+
+} // namespace MqttClient
diff --git a/include/Utils/TimeUtils.h b/include/Utils/TimeUtils.h
index f5af3064..82337b34 100644
--- a/include/Utils/TimeUtils.h
+++ b/include/Utils/TimeUtils.h
@@ -39,4 +39,14 @@ int timeZoneInSeconds(const byte timeZone);
bool hasTimeSynced();
-int getBiasInSeconds();
\ No newline at end of file
+int getBiasInSeconds();
+
+/*
+* Время (мс) прошедщее с @simce
+*/
+unsigned long millis_since(unsigned long sinse);
+
+/*
+* Интерввал времени (мс) между @start и @fimish
+*/
+unsigned long millis_passed(unsigned long start, unsigned long finish);
\ No newline at end of file
diff --git a/src/CaptiveRequestHandler.cpp b/src/CaptiveRequestHandler.cpp
new file mode 100644
index 00000000..111021fb
--- /dev/null
+++ b/src/CaptiveRequestHandler.cpp
@@ -0,0 +1,33 @@
+#include "CaptiveRequestHandler.h"
+
+CaptiveRequestHandler::CaptiveRequestHandler(const char *host) {
+ strlcpy(_local_name, host, sizeof(_local_name));
+ strcat(_local_name, ".local");
+}
+
+CaptiveRequestHandler::~CaptiveRequestHandler() {
+}
+
+bool CaptiveRequestHandler::isLocalIp(String address) {
+ IPAddress ip;
+ return !ip.fromString(address) || (ip != _local_ip);
+}
+
+bool CaptiveRequestHandler::isLocalName(String host_name) {
+ return host_name.equalsIgnoreCase(_local_name);
+}
+
+bool CaptiveRequestHandler::canHandle(AsyncWebServerRequest *request) {
+ _local_ip = request->client()->localIP();
+
+ return !isLocalIp(request->getHeader("HOST")->value()) && !isLocalName(request->getHeader("HOST")->value());
+}
+
+void CaptiveRequestHandler::CaptiveRequestHandler::handleRequest(AsyncWebServerRequest *request) {
+ char buf[64];
+ sprintf(buf, "http://%s%s", _local_name, request->url().c_str());
+ auto response = request->beginResponse(302, "text/html");
+ response->addHeader("Location", buf);
+ response->addHeader("Connection", "close");
+ request->send(response);
+};
diff --git a/src/Cmd.cpp b/src/Cmd.cpp
index a86012fc..7f4bb7c9 100644
--- a/src/Cmd.cpp
+++ b/src/Cmd.cpp
@@ -1,5 +1,11 @@
#include "Global.h"
+#include "Module/Terminal.h"
+
+static const char *MODULE = "Cmd";
+
+Terminal *term = nullptr;
+
boolean but[NUM_BUTTONS];
Bounce *buttons = new Bounce[NUM_BUTTONS];
@@ -167,7 +173,7 @@ void buttonSet() {
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
- publishStatus("button" + button_number, button_state);
+ MqttClient::publishStatus("button" + button_number, button_state);
}
void buttonChange() {
@@ -181,7 +187,7 @@ void buttonChange() {
}
order_loop += "buttonSet " + button_number + " " + current_state + ",";
jsonWriteStr(configLiveJson, "button" + button_number, current_state);
- publishStatus("button" + button_number, current_state);
+ MqttClient::publishStatus("button" + button_number, current_state);
}
void pinSet() {
@@ -230,7 +236,7 @@ void pwmSet() {
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
- publishStatus("pwm" + pwm_number, pwm_state);
+ MqttClient::publishStatus("pwm" + pwm_number, pwm_state);
}
//==================================================================================================================
//==========================================Модуль физической кнопки================================================
@@ -244,6 +250,12 @@ void switch_() {
but[switch_number.toInt()] = true;
}
+void loopSerial() {
+ if (term) {
+ term->loop();
+ }
+}
+
void loopButton() {
static uint8_t switch_number = 1;
@@ -285,7 +297,7 @@ void digitSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, value);
- publishStatus("digit" + number, value);
+ MqttClient::publishStatus("digit" + number, value);
}
//=====================================================================================================================================
@@ -307,7 +319,7 @@ void timeSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, value);
- publishStatus("time" + number, value);
+ MqttClient::publishStatus("time" + number, value);
}
void handle_time_init() {
@@ -347,7 +359,7 @@ void textSet() {
}
jsonWriteStr(configLiveJson, "text" + number, text);
- publishStatus("text" + number, text);
+ MqttClient::publishStatus("text" + number, text);
}
//=====================================================================================================================================
//=========================================Модуль шагового мотора======================================================================
@@ -503,7 +515,7 @@ void servoSet() {
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
- publishStatus("servo" + servo_number, servo_state);
+ MqttClient::publishStatus("servo" + servo_number, servo_state);
}
#endif
@@ -516,14 +528,27 @@ void serialBegin() {
if (mySerial) {
delete mySerial;
}
+
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
mySerial->begin(s_speed.toInt());
+
+ term = new Terminal(mySerial);
+ term->setEOL(LF);
+ term->enableColors(false);
+ term->enableControlCodes(false);
+ term->enableEcho(false);
+ term->setOnReadLine([](const char *str) {
+ String line = String(str);
+ pm.info("serial read: " + line);
+ //line.replace("#", " ");
+ order_loop += line + ",";
+ });
}
void serialWrite() {
String payload = sCmd.next();
- if (mySerial) {
- mySerial->println(payload);
+ if (term) {
+ term->println(payload.c_str());
}
}
#endif
diff --git a/src/Init.cpp b/src/Init.cpp
index 48f9d69e..f2dc3952 100644
--- a/src/Init.cpp
+++ b/src/Init.cpp
@@ -60,14 +60,14 @@ void Device_init() {
removeFile("/layout.txt");
#endif
- txtExecution("firmware.c.txt");
+ txtExecution("100с.txt");
//outcoming_date();
}
//-------------------------------сценарии-----------------------------------------------------
void Scenario_init() {
if (jsonReadStr(configSetupJson, "scen") == "1") {
- scenario = readFile("firmware.s.txt", 2048);
+ scenario = readFile("100s.txt", 2048);
}
}
diff --git a/src/Logging.cpp b/src/Logging.cpp
index 5fb898b9..c6c40454 100644
--- a/src/Logging.cpp
+++ b/src/Logging.cpp
@@ -134,7 +134,8 @@ void sendLogData(String file, String topic) {
log_date = "";
json_array = "{\"status\":[" + json_array + "]}";
Serial.println(json_array);
- publishChart(topic, json_array);
+
+ MqttClient::publishChart(topic, json_array);
json_array = "";
printMemoryStatus("[I] send log date");
}
diff --git a/src/Module/Telnet.cpp b/src/Module/Telnet.cpp
index 0c2681ee..f4b92fc7 100644
--- a/src/Module/Telnet.cpp
+++ b/src/Module/Telnet.cpp
@@ -6,9 +6,6 @@ bool Telnet::onInit() {
_term->enableControlCodes();
_term->enableEcho(false);
_term->setStream(&_client);
-
- // _shell = new CommandShell(Cli::get());
- _shell->setTerm(_term);
return true;
}
@@ -37,6 +34,11 @@ void Telnet::sendData(const String& data) {
}
}
+void Telnet::setCommandShell(CommandShell* shell) {
+ _shell = shell;
+ _shell->setTerm(_term);
+}
+
void Telnet::setEventHandler(TelnetEventHandler h) { _eventHandler = h; }
void Telnet::onLoop() {
diff --git a/src/Module/Terminal.cpp b/src/Module/Terminal.cpp
new file mode 100644
index 00000000..4de12887
--- /dev/null
+++ b/src/Module/Terminal.cpp
@@ -0,0 +1,320 @@
+#include "Module/Terminal.h"
+
+#include "Utils/TimeUtils.h"
+
+#define INPUT_MAX_LENGHT 255
+
+Terminal::Terminal(Stream *stream) : _stream{stream},
+ _line(INPUT_MAX_LENGHT),
+ _cc_pos(0),
+ _color(false),
+ _controlCodes(false),
+ _echo(false),
+ _eol(CRLF) { state = ST_NORMAL; };
+
+void Terminal::setStream(Stream *stream) {
+ _stream = stream;
+}
+
+void Terminal::setOnReadLine(TerminalInputEventHandler h) { inputHandler_ = h; }
+
+void Terminal::setOnEvent(TerminalEventHandler h) { eventHandler_ = h; }
+
+bool Terminal::available() {
+ return _stream != nullptr ? _stream->available() : false;
+}
+
+void Terminal::setEOL(EOLType_t eol) {
+ _eol = eol;
+}
+
+void Terminal::enableEcho(bool enabled) {
+ _echo = enabled;
+}
+
+void Terminal::enableColors(bool enabled) {
+ _color = enabled;
+}
+
+void Terminal::enableControlCodes(bool enabled) {
+ _controlCodes = enabled;
+}
+
+void Terminal::quit() {}
+
+void Terminal::loop() {
+ if (_stream == nullptr || !_stream->available()) return;
+
+ sint8_t moveX = 0;
+ sint8_t moveY = 0;
+
+ char c = _stream->read();
+
+ _lastReceived = millis();
+
+ if (state == ST_INACTIVE) {
+ // wait for CR
+ if (c == CHAR_CR) {
+ if (eventHandler_) {
+ eventHandler_(EVENT_OPEN, _stream);
+ state = ST_NORMAL;
+ }
+ }
+ // or ignore all other
+ return;
+ }
+
+ if (c == CHAR_LF || c == CHAR_NULL || c == CHAR_BIN)
+ return;
+
+ // Esc
+ if (c == CHAR_ESC || c == 195) {
+ state = ST_ESC_SEQ;
+ _cc_pos = 0;
+ for (size_t i = 0; i < 2; ++i) {
+ bool timeout = false;
+ while (!_stream->available() &&
+ !(timeout = millis_since(_lastReceived) > 10)) {
+ delay(0);
+ }
+ if (timeout) {
+ state = ST_NORMAL;
+ break;
+ }
+ _lastReceived = millis();
+ c = _stream->read();
+ _cc_buf[_cc_pos] = c;
+ if ((c == '[') || ((c >= 'A' && c <= 'Z') || c == '~')) {
+ _cc_pos++;
+ _cc_buf[++_cc_pos] = '\x00';
+ }
+ }
+ uint8_t i;
+ for (i = 0; i < 10; ++i) {
+ if (strcmp(_cc_buf, keyMap[i].cc) == 0) {
+ c = keyMap[i].ch;
+ state = ST_NORMAL;
+ }
+ }
+ }
+
+ if (state == ST_ESC_SEQ) {
+ state = ST_NORMAL;
+ return;
+ }
+
+ // WHEN NORMAL
+ if (state == ST_NORMAL) {
+ if (c == CHAR_ESC) {
+ if (!_line.available()) {
+ // QUIT
+ state = ST_INACTIVE;
+ if (eventHandler_)
+ eventHandler_(EVENT_CLOSE, _stream);
+ } else {
+ // CLEAR
+ _line.clear();
+ if (_controlCodes) {
+ clear_line();
+ } else {
+ println();
+ }
+ }
+ return;
+ }
+
+ switch (c) {
+ case CHAR_CR:
+ println();
+ if (inputHandler_)
+ inputHandler_(_line.c_str());
+ _line.clear();
+ moveY++;
+ break;
+ case CHAR_TAB:
+ if (eventHandler_)
+ eventHandler_(EVENT_TAB, _stream);
+ return;
+ case KEY_LEFT:
+ if (_line.prev())
+ moveX--;
+ break;
+ case KEY_RIGHT:
+ if (_line.next())
+ moveX++;
+ break;
+ case KEY_HOME:
+ moveX = -1 * _line.home();
+ break;
+ case KEY_END:
+ moveX = _line.end();
+ break;
+ case CHAR_BS:
+ case KEY_DEL:
+ if (_line.backspace()) {
+ backsp();
+ moveX--;
+ }
+ break;
+ default:
+ // printable ascii 7bit or printable 8bit ISO8859
+ if ((c & '\x7F') >= 32 && (c & '\x7F') < 127)
+ if (_line.write(c)) {
+ if (_echo) write(c);
+ moveX++;
+ }
+ break;
+ }
+
+ // if (controlCodesEnabled)
+ // move(startY + moveY, startX + moveX);
+ }
+}
+
+bool Terminal::setLine(const uint8_t *ptr, size_t size) {
+ _line.clear();
+ if (_line.write(ptr, size))
+ print(_line.c_str());
+ return true;
+}
+
+CharBuffer &Terminal::getLine() { return _line; }
+
+void Terminal::start() {
+ if (_controlCodes) initscr();
+ println();
+}
+
+void Terminal::initscr() {
+ write_P(SEQ_LOAD_G1);
+ attrset(A_NORMAL);
+ move(0, 0);
+ clear();
+}
+
+void Terminal::attrset(const uint16_t attr) {
+ uint8_t i;
+
+ if (attr != this->attr) {
+ this->write_P(SEQ_ATTRSET);
+
+ i = (attr & F_COLOR) >> 8;
+
+ if (i >= 1 && i <= 8) {
+ this->write_P(SEQ_ATTRSET_FCOLOR);
+ this->write(i - 1 + '0');
+ }
+
+ i = (attr & B_COLOR) >> 12;
+
+ if (i >= 1 && i <= 8) {
+ this->write_P(SEQ_ATTRSET_BCOLOR);
+ this->write(i - 1 + '0');
+ }
+
+ if (attr & A_REVERSE)
+ this->write_P(SEQ_ATTRSET_REVERSE);
+ if (attr & A_UNDERLINE)
+ this->write_P(SEQ_ATTRSET_UNDERLINE);
+ if (attr & A_BLINK)
+ this->write_P(SEQ_ATTRSET_BLINK);
+ if (attr & A_BOLD)
+ this->write_P(SEQ_ATTRSET_BOLD);
+ if (attr & A_DIM)
+ this->write_P(SEQ_ATTRSET_DIM);
+ this->write('m');
+ this->attr = attr;
+ }
+}
+
+void Terminal::clear() { write_P(SEQ_CLEAR); }
+
+void Terminal::clear_line() {
+ write(CHAR_CR);
+ write_P(ESC_CLEAR_EOL);
+}
+
+void Terminal::move(uint8_t y, uint8_t x) {
+ write_P(SEQ_CSI);
+ writeByDigit(y + 1);
+ write(';');
+ writeByDigit(x + 1);
+ write('H');
+ curY = y;
+ curX = x;
+}
+
+void Terminal::writeByDigit(uint8_t i) {
+ uint8_t ii;
+ if (i >= 10) {
+ if (i >= 100) {
+ ii = i / 100;
+ write(ii + '0');
+ i -= 100 * ii;
+ }
+ ii = i / 10;
+ write(ii + '0');
+ i -= 10 * ii;
+ }
+ write(i + '0');
+}
+
+void Terminal::backsp() {
+ write(CHAR_BS);
+ write(CHAR_SPACE);
+ write(CHAR_BS);
+}
+
+size_t Terminal::println(const char *str) {
+ size_t n = print(str);
+ return n += println();
+}
+
+size_t Terminal::println(void) {
+ size_t n = 0;
+ switch (_eol) {
+ case CRLF:
+ n += write(CHAR_CR);
+ n += write(CHAR_LF);
+ break;
+ case LF:
+ n += write(CHAR_LF);
+ break;
+ case LFCR:
+ n += write(CHAR_LF);
+ n += write(CHAR_CR);
+ break;
+ case CR:
+ n += write(CHAR_CR);
+ break;
+ }
+ return n;
+}
+
+size_t Terminal::write(uint8_t ch) {
+ size_t n = 0;
+ if (_stream)
+ n = _stream->write(ch);
+ return n;
+}
+
+size_t Terminal::write_P(PGM_P str) {
+ uint8_t ch;
+ size_t n = 0;
+ while ((ch = pgm_read_byte(str + n)) != '\x0') {
+ _stream->write(ch);
+ n++;
+ }
+ return n;
+}
+
+size_t Terminal::write(const uint8_t *buf, size_t size) {
+ size_t n = 0;
+ while (size--) {
+ if (_stream->write(*buf++))
+ n++;
+ else
+ break;
+ }
+ return n;
+}
\ No newline at end of file
diff --git a/src/Mqtt.cpp b/src/MqttClient.cpp
similarity index 84%
rename from src/Mqtt.cpp
rename to src/MqttClient.cpp
index d497a755..df61092d 100644
--- a/src/Mqtt.cpp
+++ b/src/MqttClient.cpp
@@ -1,10 +1,11 @@
+#include "MqttClient.h"
#include "Global.h"
-
-//
#include
static const char* MODULE = "Mqtt";
+namespace MqttClient {
+
// Errors
int wifi_lost_error = 0;
int mqtt_lost_error = 0;
@@ -13,14 +14,7 @@ int mqtt_lost_error = 0;
String mqttPrefix;
String mqttRootDevice;
-void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
-const String getMqttStateStr();
-void sendAllData();
-void sendAllWigets();
-boolean publicStatus(String topic, String state);
-void outcoming_date();
-
-void initMQTT() {
+void init() {
mqtt.setCallback(handleSubscribedUpdates);
ts.add(
@@ -31,7 +25,7 @@ void initMQTT() {
pm.info("OK");
setLedStatus(LED_OFF);
} else {
- connectMQTT();
+ connect();
if (!just_load) mqtt_lost_error++;
}
} else {
@@ -44,15 +38,17 @@ void initMQTT() {
nullptr, true);
}
-void reconnectMQTT() {
- if (mqttParamsChanged) {
- mqtt.disconnect();
- connectMQTT();
- mqttParamsChanged = false;
- }
+void disconnect() {
+ pm.info("disconnect");
+ mqtt.disconnect();
}
-void loopMQTT() {
+void reconnect() {
+ disconnect();
+ connect();
+}
+
+void loop() {
if (!isNetworkActive() || !mqtt.connected()) {
return;
}
@@ -60,10 +56,7 @@ void loopMQTT() {
}
void subscribe() {
- pm.info("Subscribe");
- // Для приема получения HELLOW и подтверждения связи
- // Подписываемся на топики control
- // Подписываемся на топики order
+ pm.info("subscribe");
mqtt.subscribe(mqttPrefix.c_str());
mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
mqtt.subscribe((mqttRootDevice + "/order").c_str());
@@ -72,10 +65,11 @@ void subscribe() {
mqtt.subscribe((mqttRootDevice + "/devs").c_str());
}
-boolean connectMQTT() {
+boolean connect() {
if (!isNetworkActive()) {
return false;
}
+ pm.info("connect");
String addr = jsonReadStr(configSetupJson, "mqttServer");
if (!addr) {
@@ -125,8 +119,8 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
if (payloadStr == "HELLO") {
//данные которые отправляем при подключении или отбновлении страницы
pm.info("Send web page updates");
- sendAllWigets();
- sendAllData();
+ publishWidgets();
+ publishState();
#ifdef LOGGING_ENABLED
choose_log_date_and_send();
#endif
@@ -154,10 +148,10 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
upgrade = true;
}
} else if (topicStr.indexOf("devc")) {
- writeFile("firmware.c.txt", payloadStr);
+ writeFile("100с.txt", payloadStr);
Device_init();
} else if (topicStr.indexOf("devs")) {
- writeFile("firmware.s.txt", payloadStr);
+ writeFile("100s.txt", payloadStr);
Scenario_init();
}
}
@@ -193,9 +187,9 @@ boolean publishControl(String id, String topic, String state) {
return mqtt.publish(path.c_str(), state.c_str(), false);
}
-boolean sendCHART_test(String topic, String data) {
- topic = mqttRootDevice + "/" + topic + "/status";
- return mqtt.publish(topic.c_str(), data.c_str(), false);
+boolean publishChart_test(const String& topic, const String& data) {
+ String path = mqttRootDevice + "/" + topic + "/status";
+ return mqtt.publish(path.c_str(), data.c_str(), false);
}
boolean publishStatus(const String& topic, const String& data) {
@@ -205,9 +199,8 @@ boolean publishStatus(const String& topic, const String& data) {
return mqtt.publish(path.c_str(), json.c_str(), false);
}
-//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
#ifdef LAYOUT_IN_RAM
-void sendAllWigets() {
+void publishWidgets() {
if (all_widgets != "") {
int counter = 0;
String line;
@@ -231,7 +224,7 @@ void sendAllWigets() {
#endif
#ifndef LAYOUT_IN_RAM
-void sendAllWigets() {
+void publishWidgets() {
auto file = seekFile("/layout.txt");
if (!file) {
return;
@@ -245,9 +238,7 @@ void sendAllWigets() {
}
#endif
-//=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ========================================================
-
-void sendAllData() {
+void publishState() {
// берет строку 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"
@@ -274,7 +265,7 @@ void sendAllData() {
}
}
-const String getMqttStateStr() {
+const String getStateStr() {
switch (mqtt.state()) {
case -4:
return F("no respond");
@@ -311,3 +302,5 @@ const String getMqttStateStr() {
break;
}
}
+
+} // namespace MqttClient
\ No newline at end of file
diff --git a/src/Sensors.cpp b/src/Sensors.cpp
index e81f39a1..92c20f24 100644
--- a/src/Sensors.cpp
+++ b/src/Sensors.cpp
@@ -146,12 +146,16 @@ void ultrasonic_reading() {
jsonWriteInt(configLiveJson, levelPr_value_name, level);
eventGen(levelPr_value_name, "");
- publishStatus(levelPr_value_name, String(level));
+
+ MqttClient::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, "");
- publishStatus(ultrasonicCm_value_name, String(distance_cm));
+
+ MqttClient::publishStatus(ultrasonicCm_value_name, String(distance_cm));
+
Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm));
}
}
@@ -201,7 +205,7 @@ void analog_reading1() {
jsonReadInt(configOptionJson, value_name + "_end_out"));
jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, "");
- publishStatus(value_name, String(analog));
+ MqttClient::publishStatus(value_name, String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
}
@@ -220,7 +224,7 @@ void analog_reading2() {
jsonReadInt(configOptionJson, value_name + "_end_out"));
jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, "");
- publishStatus(value_name, String(analog));
+ MqttClient::publishStatus(value_name, String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
}
#endif
@@ -249,7 +253,7 @@ void dallas_reading() {
temp = sensors.getTempCByIndex(0);
jsonWriteStr(configLiveJson, "dallas", String(temp));
eventGen("dallas", "");
- publishStatus("dallas", String(temp));
+ MqttClient::publishStatus("dallas", String(temp));
Serial.println("[I] sensor 'dallas' send date " + String(temp));
}
#endif
@@ -280,7 +284,7 @@ void dhtT_reading() {
float value = 0;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
- publishStatus(dhtT_value_name, String(dht.getStatusString()));
+ MqttClient::publishStatus(dhtT_value_name, String(dht.getStatusString()));
counter++;
} else {
counter = 0;
@@ -288,7 +292,7 @@ void dhtT_reading() {
if (String(value) != "nan") {
eventGen(dhtT_value_name, "");
jsonWriteStr(configLiveJson, dhtT_value_name, String(value));
- publishStatus(dhtT_value_name, String(value));
+ MqttClient::publishStatus(dhtT_value_name, String(value));
Serial.println("[I] sensor '" + dhtT_value_name + "' data: " + String(value));
}
}
@@ -318,7 +322,7 @@ void dhtH_reading() {
float value = 0;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
- publishStatus(dhtH_value_name, String(dht.getStatusString()));
+ MqttClient::publishStatus(dhtH_value_name, String(dht.getStatusString()));
counter++;
} else {
counter = 0;
@@ -326,7 +330,7 @@ void dhtH_reading() {
if (String(value) != "nan") {
eventGen(dhtH_value_name, "");
jsonWriteStr(configLiveJson, dhtH_value_name, String(value));
- publishStatus(dhtH_value_name, String(value));
+ MqttClient::publishStatus(dhtH_value_name, String(value));
Serial.println("[I] sensor '" + dhtH_value_name + "' data: " + String(value));
}
}
@@ -344,13 +348,13 @@ void dhtP() {
void dhtP_reading() {
byte value;
if (dht.getStatus() != 0) {
- publishStatus("dhtPerception", String(dht.getStatusString()));
+ MqttClient::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", "");
- publishStatus("dhtPerception", final_line);
+ MqttClient::publishStatus("dhtPerception", final_line);
if (mqtt.connected()) {
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
}
@@ -402,13 +406,13 @@ void dhtC() {
void dhtC_reading() {
ComfortState cf;
if (dht.getStatus() != 0) {
- publishStatus("dhtComfort", String(dht.getStatusString()));
+ MqttClient::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", "");
- publishStatus("dhtComfort", final_line);
+ MqttClient::publishStatus("dhtComfort", final_line);
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
}
}
@@ -462,12 +466,12 @@ void dhtD() {
void dhtD_reading() {
float value;
if (dht.getStatus() != 0) {
- publishStatus("dhtDewpoint", String(dht.getStatusString()));
+ MqttClient::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", "");
- publishStatus("dhtDewpoint", String(value));
+ MqttClient::publishStatus("dhtDewpoint", String(value));
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
}
}
@@ -503,7 +507,7 @@ void bmp280T_reading() {
value = temp_event.temperature;
jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
eventGen(bmp280T_value_name, "");
- publishStatus(bmp280T_value_name, String(value));
+ MqttClient::publishStatus(bmp280T_value_name, String(value));
Serial.println("[I] sensor '" + bmp280T_value_name + "' data: " + String(value));
}
@@ -535,7 +539,7 @@ void bmp280P_reading() {
value = value / 1.333224;
jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
eventGen(bmp280P_value_name, "");
- publishStatus(bmp280P_value_name, String(value));
+ MqttClient::publishStatus(bmp280P_value_name, String(value));
Serial.println("[I] sensor '" + bmp280P_value_name + "' data: " + String(value));
}
@@ -560,7 +564,7 @@ void bme280T_reading() {
value = bme.readTemperature();
jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
eventGen(bme280T_value_name, "");
- publishStatus(bme280T_value_name, String(value));
+ MqttClient::publishStatus(bme280T_value_name, String(value));
Serial.println("[I] sensor '" + bme280T_value_name + "' data: " + String(value));
}
@@ -584,7 +588,7 @@ void bme280P_reading() {
value = value / 1.333224;
jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
eventGen(bme280P_value_name, "");
- publishStatus(bme280P_value_name, String(value));
+ MqttClient::publishStatus(bme280P_value_name, String(value));
Serial.println("[I] sensor '" + bme280P_value_name + "' data: " + String(value));
}
@@ -607,7 +611,7 @@ void bme280H_reading() {
value = bme.readHumidity();
jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
eventGen(bme280H_value_name, "");
- publishStatus(bme280H_value_name, String(value));
+ MqttClient::publishStatus(bme280H_value_name, String(value));
Serial.println("[I] sensor '" + bme280H_value_name + "' data: " + String(value));
}
@@ -631,7 +635,7 @@ void bme280A_reading() {
eventGen(bme280A_value_name, "");
- publishStatus(bme280A_value_name, String(value));
+ MqttClient::publishStatus(bme280A_value_name, String(value));
Serial.println("[I] sensor '" + bme280A_value_name + "' data: " + String(value));
}
diff --git a/src/Upgrade.cpp b/src/Upgrade.cpp
index 4f9877b2..0c2ab7c8 100644
--- a/src/Upgrade.cpp
+++ b/src/Upgrade.cpp
@@ -28,8 +28,8 @@ void upgrade_firmware() {
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
- scenario_for_update = readFile("firmware.s.txt", 4000);
- config_for_update = readFile("firmware.c.txt", 4000);
+ scenario_for_update = readFile("100s.txt", 4000);
+ config_for_update = readFile("100с.txt", 4000);
configSetup_for_update = configSetupJson;
Serial.println("Start upgrade SPIFFS, please wait...");
@@ -46,8 +46,8 @@ void upgrade_firmware() {
#endif
if (ret == HTTP_UPDATE_OK) {
- writeFile("firmware.s.txt", scenario_for_update);
- writeFile("firmware.c.txt", config_for_update);
+ writeFile("100s.txt", scenario_for_update);
+ writeFile("100с.txt", config_for_update);
writeFile("config.json", configSetup_for_update);
saveConfig();
diff --git a/src/Utils/TimeUtils.cpp b/src/Utils/TimeUtils.cpp
index b52d9cd9..72eb4c9b 100644
--- a/src/Utils/TimeUtils.cpp
+++ b/src/Utils/TimeUtils.cpp
@@ -268,4 +268,30 @@ int timeZoneInSeconds(const byte timeZone) {
break;
}
return res;
-}
\ No newline at end of file
+}
+
+unsigned long millis_since(unsigned long sinse) {
+ return millis_passed(sinse, millis());
+}
+
+unsigned long millis_passed(unsigned long start, unsigned long finish) {
+ unsigned long result = 0;
+ if (start <= finish) {
+ unsigned long passed = finish - start;
+ if (passed <= __LONG_MAX__) {
+ result = static_cast(passed);
+ } else {
+ result = static_cast((__LONG_MAX__ - finish) + start + 1u);
+ }
+ } else {
+ unsigned long passed = start - finish;
+ if (passed <= __LONG_MAX__) {
+ result = static_cast(passed);
+ result = -1 * result;
+ } else {
+ result = static_cast((__LONG_MAX__ - start) + finish + 1u);
+ result = -1 * result;
+ }
+ }
+ return result;
+}
diff --git a/src/Utils/WiFiUtils.cpp b/src/Utils/WiFiUtils.cpp
index 1d5dd506..e1727379 100644
--- a/src/Utils/WiFiUtils.cpp
+++ b/src/Utils/WiFiUtils.cpp
@@ -43,8 +43,9 @@ void startSTAMode() {
}
} while (keepConnecting && tries--);
- if (WiFi.status() == WL_CONNECTED) {
- initMQTT();
+ if (isNetworkActive()) {
+ MqttClient::init();
+
setLedStatus(LED_OFF);
} else {
startAPMode();
diff --git a/src/Web.cpp b/src/Web.cpp
index f47dc71e..3f54d76b 100644
--- a/src/Web.cpp
+++ b/src/Web.cpp
@@ -1,5 +1,6 @@
#include "Global.h"
+#include "CaptiveRequestHandler.h"
#include "Utils/PresetUtils.h"
static const char* MODULE = "Web";
@@ -7,10 +8,6 @@ static const char* MODULE = "Web";
static const uint8_t MIN_PRESET = 1;
static const uint8_t MAX_PRESET = 21;
-String getMqttStateStr();
-
-const Item_t getPresetItem(uint8_t preset);
-
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
if (request->hasArg("preset")) {
preset = request->getParam("preset")->value().toInt();
@@ -20,14 +17,16 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
}
void web_init() {
+ // server.addHandler(new CaptiveRequestHandler(jsonReadStr(configSetupJson, "name").c_str())).setFilter(ON_AP_FILTER);
+
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);
+ String srcMacro = preset == 21 ? "configs/100с.txt" : getPresetFile(preset, CT_MACRO);
+ String srcScenario = preset == 21 ? "configs/100s.txt" : getPresetFile(preset, CT_SCENARIO);
pm.info("activate " + getItemName(getPresetItem(preset)));
- copyFile(srcMacro, "firmware.c.txt");
- copyFile(srcScenario, "firmware.s.txt");
+ copyFile(srcMacro, "100с.txt");
+ copyFile(srcScenario, "100s.txt");
Device_init();
Scenario_init();
@@ -203,7 +202,7 @@ void web_init() {
if (request->hasArg("mqttcheck")) {
String buf = "{}";
- String payload = "" + getMqttStateStr();
+ String payload = "" + MqttClient::getStateStr();
jsonWriteStr(buf, "title", payload);
jsonWriteStr(buf, "class", "pop-up");
diff --git a/src/main.cpp b/src/main.cpp
index 6fadabd2..67b3fb9a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -85,18 +85,25 @@ void loop() {
not_async_actions();
- loopMQTT();
+ MqttClient::loop();
+
loopCmd();
loopButton();
loopScenario();
#ifdef UDP_ENABLED
loopUdp();
#endif
+
+ loopSerial();
+
ts.update();
}
void not_async_actions() {
- reconnectMQTT();
+ if (mqttParamsChanged) {
+ MqttClient::reconnect();
+ mqttParamsChanged = false;
+ }
do_upgrade_url();
do_upgrade();