From 18350e6fd760519e448029dd3697a9abb7407117 Mon Sep 17 00:00:00 2001 From: Martin Fasani Date: Tue, 1 Jun 2021 16:15:31 +0200 Subject: [PATCH] Add old calepd version --- lvgl_tft/calepd_epaper.cpp | 66 ++++++++++++++++++++++++++++++++++++++ lvgl_tft/calepd_epaper.h | 36 +++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 lvgl_tft/calepd_epaper.cpp create mode 100644 lvgl_tft/calepd_epaper.h diff --git a/lvgl_tft/calepd_epaper.cpp b/lvgl_tft/calepd_epaper.cpp new file mode 100644 index 0000000..4ea6c89 --- /dev/null +++ b/lvgl_tft/calepd_epaper.cpp @@ -0,0 +1,66 @@ +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "epdiy_epaper.h" + +// NOTE: This needs Epdiy component https://github.com/vroland/epdiy +// Run idf.py menuconfig-> Component Config -> E-Paper driver and select: +// Display type: LILIGO 4.7 ED047TC1 +// Board: LILIGO T5-4.7 Epaper +// In the same section Component Config -> ESP32 Specifics -> Enable PSRAM +#include "parallel/ED047TC1.h" +Ed047TC1 display; + +/********************* + * DEFINES + *********************/ +#define TAG "EPDIY" + +uint16_t flushcalls = 0; + +/* Display initialization routine */ +void epdiy_init(void) +{ + printf("epdiy_init\n"); + display.init(); + display.setRotation(0); + display.clearScreen(); +} + +/* Required by LVGL */ +void epdiy_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + ++flushcalls; + printf("epdiy_flush %d x:%d y:%d w:%d h:%d\n", flushcalls,area->x1,area->y1,lv_area_get_width(area),lv_area_get_height(area)); + + // Full update + if (lv_area_get_width(area)==display.width() && lv_area_get_height(area)==display.height()) { + display.update(); + } else { + // Partial update: Looks nice but should find a way to clear that area first. Mode: MODE_EPDIY_WHITE_TO_GL16 + display.updateWindow(area->x1,area->y1,lv_area_get_width(area),lv_area_get_height(area),MODE_GC16); + } + + /* IMPORTANT!!! + * Inform the graphics library that you are ready with the flushing */ + lv_disp_flush_ready(drv); +} + +/* Called for each pixel */ +void epdiy_set_px_cb(lv_disp_drv_t * disp_drv, uint8_t* buf, + lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + // Is printing Y axis only till 40 px: And flushing too many times + //printf("%d ", (int16_t)y); // Works and prints "Hello world" + //printf("%d ",(int16_t)color.full); // Debug colors + // Test using RGB232 + int16_t epd_color = EPD_WHITE; + + // Color setting use: RGB232 + if ((int16_t)color.full<250) { + epd_color = (int16_t)color.full/3; + } + display.drawPixel((int16_t)x, (int16_t)y, epd_color); +} diff --git a/lvgl_tft/calepd_epaper.h b/lvgl_tft/calepd_epaper.h new file mode 100644 index 0000000..b9cfba7 --- /dev/null +++ b/lvgl_tft/calepd_epaper.h @@ -0,0 +1,36 @@ +/** + * Display class for generic e-Paper driven by EPDiy class +*/ +#ifndef CALEPD_H +#define CALEPD_H + +#define EPDIY_COLUMNS (LV_HOR_RES_MAX / 8) + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif +#include "sdkconfig.h" + +/* Configure your display */ +void epdiy_init(void); + +/* LVGL callbacks */ +void epdiy_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); + +/* Only for monochrome displays. But we use epdiy_set_px also for epapers */ +//void epdiy_rounder(lv_disp_drv_t *disp_drv, lv_area_t *area); +void epdiy_set_px_cb(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* EPDIY_H */ \ No newline at end of file