【Linux学习】触摸屏应用编程

下面是有关触摸屏应用的相关介绍,希望对你有所帮助!

小海编程心语录-CSDN博客

 

目录

1. 触摸屏应用编程

1.1 概念

 1.2 分类

2. 解析触摸屏设备上报的数据

3.单点触摸和多点触摸

3.1 单点触摸

3.2 多点触摸 

3.3 触摸事件 

4. MT 协议之 Type B 协议

4.1 ABS_MT_SLOT

 4.2  ABS_MT_TRACTKING_ID

5.  获取触摸屏的信息 

 ioctl()函数

6. 单点触摸应用程序


1. 触摸屏应用编程

1.1 概念

触摸屏的本质是传感器,它由测触摸检部件和触摸屏控制器组成。触摸检测部件安装在显示器屏幕前面,用于检测用户触摸位置,接受后发送触摸屏控制器;

触摸屏控制器的主要作用是从触摸点检测装置接收触摸信息,并将它转换成触点坐标送给CPU,同时能接收CPU发来的命令并加以执行。

 1.2 分类

  1. 红外线式触摸屏
  2. 电阻式触摸屏
  3. 表面声波式触摸屏
  4. 电容式触摸屏

2. 解析触摸屏设备上报的数据

触摸屏设备是一个绝对位移设备,可以上报绝对位移事件(EV_ABS),绝对位移事件如下:

/*
 * Absolute axes
 */

#define ABS_X                   0x00     //X 轴坐标

#define ABS_Y                   0x01     //Y 轴坐标
#define ABS_Z                   0x02     //Z 轴坐标
#define ABS_RX                  0x03
#define ABS_RY                  0x04
#define ABS_RZ                  0x05
#define ABS_THROTTLE            0x06
#define ABS_RUDDER              0x07
#define ABS_WHEEL               0x08
#define ABS_GAS                 0x09
#define ABS_BRAKE               0x0a
#define ABS_HAT0X               0x10
#define ABS_HAT0Y               0x11
#define ABS_HAT1X               0x12
#define ABS_HAT1Y               0x13
#define ABS_HAT2X               0x14
#define ABS_HAT2Y               0x15
#define ABS_HAT3X               0x16
#define ABS_HAT3Y               0x17
#define ABS_PRESSURE            0x18      //按压力
#define ABS_DISTANCE            0x19
#define ABS_TILT_X              0x1a
#define ABS_TILT_Y              0x1b
#define ABS_TOOL_WIDTH          0x1c

#define ABS_VOLUME              0x20

#define ABS_MISC                0x28
........

3.单点触摸和多点触摸

3.1 单点触摸

触摸屏分为多点触摸设备和单点触摸设备。

单点触摸设备只支持单点触摸,一轮(一个同步事件) 完整的数据只包含一个触摸点信息;单点触摸设备以 ABS_XXX 事件承载、上报触摸点的信息,譬如 ABS_X(value 值对应的是 X 轴坐标值)、ABS_Y(value 值对应的是 Y 轴坐标值)等绝对位移事件,而有些设备可能还支持 Z 轴坐标(通过 ABS_Z 事件上报、value 值对应的便是 Z 轴坐标值)、按压力大小 (通过 ABS_PRESSURE 事件上报、 value 值对应的便是按压力大小)以及接触面积等属性。

大部分的单点触摸设备都会上报 ABS_X 和 ABS_Y 事件,而其它绝对位移事件则根据具体的设备以及驱动的实现而定!

3.2 多点触摸 

多点触摸设备可支持多点触摸,对于多点触摸设备,一轮完整的数据可能包含多个触摸点信息。多点触摸设备则是以 ABS_MT_XXX(MT 是 Multi-touch,意思为:多点触摸)事件承载、上报触摸点的信息,如 ABS_MT_POSITION_X(X 轴坐标)、ABS_MT_POSITION_Y(Y 轴坐标)等绝对位移事件。

3.3 触摸事件 

触摸屏设备除了上报绝对位移事件之外,还可以上报按键类事件和同步类事件。同步事件很好理解,因为几乎每一个输入设备都会上报同步事件、告知应用层本轮数据是否完整;当手指点击触摸屏或手指从触摸屏离开时,此时就会上报按键类事件,用于描述按下触摸屏和松开触摸屏;具体的按键事件为 BTN_TOUCH(code=0x14a,也就是 330),当然,手指在触摸屏上滑动不会上报 BTN_TOUCH 事件

Tips: BTN_TOUCH 事件不支持长按状态,故其 value 不会等于 2。 对于多点触摸设备来说,只有第一个点按下时上报 BTN_TOUCH 事件 value=1、当最后一个点离开触摸屏时上报 BTN_TOUCH 事件 value=0。 

4. MT 协议之 Type B 协议

4.1 ABS_MT_SLOT

在 Linux 内核中,多点触摸设备使用多点触摸(MT)协议上报各个触摸点的数据,MT 协议分为两种类型:Type A 和 Type B,Type A 协议实际使用中用的比较少,几乎处于淘汰的边缘,现在所有内核驱动程序都已转换为使用 Type B,所以重点来看看 Type B 协议。

Type B 协议适用于能够追踪并区分触摸点的设备,Type B 协议的重点是通过 ABS_MT_SLOT 事件上报各个触摸点信息的更新!

能够追踪并区分触摸点的设备通常在硬件上能够区分不同的触摸点,每个识别出来的触摸点分配一个 slot, 与该 slot 关联起来,这个 slot 就是一个编号,利用这个 slot 来传递对应触点的变化。

 4.2  ABS_MT_TRACTKING_ID

除了 ABS_MT_SLOT 事 件 之 外 , Type B 协 议 还 会 使 用 到 ABS_MT_TRACTKING_ID 事 件 ,该事件用于触摸点的创建、替换和销毁工作。

ABS_MT_TRACTKING_ID 事件携带的数据 value 表示一个 ID,一个非负数的 ID(ID>=0)表示一个有效的触摸点,如果 ID 等于 -1 表示该触摸点已经不存在、被移除了;一个以前不存在的 ID 表示这是一个新的触摸点。

Type B 协议可以减少发送到用户空间的数据,只有发生了变更的数据才会上报,譬如某个触摸点发生了移动,但仅仅只改变了 X 轴坐标、而未改变 Y 轴坐标,那么内核只会将改变后的 X 坐标值通过 ABS_MT_POSITION_X 事件发送给应用层。

5.  获取触摸屏的信息 

 ioctl()函数

//函数原型
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
/*
第一个参数 fd 对应文件描述符;
第二个参数 request 与具体要操作的对象有关,没有统一值,表示向文件描述符请求相应的操作,也就是请求指令,此函数是一个可变参函数
第三个参数需要根据 request 参数来决定,配合 request 来使用。
*/

 举个例子

//ioctl函数获取显示屏信息并存储

struct fb_fix_screeninfo fb_fix;    //固定参数信息
struct fb_var_screeninfo fb_var;    //可变参数信息

int lcdfd = open("/dev/fb0", O_RDWR); //以可读可写的方式打开LCD

ioctl(lcdfd, FBIOGET_VSCREENINFO, &fb_var);   
ioctl(lcdfd, FBIOGET_FSCREENINFO, &fb_fix);

6. 单点触摸应用程序

获取触摸点的坐标信息,并将其打印出来!

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
int main()
{
    int x, y;
    //定义输入输出设备子系统结构体
    struct input_event myts;
    //int x,y;
    //打开触摸屏设备/dev/input/event1
    int ts_fd = open("/dev/input/event1",O_RDWR);
    
    //获取一次点击坐标
    while(1)
    {
        //读取触摸屏事件
        read(ts_fd,&myts,sizeof(myts));
        
        //判断事件类型是否为触摸屏的x轴,并且获取x轴坐标
        if(myts.type == EV_ABS && myts.code == ABS_MT_POSITION_X)
        {
            x = myts.value; 
        }
        //判断事件类型是否为触摸屏的y轴,并且获取y轴坐标
        if(myts.type == EV_ABS && myts.code == ABS_MT_POSITION_Y)
        {
            y = myts.value; 
        }
        //判断是否松手
        if(myts.type == EV_ABS && myts.code == ABS_MT_TRACKING_ID && myts.value == -1)
        {
            //打印坐标值
            printf("X:%d,Y:%d\n", x, y);
            break;
        }
    }
}

如果喜欢请不吝给予三连支持!

小海编程心语录-CSDN博客

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值