Created
August 31, 2023 09:02
-
-
Save Zer0-bit/7573ff939662476275c11bb0c5a4f4ac to your computer and use it in GitHub Desktop.
LVGL widgets done for both Lovyan and Arduino GFX libraries to showcase the issue better.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifdef ARDUINO_GFX | |
#include <Wire.h> | |
#include <TAMC_GT911.h> | |
#include <Arduino_GFX_Library.h> | |
#define TFT_BL 2 | |
Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel( | |
40 /* DE */, 41 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */, | |
45 /* R0 */, 48 /* R1 */, 47 /* R2 */, 21 /* R3 */, 14 /* R4 */, | |
5 /* G0 */, 6 /* G1 */, 7 /* G2 */, 15 /* G3 */, 16 /* G4 */, 4 /* G5 */, | |
8 /* B0 */, 3 /* B1 */, 46 /* B2 */, 9 /* B3 */, 1 /* B4 */, | |
0 /* hsync_polarity */, 8 /* hsync_front_porch */, 4 /* hsync_pulse_width */, 43 /* hsync_back_porch */, | |
0 /* vsync_polarity */, 8 /* vsync_front_porch */, 4 /* vsync_pulse_width */, 12 /* vsync_back_porch */, | |
1 /* pclk_active_neg */, 16000000 /* prefer_speed */, | |
0 /* de_idle_high */, 0 /* pclk_idle_high */ | |
); | |
Arduino_RGB_Display *gfx = new Arduino_RGB_Display( | |
800 /* width */, 480 /* height */, rgbpanel | |
); | |
#define TOUCH_GT911_SCL 20 | |
#define TOUCH_GT911_SDA 19 | |
#define TOUCH_GT911_INT -1 | |
#define TOUCH_GT911_RST 38 | |
#define TOUCH_GT911_ROTATION ROTATION_NORMAL | |
#define TOUCH_MAP_X1 480 | |
#define TOUCH_MAP_X2 0 | |
#define TOUCH_MAP_Y1 272 | |
#define TOUCH_MAP_Y2 0 | |
int touch_last_x = 0, touch_last_y = 0; | |
TAMC_GT911 ts = TAMC_GT911(TOUCH_GT911_SDA, TOUCH_GT911_SCL, TOUCH_GT911_INT, TOUCH_GT911_RST, max(TOUCH_MAP_X1, TOUCH_MAP_X2), max(TOUCH_MAP_Y1, TOUCH_MAP_Y2)); | |
void touch_init() | |
{ | |
Wire.begin(TOUCH_GT911_SDA, TOUCH_GT911_SCL); | |
ts.begin(); | |
ts.setRotation(TOUCH_GT911_ROTATION); | |
} | |
bool touch_has_signal() | |
{ | |
return true; | |
} | |
bool touch_touched() | |
{ | |
ts.read(); | |
if (ts.isTouched) | |
{ | |
#if defined(TOUCH_SWAP_XY) | |
touch_last_x = map(ts.points[0].y, TOUCH_MAP_X1, TOUCH_MAP_X2, 0, gfx->width() - 1); | |
touch_last_y = map(ts.points[0].x, TOUCH_MAP_Y1, TOUCH_MAP_Y2, 0, gfx->height() - 1); | |
#else | |
touch_last_x = map(ts.points[0].x, TOUCH_MAP_X1, TOUCH_MAP_X2, 0, gfx->width() - 1); | |
touch_last_y = map(ts.points[0].y, TOUCH_MAP_Y1, TOUCH_MAP_Y2, 0, gfx->height() - 1); | |
#endif | |
return true; | |
} | |
else | |
{ | |
return false; | |
} | |
} | |
bool touch_released() | |
{ | |
return true; | |
} | |
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma GCC optimize ("Ofast") | |
#include <Arduino.h> | |
#include <lvgl.h> | |
#include <demos/lv_demos.h> | |
// #include <demos/widgets/lv_demo_widgets.h> | |
#include "lgfx_8048S043C.h" | |
#include "agfx_8048S043C.h" | |
///////////////////// LCD INIT //////////////////// | |
#ifdef LOVYAN_GFX | |
static LGFX lcd; // LGFXのインスタンスを作成。 | |
static lv_disp_draw_buf_t draw_buf; | |
static lv_color_t buf[ MAIN_CONTENT_WIDTH * 10 ]; | |
/* Display flushing */ | |
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p){ | |
lcd.pushImageDMA( area->x1 | |
, area->y1 | |
, area->x2 - area->x1 + 1 | |
, area->y2 - area->y1 + 1 | |
, ( lgfx::rgb565_t* )&color_p->full ); | |
lv_disp_flush_ready(disp); | |
} | |
/////////////// LCD INIT//////////////// | |
void my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { | |
uint16_t touchX, touchY; | |
bool touched; | |
touched = lcd.getTouch( &touchX, &touchY); | |
if( !touched ) | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
else | |
{ | |
data->state = LV_INDEV_STATE_PR; | |
/*Set the coordinates*/ | |
data->point.x = touchX; | |
data->point.y = touchY; | |
} | |
} | |
void lcd_init(void) { | |
lcd.begin(); /* TFT init */ | |
lcd.setRotation(0); /* Landscape orientation, flipped */ | |
lcd.setBrightness(128); | |
lv_init(); | |
lv_disp_draw_buf_init( &draw_buf, buf, NULL, MAIN_CONTENT_WIDTH * 10 ); | |
/*Initialize the display*/ | |
static lv_disp_drv_t disp_drv; | |
lv_disp_drv_init( &disp_drv ); | |
/*Change the following line to your display resolution*/ | |
disp_drv.hor_res = MAIN_CONTENT_WIDTH; | |
disp_drv.ver_res = MAIN_CONTENT_HEIGHT; | |
disp_drv.flush_cb = my_disp_flush; | |
disp_drv.draw_buf = &draw_buf; | |
lv_disp_drv_register( &disp_drv ); | |
/*Initialize the (dummy) input device driver*/ | |
static lv_indev_drv_t indev_drv; | |
lv_indev_drv_init( &indev_drv ); | |
indev_drv.type = LV_INDEV_TYPE_POINTER; | |
indev_drv.read_cb = my_touchpad_read; | |
lv_indev_drv_register( &indev_drv ); | |
} | |
#elif defined(ARDUINO_GFX) | |
/* Change to your screen resolution */ | |
static uint32_t screenWidth; | |
static uint32_t screenHeight; | |
static lv_disp_draw_buf_t draw_buf; | |
static lv_color_t *disp_draw_buf; | |
static lv_disp_drv_t disp_drv; | |
/* Display flushing */ | |
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { | |
uint32_t w = (area->x2 - area->x1 + 1); | |
uint32_t h = (area->y2 - area->y1 + 1); | |
#if (LV_COLOR_16_SWAP != 0) | |
gfx->draw16bitBeRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h); | |
#else | |
gfx->draw16bitRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h); | |
#endif | |
lv_disp_flush_ready(disp); | |
} | |
void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) | |
{ | |
if (touch_has_signal()) | |
{ | |
if (touch_touched()) | |
{ | |
data->state = LV_INDEV_STATE_PR; | |
/*Set the coordinates*/ | |
data->point.x = touch_last_x; | |
data->point.y = touch_last_y; | |
} | |
else if (touch_released()) | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
} | |
else | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
} | |
void lcd_init(void) { | |
// Init Display | |
gfx->begin(); | |
#ifdef TFT_BL | |
pinMode(TFT_BL, OUTPUT); | |
digitalWrite(TFT_BL, HIGH); | |
#endif | |
gfx->fillScreen(RED); | |
delay(500); | |
gfx->fillScreen(GREEN); | |
delay(500); | |
gfx->fillScreen(BLUE); | |
delay(500); | |
gfx->fillScreen(BLACK); | |
delay(500); | |
lv_init(); | |
delay(10); | |
touch_init(); | |
screenWidth = gfx->width(); | |
screenHeight = gfx->height(); | |
#ifdef ESP32 | |
disp_draw_buf = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * screenHeight/4 , MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); | |
#else | |
disp_draw_buf = (lv_color_t *)malloc(sizeof(lv_color_t) * screenWidth * screenHeight/4); | |
#endif | |
if (!disp_draw_buf) | |
{ | |
Serial.println("LVGL disp_draw_buf allocate failed!"); | |
} | |
else | |
{ | |
lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * screenHeight/4); | |
/* Initialize the display */ | |
lv_disp_drv_init(&disp_drv); | |
/* Change the following line to your display resolution */ | |
disp_drv.hor_res = screenWidth; | |
disp_drv.ver_res = screenHeight; | |
disp_drv.flush_cb = my_disp_flush; | |
disp_drv.draw_buf = &draw_buf; | |
lv_disp_drv_register(&disp_drv); | |
/* Initialize the (dummy) input device driver */ | |
static lv_indev_drv_t indev_drv; | |
lv_indev_drv_init(&indev_drv); | |
indev_drv.type = LV_INDEV_TYPE_POINTER; | |
indev_drv.read_cb = my_touchpad_read; | |
lv_indev_drv_register(&indev_drv); | |
Serial.println("Setup done"); | |
} | |
} | |
#endif | |
void setup() { | |
Serial.begin( 115200 ); | |
lcd_init(); | |
// Init LCD objects | |
lv_demo_widgets(); | |
} | |
void loop() { | |
lv_timer_handler(); /* let the GUI do its work */ | |
delay(5); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma GCC optimize ("Ofast") | |
#include <Arduino.h> | |
#include <lvgl.h> | |
#include <demos/lv_demos.h> | |
// #include <demos/widgets/lv_demo_widgets.h> | |
#include "lgfx_8048S043C.h" | |
#include "agfx_8048S043C.h" | |
///////////////////// LCD INIT //////////////////// | |
#ifdef LOVYAN_GFX | |
static LGFX lcd; // LGFXのインスタンスを作成。 | |
static lv_disp_draw_buf_t draw_buf; | |
static lv_color_t buf[ MAIN_CONTENT_WIDTH * 10 ]; | |
/* Display flushing */ | |
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p){ | |
lcd.pushImageDMA( area->x1 | |
, area->y1 | |
, area->x2 - area->x1 + 1 | |
, area->y2 - area->y1 + 1 | |
, ( lgfx::rgb565_t* )&color_p->full ); | |
lv_disp_flush_ready(disp); | |
} | |
/////////////// LCD INIT//////////////// | |
void my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { | |
uint16_t touchX, touchY; | |
bool touched; | |
touched = lcd.getTouch( &touchX, &touchY); | |
if( !touched ) | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
else | |
{ | |
data->state = LV_INDEV_STATE_PR; | |
/*Set the coordinates*/ | |
data->point.x = touchX; | |
data->point.y = touchY; | |
} | |
} | |
void lcd_init(void) { | |
lcd.begin(); /* TFT init */ | |
lcd.setRotation(0); /* Landscape orientation, flipped */ | |
lcd.setBrightness(128); | |
lv_init(); | |
lv_disp_draw_buf_init( &draw_buf, buf, NULL, MAIN_CONTENT_WIDTH * 10 ); | |
/*Initialize the display*/ | |
static lv_disp_drv_t disp_drv; | |
lv_disp_drv_init( &disp_drv ); | |
/*Change the following line to your display resolution*/ | |
disp_drv.hor_res = MAIN_CONTENT_WIDTH; | |
disp_drv.ver_res = MAIN_CONTENT_HEIGHT; | |
disp_drv.flush_cb = my_disp_flush; | |
disp_drv.draw_buf = &draw_buf; | |
lv_disp_drv_register( &disp_drv ); | |
/*Initialize the (dummy) input device driver*/ | |
static lv_indev_drv_t indev_drv; | |
lv_indev_drv_init( &indev_drv ); | |
indev_drv.type = LV_INDEV_TYPE_POINTER; | |
indev_drv.read_cb = my_touchpad_read; | |
lv_indev_drv_register( &indev_drv ); | |
} | |
#elif defined(ARDUINO_GFX) | |
/* Change to your screen resolution */ | |
static uint32_t screenWidth; | |
static uint32_t screenHeight; | |
static lv_disp_draw_buf_t draw_buf; | |
static lv_color_t *disp_draw_buf; | |
static lv_disp_drv_t disp_drv; | |
/* Display flushing */ | |
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { | |
uint32_t w = (area->x2 - area->x1 + 1); | |
uint32_t h = (area->y2 - area->y1 + 1); | |
#if (LV_COLOR_16_SWAP != 0) | |
gfx->draw16bitBeRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h); | |
#else | |
gfx->draw16bitRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h); | |
#endif | |
lv_disp_flush_ready(disp); | |
} | |
void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) | |
{ | |
if (touch_has_signal()) | |
{ | |
if (touch_touched()) | |
{ | |
data->state = LV_INDEV_STATE_PR; | |
/*Set the coordinates*/ | |
data->point.x = touch_last_x; | |
data->point.y = touch_last_y; | |
} | |
else if (touch_released()) | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
} | |
else | |
{ | |
data->state = LV_INDEV_STATE_REL; | |
} | |
} | |
void lcd_init(void) { | |
// Init Display | |
gfx->begin(); | |
#ifdef TFT_BL | |
pinMode(TFT_BL, OUTPUT); | |
digitalWrite(TFT_BL, HIGH); | |
#endif | |
gfx->fillScreen(RED); | |
delay(500); | |
gfx->fillScreen(GREEN); | |
delay(500); | |
gfx->fillScreen(BLUE); | |
delay(500); | |
gfx->fillScreen(BLACK); | |
delay(500); | |
lv_init(); | |
delay(10); | |
touch_init(); | |
screenWidth = gfx->width(); | |
screenHeight = gfx->height(); | |
#ifdef ESP32 | |
disp_draw_buf = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * screenHeight/4 , MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); | |
#else | |
disp_draw_buf = (lv_color_t *)malloc(sizeof(lv_color_t) * screenWidth * screenHeight/4); | |
#endif | |
if (!disp_draw_buf) | |
{ | |
Serial.println("LVGL disp_draw_buf allocate failed!"); | |
} | |
else | |
{ | |
lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * screenHeight/4); | |
/* Initialize the display */ | |
lv_disp_drv_init(&disp_drv); | |
/* Change the following line to your display resolution */ | |
disp_drv.hor_res = screenWidth; | |
disp_drv.ver_res = screenHeight; | |
disp_drv.flush_cb = my_disp_flush; | |
disp_drv.draw_buf = &draw_buf; | |
lv_disp_drv_register(&disp_drv); | |
/* Initialize the (dummy) input device driver */ | |
static lv_indev_drv_t indev_drv; | |
lv_indev_drv_init(&indev_drv); | |
indev_drv.type = LV_INDEV_TYPE_POINTER; | |
indev_drv.read_cb = my_touchpad_read; | |
lv_indev_drv_register(&indev_drv); | |
Serial.println("Setup done"); | |
} | |
} | |
#endif | |
void setup() { | |
Serial.begin( 115200 ); | |
lcd_init(); | |
// Init LCD objects | |
lv_demo_widgets(); | |
} | |
void loop() { | |
lv_timer_handler(); /* let the GUI do its work */ | |
delay(5); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment