1.输入事件
输入设备(键盘,鼠标,触摸屏,游戏手柄…),都属于输入的子系统 特点 : 你不知道他什么时候输入,当我们输入的时候,我们称之为输入事件 触摸屏对GEC6818的一个文件 : /dev/input/event0
struct input_event{
struct timeval time;
_u16 type;
_u16 code;
_s32 value;
};
@type :表示事件的类型 区分是什么事件
#define EV_KEY 0x01 按键事件
#define EV_REL 0x02 (relative) 相对事件: 鼠标
#define EV_ABS 0x03 (absolute) 绝对事件: 触摸屏
@code
if type == EV_KEY
code键值, 区分按下的是哪个键
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
。。。。。
#define BTN_TOUCH 0x14a //触摸屏的按键
if type == EV_REL
code就是相对的坐标轴 区分是哪个轴
#define REL_X 0x00
#define REL_Y 0x01
#define REL_Z 0x02
。。。。。
if type == EV_ABS
code就是绝对坐标轴
#define ABS_X 0x00
#define ABS_Y 0x01
。。。。。。
#define ABS_PRESSURE 0x18//触摸屏的压力值
@value
if type == EV_KEY code == KEY_ESC value按键的状态值
按键的状态
按下 1
松开 0
if type == EV_ABS code == ABS_X value是x轴的坐标
if type == EV_ABS code == ABS_Y value是y轴的坐标
if type == EV_ABS code == ABS_PRESSURE value是压力值
简化表格:
type | ture number | code | ture number | value meaning |
---|---|---|---|---|
EV_KEY | 0x01 | KEY_ESC | 0x01 | 按键的状态:1按0松 |
KEY_X | 0x0X | 按键的状态:1按0松 | ||
… | … | 按键的状态:1按0松 | ||
BTN_TOUCH | 0x14a | 按键的状态:1按0松 | ||
EV_REL | 0x02 | REL_X | 0x00 | x轴 |
REL_Y | 0x01 | y轴 | ||
REL_Z… | 0x02 | z轴 | ||
… | … | … | ||
EV_ABS | 0x03 | ABS_X | 0x00 | x轴的坐标 |
ABS_Y | 0x01 | y轴的坐标 | ||
ABS_PRESSURE | 0x18 | 压力值 |
2.实例程序
touch.h文件
#ifndef __TOUCH_H__
#define __TOUCH_H__
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/input.h>//输入子系统
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
void getTouch();
#endif
touch.c文件
#include "touch.h"
//获取坐标
void getTouch()
{
int x=-1,y=-1;
//1.打开触摸屏
int fd = open("/dev/input/event0",O_RDONLY);
if(-1 == fd)
{
perror("open ScreenTouch failed\n");
return ;
}
//2.操作
struct input_event ev;
while(1)
{
read(fd,&ev,sizeof(ev));
printf("type =%d,code=%d,value=%d\n",ev.type,ev.code,ev.value);
if(ev.type == EV_ABS && ev.code == ABS_X )//触摸屏的x轴
{
x = ev.value *(1.0*800/1040);
}
if(ev.type == EV_ABS && ev.code == ABS_Y )//触摸屏的y轴
{
y = ev.value*(1.0*480/600);
}
printf("( %d , %d )\n",x,y);
if(ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 0 ) //手指松开
{
break;//一次获取
}
}
//3.关闭
close(fd);
}
main.c文件
#include"touch.h"
int main()
{
getTouch();
}
分析:
type=3,code=0,value=307:屏幕事件 | x轴坐标 | x=307
type=3,code=1,value=338:屏幕事件 | y轴坐标 | y=338
type=1,code=330,value=1:按键事件 | 屏幕按键 | 已经摁下
type=0,code=0,value=0:应该是系统事件,不太清楚
type=1,code=330,value=0:按键事件 | 屏幕按键 | 已经松开