linux嵌入式_lvgl触摸

本文章是基于,已经生成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);
    }
}

给一个按钮写入回调函数,每一次按压数值加一,来验证触摸成功实现
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值