From e375cca3dc7df199ecc2fbba7d7fd1b229844a09 Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 01:16:00 +0300 Subject: [PATCH 01/11] Terminal --- include/CaptiveRequestHandler.h | 22 +++ include/CommonTypes.h | 19 ++ include/Global.h | 33 +--- include/Module/Terminal.h | 6 +- include/MqttClient.h | 27 +++ include/Utils/TimeUtils.h | 12 +- src/CaptiveRequestHandler.cpp | 33 ++++ src/Cmd.cpp | 14 +- src/Logging.cpp | 3 +- src/Module/Terminal.cpp | 322 +++++++++++++++++++++++++++++++ src/{Mqtt.cpp => MqttClient.cpp} | 63 +++--- src/Sensors.cpp | 46 +++-- src/Utils/TimeUtils.cpp | 28 ++- src/Utils/WiFiUtils.cpp | 5 +- src/Web.cpp | 9 +- src/main.cpp | 8 +- 16 files changed, 541 insertions(+), 109 deletions(-) create mode 100644 include/CaptiveRequestHandler.h create mode 100644 include/MqttClient.h create mode 100644 src/CaptiveRequestHandler.cpp create mode 100644 src/Module/Terminal.cpp rename src/{Mqtt.cpp => MqttClient.cpp} (85%) 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..da313a07 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); diff --git a/include/Module/Terminal.h b/include/Module/Terminal.h index 859f227d..11c5232e 100644 --- a/include/Module/Terminal.h +++ b/include/Module/Terminal.h @@ -152,12 +152,12 @@ class Terminal : public Print { uint8_t curY = 0xff; uint8_t curX = 0xff; - unsigned long lastReceived = 0; + unsigned long _lastReceived = 0; State state = ST_INACTIVE; 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..377eae5a 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -167,7 +167,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 +181,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 +230,7 @@ void pwmSet() { jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); - publishStatus("pwm" + pwm_number, pwm_state); + MqttClient::publishStatus("pwm" + pwm_number, pwm_state); } //================================================================================================================== //==========================================Модуль физической кнопки================================================ @@ -285,7 +285,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 +307,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 +347,7 @@ void textSet() { } jsonWriteStr(configLiveJson, "text" + number, text); - publishStatus("text" + number, text); + MqttClient::publishStatus("text" + number, text); } //===================================================================================================================================== //=========================================Модуль шагового мотора====================================================================== @@ -503,7 +503,7 @@ void servoSet() { jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); - publishStatus("servo" + servo_number, servo_state); + MqttClient::publishStatus("servo" + servo_number, servo_state); } #endif 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/Terminal.cpp b/src/Module/Terminal.cpp new file mode 100644 index 00000000..17d96b91 --- /dev/null +++ b/src/Module/Terminal.cpp @@ -0,0 +1,322 @@ +#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){}; + +void Terminal::setStream(Stream *stream) { + _stream = stream; +} + +Terminal::~Terminal() {} + +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 85% rename from src/Mqtt.cpp rename to src/MqttClient.cpp index d497a755..3d1bb95e 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 @@ -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/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..5f940a7d 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,6 +17,8 @@ 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)) { @@ -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..a2d77deb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -85,7 +85,8 @@ void loop() { not_async_actions(); - loopMQTT(); + MqttClient::loop(); + loopCmd(); loopButton(); loopScenario(); @@ -96,7 +97,10 @@ void loop() { } void not_async_actions() { - reconnectMQTT(); + if (mqttParamsChanged) { + MqttClient::reconnect(); + mqttParamsChanged = false; + } do_upgrade_url(); do_upgrade(); From dfeb25a8fa7243cdd6937e2a4a83e9c04ff302fa Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 01:33:42 +0300 Subject: [PATCH 02/11] Serial --- include/Module/Telnet.h | 1 + src/Cmd.cpp | 17 +++++++++++++++-- src/Module/Telnet.cpp | 8 +++++--- 3 files changed, 21 insertions(+), 5 deletions(-) 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/src/Cmd.cpp b/src/Cmd.cpp index 377eae5a..1542f702 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -1,5 +1,8 @@ #include "Global.h" +#include "Module/Terminal.h" +Terminal *term = nullptr; + boolean but[NUM_BUTTONS]; Bounce *buttons = new Bounce[NUM_BUTTONS]; @@ -516,14 +519,24 @@ void serialBegin() { if (mySerial) { delete mySerial; } + + if (term) { + delete term; + } + mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt()); mySerial->begin(s_speed.toInt()); + + term = new Terminal(mySerial); + term->setOnReadLine([](const char *str) { + order_loop += String(str) + ","; + }); } void serialWrite() { String payload = sCmd.next(); - if (mySerial) { - mySerial->println(payload); + if (term) { + term->println(payload.c_str()); } } #endif 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() { From cb9c0efac6a5733adb864dee5dc4d93753d676eb Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 01:40:35 +0300 Subject: [PATCH 03/11] Serial --- src/Cmd.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 1542f702..2ac5a22b 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -528,8 +528,14 @@ void serialBegin() { 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) { - order_loop += String(str) + ","; + String line = String(str); + pm.info("serial read: " + line); + order_loop += line + ","; }); } From 7dd13b7fcf6deb12535035fd76f5f0ee8c759151 Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 01:42:56 +0300 Subject: [PATCH 04/11] Serial --- src/Cmd.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 2ac5a22b..bb597623 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -1,6 +1,9 @@ #include "Global.h" #include "Module/Terminal.h" + +static const char *MODULE = "Cmd"; + Terminal *term = nullptr; boolean but[NUM_BUTTONS]; From f9933ea55e7ed269a3d8addc9a4baed698ac9de0 Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 01:46:05 +0300 Subject: [PATCH 05/11] Serial --- include/Module/Terminal.h | 2 +- src/Cmd.cpp | 4 ---- src/Module/Terminal.cpp | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/include/Module/Terminal.h b/include/Module/Terminal.h index 11c5232e..eb47417c 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); diff --git a/src/Cmd.cpp b/src/Cmd.cpp index bb597623..efd49206 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -523,10 +523,6 @@ void serialBegin() { delete mySerial; } - if (term) { - delete term; - } - mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt()); mySerial->begin(s_speed.toInt()); diff --git a/src/Module/Terminal.cpp b/src/Module/Terminal.cpp index 17d96b91..b5321810 100644 --- a/src/Module/Terminal.cpp +++ b/src/Module/Terminal.cpp @@ -16,8 +16,6 @@ void Terminal::setStream(Stream *stream) { _stream = stream; } -Terminal::~Terminal() {} - void Terminal::setOnReadLine(TerminalInputEventHandler h) { inputHandler_ = h; } void Terminal::setOnEvent(TerminalEventHandler h) { eventHandler_ = h; } From cc3c17dfb2547fd57f32015adb0a974839565d34 Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 02:11:08 +0300 Subject: [PATCH 06/11] Serial --- include/Global.h | 1 + src/Cmd.cpp | 6 ++++++ src/main.cpp | 3 +++ 3 files changed, 10 insertions(+) diff --git a/include/Global.h b/include/Global.h index da313a07..ab5ca375 100644 --- a/include/Global.h +++ b/include/Global.h @@ -255,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/src/Cmd.cpp b/src/Cmd.cpp index efd49206..cd8d7c97 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -250,6 +250,12 @@ void switch_() { but[switch_number.toInt()] = true; } +void loopSerial() { + if (term) { + term->loop(); + } +} + void loopButton() { static uint8_t switch_number = 1; diff --git a/src/main.cpp b/src/main.cpp index a2d77deb..67b3fb9a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,6 +93,9 @@ void loop() { #ifdef UDP_ENABLED loopUdp(); #endif + + loopSerial(); + ts.update(); } From e400de1e1c3237a2eb1350ebeab12b37bfd176d8 Mon Sep 17 00:00:00 2001 From: Yuri Trikoz Date: Wed, 24 Jun 2020 02:49:44 +0300 Subject: [PATCH 07/11] Serial active on create --- include/Module/Terminal.h | 2 +- src/Cmd.cpp | 1 + src/Module/Terminal.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/Module/Terminal.h b/include/Module/Terminal.h index eb47417c..3d3234d8 100644 --- a/include/Module/Terminal.h +++ b/include/Module/Terminal.h @@ -153,7 +153,7 @@ class Terminal : public Print { uint8_t curX = 0xff; unsigned long _lastReceived = 0; - State state = ST_INACTIVE; + State state; Stream *_stream; EditLine _line; char _cc_buf[32] = {0}; diff --git a/src/Cmd.cpp b/src/Cmd.cpp index cd8d7c97..85b7e48e 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -540,6 +540,7 @@ void serialBegin() { term->setOnReadLine([](const char *str) { String line = String(str); pm.info("serial read: " + line); + line.replace("#", " "); order_loop += line + ","; }); } diff --git a/src/Module/Terminal.cpp b/src/Module/Terminal.cpp index b5321810..4de12887 100644 --- a/src/Module/Terminal.cpp +++ b/src/Module/Terminal.cpp @@ -10,7 +10,7 @@ Terminal::Terminal(Stream *stream) : _stream{stream}, _color(false), _controlCodes(false), _echo(false), - _eol(CRLF){}; + _eol(CRLF) { state = ST_NORMAL; }; void Terminal::setStream(Stream *stream) { _stream = stream; From a422c72565b307628a2197a74f82deff40c2ef1b Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 24 Jun 2020 14:26:52 +0200 Subject: [PATCH 08/11] No need replace --- src/Cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 85b7e48e..7f4bb7c9 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -540,7 +540,7 @@ void serialBegin() { term->setOnReadLine([](const char *str) { String line = String(str); pm.info("serial read: " + line); - line.replace("#", " "); + //line.replace("#", " "); order_loop += line + ","; }); } From c4dfdee7e5e63a99373dfc78c8b22636a2d6aa0d Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 24 Jun 2020 14:28:13 +0200 Subject: [PATCH 09/11] Changed preset order to correct one --- data/set.device.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/set.device.json b/data/set.device.json index 33cd7b9b..205080b9 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -68,13 +68,13 @@ "/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=14": "14.Сенсор DS18B20 (темп) и логгирование", + "/set?preset=15": "15.Термостат на DS18B20 с переключением в ручной режим и логгированием", + "/set?preset=16": "16.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование", + "/set?preset=17": "17.Датчик движения включающий свет", + "/set?preset=18": "18.Охранный датчик движения", + "/set?preset=19": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", + "/set?preset=20": "20.Система управления сервоприводами", "/set?preset=21": "Настройки по умолчанию" } }, From 90a342bc27dbae9f701c565635e863ea18ad6770 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 24 Jun 2020 14:40:47 +0200 Subject: [PATCH 10/11] =?UTF-8?q?=D0=9F=D0=BE=D1=80=D1=8F=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/set.device.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/set.device.json b/data/set.device.json index 205080b9..2b1dd17a 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -75,7 +75,7 @@ "/set?preset=18": "18.Охранный датчик движения", "/set?preset=19": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", "/set?preset=20": "20.Система управления сервоприводами", - "/set?preset=21": "Настройки по умолчанию" + "/set?preset=21": "21.Настройки по умолчанию" } }, { From 5643804d7708a438e1d8b4262e3bd04f7ccf9380 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 24 Jun 2020 15:54:15 +0200 Subject: [PATCH 11/11] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=B8=D1=81=D0=B5=D1=82=D0=BE=D0=B2!=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D1=81=D0=B5=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D1=8F=20uart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/{configs/firmware.c.txt => 100c.txt} | 0 data/{configs/firmware.s.txt => 100s.txt} | 0 data/configs/{1-relay.c.txt => 001c.txt} | 0 data/configs/{1-relay.s.txt => 001s.txt} | 0 data/configs/{2-relay.c.txt => 002c.txt} | 0 data/configs/{2-relay.s.txt => 002s.txt} | 0 data/configs/{3-relay.c.txt => 003c.txt} | 0 data/configs/{3-relay.s.txt => 003s.txt} | 0 data/configs/{4-relay.c.txt => 004c.txt} | 0 data/configs/{4-relay.s.txt => 004s.txt} | 0 data/configs/{5-relay.c.txt => 005c.txt} | 0 data/configs/{5-relay.s.txt => 005s.txt} | 0 data/configs/{6-relay.c.txt => 006c.txt} | 0 data/configs/{6-relay.s.txt => 006s.txt} | 0 data/configs/{7-relay.c.txt => 007c.txt} | 0 data/configs/{7-relay.s.txt => 007s.txt} | 0 data/configs/{8-pwm.c.txt => 008c.txt} | 0 data/configs/{10-dht22.s.txt => 008s.txt} | 0 data/configs/{9-dht11.c.txt => 009c.txt} | 0 data/configs/{11-analog.s.txt => 009s.txt} | 0 data/configs/{10-dht22.c.txt => 010c.txt} | 0 data/configs/{12-bmp280.s.txt => 010s.txt} | 0 data/configs/{11-analog.c.txt => 011c.txt} | 0 data/configs/{13-bme280.s.txt => 011s.txt} | 0 data/configs/{12-bmp280.c.txt => 012c.txt} | 0 data/configs/{14-dallas.s.txt => 012s.txt} | 0 data/configs/{13-bme280.c.txt => 013c.txt} | 0 data/configs/{8-pwm.s.txt => 013s.txt} | 0 data/configs/{14-dallas.c.txt => 014c.txt} | 0 data/configs/{9-dht11.s.txt => 014s.txt} | 0 data/configs/{15-termostat.c.txt => 015c.txt} | 0 data/configs/{15-termostat.s.txt => 015s.txt} | 0 .../configs/{16-ultrasonic.c.txt => 016c.txt} | 0 .../configs/{16-ultrasonic.s.txt => 016s.txt} | 0 data/configs/{17-motion.c.txt => 017c.txt} | 0 data/configs/{17-motion.s.txt => 017s.txt} | 0 data/configs/{18-motion.c.txt => 018c.txt} | 0 data/configs/{18-motion.s.txt => 018s.txt} | 0 data/configs/{19-stepper.c.txt => 019c.txt} | 0 data/configs/{19-stepper.s.txt => 019s.txt} | 0 data/configs/{20-servo.c.txt => 020c.txt} | 0 data/configs/{20-servo.s.txt => 020s.txt} | 0 data/configs/021c.txt | 0 data/configs/021s.txt | 0 data/{firmware.c.txt => configs/100c.txt} | 0 data/{firmware.s.txt => configs/100s.txt} | 0 data/set.device.json | 47 ++++++++++--------- src/Init.cpp | 4 +- src/MqttClient.cpp | 4 +- src/Upgrade.cpp | 8 ++-- src/Web.cpp | 8 ++-- 51 files changed, 36 insertions(+), 35 deletions(-) rename data/{configs/firmware.c.txt => 100c.txt} (100%) rename data/{configs/firmware.s.txt => 100s.txt} (100%) rename data/configs/{1-relay.c.txt => 001c.txt} (100%) rename data/configs/{1-relay.s.txt => 001s.txt} (100%) rename data/configs/{2-relay.c.txt => 002c.txt} (100%) rename data/configs/{2-relay.s.txt => 002s.txt} (100%) rename data/configs/{3-relay.c.txt => 003c.txt} (100%) rename data/configs/{3-relay.s.txt => 003s.txt} (100%) rename data/configs/{4-relay.c.txt => 004c.txt} (100%) rename data/configs/{4-relay.s.txt => 004s.txt} (100%) rename data/configs/{5-relay.c.txt => 005c.txt} (100%) rename data/configs/{5-relay.s.txt => 005s.txt} (100%) rename data/configs/{6-relay.c.txt => 006c.txt} (100%) rename data/configs/{6-relay.s.txt => 006s.txt} (100%) rename data/configs/{7-relay.c.txt => 007c.txt} (100%) rename data/configs/{7-relay.s.txt => 007s.txt} (100%) rename data/configs/{8-pwm.c.txt => 008c.txt} (100%) rename data/configs/{10-dht22.s.txt => 008s.txt} (100%) rename data/configs/{9-dht11.c.txt => 009c.txt} (100%) rename data/configs/{11-analog.s.txt => 009s.txt} (100%) rename data/configs/{10-dht22.c.txt => 010c.txt} (100%) rename data/configs/{12-bmp280.s.txt => 010s.txt} (100%) rename data/configs/{11-analog.c.txt => 011c.txt} (100%) rename data/configs/{13-bme280.s.txt => 011s.txt} (100%) rename data/configs/{12-bmp280.c.txt => 012c.txt} (100%) rename data/configs/{14-dallas.s.txt => 012s.txt} (100%) rename data/configs/{13-bme280.c.txt => 013c.txt} (100%) rename data/configs/{8-pwm.s.txt => 013s.txt} (100%) rename data/configs/{14-dallas.c.txt => 014c.txt} (100%) rename data/configs/{9-dht11.s.txt => 014s.txt} (100%) rename data/configs/{15-termostat.c.txt => 015c.txt} (100%) rename data/configs/{15-termostat.s.txt => 015s.txt} (100%) rename data/configs/{16-ultrasonic.c.txt => 016c.txt} (100%) rename data/configs/{16-ultrasonic.s.txt => 016s.txt} (100%) rename data/configs/{17-motion.c.txt => 017c.txt} (100%) rename data/configs/{17-motion.s.txt => 017s.txt} (100%) rename data/configs/{18-motion.c.txt => 018c.txt} (100%) rename data/configs/{18-motion.s.txt => 018s.txt} (100%) rename data/configs/{19-stepper.c.txt => 019c.txt} (100%) rename data/configs/{19-stepper.s.txt => 019s.txt} (100%) rename data/configs/{20-servo.c.txt => 020c.txt} (100%) rename data/configs/{20-servo.s.txt => 020s.txt} (100%) create mode 100644 data/configs/021c.txt create mode 100644 data/configs/021s.txt rename data/{firmware.c.txt => configs/100c.txt} (100%) rename data/{firmware.s.txt => configs/100s.txt} (100%) 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 2b1dd17a..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": "14.Сенсор DS18B20 (темп) и логгирование", - "/set?preset=15": "15.Термостат на DS18B20 с переключением в ручной режим и логгированием", - "/set?preset=16": "16.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование", - "/set?preset=17": "17.Датчик движения включающий свет", - "/set?preset=18": "18.Охранный датчик движения", - "/set?preset=19": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", - "/set?preset=20": "20.Система управления сервоприводами", - "/set?preset=21": "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/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/MqttClient.cpp b/src/MqttClient.cpp index 3d1bb95e..df61092d 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -148,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(); } } 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/Web.cpp b/src/Web.cpp index 5f940a7d..3f54d76b 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -22,11 +22,11 @@ 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); + 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();