开天辟地的卷毛 2023-06-03 12:22 采纳率: 83.7%
浏览 16

linxu项目开发触摸屏事件


#include "main.h"

int ts_fd;
int ts_x, ts_y;
int old_x = 300;
int flag_x = 0, flag_y = 0, first_press_flag = 0;
int right_left_slide_flag = 0;
int slider_left = 0;
int slider_right = 0;

/*触摸屏初始化*/
void TS_Init()
{
    ts_fd = open("/dev/event0", O_RDONLY);
    if(ts_fd == -1)
    {
        perror("open TS error!");
        exit(-1);
    }

}
/*关闭触摸屏*/
void TS_Close()
{
    close(ts_fd);
}
/*获取坐标*/
void get_xy()
{
    struct input_event tsevent;
    bzero(&tsevent, sizeof(tsevent));
    int flag = 0;
    while (1)
    {
        read(ts_fd, &tsevent, sizeof(tsevent));
        if(tsevent.type == EV_ABS  )//判断是否为触摸屏事件
        {
            printf("in 1\n");
            if(tsevent.code == ABS_X)//判断是否为x轴数据
            {
                ts_x = tsevent.value;
                flag_x= 1;
                printf("get x\n");
            }
            if(tsevent.code == ABS_Y)//判断是否为y轴数据
            {
                ts_y = tsevent.value;
                flag_y = 1;
                printf("get y\n");
                if (flag_y && flag_x)
                    break;
            }          
        }
        printf("exit 1\n");
        if (EV_KEY == tsevent.type)
        {
            printf("in 2\n");
            //刚触碰的坐标/长按时
            if (tsevent.code == BTN_TOUCH && tsevent.value == 1)
            {
                printf("old in\n");
                old_x = ts_x;
                first_press_flag = 1;
            }
        }
        printf("exit 2\n");
        if (EV_KEY == tsevent.type)
        {
            printf("in 3\n");
            //松开
            if (tsevent.code == BTN_TOUCH && tsevent.value == 0)
            {
                //从左到右的滑动
                if (((ts_x > old_x) && (ts_x - old_x > 150) && (ts_x < 600)))
                {
                    right_left_slide_flag = 1;
                    slider_right = 1;
                    old_x = 300;
                }
                //从右到左的滑动
                else if (((old_x > ts_x) && (old_x - ts_x > 150) && (old_x < 600)))
                {

                    right_left_slide_flag = 1;
                    slider_left = 1;
                    old_x = 300;
                }
            }
        }
        
        //if(tsevent.type == EV_KEY &&  tsevent.code == BTN_TOUCH && tsevent.value == 0 )
        //{
        //    break;
        //}
    }
    
}

我想问一下,这是开发板部分获取触摸屏坐标的代码,但是我点击开发板屏幕,不能进去带有 EV_KEY的循环里,这个有办法解决嘛

  • 写回答

1条回答 默认 最新

  • 希望代码都能跑 2023-06-03 12:44
    关注

    从代码看,获取触摸屏坐标的函数是在一个死循环中,一直监听触摸事件的输入设备文件描述符,如果有触摸事件就会进入if判断,但是同时也有其他的if判断,如EV_KEY,可能导致程序陷入等待某个事件的状态。建议对代码进行重构,使用多线程或者select函数等来实现同时监听多个事件,以避免阻塞等待某个事件的情况。同时可以加一些debug信息输出,观察代码执行流程,查找问题所在,例如在while循环内部添加 printf() 来输出调试信息。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月3日

悬赏问题

  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,