wangrong
2026-08-24 beef6536e7c8dd3f5cbe8f73585611479910bea7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef __CUSTOM_LCD_DISPLAY_H__
#define __CUSTOM_LCD_DISPLAY_H__
 
#include <driver/gpio.h>
#include "lcd_display.h"
 
/* Display color */
typedef enum {
    DRIVER_COLOR_WHITE = 0xff,
    DRIVER_COLOR_BLACK = 0x00,
    FONT_BACKGROUND = DRIVER_COLOR_WHITE,
} COLOR_IMAGE;
 
typedef struct {
    uint8_t cs;
    uint8_t dc;
    uint8_t rst;
    uint8_t busy;
    uint8_t mosi;
    uint8_t scl;
    int spi_host;
    int buffer_len;
} custom_epd_spi_t;
 
class CustomEpdDisplay : public LcdDisplay {
public:
    CustomEpdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width,
                     int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y,
                     bool swap_xy, custom_epd_spi_t _epd_spi_data);
    ~CustomEpdDisplay();
 
    void EPD_Init();    /* 墨水屏初始化 */
    void EPD_Clear();   /* 清空屏幕 */
    void EPD_Display(); /* 刷buffer到墨水屏 */
    void EPD_Sleep();
 
    /*快速刷新*/
    void EPD_DisplayPartBaseImage();
    void EPD_Init_Partial();
    void EPD_DisplayPart();
    void EPD_DrawColorPixel(uint16_t x, uint16_t y, uint8_t color);
 
private:
    const custom_epd_spi_t epd_spi_data;
    const int Width;
    const int Height;
    spi_device_handle_t spi;
    uint8_t* buffer = NULL;
 
    static void lvgl_flush_cb(lv_display_t* disp, const lv_area_t* area, uint8_t* color_p);
 
    void spi_gpio_init();
    void spi_port_init();
    void read_busy();
 
    void set_cs_1() { gpio_set_level((gpio_num_t)epd_spi_data.cs, 1); }
    void set_cs_0() { gpio_set_level((gpio_num_t)epd_spi_data.cs, 0); }
    void set_dc_1() { gpio_set_level((gpio_num_t)epd_spi_data.dc, 1); }
    void set_dc_0() { gpio_set_level((gpio_num_t)epd_spi_data.dc, 0); }
    void set_rst_1() { gpio_set_level((gpio_num_t)epd_spi_data.rst, 1); }
    void set_rst_0() { gpio_set_level((gpio_num_t)epd_spi_data.rst, 0); }
 
    void SPI_SendByte(uint8_t data);
    void EPD_SendData(uint8_t data);
    void EPD_SendCommand(uint8_t command);
    void writeBytes(uint8_t* buffer, int len);
    void writeBytes(const uint8_t* buffer, int len);
    void EPD_SetWindows(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend);
    void EPD_SetCursor(uint16_t Xstart, uint16_t Ystart);
    void EPD_TurnOnDisplay();
    void EPD_TurnOnDisplayPart();
};
 
#endif  // __CUSTOM_LCD_DISPLAY_H__