linux读取触摸屏事件数据

2023-11-06

对于有触摸设备的电脑或者手机,通过cat /proc/bus/input/devices应该就能够看到触摸设备的相关信息。比如

~ # cat /proc/bus/input/devices                                                 
I: Bus=0013 Vendor=0x0012 Product=0x1200 Version=0101                               
N: Name="TouchScreen"                                                    
P: Phys=                                                                        
S: Sysfs=/devices/virtual/input/input0                                          
U: Uniq=                                                                        
H: Handlers=event0                                                              
B: EV=b                                                                         
B: KEY=0                                                                        
B: ABS=1000003 

上面的信息有触摸屏vid,pid,版本等,以及ABS表示触摸屏的绝对坐标掩码,掩码上面表示16进制,所以

0x1000003=0001 0000 0000 0000 0000 0000 0011,其中为1的比特的位置就表示触摸屏会报告这一类型的事件,前面bit0和bit1以及bit24为1,那么看linux/input.h文件就表示事件code码有ABS_X=0x00  ,  ABS_Y=0x01,  ABS_PRESSURE=0x18,这三个分别表示触摸屏报告触摸的x坐标,y坐标,以及按下和松开。

但是不同的触摸屏的x,y坐标的范围不一定,所以需要通过input_absinfo结构体去记录得到触摸屏的绝对值信息。

struct input_absinfo {
	__s32 value;//这个轴最后一次报告的坐标值
	__s32 minimum;//这个轴的坐标最小值
	__s32 maximum;//这个轴的坐标最大值
	__s32 fuzz;
	__s32 flat;
	__s32 resolution;
};

得到触摸屏的绝对值信息的代码如下:

#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>

int main()
{
    struct input_absinfo absI;
    int ret;
    int fd=-1;
    fd = open("/dev/input/event0",O_RDONLY);
    if(fd<0){
       perror("/dev/input/event0"); 
       return -1;
    }
   //得到X轴的abs信息
    ioctl(fd,EVIOCGABS(ABS_X),&absI);
    printf("x abs lastest value=%d\n",absI.value);
    printf("x abs min=%d\n",absI.minimum);
    printf("x abs max=%d\n",absI.maximum);
   //得到y轴的abs信息
    ioctl(fd,EVIOCGABS(ABS_Y),&absI);
    printf("y abs lastest value=%d\n",absI.value);
    printf("y abs min=%d\n",absI.minimum);
    printf("y abs max=%d\n",absI.maximum);
   //得到按压轴的abs信息
    ioctl(fd,EVIOCGABS(ABS_PRESSURE),&absI);
    printf("pressure abs lastest value=%d\n",absI.value);
    printf("pressure abs min=%d\n",absI.minimum);
    printf("pressure abs max=%d\n",absI.maximum);
    close(fd);
    return 0;
}

结果如下,可以看到x,y方向的触摸值范围都是0~1023,触摸屏按下松开的取值分别是1,0

x abs lastest value=315                                                         
x abs min=0                                                                     
x abs max=1023                                                                  
y abs lastest value=257                                                         
y abs min=0                                                                     
y abs max=1023                                                                  
pressure abs lastest value=0                                                    
pressure abs min=0                                                              
pressure abs max=1 

接着通过linux/input.h里面提供的函数得到触摸屏的事件报告。

#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
int main( void )
{
	int			fd;
	fd_set			rds;
	int			ret;
	struct input_event	event;
	struct timeval		time;
	fd = open( "/dev/input/event0", O_RDONLY );
	if ( fd < 0 )
	{
		perror( "/dev/input/event0" );
		return(-1);
	}
	while ( 1 )
	{
		FD_ZERO( &rds );
		FD_SET( fd, &rds );
		/*调用select检查是否能够从/dev/input/event0设备读取数据*/
		ret = select( fd + 1, &rds, NULL, NULL, NULL );
		if ( ret < 0 )
		{
			perror( "select" );
			return(-1);
		}
		/*能够读取到数据*/
		else if ( FD_ISSET( fd, &rds ) )
		{
			ret	= read( fd, &event, sizeof(struct input_event) );
			time	= event.time;
			printf( "timeS=%d,timeUS=%d,type=%d,code=%d,value=%d\n", time.tv_sec, time.tv_usec, event.type, event.code, event.value );
		}
	}
	/*关闭设备文件句柄*/
	close( fd );
	return(0);
}

触摸一下触摸屏,得到下面的事件报告,timeS和timeUS是发生报告的时间,对于PC的话一般是从1970到现在的时间,对于我的开发板的话是系统启动开始到报告的时间。

type的话是事件类型,为3就是EV_ABS=0x03,为0就是EV_SYN=0x00(用来作为事件的分隔)

code的话根据事件类型而定,如果是EV_ABS的话,那么code就从ABS_XXX中去找,type为EV_ABS,code为0就是ABS_X,code为1就是ABS_Y,code为24就是ABS_PRESSURE,这些都可以在linux/input.h里面找到,然后value就是在type和code的前提下的值,比如type为EV_ABS,code为ABS_X,那么value就代表触摸点的x轴绝对值。

timeS=3143,timeUS=415046,type=3,code=0,value=325  触摸x轴值                       
timeS=3143,timeUS=415082,type=3,code=1,value=599  触摸y轴值                              
timeS=3143,timeUS=415092,type=3,code=24,value=1   按下                              
timeS=3143,timeUS=415098,type=0,code=0,value=0    同步                              
timeS=3143,timeUS=430129,type=3,code=0,value=323  触摸x轴值                              
timeS=3143,timeUS=430169,type=3,code=1,value=592  触摸y轴值                              
timeS=3143,timeUS=430183,type=0,code=0,value=0    同步                              
timeS=3143,timeUS=445130,type=3,code=24,value=0   松开

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux读取触摸屏事件数据 的相关文章

随机推荐

  • vue路由props传递参数

    props分为三种形式 props为对象 props为布尔值 这种只能接收params动态路由的参数 props为函数 可以接收query和params参数 推荐 import Vue from vue import VueRouter f
  • 大数据技术之(一) Spark-Core

    第1章 Spark 概述 1 Spark是什么 Spark 是一种基于内存的快速 通用 可扩展的大数据分析计算引擎 2 Spark and Hadoop 在之前的学习中 Hadoop 的 MapReduce 是大家广为熟知的计算框架 那为什
  • sqli-labs通关(less31~less40)

    目录 Less31 Less32 Less33 Less34 Less35 Less36 Less37 Less38 Less39 Less40 Less31 这关和前两关也只是闭合不同的差别 思路还是通过HTTP参数污染绕过WAF 爆数据
  • Dubbo3.0如何实现进行路由扩展

    Dubbo3 0如何实现进行路由扩展 前言 关键类介绍 RouterFactory 接口 CacheableRouterFactory抽象类 Router 接口 AbstractRouter 抽象类 RouterChain 类 怎么扩展路由
  • 加密货币技术架构(一)——BTC、ETH

    一 BTC 比特币 一 项目背景 BTC 比特币 是第一个基于去中心化 采用点对点网络与共识主动性 开放源代码 以区块链作为底层技术的加密货币 身为世界上第一个加密货币 市值毋庸置疑是最大的 并且历经13年的牛熊转换 坐拥最稳加密货币宝座
  • struct 和 typedef struct 的区别

    文章目录 前言 struct和typedef struct的区别 C语言中的struct和typedef struct struct typedef struct C 中的struct和typedef struct struct typed
  • 搜索引擎solr系列---solr分词配置

    分词我理解的是 输入的一句话 按照它自己定义的规则分为常用词语 首先 Solr有自己基本的类型 string int date long等等 对于string类型 比如在你的core conf manage schema文件中 配置一个字段
  • 【教程】Matrikon OPC使用教程连载(二)

    MatrikonOPC介绍 Matrikon 是基于OPC UA和基于OPC的控制自动化数据互操作性产品的供应商 提供自动化厂商的高级OPC UA开发工具包 适用于从嵌入式设备到云应用的所有产品线 对于终端用户客户 Matrikon提供了关
  • 【elementplus】解决el-table的固定列不固定了

    如图所示 只要只有表头还是固定的 表体不固定了 解决方法 取消给表格固定列设置的position 我这里是因为设置了position relative导致的 ep table fixed column right position rela
  • Cookie的创建和读取和常用方法

    b 如何创建 Cookie Servlet 程序中的代码 public class CookieServlet extends BaseServlet 创建Cookie param req param resp throws Servlet
  • 数据结构知识点复习

    第一章 数据结构概述 基本概念与术语 数据 数据是对客观事物的符号表示 在计算机科学中是指所有能输入到计算机中并被计算机程序所处理的符号的总称 数据元素 数据元素是数据的基本单位 是数据这个集合中的个体 也称之为元素 结点 顶点记录 补充
  • MyBatis中 sql标签和include标签的使用

  • Flutter报错Building with plugins requires symlink support的解决方法

    错误 Building with plugins requires symlink support Please enable Developer Mode in your system settings Run start ms sett
  • js 识别当前设备信息 是否是移动端

    一 navigator userAgent 对象 最简单的方法就是分析浏览器的 user agent 字符串 它包含了设备信息 JS 通过navigator userAgent属性拿到这个字符串 只要里面包含mobi android iph
  • 小程序实现弹幕功能-无限循环,不会重叠

    以下是支付宝小程序代码 先上效果图 以下是axml代码
  • QT小例子GUI(主)线程与子线程之间的通信

    QT小例子GUI 主 线程与子线程之间的通信 在主线程上 可以控制子线程启动 停止 清零 如果子线程启动的话 每一秒钟会向主线程发送一个数字 让主线程更新界面上的数字 ifndef TQT H define TQT H include
  • Caffe中 math_functions 分析

    本篇博客转载自 Caffe源码 一 math functions 分析 math function 定义了caffe 中用到的一些矩阵操作和数值计算的一些函数 这里以float类型为例做简单的分析 1 caffe cpu gemm temp
  • huggingface transformers 预训练模型加载参数设置

    说明 1 proxies 服务器无法直接访问互联网需通过代理访问 2 cache dir model及dadaset文件过大多次容易导致服务器存储过高 手工选择存储位置 model tokenizer from pretrained ber
  • TCP 滑动窗口详解(非常实用)

    一 滑动窗口简介 滑动窗口 Sliding window 是一种流量控制技术 早期的网络通信中 通信双方不会考虑网络的 拥挤情况直接发送数据 由于大家不知道网络拥塞状况 同时发送数据 导致中间节点阻塞掉包 谁也发不了数据 所以就有了滑动窗口
  • linux读取触摸屏事件数据

    对于有触摸设备的电脑或者手机 通过cat proc bus input devices应该就能够看到触摸设备的相关信息 比如 cat proc bus input devices I Bus 0013 Vendor 0x0012 Produ