diff --git a/main/APP/app_task_display/app_task_display.c b/main/APP/app_task_display/app_task_display.c index bb3c723..72d3ca6 100644 --- a/main/APP/app_task_display/app_task_display.c +++ b/main/APP/app_task_display/app_task_display.c @@ -31,7 +31,8 @@ #define LV_TICK_PERIOD_MS 1 -TFT_t lcd_disp_dev; +TFT_t lcd_disp_dev; +app_display_handle_t app_display_handle = { 0 }; TickType_t FillTest(TFT_t* dev, int width, int height) { @@ -66,22 +67,34 @@ TickType_t FillTest(TFT_t* dev, int width, int height) return diffTick; } -void cst_scan_gesture() +static void cst_scan_gesture() { - int index = 0; + int index = 0; + uint8_t release_timeout = 5; // 5 times is 20 ms while (1) { - vTaskDelay(1); + vTaskDelay(pdMS_TO_TICKS(10)); if (index++ == 500) { index = 0; - lcdBacklightOff(&lcd_disp_dev); + if (app_display_handle.back_light_auto_off) { + if (!app_display_handle.back_light_state) { + lcdBacklightOff(&lcd_disp_dev); + app_display_handle.back_light_state = 0; + } + } } + if (cst816t_available()) { + release_timeout = 5; /*printf("gesture.id %u \n", data.gestureID); - printf("points %u \n", data.points); - printf("event %u \n", data.event);*/ - printf("x %i \n", cst816t_data.x); - printf("y %i \n", cst816t_data.y); + printf("points %u \n", data.points); + printf("event %u \n", data.event);*/ + // printf("x %i \n", cst816t_data.x); + // printf("y %i \n", cst816t_data.y); + app_display_handle.tp_pos_x = cst816t_data.x; + app_display_handle.tp_pos_y = cst816t_data.y; lcdBacklightOn(&lcd_disp_dev); + app_display_handle.back_light_state = 1; + app_display_handle.tp_state = 0x02; switch (cst816t_data.gestureID) { case NONE: @@ -100,18 +113,24 @@ void cst_scan_gesture() printf("SWIPE RIGHT \n"); break; case SINGLE_CLICK: - printf("SINGLE CLICK \n"); + // printf("SINGLE CLICK \n"); break; case DOUBLE_CLICK: - printf("DOUBLE CLICK \n"); + // printf("DOUBLE CLICK \n"); break; case LONG_PRESS: - printf("LONG PRESS \n"); + // printf("LONG PRESS \n"); break; default: - printf("UNKNOWN \n"); + // printf("UNKNOWN \n"); break; } + } else { + if (!release_timeout) { + app_display_handle.tp_state = 0x01; + } else { + release_timeout--; + } } } } @@ -124,12 +143,46 @@ static void _display_thread_entry() } } -static void anim_x_cb(void * var, int32_t v) +static void event_handler(lv_event_t* e) +{ + lv_event_code_t code = lv_event_get_code(e); + + if (code == LV_EVENT_CLICKED) { + LV_LOG_USER("Clicked"); + } else if (code == LV_EVENT_VALUE_CHANGED) { + LV_LOG_USER("Toggled"); + } +} + +void lv_example_btn_1233(void) +{ + lv_obj_t* label; + + lv_obj_t* btn1 = lv_btn_create(lv_scr_act()); + lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL); + lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40); + + label = lv_label_create(btn1); + lv_label_set_text(label, "Button"); + lv_obj_center(label); + + lv_obj_t* btn2 = lv_btn_create(lv_scr_act()); + lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL); + lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40); + lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE); + lv_obj_set_height(btn2, LV_SIZE_CONTENT); + + label = lv_label_create(btn2); + lv_label_set_text(label, "Toggle"); + lv_obj_center(label); +} + +static void anim_x_cb(void* var, int32_t v) { lv_obj_set_x(var, v); } -static void anim_size_cb(void * var, int32_t v) +static void anim_size_cb(void* var, int32_t v) { lv_obj_set_size(var, v, v); } @@ -140,7 +193,7 @@ static void anim_size_cb(void * var, int32_t v) void lv_example_anim_233333(void) { - lv_obj_t * obj = lv_obj_create(lv_scr_act()); + lv_obj_t* obj = lv_obj_create(lv_scr_act()); lv_obj_set_style_bg_color(obj, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_style_radius(obj, LV_RADIUS_CIRCLE, 0); @@ -164,8 +217,6 @@ void lv_example_anim_233333(void) lv_anim_start(&a); } - - static void _lvgl_thread_entry() { vTaskDelay(10); @@ -176,7 +227,7 @@ static void _lvgl_thread_entry() lv_port_indev_init(); lcdFillScreen(&lcd_disp_dev, WHITE); - lv_example_anim_233333(); + lv_example_btn_1233(); while (1) { lv_task_handler(); @@ -193,18 +244,20 @@ static void _lvgl_thread_tick_entry() } } -static void lv_tick_task(void *arg) { - (void) arg; +static void lv_tick_task(void* arg) +{ + (void)arg; lv_tick_inc(LV_TICK_PERIOD_MS); } uint8_t app_task_display_start() { + app_display_handle.back_light_auto_off = 1; cst816t_begin(34, 33, 35, 36); - // xTaskCreatePinnedToCore(cst_scan_gesture, "sct test", 4096, NULL, 4, NULL, tskNO_AFFINITY); - spi_master_init(&lcd_disp_dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO, - CONFIG_BL_GPIO); + xTaskCreatePinnedToCore(cst_scan_gesture, "sct test", 4096, NULL, 4, NULL, tskNO_AFFINITY); + spi_master_init(&lcd_disp_dev, CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, + CONFIG_RESET_GPIO, CONFIG_BL_GPIO); // lcdBacklightOn(&lcd_disp_dev); lcdInit(&lcd_disp_dev, CONFIG_WIDTH, CONFIG_HEIGHT, CONFIG_OFFSETX, CONFIG_OFFSETY); lcdBacklightOff(&lcd_disp_dev); @@ -212,11 +265,8 @@ uint8_t app_task_display_start() lcdFillScreen(&lcd_disp_dev, BLACK); vTaskDelay(100); /* Create and start a periodic timer interrupt to call lv_tick_inc */ - const esp_timer_create_args_t periodic_timer_args = { - .callback = &lv_tick_task, - .name = "periodic_gui" - }; - esp_timer_handle_t periodic_timer; + const esp_timer_create_args_t periodic_timer_args = { .callback = &lv_tick_task, .name = "periodic_gui" }; + esp_timer_handle_t periodic_timer; ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000)); diff --git a/main/APP/app_task_display/app_task_display.h b/main/APP/app_task_display/app_task_display.h index 583af97..d2ea0ec 100644 --- a/main/APP/app_task_display/app_task_display.h +++ b/main/APP/app_task_display/app_task_display.h @@ -26,7 +26,17 @@ extern "C" { #endif +typedef struct _app_display_handle_t_ +{ + uint8_t back_light_auto_off; + uint8_t back_light_state; + uint8_t tp_state; + int tp_pos_x; + int tp_pos_y; +} app_display_handle_t; + extern TFT_t lcd_disp_dev; +extern app_display_handle_t app_display_handle; /** * diff --git a/main/APP/app_task_display/app_task_lvgl_port.c b/main/APP/app_task_display/app_task_lvgl_port.c index 9c95feb..e460f93 100644 --- a/main/APP/app_task_display/app_task_lvgl_port.c +++ b/main/APP/app_task_display/app_task_lvgl_port.c @@ -19,23 +19,22 @@ */ #include #include "st7789.h" -#include "CST816T.h" #include "app_task_display.h" /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; -static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ -lv_indev_t * touch_indev; +static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ +lv_indev_t* touch_indev; -#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX / 4) +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX / 4) static lv_disp_drv_t g_disp_drv; -static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +static void lcd_fb_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) { - static uint16_t datas[DISP_BUF_SIZE] = {0}; - int i = 0, j = 0, index = 0; + static uint16_t datas[DISP_BUF_SIZE] = { 0 }; + int i = 0, j = 0, index = 0; // for ( i = area->y1; i <= area->y2; i++) { // for (j = area->x1; j <= area->x2; j++) { // datas[index++] = color_p->full; @@ -46,10 +45,9 @@ static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_colo lv_disp_flush_ready(disp_drv); } - void lv_port_disp_init(void) { - static lv_color_t lv_disp_buf1[DISP_BUF_SIZE] = {0}; + static lv_color_t lv_disp_buf1[DISP_BUF_SIZE] = { 0 }; /*Initialize `disp_buf` with the buffer(s).*/ lv_disp_draw_buf_init(&disp_buf, lv_disp_buf1, NULL, DISP_BUF_SIZE); @@ -72,20 +70,27 @@ void lv_port_disp_init(void) g_disp_drv = disp_drv; } -static void input_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +static void input_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { /* Since the origin of the LCD screen and the origin of the touch screen are * different, the parameters passed in here need to be simply converted. */ - data->point.x = cst816t_data.x; - data->point.y = cst816t_data.y; + data->point.x = app_display_handle.tp_pos_x; + data->point.y = app_display_handle.tp_pos_y; - if (cst816t_data.event == 0) - data->state = LV_INDEV_STATE_PR; - if (cst816t_data.event == 2) - data->state = LV_INDEV_STATE_PR; - if (cst816t_data.event == 1) - data->state = LV_INDEV_STATE_REL; + switch (app_display_handle.tp_state) { + case 0x01: + /* release */ + data->state = LV_INDEV_STATE_REL; + break; + case 0x02: + /* press */ + data->state = LV_INDEV_STATE_PR; + break; + default: + printf("tp_state = %d\r\n", app_display_handle.tp_state); + break; + } } void lv_port_indev_init(void) @@ -93,7 +98,7 @@ void lv_port_indev_init(void) static lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); /*Basic initialization*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = input_read; /*Register the driver in LVGL and save the created input device object*/ diff --git a/main/drivers/cst816/CST816T.c b/main/drivers/cst816/CST816T.c index 8df8f93..4dff21b 100644 --- a/main/drivers/cst816/CST816T.c +++ b/main/drivers/cst816/CST816T.c @@ -46,8 +46,8 @@ void cst816t_read_touch() cst816t_data.gestureID = rx_data[0]; cst816t_data.points = rx_data[1]; cst816t_data.event = rx_data[2] >> 6; - cst816t_data.x = rx_data[3]; - cst816t_data.y = rx_data[5]; + cst816t_data.x = rx_data[3] | ((rx_data[2] & 0x0f) << 8); + cst816t_data.y = rx_data[5] | ((rx_data[4] & 0x0f) << 8); } void IRAM_ATTR gpioHandler(void *arg) diff --git a/main/drivers/cst816/CST816T.h b/main/drivers/cst816/CST816T.h index cd90a26..d69245d 100644 --- a/main/drivers/cst816/CST816T.h +++ b/main/drivers/cst816/CST816T.h @@ -14,8 +14,8 @@ typedef struct data_struct uint8_t gestureID; // Gesture ID uint8_t points; // Number of touch points uint8_t event; // Event (0 = Down, 1 = Up, 2 = Contact) - int x; - int y; + uint16_t x; + uint16_t y; uint8_t version; uint8_t versionInfo[3]; } data_struct_t; diff --git a/main/drivers/st7789/st7789.c b/main/drivers/st7789/st7789.c index b1e8d2c..2accfa3 100644 --- a/main/drivers/st7789/st7789.c +++ b/main/drivers/st7789/st7789.c @@ -486,7 +486,7 @@ void lcdDrawFillRect(TFT_t * dev, uint16_t x1, uint16_t y1, uint16_t x2, uint16_ uint16_t _y2 = y2 + dev->_offsety; bool ret = spi_master_write_command(dev, 0x2A); // set column(x) address - printf("ret = %d\r\n", ret); + // printf("ret = %d\r\n", ret); spi_master_write_addr(dev, _x1, _x2); spi_master_write_command(dev, 0x2B); // set Page(y) address spi_master_write_addr(dev, _y1, _y2); @@ -1122,14 +1122,14 @@ void lcdDrawFillRectData(TFT_t * dev, uint16_t x1, uint16_t y1, uint16_t x2, uin if (y1 >= dev->_height) return; if (y2 >= dev->_height) y2=dev->_height-1; - ESP_LOGD(TAG,"offset(x)=%d offset(y)=%d",dev->_offsetx,dev->_offsety); + // ESP_LOGD(TAG,"offset(x)=%d offset(y)=%d",dev->_offsetx,dev->_offsety); uint16_t _x1 = x1 + dev->_offsetx; uint16_t _x2 = x2 + dev->_offsetx; uint16_t _y1 = y1 + dev->_offsety; uint16_t _y2 = y2 + dev->_offsety; bool ret = spi_master_write_command(dev, 0x2A); // set column(x) address - printf("ret = %d\r\n", ret); + // printf("ret = %d\r\n", ret); spi_master_write_addr(dev, _x1, _x2); spi_master_write_command(dev, 0x2B); // set Page(y) address spi_master_write_addr(dev, _y1, _y2);