From 34142c510ff29264553619bfae8954ce638626fd Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Wed, 1 Nov 2023 09:35:51 +0100 Subject: [PATCH] Upload TFT for ESP-IDF Still pending some clean-up, but I would say this is a working version. --- nspanel_esphome_addon_upload_tft.yaml | 30 ++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/nspanel_esphome_addon_upload_tft.yaml b/nspanel_esphome_addon_upload_tft.yaml index 32fe9bb..96ca346 100644 --- a/nspanel_esphome_addon_upload_tft.yaml +++ b/nspanel_esphome_addon_upload_tft.yaml @@ -466,6 +466,10 @@ script: .url = url.c_str(), }; esp_http_client_handle_t client = esp_http_client_init(&config); + char range_header[64]; + sprintf(range_header, "bytes=%d-%d", range_start, range_end); + ESP_LOGD(TAG, "Requesting range: %s", range_header); + esp_http_client_set_header(client, "Range", range_header); esp_err_t err; if ((err = esp_http_client_open(client, 0)) != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); @@ -473,10 +477,6 @@ script: esp_http_client_cleanup(client); return -1; } - //char range_header[64]; - //sprintf(range_header, "bytes=%d-%d", range_start, range_end); - //ESP_LOGD(TAG, "Requesting range: %s", range_header); - //esp_http_client_set_header(client, "Range", range_header); int content_length = esp_http_client_fetch_headers(client); ESP_LOGD(TAG, "content_length = %d", content_length); int total_read_len = 0, read_len; @@ -499,10 +499,28 @@ script: tf_uart->write_array(buffer, read_len); ESP_LOGI(TAG, "Write to UART successful"); recv_ret_string_(recv_string, 5000, true); - if (recv_string[0] != 0x05) { // 0x05 == "ok" + content_length_ -= read_len; + ESP_LOGD(TAG, "Uploaded %0.1f %%, remaining %d bytes", + 100.0 * (tft_size_ - content_length_) / tft_size_, + content_length_); + if (recv_string[0] != 0x05) { // 0x05 == "ok" ESP_LOGD(TAG, "recv_string [%s]", format_hex_pretty(reinterpret_cast(recv_string.data()), recv_string.size()).c_str()); } + // handle partial upload request + if (recv_string[0] == 0x08 && recv_string.size() == 5) { + uint32_t result = 0; + for (int j = 0; j < 4; ++j) { + result += static_cast(recv_string[j + 1]) << (8 * j); + } + if (result > 0) { + ESP_LOGD(TAG, "Nextion reported new range %d", result); + content_length_ = tft_size_ - result; + esp_http_client_cleanup(client); + esp_http_client_close(client); + return result; + } + } recv_string.clear(); } else if (read_len == 0) { ESP_LOGI(TAG, "End of HTTP response reached"); @@ -517,6 +535,8 @@ script: delete[] buffer; ESP_LOGI(TAG, "Memory for buffer deallocated"); } + esp_http_client_cleanup(client); + esp_http_client_close(client); return range_end + 1; }; auto upload_tft_ = [&](const std::string &url, unsigned int update_baud_rate_) -> bool {