Fixed partial refresh problem, but refresh may blackout un touched pixels

This commit is contained in:
GW_MC
2026-01-27 11:50:12 +08:00
parent 5f491dff6e
commit dc2a76e131
2 changed files with 63 additions and 28 deletions

View File

@@ -83,20 +83,32 @@ void EInk_Checkerboard(
}
}
// Yield and reset watchdog periodically
if (y % 50 == 0) {
const size_t YIELD_INTERVAL = 16;
if (y % YIELD_INTERVAL == 0) {
if (wdt_err == ESP_OK) {
esp_task_wdt_reset();
}
vTaskDelay(1 / portTICK_PERIOD_MS);
// partial refresh to show progress
int32_t y_start = static_cast<int32_t>((y >= YIELD_INTERVAL - 1) ? (y - (YIELD_INTERVAL - 1)) : 0);
int32_t y_end = static_cast<int32_t>(y);
// get the partial framebuffer for this area
uint8_t* partial_framebuffer = &framebuffer[y_start * (DISPLAY_WIDTH / 8)];
esp_err_t err = display_handler->partial_refresh(partial_framebuffer, RefreshArea { 0, y_start, DISPLAY_WIDTH - 1, y_end });
if (err != ESP_OK) {
ESP_LOGE(TAG, "Partial refresh failed at y=%d: %s", y, esp_err_to_name(err));
}
// wait for 4 seconds to prevent spamming the display
// vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// Perform full write to display
esp_err_t err = display_handler->full_write(framebuffer);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Checkerboard full write failed: %s", esp_err_to_name(err));
} else {
ESP_LOGI(TAG, "Checkerboard pattern displayed successfully.");
}
// esp_err_t err = display_handler->full_write(framebuffer);
// if (err != ESP_OK) {
// ESP_LOGE(TAG, "Checkerboard full write failed: %s", esp_err_to_name(err));
// } else {
// ESP_LOGI(TAG, "Checkerboard pattern displayed successfully.");
// }
delete[] framebuffer;
// Remove task from watchdog before deletion
@@ -239,18 +251,19 @@ void app_main(void) {
// NetworkHandler* network_handler = new NetworkHandler(std::move(wifi_handler));
EInkDisplayHandler* display_handler = new EInkDisplayHandler();
// Initialize display and touch
display_handler->init_devices();
display_handler->init_devices(system_event_group);
// display_handler->init_devices();
display_handler->clear_display();
ESP_LOGI(TAG, "E-Ink display handler initialized.\n");
// LVGL Handler
std::unique_ptr<EInkDisplayHandler> display_uptr(display_handler);
LVGLHandler lvgl_handler(std::move(display_uptr));
esp_err_t err = lvgl_handler.initLVGL(system_event_group);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize LVGL handler: %s", esp_err_to_name(err));
vTaskDelay(5000 / portTICK_PERIOD_MS);
return esp_restart();
}
// std::unique_ptr<EInkDisplayHandler> display_uptr(display_handler);
// LVGLHandler lvgl_handler(std::move(display_uptr));
// esp_err_t err = lvgl_handler.initLVGL(system_event_group);
// if (err != ESP_OK) {
// ESP_LOGE(TAG, "Failed to initialize LVGL handler: %s", esp_err_to_name(err));
// vTaskDelay(5000 / portTICK_PERIOD_MS);
// return esp_restart();
// }
//
// kv_storage_handler->init(system_event_group);
@@ -270,7 +283,8 @@ void app_main(void) {
ESP_LOGI(TAG, "System is ready. Starting main application...\n");
// Show checkerboard pattern on display for testing
LVGL_Checkerboard(&lvgl_handler);
EInk_Checkerboard(display_handler);
// LVGL_Checkerboard(&lvgl_handler);
// Register apps with AppRegistry by creating their descriptors
// Each descriptor will create and register the app instance