mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
Merge pull request #11876 from gemu2015/lvgl_mono
lvgl monochrome support
This commit is contained in:
commit
4c070aa2a2
@ -924,6 +924,19 @@ void uDisplay::Splash(void) {
|
|||||||
|
|
||||||
void uDisplay::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
|
void uDisplay::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
|
||||||
|
|
||||||
|
if (bpp != 16) {
|
||||||
|
// just save params or update frame
|
||||||
|
if (!x0 && !y0 && !x1 && !y1) {
|
||||||
|
Updateframe();
|
||||||
|
} else {
|
||||||
|
seta_xp1 = x0;
|
||||||
|
seta_xp2 = x1;
|
||||||
|
seta_yp1 = y0;
|
||||||
|
seta_yp2 = y1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!x0 && !y0 && !x1 && !y1) {
|
if (!x0 && !y0 && !x1 && !y1) {
|
||||||
SPI_CS_HIGH
|
SPI_CS_HIGH
|
||||||
SPI_END_TRANSACTION
|
SPI_END_TRANSACTION
|
||||||
@ -984,9 +997,30 @@ void uDisplay::setAddrWindow_int(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline uint8_t ulv_color_to1(uint16_t color) {
|
||||||
|
if (((color>>11) & 0x10) || ((color>>5) & 0x20) || (color & 0x10)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean first) {
|
void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean first) {
|
||||||
uint16_t color;
|
uint16_t color;
|
||||||
|
|
||||||
|
if (bpp != 16) {
|
||||||
|
// stupid monchrome version
|
||||||
|
for (uint32_t y = seta_yp1; y < seta_yp2; y++) {
|
||||||
|
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||||
|
uint16_t color = *data++;
|
||||||
|
drawPixel(x, y, ulv_color_to1(color));
|
||||||
|
len--;
|
||||||
|
if (!len) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (len--) {
|
while (len--) {
|
||||||
color = *data++;
|
color = *data++;
|
||||||
WriteColor(color);
|
WriteColor(color);
|
||||||
|
@ -205,6 +205,10 @@ class uDisplay : public Renderer {
|
|||||||
uint8_t lut_array[LUTMAXSIZE][5];
|
uint8_t lut_array[LUTMAXSIZE][5];
|
||||||
uint8_t lut_cnt[5];
|
uint8_t lut_cnt[5];
|
||||||
uint8_t lut_cmd[5];
|
uint8_t lut_cmd[5];
|
||||||
|
uint16_t seta_xp1;
|
||||||
|
uint16_t seta_xp2;
|
||||||
|
uint16_t seta_yp1;
|
||||||
|
uint16_t seta_yp2;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ static void lv_tick_handler(void) { lv_tick_inc(lv_tick_interval_ms); }
|
|||||||
#define ADC_YMAX 840
|
#define ADC_YMAX 840
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t Touch_Status(uint32_t sel);
|
uint32_t Touch_Status(uint32_t sel);
|
||||||
|
|
||||||
static bool touchscreen_read(struct _lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
|
static bool touchscreen_read(struct _lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
|
||||||
@ -76,10 +77,10 @@ static void lv_flush_callback(lv_disp_drv_t *disp, const lv_area_t *area, lv_col
|
|||||||
Renderer *display = glue->display;
|
Renderer *display = glue->display;
|
||||||
|
|
||||||
if (!glue->first_frame) {
|
if (!glue->first_frame) {
|
||||||
//display->dmaWait(); // Wait for prior DMA transfer to complete
|
//display->dmaWait(); // Wait for prior DMA transfer to complete
|
||||||
//display->endWrite(); // End transaction from any prior call
|
//display->endWrite(); // End transaction from any prior call
|
||||||
} else {
|
} else {
|
||||||
glue->first_frame = false;
|
glue->first_frame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
display->setAddrWindow(area->x1, area->y1, area->x1+width, area->y1+height);
|
display->setAddrWindow(area->x1, area->y1, area->x1+width, area->y1+height);
|
||||||
@ -87,6 +88,7 @@ static void lv_flush_callback(lv_disp_drv_t *disp, const lv_area_t *area, lv_col
|
|||||||
display->setAddrWindow(0,0,0,0);
|
display->setAddrWindow(0,0,0,0);
|
||||||
|
|
||||||
lv_disp_flush_ready(disp);
|
lv_disp_flush_ready(disp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LV_USE_LOG)
|
#if (LV_USE_LOG)
|
||||||
@ -104,6 +106,7 @@ static void lv_debug(lv_log_level_t level, const char *file, uint32_t line, cons
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// GLUE LIB FUNCTIONS ------------------------------------------------------
|
// GLUE LIB FUNCTIONS ------------------------------------------------------
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
@ -198,6 +201,8 @@ LvGLStatus Adafruit_LvGL_Glue::begin(Renderer *tft, bool debug) {
|
|||||||
|
|
||||||
LvGLStatus Adafruit_LvGL_Glue::begin(Renderer *tft, void *touch, bool debug) {
|
LvGLStatus Adafruit_LvGL_Glue::begin(Renderer *tft, void *touch, bool debug) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lv_init();
|
lv_init();
|
||||||
// #if (LV_USE_LOG)
|
// #if (LV_USE_LOG)
|
||||||
// if (debug) {
|
// if (debug) {
|
||||||
@ -208,7 +213,13 @@ LvGLStatus Adafruit_LvGL_Glue::begin(Renderer *tft, void *touch, bool debug) {
|
|||||||
// Allocate LvGL display buffer (x2 because DMA double buffering)
|
// Allocate LvGL display buffer (x2 because DMA double buffering)
|
||||||
LvGLStatus status = LVGL_ERR_ALLOC;
|
LvGLStatus status = LVGL_ERR_ALLOC;
|
||||||
// if ((lv_pixel_buf = new lv_color_t[LV_HOR_RES_MAX * LV_BUFFER_ROWS * 2])) {
|
// if ((lv_pixel_buf = new lv_color_t[LV_HOR_RES_MAX * LV_BUFFER_ROWS * 2])) {
|
||||||
if ((lv_pixel_buf = new lv_color_t[LV_HOR_RES_MAX * LV_BUFFER_ROWS])) {
|
|
||||||
|
uint32_t lvgl_buffer_size;
|
||||||
|
//lvgl_buffer_size = LV_HOR_RES_MAX * LV_BUFFER_ROWS;
|
||||||
|
lvgl_buffer_size = tft->width() * LV_BUFFER_ROWS;
|
||||||
|
|
||||||
|
|
||||||
|
if ((lv_pixel_buf = new lv_color_t[lvgl_buffer_size])) {
|
||||||
|
|
||||||
display = tft;
|
display = tft;
|
||||||
touchscreen = (void *)touch;
|
touchscreen = (void *)touch;
|
||||||
@ -223,7 +234,7 @@ LvGLStatus Adafruit_LvGL_Glue::begin(Renderer *tft, void *touch, bool debug) {
|
|||||||
lv_disp_buf_init(
|
lv_disp_buf_init(
|
||||||
&lv_disp_buf, lv_pixel_buf, // 1st half buf
|
&lv_disp_buf, lv_pixel_buf, // 1st half buf
|
||||||
nullptr, // 2nd half buf
|
nullptr, // 2nd half buf
|
||||||
LV_HOR_RES_MAX * LV_BUFFER_ROWS);
|
lvgl_buffer_size);
|
||||||
|
|
||||||
// Initialize LvGL display driver
|
// Initialize LvGL display driver
|
||||||
lv_disp_drv_init(&lv_disp_drv);
|
lv_disp_drv_init(&lv_disp_drv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user