diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 4de13717a..748f0388a 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -380,23 +380,22 @@ void SleepDelay(uint32_t mseconds) { } } -void loop(void) { - uint32_t my_sleep = millis(); - -// check LEAmDNS.h -// MDNS.update() needs to be called in main loop - #ifdef ESP8266 //Not needed with esp32 mdns - #ifdef USE_DISCOVERY - #ifdef WEBSERVER_ADVERTISE - // previously this was only called in WifiCheckIp() and that causes delays in responses to mdns - MdnsUpdate(); - #endif // WEBSERVER_ADVERTISE - #endif // USE_DISCOVERY - #endif // ESP8266 - +void Scheduler(void) { XdrvCall(FUNC_LOOP); XsnsCall(FUNC_LOOP); +// check LEAmDNS.h +// MDNS.update() needs to be called in main loop +#ifdef ESP8266 // Not needed with esp32 mdns +#ifdef USE_DISCOVERY +#ifdef USE_WEBSERVER +#ifdef WEBSERVER_ADVERTISE + MdnsUpdate(); +#endif // WEBSERVER_ADVERTISE +#endif // USE_WEBSERVER +#endif // USE_DISCOVERY +#endif // ESP8266 + OsWatchLoop(); ButtonLoop(); SwitchLoop(); @@ -444,6 +443,12 @@ void loop(void) { #ifdef USE_ARDUINO_OTA ArduinoOtaLoop(); #endif // USE_ARDUINO_OTA +} + +void loop(void) { + uint32_t my_sleep = millis(); + + Scheduler(); uint32_t my_activity = millis() - my_sleep; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 356086408..6a1df65a7 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -365,13 +365,13 @@ ESP8266WebServer *Webserver; struct WEB { String chunk_buffer = ""; // Could be max 2 * CHUNKED_BUFFER_SIZE - uint16_t upload_progress_dot_count; uint16_t upload_error = 0; uint8_t state = HTTP_OFF; uint8_t upload_file_type; uint8_t config_block_count = 0; uint8_t config_xor_on = 0; uint8_t config_xor_on_set = CONFIG_FILE_XOR; + bool upload_services_stopped = false; bool reset_web_log_flag = false; // Reset web console log } Web; @@ -2298,14 +2298,8 @@ void HandleUploadDone(void) { AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPLOAD_DONE)); - char error[100]; - WifiConfigCounter(); - TasmotaGlobal.restart_flag = 0; - MqttRetryCounter(0); -#ifdef USE_COUNTER - CounterInterruptDisable(false); -#endif // USE_COUNTER + UploadServices(1); WSContentStart_P(PSTR(D_INFORMATION)); if (!Web.upload_error) { @@ -2315,6 +2309,7 @@ void HandleUploadDone(void) { WSContentSend_P(PSTR("
" D_UPLOAD " " D_FAILED "

"), WebColor(COL_TEXT_WARNING)); + char error[100]; if (Web.upload_error < 10) { GetTextIndexed(error, sizeof(error), Web.upload_error -1, kUploadErrors); } else { @@ -2323,6 +2318,7 @@ void HandleUploadDone(void) { WSContentSend_P(error); DEBUG_CORE_LOG(PSTR("UPL: %s"), error); TasmotaGlobal.stop_flash_rotate = Settings.flag.stop_flash_rotate; // SetOption12 - Switch between dynamic or fixed slot flash save location + Web.upload_error = 0; } else { WSContentSend_P(PSTR("%06x'>" D_SUCCESSFUL "
"), WebColor(COL_TEXT_SUCCESS)); TasmotaGlobal.restart_flag = 2; // Always restart to re-enable disabled features during update @@ -2335,14 +2331,65 @@ void HandleUploadDone(void) { WSContentStop(); } +void UploadServices(uint32_t start_service) { + if (Web.upload_services_stopped == start_service) { return; } + Web.upload_services_stopped = start_service; + + if (start_service) { +// AddLog_P(LOG_LEVEL_DEBUG, PSTR("UPL: Services enabled")); + + TasmotaGlobal.restart_flag = 0; +/* + MqttRetryCounter(0); +*/ +#ifdef USE_ARILUX_RF + AriluxRfInit(); +#endif // USE_ARILUX_RF +#ifdef USE_COUNTER + CounterInterruptDisable(false); +#endif // USE_COUNTER +#ifdef USE_EMULATION + UdpConnect(); +#endif // USE_EMULATION + + } else { +// AddLog_P(LOG_LEVEL_DEBUG, PSTR("UPL: Services disabled")); + +#ifdef USE_EMULATION + UdpDisconnect(); +#endif // USE_EMULATION +#ifdef USE_COUNTER + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts +#endif // USE_COUNTER +#ifdef USE_ARILUX_RF + AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine +#endif // USE_ARILUX_RF +/* + MqttRetryCounter(60); + if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT + MqttDisconnect(); + } +*/ + TasmotaGlobal.restart_flag = 120; // Set restart watchdog after 2 minutes + } +} + void HandleUploadLoop(void) { // Based on ESP8266HTTPUpdateServer.cpp uses ESP8266WebServer Parsing.cpp and Cores Updater.cpp (Update) static uint32_t upload_size; - bool _serialoutput = (LOG_LEVEL_DEBUG <= TasmotaGlobal.seriallog_level); + static bool upload_error_signalled; if (HTTP_USER == Web.state) { return; } + if (Web.upload_error) { - if (UPL_TASMOTA == Web.upload_file_type) { Update.end(); } + if (!upload_error_signalled) { + if (UPL_TASMOTA == Web.upload_file_type) { Update.end(); } + UploadServices(1); + +// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "Upload error %d"), Web.upload_error); + + upload_error_signalled = true; + } return; } @@ -2351,15 +2398,18 @@ void HandleUploadLoop(void) { // ***** Step1: Start upload file if (UPLOAD_FILE_START == upload.status) { Web.upload_error = 0; + upload_error_signalled = false; upload_size = 0; - TasmotaGlobal.restart_flag = 60; + + UploadServices(0); + if (0 == upload.filename.c_str()[0]) { Web.upload_error = 1; // No file selected return; } SettingsSave(1); // Free flash for upload - AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD D_FILE " %s ..."), upload.filename.c_str()); + AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD D_FILE " %s"), upload.filename.c_str()); if (UPL_SETTINGS == Web.upload_file_type) { if (!SettingsBufferAlloc()) { @@ -2376,22 +2426,6 @@ void HandleUploadLoop(void) { TasmotaGlobal.restart_flag = 0; } #endif // USE_UFILESYS - else { - MqttRetryCounter(60); -#ifdef USE_COUNTER - CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts -#endif // USE_COUNTER -#ifdef USE_EMULATION - UdpDisconnect(); -#endif // USE_EMULATION -#ifdef USE_ARILUX_RF - AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine -#endif // USE_ARILUX_RF - if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT - MqttDisconnect(); - } - } - Web.upload_progress_dot_count = 0; } // ***** Step2: Write upload file @@ -2487,21 +2521,14 @@ void HandleUploadLoop(void) { Web.upload_error = 5; // Upload buffer miscompare return; } - if (_serialoutput) { - upload_size += upload.currentSize; - Serial.printf("."); - Web.upload_progress_dot_count++; - if (!(Web.upload_progress_dot_count % 50)) { // Assuming core HTTP_UPLOAD_BUFLEN=2048 - Serial.printf("%5dkB\n", upload_size / 1024); - } + if (upload.totalSize && !(upload.totalSize % 102400)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "Progress %dkB"), upload.totalSize / 1024); } } // ***** Step3: Finish upload file else if (UPLOAD_FILE_END == upload.status) { - if (_serialoutput && (Web.upload_progress_dot_count % 50)) { - Serial.printf("%5dkB\n", upload_size / 1024); - } + UploadServices(1); if (UPL_SETTINGS == Web.upload_file_type) { if (Web.config_xor_on_set) { for (uint32_t i = 2; i < sizeof(Settings); i++) { @@ -2593,7 +2620,6 @@ void HandleUploadLoop(void) { } #endif // USE_WEB_FW_UPGRADE else if (!Update.end(true)) { // true to set the size to the current progress - if (_serialoutput) { Update.printError(Serial); } Web.upload_error = 6; // Upload failed. Enable logging 3 return; } @@ -2601,18 +2627,13 @@ void HandleUploadLoop(void) { } // ***** Step4: Abort upload file -// else if (UPLOAD_FILE_ABORTED == upload.status) { else { - TasmotaGlobal.restart_flag = 0; - MqttRetryCounter(0); -#ifdef USE_COUNTER - CounterInterruptDisable(false); -#endif // USE_COUNTER + UploadServices(1); Web.upload_error = 7; // Upload aborted if (UPL_TASMOTA == Web.upload_file_type) { Update.end(); } } delay(0); - OsWatchLoop(); // Feed OsWatch timer to prevent restart on long uploads + Scheduler(); // Feed OsWatch timer to prevent restart on long uploads } /*-------------------------------------------------------------------------------------------*/