Fixed partial refresh problem, but refresh may blackout un touched pixels
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user