From 73e49803cc9182d39f94e34de93629630a659d60 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 1 Sep 2020 13:05:46 +0200 Subject: [PATCH] Add better Zigbee firmware Upload Transfer GUI --- tasmota/language/bg_BG.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + tasmota/xdrv_01_webserver.ino | 27 ++++++---- tasmota/xdrv_23_zigbee_9a_upload.ino | 81 ++++++++++++++++++++++++---- tasmota/xdrv_23_zigbee_A_impl.ino | 8 ++- 26 files changed, 116 insertions(+), 23 deletions(-) diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 7c80a6cf6..ec637b220 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Зареждането започна" #define D_UPGRADE_STARTED "Обновяването започна" #define D_UPLOAD_DONE "Зареждането завърши" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Не е избран файл" #define D_UPLOAD_ERR_2 "Недостатъчно свободно място" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 3aca1ffda..1d591b610 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Nahrávání zahájeno" #define D_UPGRADE_STARTED "Zahájení aktualizace" #define D_UPLOAD_DONE "Nahrávání ukončeno" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Soubor nebyl vybrán" #define D_UPLOAD_ERR_2 "Málo místa" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 77fbfa5e9..643110761 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Upload gestartet" #define D_UPGRADE_STARTED "Update gestartet" #define D_UPLOAD_DONE "Upload abgeschlossen" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Keine Datei ausgewählt" #define D_UPLOAD_ERR_2 "Ungenügend Speicherplatz" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index a374cc116..8e3653957 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Η μεταφόρτωση ξεκίνησε" #define D_UPGRADE_STARTED "Η αναβάθμιση ξεκίνησε" #define D_UPLOAD_DONE "Η μεταφόρτωση ολοκληρώθηκε" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Δεν έχει επιλεγεί αρχείο" #define D_UPLOAD_ERR_2 "Δεν υπάρχει επαρκής χώρος" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index e091d2ad1..c077dcb81 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Upload started" #define D_UPGRADE_STARTED "Upgrade started" #define D_UPLOAD_DONE "Upload done" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "No file selected" #define D_UPLOAD_ERR_2 "Not enough space" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 0fa3221ba..f68572eab 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Cargando archivo" #define D_UPGRADE_STARTED "Actualización iniciada" #define D_UPLOAD_DONE "Carga finalizada" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Ningún archivo seleccionado" #define D_UPLOAD_ERR_2 "Espacio insuficiente" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 5be788868..434dd07b8 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Téléchargement lancé" #define D_UPGRADE_STARTED "Mise à jour lancée" #define D_UPLOAD_DONE "Téléchargement terminé" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Aucun fichier sélectionné" #define D_UPLOAD_ERR_2 "Espace insuffisant" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index a673cacc0..dd0f2fbee 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "העלאה מתחילה" #define D_UPGRADE_STARTED "שדרוג מתחיל" #define D_UPLOAD_DONE "העלאה הסתיימה" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "לא נבחר קובץ" #define D_UPLOAD_ERR_2 "אין מספיק מקום" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 69c467ef9..79d7c40aa 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Feltöltés elindítva" #define D_UPGRADE_STARTED "Frissítés elindítva" #define D_UPLOAD_DONE "Feltöltés kész" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nincs fájl kijelölve" #define D_UPLOAD_ERR_2 "Nincs elég memória" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index fc18d3d30..34f5a1696 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Caricamento..." #define D_UPGRADE_STARTED "Aggiornamento..." #define D_UPLOAD_DONE "Caricamento completato" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nessun file selezionato" #define D_UPLOAD_ERR_2 "Spazio insufficiente" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index a1f0f2972..ef1f781b2 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "업로드 시작됨" #define D_UPGRADE_STARTED "업그레이드 시작됨" #define D_UPLOAD_DONE "업그레이드 완료" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "파일이 선택되지 않았습니다" #define D_UPLOAD_ERR_2 "용량이 충분하지 않습니다" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index edd09b795..a3a5821fd 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Verzending gestart" #define D_UPGRADE_STARTED "Opwaarderen gestart" #define D_UPLOAD_DONE "Opwaarderen klaar" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Geen bestand gekozen" #define D_UPLOAD_ERR_2 "Onvoldoende geheugen ruimte" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index b0f0962fe..929774738 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Wgrywanie rozpoczęte" #define D_UPGRADE_STARTED "Aktualizacja rozpoczęta" #define D_UPLOAD_DONE "Wgrywanie zakończone" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nie wybrano pliku" #define D_UPLOAD_ERR_2 "Niewystarczająca ilość miejsca" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 2af91db6e..990b308cb 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Início do envio" #define D_UPGRADE_STARTED "Atualização iniciada" #define D_UPLOAD_DONE "Atualização finalizada" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nenhum arquivo selecionado" #define D_UPLOAD_ERR_2 "Não existe memória disponível" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index da6f46758..a976811c3 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Envio Iniciado" #define D_UPGRADE_STARTED "Atualização Iniciada" #define D_UPLOAD_DONE "Atualização Finalizada" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nenhum ficheiro selecionado" #define D_UPLOAD_ERR_2 "Não existe espaço disponível" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index a6d66722f..c4cba2ee3 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Încărcare începută" #define D_UPGRADE_STARTED "Actualizare începută" #define D_UPLOAD_DONE "Încărcare terminată" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Nici un fișier selectat" #define D_UPLOAD_ERR_2 "Spațiu insuficient" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 921398a2d..f9e576f70 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Загрузка началась" #define D_UPGRADE_STARTED "Обновление началось" #define D_UPLOAD_DONE "Загрузка завершена" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Файл не выбран" #define D_UPLOAD_ERR_2 "Недостаточно места" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index b418924d5..072caa53d 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Nahrávanie spustené" #define D_UPGRADE_STARTED "Aktualizácia spustená" #define D_UPLOAD_DONE "Nahrávanie ukončené" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Súbor nebol vybraný" #define D_UPLOAD_ERR_2 "Málo miesta" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 352c8b82d..1ba0b0b7e 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Uppladdning startad" #define D_UPGRADE_STARTED "Uppgradeing startad" #define D_UPLOAD_DONE "Uppladdning klar" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Ingen fil vald" #define D_UPLOAD_ERR_2 "Inte tillräckligt med ledigt utrymme" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index e5a34fdcd..928ad30b6 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Yükleme başlatıldı" #define D_UPGRADE_STARTED "YÜkestlme başlatıldı" #define D_UPLOAD_DONE "Yükleme Tamamlandı" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Dosya seçilmedi" #define D_UPLOAD_ERR_2 "Boş yer yok" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 001e6692c..8ce7ee877 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "Завантаження почалось" #define D_UPGRADE_STARTED "Оновлення почалось" #define D_UPLOAD_DONE "Завантаження завершено" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "Файл не вибраний" #define D_UPLOAD_ERR_2 "Недостатньо місця" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 9dbe6728b..b1b58b4c4 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "开始上传" #define D_UPGRADE_STARTED "开始升级" #define D_UPLOAD_DONE "上传完成" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "没有选择任何文件" #define D_UPLOAD_ERR_2 "没有足够空间" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index c3ecf4027..fc9606a90 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -351,6 +351,7 @@ #define D_UPLOAD_STARTED "已開始上傳" #define D_UPGRADE_STARTED "已開始升級" #define D_UPLOAD_DONE "已上傳完成" +#define D_UPLOAD_TRANSFER "Upload transfer" #define D_TRANSFER_STARTED "Transfer started" #define D_UPLOAD_ERR_1 "沒選擇任何檔案" #define D_UPLOAD_ERR_2 "可用空間不足" diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 615317337..72876ecf2 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -637,12 +637,12 @@ const char HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED[] PROGMEM = "\x3A\x0E\xA3\xDA\x3B\x "\x33\x90\x81\x0F\x5F\x04\x2D\x53\xFA\x3C\x2A\x2B\x8F\x33\xAC\xE6\x10\x22\x70\x54" "\x08\xFC\x0C\x82\x0F\x0A\x67\x30\x81\x23\x81\x23\xDA\x08\x34\x4C\xEF\xE7\x74\xEB" "\x3A\xC7\x04\x75\x1C\x98\x43\x0D\x87\x78\xF0\x13\x31\x47\x99\xC8\x43\x0D\x87\xB8"; - + // Raw: .bt{box-sizing:border-box;position:relative;display:inline-block;width:20px;height:12px;border:2px solid;border-radius:3px;margin-left:-3px}.bt::after,.bt::before{content:"";display:block;box-sizing:border-box;position:absolute;height:6px;background:currentColor;top:1px}.bt::before{right:-4px;border-radius:3px;width:4px}.bt::after{width:var(--bl,14px);left:1px} // Successfully compressed from 363 to 240 bytes (-33.9%) #define HTTP_HEAD_STYLE_ZIGBEE Decompress(HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED,HTTP_HEAD_STYLE_ZIGBEE_SIZE).c_str() #else // USE_UNISHOX_COMPRESSION -const char HTTP_HEAD_STYLE_ZIGBEE[] PROGMEM = +const char HTTP_HEAD_STYLE_ZIGBEE[] PROGMEM = ".bt{box-sizing:border-box;position:relative;display:inline-block;width:20px;height:12px;border:2px solid;border-radius:3px;margin-left:-3px}" ".bt::after,.bt::before{content:\"\";display:block;box-sizing:border-box;position:absolute;height:6px;background:currentColor;top:1px}" ".bt::before{right:-4px;border-radius:3px;width:4px}" @@ -869,6 +869,7 @@ void StartWebserver(int type, IPAddress ipweb) Webserver->on("/u1", HandleUpgradeFirmwareStart); // OTA Webserver->on("/u2", HTTP_POST, HandleUploadDone, HandleUploadLoop); Webserver->on("/u2", HTTP_OPTIONS, HandlePreflightRequest); + Webserver->on("/u3", HandleUploadDone); Webserver->on("/cs", HTTP_GET, HandleConsole); Webserver->on("/cs", HTTP_OPTIONS, HandlePreflightRequest); Webserver->on("/cm", HandleHttpCommand); @@ -2624,6 +2625,16 @@ void HandleUploadDone(void) { if (!HttpCheckPriviledgedAccess()) { return; } +#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) + if (!Web.upload_error) { + // GUI xmodem + if (ZigbeeUploadOtaReady()) { + HandleZigbeeXfer(); + return; + } + } +#endif + AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPLOAD_DONE)); char error[100]; @@ -2639,8 +2650,8 @@ void HandleUploadDone(void) if (!Web.upload_error) { uint32_t javascript_settimeout = HTTP_OTA_RESTART_RECONNECT_TIME; #if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) - if (ZigbeeUploadOtaReady()) { - javascript_settimeout = 30000; // Refesh main web ui after transfer upgrade + if (ZigbeeUploadFinish()) { + javascript_settimeout = 10000; // Refesh main web ui after transfer upgrade } #endif WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, javascript_settimeout); // Refesh main web ui after OTA upgrade @@ -2665,15 +2676,9 @@ void HandleUploadDone(void) } else { WSContentSend_P(PSTR("%06x'>" D_SUCCESSFUL "
"), WebColor(COL_TEXT_SUCCESS)); restart_flag = 2; // Always restart to re-enable disabled features during update -#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) - if (ZigbeeUploadOtaReady()) { - WSContentSend_P(PSTR("
" D_TRANSFER_STARTED " ...

")); - restart_flag = 0; // Hold restart as firmware still needs to be written to MCU EFR32 - } -#endif // USE_ZIGBEE and USE_ZIGBEE_EZSP #ifdef USE_TASMOTA_CLIENT if (TasmotaClient_GetFlagFlashing()) { - WSContentSend_P(PSTR("
" D_TRANSFER_STARTED " ...

")); + WSContentSend_P(PSTR("
" D_TRANSFER_STARTED " ...
")); restart_flag = 0; // Hold restart as code still needs to be transferred to Atmega } #endif // USE_TASMOTA_CLIENT diff --git a/tasmota/xdrv_23_zigbee_9a_upload.ino b/tasmota/xdrv_23_zigbee_9a_upload.ino index 7c2feed26..05b20fdab 100644 --- a/tasmota/xdrv_23_zigbee_9a_upload.ino +++ b/tasmota/xdrv_23_zigbee_9a_upload.ino @@ -40,7 +40,7 @@ enum ZbUploadSteps { ZBU_IDLE, ZBU_INIT, ZBU_SOFTWARE_RESET, ZBU_SOFTWARE_SEND, ZBU_HARDWARE_RESET, ZBU_PROMPT, - ZBU_SYNC, ZBU_UPLOAD, ZBU_EOT, ZBU_COMPLETE, ZBU_DONE, ZBU_FINISH }; + ZBU_SYNC, ZBU_UPLOAD, ZBU_EOT, ZBU_COMPLETE, ZBU_DONE, ZBU_ERROR, ZBU_FINISH }; const uint8_t PIN_ZIGBEE_BOOTLOADER = 5; @@ -52,6 +52,7 @@ struct ZBUPLOAD { char *buffer; uint8_t ota_step = ZBU_IDLE; uint8_t bootloader = 0; + uint8_t state = ZBU_IDLE; } ZbUpload; /*********************************************************************************************\ @@ -282,7 +283,7 @@ bool ZigbeeUploadXmodem(void) { ZbUpload.ota_step = ZBU_HARDWARE_RESET; } else { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader hardware reset timeout")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; } return true; } @@ -299,7 +300,7 @@ bool ZigbeeUploadXmodem(void) { case ZBU_PROMPT: { // *** Wait for prompt and select option upload ebl if (millis() > XModem.timeout) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader timeout")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; return true; } #endif // ZIGBEE_BOOTLOADER_SOFTWARE_RESET_FIRST @@ -333,7 +334,7 @@ bool ZigbeeUploadXmodem(void) { case ZBU_SYNC: { // *** Handle file upload using XModem - sync if (millis() > XModem.timeout) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: SYNC timeout")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; return true; } // Wait for either C or NACK as a sync packet. Determines protocol details, checksum algorithm. @@ -354,7 +355,7 @@ bool ZigbeeUploadXmodem(void) { if (ZigbeeUploadAvailable()) { if (!XModemSendPacket(XModem.packetNo)) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Packet send failed")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; return true; } XModem.packetNo++; @@ -376,7 +377,7 @@ bool ZigbeeUploadXmodem(void) { // to occur without timing out on the response just before the EOT is sent. if (millis() > XModem.timeout) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: EOT ACK timeout")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; return true; } if (ZigbeeSerial->available()) { @@ -386,7 +387,6 @@ bool ZigbeeUploadXmodem(void) { XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt ZbUpload.byte_counter = 0; ZbUpload.ota_step = ZBU_COMPLETE; -// ZbUpload.ota_step = ZBU_DONE; // Skip prompt for now } } break; @@ -394,7 +394,7 @@ bool ZigbeeUploadXmodem(void) { case ZBU_COMPLETE: { // *** Wait for Serial upload complete EBL prompt if (millis() > XModem.timeout) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader timeout")); - ZbUpload.ota_step = ZBU_DONE; + ZbUpload.ota_step = ZBU_ERROR; return true; } else { // After an image successfully uploads, the XModem transaction completes and the bootloader displays @@ -406,18 +406,21 @@ bool ZigbeeUploadXmodem(void) { // 3. ebl info // BL > if (ZigbeeUploadBootloaderPrompt()) { + ZbUpload.state = ZBU_COMPLETE; ZbUpload.ota_step = ZBU_DONE; } } break; } + case ZBU_ERROR: + ZbUpload.state = ZBU_ERROR; case ZBU_DONE: { // *** Clean up and restart to disable bootloader and use new firmware AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: " D_RESTARTING)); ZigbeeUploadSetBootloader(1); // Disable bootloader and reset MCU - should happen at restart if (1 == ssleep) { ssleep = Settings.sleep; // Restore loop sleep } - restart_flag = 2; // Restart to disable bootloader and use new firmware +// restart_flag = 2; // Restart to disable bootloader and use new firmware ZbUpload.ota_step = ZBU_FINISH; // Never return to zero without a restart to get a sane Zigbee environment break; } @@ -437,6 +440,10 @@ bool ZigbeeUploadOtaReady(void) { return (ZBU_INIT == ZbUpload.ota_step); } +bool ZigbeeUploadFinish(void) { + return (ZBU_FINISH == ZbUpload.ota_step); +} + uint8_t ZigbeeUploadInit(void) { if (!PinUsed(GPIO_ZIGBEE_RST) && (ZigbeeSerial == nullptr)) { return 1; } // Wrong pin configuration - No file selected @@ -444,6 +451,7 @@ uint8_t ZigbeeUploadInit(void) { ZbUpload.sector_cursor = 0; ZbUpload.ota_size = 0; ZbUpload.ota_step = ZBU_IDLE; + ZbUpload.state = ZBU_IDLE; return 0; } @@ -468,8 +476,59 @@ bool ZigbeeUploadWriteBuffer(uint8_t *buf, size_t size) { void ZigbeeUploadDone(void) { ZbUpload.ota_step = ZBU_INIT; + ZbUpload.state = ZBU_UPLOAD; } -#endif // USE_ZIGBEE_EZSP +#ifdef USE_WEBSERVER -#endif // USE_ZIGBEE +#define WEB_HANDLE_ZIGBEE_XFER "zx" + +const char HTTP_SCRIPT_XFER_STATE[] PROGMEM = + "function z9(){" + "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) + "x=new XMLHttpRequest();" + "x.onreadystatechange=function(){" + "if(x.readyState==4&&x.status==200){" + "var s=x.responseText;" + "if(s!=7){" // ZBU_UPLOAD + "location.href='/u3';" + "}" + "}" + "};" + "x.open('GET','" WEB_HANDLE_ZIGBEE_XFER "?m=1',true);" // ?m related to Webserver->hasArg("m") + "x.send();" + "if(pc==1){" + "lt=setTimeout(z9,950);" // Poll every 0.95 second + "}" + "}" + "pc=1;" + "wl(z9);"; + +void HandleZigbeeXfer(void) { + if (!HttpCheckPriviledgedAccess()) { return; } + + if (Webserver->hasArg("m")) { // Status refresh requested + WSContentBegin(200, CT_PLAIN); + WSContentSend_P(PSTR("%d"), ZbUpload.state); + WSContentEnd(); + if (ZBU_ERROR == ZbUpload.state) { + Web.upload_error = 7; // Upload aborted (failed) + } + return; + } + + AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_UPLOAD_TRANSFER)); + + WSContentStart_P(S_INFORMATION); + WSContentSend_P(HTTP_SCRIPT_XFER_STATE); + WSContentSendStyle(); + WSContentSend_P(PSTR("
" D_UPLOAD_TRANSFER "...
")); + WSContentSpaceButton(BUTTON_MAIN); + WSContentStop(); +} + +#endif // USE_WEBSERVER + +#endif // USE_ZIGBEE_EZSP + +#endif // USE_ZIGBEE diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 9c359cf3a..a6386e491 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -284,7 +284,7 @@ void ZbSendReportWrite(const JsonObject &val_pubwrite, uint16_t device, uint16_t ResponseCmndChar_P(PSTR("No more than one cluster id per command")); return; } - + // //////////////////////////////////////////////////////////////////////////////// // Split encoding depending on message if (operation != ZCL_CONFIGURE_REPORTING) { @@ -1482,6 +1482,12 @@ bool Xdrv23(uint8_t function) case FUNC_WEB_SENSOR: ZigbeeShow(false); break; +#ifdef USE_ZIGBEE_EZSP + // GUI xmodem + case FUNC_WEB_ADD_HANDLER: + Webserver->on("/" WEB_HANDLE_ZIGBEE_XFER, HandleZigbeeXfer); + break; +#endif // USE_ZIGBEE_EZSP #endif // USE_WEBSERVER case FUNC_PRE_INIT: ZigbeeInit();