Limit max chunk_size to 32768
To leave more heap memory available. It might slow down a bit the transfers.
This commit is contained in:
@@ -15,6 +15,7 @@ substitutions:
|
|||||||
|
|
||||||
##### DON'T CHANGE THIS #####
|
##### DON'T CHANGE THIS #####
|
||||||
version: "4.1dev3"
|
version: "4.1dev3"
|
||||||
|
upload_tft_chunk_size_max: "32768"
|
||||||
#############################
|
#############################
|
||||||
|
|
||||||
##### WIFI SETUP #####
|
##### WIFI SETUP #####
|
||||||
@@ -38,11 +39,12 @@ esphome:
|
|||||||
- logger.log: After boot check-up
|
- logger.log: After boot check-up
|
||||||
- wait_until:
|
- wait_until:
|
||||||
condition:
|
condition:
|
||||||
- lambda: !lambda return id(tf_uart).available() or id(disp1).is_setup();
|
|
||||||
- api.connected:
|
- api.connected:
|
||||||
timeout: 15s
|
timeout: 60s
|
||||||
- delay: 2s
|
- wait_until:
|
||||||
|
condition:
|
||||||
|
- lambda: !lambda return id(disp1).is_setup();
|
||||||
|
timeout: 20s
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
if (not id(tf_uart).available() and not id(disp1).is_setup())
|
if (not id(tf_uart).available() and not id(disp1).is_setup())
|
||||||
{
|
{
|
||||||
@@ -1770,7 +1772,7 @@ script:
|
|||||||
ESP_LOGV("script.timer_dim", "Reset timer: %is", timeout);
|
ESP_LOGV("script.timer_dim", "Reset timer: %is", timeout);
|
||||||
if (id(is_dim_brightness))
|
if (id(is_dim_brightness))
|
||||||
{
|
{
|
||||||
if (page != "screensaver" and page != "boot")
|
if (page != "screensaver" and page != "boot" and page != "blank-screensaver")
|
||||||
{
|
{
|
||||||
ESP_LOGD("script.timer_dim", "Waking up on page: %s", page.c_str());
|
ESP_LOGD("script.timer_dim", "Waking up on page: %s", page.c_str());
|
||||||
id(disp1).send_command_printf("wakeup_timer.en=1");
|
id(disp1).send_command_printf("wakeup_timer.en=1");
|
||||||
@@ -1783,7 +1785,7 @@ script:
|
|||||||
then:
|
then:
|
||||||
- delay: !lambda return (timeout *1000);
|
- delay: !lambda return (timeout *1000);
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
if (id(current_page).state != "screensaver" and id(current_page).state != "boot" and timeout >= 1)
|
if (id(current_page).state != "screensaver" and id(current_page).state != "blank-screensaver" and id(current_page).state != "boot" and timeout >= 1)
|
||||||
{
|
{
|
||||||
ESP_LOGD("script.timer_dim", "Dimming the display to %i%%", id(display_dim_brightness_global));
|
ESP_LOGD("script.timer_dim", "Dimming the display to %i%%", id(display_dim_brightness_global));
|
||||||
id(disp1).send_command_printf("dim=%i", id(display_dim_brightness_global));
|
id(disp1).send_command_printf("dim=%i", id(display_dim_brightness_global));
|
||||||
@@ -1805,7 +1807,7 @@ script:
|
|||||||
- lambda: |-
|
- lambda: |-
|
||||||
if (id(current_page).state != "screensaver" and id(current_page).state != "boot" and timeout >= 1)
|
if (id(current_page).state != "screensaver" and id(current_page).state != "boot" and timeout >= 1)
|
||||||
{
|
{
|
||||||
ESP_LOGD("script.timer_sleep", "Going to sleep");
|
ESP_LOGD("script.timer_sleep", "Going to sleep from page %s", id(current_page).state.c_str());
|
||||||
id(disp1).goto_page("screensaver");
|
id(disp1).goto_page("screensaver");
|
||||||
id(is_dim_brightness) = true;
|
id(is_dim_brightness) = true;
|
||||||
}
|
}
|
||||||
@@ -2315,12 +2317,13 @@ script:
|
|||||||
unsigned long starting_timestamp = 0;
|
unsigned long starting_timestamp = 0;
|
||||||
auto remaining_time = [starting_timestamp, tranfer_size_, content_length_]() -> std::string
|
auto remaining_time = [starting_timestamp, tranfer_size_, content_length_]() -> std::string
|
||||||
{
|
{
|
||||||
|
if (content_length_ > tranfer_size_) return "unknown";
|
||||||
long remaining_millis = int(round((millis() - starting_timestamp) * content_length_ / (tranfer_size_ - content_length_)));
|
long remaining_millis = int(round((millis() - starting_timestamp) * content_length_ / (tranfer_size_ - content_length_)));
|
||||||
long hours = remaining_millis / (1000 * 60 * 60);
|
int hours = remaining_millis / (1000 * 60 * 60);
|
||||||
long minutes = (remaining_millis / (1000 * 60)) % 60;
|
int minutes = (remaining_millis / (1000 * 60)) % 60;
|
||||||
long seconds = (remaining_millis / 1000) % 60;
|
int seconds = (remaining_millis / 1000) % 60;
|
||||||
char resp[9];
|
char resp[9];
|
||||||
sprintf(resp, "%02lu:%02lu:%02lu", hours, minutes, seconds);
|
sprintf(resp, "%02i:%02i:%02i", hours, minutes, seconds);
|
||||||
return std::string(resp);
|
return std::string(resp);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2436,7 +2439,7 @@ script:
|
|||||||
|
|
||||||
++tries;
|
++tries;
|
||||||
if (!begin_status) {
|
if (!begin_status) {
|
||||||
ESP_LOGD("script.upload_tft.upload_by_chunks", "upload_by_chunks_: connection failed");
|
ESP_LOGD("script.upload_tft.upload_by_chunks", "Connection failed");
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2475,7 +2478,7 @@ script:
|
|||||||
fetched += c;
|
fetched += c;
|
||||||
}
|
}
|
||||||
http->end();
|
http->end();
|
||||||
ESP_LOGD("script.upload_tft.upload_by_chunks", "fetched %d bytes", fetched);
|
ESP_LOGD("script.upload_tft.upload_by_chunks", "Fetched %d bytes", fetched);
|
||||||
|
|
||||||
// upload fetched segments to the display in 4KB chunks
|
// upload fetched segments to the display in 4KB chunks
|
||||||
for (int i = 0; i < range; i += 4096) {
|
for (int i = 0; i < range; i += 4096) {
|
||||||
@@ -2483,9 +2486,10 @@ script:
|
|||||||
write_len = content_length_ < 4096 ? content_length_ : 4096;
|
write_len = content_length_ < 4096 ? content_length_ : 4096;
|
||||||
id(tf_uart).write_array(&transfer_buffer_[i], write_len);
|
id(tf_uart).write_array(&transfer_buffer_[i], write_len);
|
||||||
content_length_ -= write_len;
|
content_length_ -= write_len;
|
||||||
ESP_LOGD("script.upload_tft.upload_by_chunks", "Uploaded %0.1f %%, remaining %d bytes",
|
ESP_LOGD("script.upload_tft.upload_by_chunks", "Uploaded %0.1f %%, remaining %d bytes (%s)",
|
||||||
100.0 * (tft_size_ - content_length_) / tft_size_,
|
100.0 * (tft_size_ - content_length_) / tft_size_,
|
||||||
content_length_);
|
content_length_,
|
||||||
|
remaining_time);
|
||||||
|
|
||||||
if (!upload_first_chunk_sent_) {
|
if (!upload_first_chunk_sent_) {
|
||||||
upload_first_chunk_sent_ = true;
|
upload_first_chunk_sent_ = true;
|
||||||
@@ -2528,7 +2532,7 @@ script:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!network::is_connected()) {
|
if (!network::is_connected()) {
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "network is not connected");
|
ESP_LOGD("script.upload_tft.upload_tft", "Network is not connected");
|
||||||
return upload_end_(false);
|
return upload_end_(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2546,7 +2550,7 @@ script:
|
|||||||
|
|
||||||
if (!begin_status) {
|
if (!begin_status) {
|
||||||
is_updating_ = false;
|
is_updating_ = false;
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "connection failed");
|
ESP_LOGD("script.upload_tft.upload_tft", "Connection failed");
|
||||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||||
allocator.deallocate(transfer_buffer_, transfer_buffer_size_);
|
allocator.deallocate(transfer_buffer_, transfer_buffer_size_);
|
||||||
return upload_end_(true);
|
return upload_end_(true);
|
||||||
@@ -2614,25 +2618,26 @@ script:
|
|||||||
|
|
||||||
std::string response;
|
std::string response;
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "Waiting for upgrade response");
|
ESP_LOGD("script.upload_tft.upload_tft", "Waiting for upgrade response");
|
||||||
recv_ret_string_(response, 15000, true); // This can take some time to return
|
recv_ret_string_(response, 2000, true); // This can take some time to return
|
||||||
|
|
||||||
// The Nextion display will, if it's ready to accept data, send a 0x05 byte.
|
// The Nextion display will, if it's ready to accept data, send a 0x05 byte.
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "Upgrade response is [%s]",
|
ESP_LOGD("script.upload_tft.upload_tft", "Upgrade response is [%s]",
|
||||||
format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str());
|
format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str());
|
||||||
|
|
||||||
if (response.find(0x05) != std::string::npos) {
|
if (response.find(0x05) != std::string::npos) {
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "preparation for tft update done");
|
ESP_LOGD("script.upload_tft.upload_tft", "Preparation for tft update done");
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "preparation for tft update failed %d \"%s\"", response[0], response.c_str());
|
ESP_LOGD("script.upload_tft.upload_tft", "Preparation for tft update failed %d \"%s\"", response[0], response.c_str());
|
||||||
return upload_end_(true);
|
return upload_end_(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nextion wants 4096 bytes at a time. Make chunk_size a multiple of 4096
|
// Nextion wants 4096 bytes at a time. Make chunk_size a multiple of 4096
|
||||||
uint32_t chunk_size = 8192;
|
uint32_t chunk_size = 8192;
|
||||||
if (ESP.getFreeHeap() > 40960) { // 32K to keep on hand
|
if (ESP.getFreeHeap() > 81920) { // Ensure some FreeHeap to other things and limit chunk size
|
||||||
chunk_size = ESP.getFreeHeap() - 32768;
|
chunk_size = ESP.getFreeHeap() - 65536;
|
||||||
chunk_size = chunk_size > 65536 ? 65536 : chunk_size;
|
chunk_size = int(chunk_size / 4096) * 4096;
|
||||||
} else if (ESP.getFreeHeap() < 10240) {
|
chunk_size = chunk_size > ${upload_tft_chunk_size_max} ? ${upload_tft_chunk_size_max} : chunk_size;
|
||||||
|
} else if (ESP.getFreeHeap() < 32768) {
|
||||||
chunk_size = 4096;
|
chunk_size = 4096;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2640,7 +2645,7 @@ script:
|
|||||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "Allocating buffer size %d, Heap size is %u", chunk_size, ESP.getFreeHeap());
|
ESP_LOGD("script.upload_tft.upload_tft", "Allocating buffer size %d, Heap size is %u", chunk_size, ESP.getFreeHeap());
|
||||||
transfer_buffer_ = allocator.allocate(chunk_size);
|
transfer_buffer_ = allocator.allocate(chunk_size);
|
||||||
if (transfer_buffer_ == nullptr) { // Try a smaller size
|
if (transfer_buffer_ == nullptr) { // Try a smaller size
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "Could not allocate buffer size: %d trying 4096 instead", chunk_size);
|
ESP_LOGD("script.upload_tft.upload_tft", "Could not allocate buffer size: %d trying 4096 instead", chunk_size);
|
||||||
chunk_size = 4096;
|
chunk_size = 4096;
|
||||||
ESP_LOGD("script.upload_tft.upload_tft", "Allocating %d buffer", chunk_size);
|
ESP_LOGD("script.upload_tft.upload_tft", "Allocating %d buffer", chunk_size);
|
||||||
@@ -2679,9 +2684,7 @@ script:
|
|||||||
|
|
||||||
if (upload_tft(url, id(tf_uart).get_baud_rate())) id(restart_nspanel).press();
|
if (upload_tft(url, id(tf_uart).get_baud_rate())) id(restart_nspanel).press();
|
||||||
power_cycle_display();
|
power_cycle_display();
|
||||||
if (upload_tft(url, 921600)) id(restart_nspanel).press();
|
if (upload_tft(url, (id(tf_uart).get_baud_rate() == 115200) ? 921600 : 115200 )) id(restart_nspanel).press();
|
||||||
power_cycle_display();
|
|
||||||
if (upload_tft(url, 9600)) id(restart_nspanel).press();
|
|
||||||
power_cycle_display();
|
power_cycle_display();
|
||||||
ESP_LOGE("script.upload_tft", "TFT upload failed.");
|
ESP_LOGE("script.upload_tft", "TFT upload failed.");
|
||||||
ESP_LOGW("script.upload_tft", "Trying Nextion standard upload");
|
ESP_LOGW("script.upload_tft", "Trying Nextion standard upload");
|
||||||
|
|||||||
Reference in New Issue
Block a user