硬汉嵌入式论坛

 找回密码
 立即注册
查看: 794|回复: 6
收起左侧

[LVGL] 关于V7板子lvgl触摸驱动疑问

[复制链接]

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2023-3-28 15:12:34 | 显示全部楼层 |阅读模式
目前点击和释放事件都可以实现。注:要开启心跳 lv_timer_handler();和lv_tick_inc(1);
存在疑问:1、长按事件怎么实现
                2、TOUCH_MOVE应该属于按下还是释放。TOUCH_MOVE归为按下可以实现长按,但是在按钮附近来回拖动回一直触发事件,不符合常理。
                TOUCH_MOVE为释放,则无法实现长按。

/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    /*Save the pressed coordinates and the state*/
    if(touchpad_is_pressed()) {   //暂且无法实现移动
        touchpad_get_xy(&last_x, &last_y);       
               
        data->state = LV_INDEV_STATE_PR;               
    }
    else {

        data->state = LV_INDEV_STATE_REL;
    }
       
    /*Set the last pressed coordinates*/
    data->point.x = last_x;
    data->point.y = last_y;
}
int16_t t_pX;
int16_t t_pY;
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
    /*Your code comes here*/
                uint8_t ret;
                ret = TOUCH_GetKey(&t_pX, &t_pY);
                if(ret == TOUCH_DOWN) //移动事件很奇怪,在按钮附近移动,会触摸点击事件||(ret == TOUCH_MOVE)
                {
                        return true;
                }
    return false;
}

/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
    /*Your code comes here*/

    (*x) = t_pX;
    (*y) = t_pY;
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2023-3-28 17:32:01 | 显示全部楼层
参考我这个,应该所有的UI都适用。

ThreadX GUIX,emWin6.x和裸机触摸触发方案已经完全统一
https://www.armbbs.cn/forum.php? ... 4061&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-3-28 19:36:06 | 显示全部楼层
应该是释放事件有问题
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-3-29 20:45:52 | 显示全部楼层
现在的问题是 lvgl没有移动事件
typedef enum {
    LV_INDEV_STATE_RELEASED = 0,
    LV_INDEV_STATE_PRESSED
} lv_indev_state_t;
把移动归到点击事件中,在点击不释放,移动过程中,不断触发点击事件
或把移动归到释放事件中,没有办法实现释放事件。现象为:点击屏幕不释放,但是仍然自动释放。
个人猜测:网上的例程大多为电容触摸,或电阻xpt2046例程,没有做移动事件
应该为底层触摸问题。目前还没有找到原因
回复

使用道具 举报

19

主题

374

回帖

431

积分

高级会员

积分
431
发表于 2023-3-30 13:19:15 | 显示全部楼层
开个新任务,优先级处于驱动和GUI之间,进行处理:按键驱动任务(写按键缓冲) -> 中间处理任务(读按键缓冲,处理,再回写到按键缓冲)  -> GUI APP。什么长按之类都没问题
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-4-1 16:30:30 | 显示全部楼层
由于论坛没有办法上传附件,我自己移植了一个lvgl的例程,但是触摸有问题,希望坛友能帮忙看一下
链接:https://pan.baidu.com/s/1a05hAI0pnl6RbbWpotdfMw
提取码:lvgl

回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-4-3 20:05:05 | 显示全部楼层
[C] 纯文本查看 复制代码
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;
	TOUCH_CelarFIFO();
	if (TOUCH_PenInt())
	{
		last_x = g_tTP.XBuf[g_tTP.Write];
		last_y = g_tTP.YBuf[g_tTP.Write];

		data->state = LV_INDEV_STATE_PR;
	
	}
	else
	{

		data->state = LV_INDEV_STATE_REL;
	
	}
	data->point.x = last_x;
	data->point.y = last_y;
}


自己顶贴。修正为以上触摸接口能解决问题,可以实现释放。
但是存在点的位置为上一个点的位置的现象,把fifo清楚掉,仍无法解决。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-21 22:51 , Processed in 0.167552 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表