本文章是基于,已经生成event,屏幕能够实现触摸功能的基础上!
一,触摸测试
输入可以查看到你设备的event
cd /dev/input
ls
然后依次输入一下命令,进行测试,找到属于你的触摸文件
cat event0
cat event1
在这里,我的是event0,在进行按压屏幕时可以看到
二、lvgl触摸注册
在lvgl文件夹中,找到lv_port_indev_template.c文件,将#if 0改为#if 1.同样在头文件中也进行相应的修改。
void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_drv;
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad if you have*/
touchpad_init();
/*Register a touchpad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touchpad_read;
indev_touchpad = lv_indev_drv_register(&indev_drv);
}
修改初始化函数,只留下触摸相关的函数,将多余的内容删除。
static void touchpad_init(void)
{
// 打开触摸设备
touch_fd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK);
if (touch_fd < 0) {
printf("Failed to open touch device\n");
return;
}
}
在触摸屏初始化函数中,写入打开触摸文件
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
struct input_event ev;
static int touch_x = 0;
static int touch_y = 0;
static bool last_touch_state = false;
static lv_indev_state_t last_state = LV_INDEV_STATE_REL;
fd_set read_fds;
struct timeval tv;
int ret;
// 清空文件描述符集合并将触摸设备文件描述符添加到集合中
FD_ZERO(&read_fds);
FD_SET(touch_fd, &read_fds);
// 设置超时时间(例如0.1秒)
tv.tv_sec = 0;
tv.tv_usec = 100000;
// 使用 select 监控文件描述符
ret = select(touch_fd + 1, &read_fds, NULL, NULL, &tv);
if (ret < 0) {
printf("select() failed\n");
return;
} else if (ret == 0) {
// 超时,没有事件发生
return;
}
// 如果文件描述符准备好读取数据
if (FD_ISSET(touch_fd, &read_fds)) {
// 读取事件
ret = read(touch_fd, &ev, sizeof(ev));
if (ret < 0) {
printf("Failed to read touch event\n");
return;
}
// 处理ABS事件获取坐标
if (ev.type == EV_ABS) {
if (ev.code == ABS_MT_POSITION_X) {
touch_x = ev.value;
} else if (ev.code == ABS_MT_POSITION_Y) {
touch_y = ev.value;
}
}
// 处理KEY事件获取按下或释放状态
if (ev.type == EV_KEY && ev.code == BTN_TOUCH) {
last_touch_state = (ev.value != 0);
data->state = last_touch_state ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
}
// 更新坐标数据
if (last_touch_state) {
data->point.x = touch_x;
data->point.y = touch_y;
}
// 输出日志:仅当状态变化时输出
if (data->state != last_state) {
printf("Touch X: %d, Y: %d, State: %s\n", touch_x, touch_y,
data->state == LV_INDEV_STATE_PR ? "Pressed" : "Released");
last_state = data->state;
}
}
}
通过read函数,获取触摸事件获得的按压状态和按压坐标,来实现lvgl触摸功能。
以上代码便完成了lvgl触摸注册,在主函数中进行触摸初始化即可。
三、事件回调函数测试
void btn_event_handler(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * btn = lv_event_get_target(e);
if(code == LV_EVENT_CLICKED) {
count++; // 数值增加1
// 获取关联的标签对象
lv_obj_t * label = (lv_obj_t *)lv_event_get_user_data(e);
// 更新标签文本
lv_label_set_text_fmt(label, "Count: %d", count);
}
}
给一个按钮写入回调函数,每一次按压数值加一,来验证触摸成功实现