下面代码有两个功能函数,get_slide()用于滑屏和获取点击坐标,而get_ts()仅用于获取一次点击坐标。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>		//输入子系统头文件 

//触摸屏文件路径
#define TS_DEV "/dev/input/event0"
//获取的(x,y)坐标
int ts_x,ts_y;



/*
功能: 获取一次划动的方向或点击坐标
返回值:1-->右滑; 2-->左滑; 3-->上滑; 4-->下滑; 5-->点击(获取到点击坐标)

*/
int get_slide()
{
	int x1, x2, y1, y2;
	int flag = 0;		//记录当前获取到的坐标的个数 : 0 --> 无;  1-->横坐标;	2-->横纵坐标
	struct input_event xy;
	
	//1, 打开触摸屏文件
	int fd = open(TS_DEV, O_RDWR);
	if(-1 == fd)
	{
		perror("open ts failed");
		return -1;
	}
	
	//2, 读取分析触摸屏数据 -->获取起点坐标
	while(1)	
	{
		read(fd, &xy, sizeof(xy));		//如果触摸屏文件中没有数据-->程序在此阻塞!
		if(xy.type == EV_ABS && xy.code == ABS_X && flag == 0)
		{
			flag = 1;
			x1 = xy.value *800/1024;		//对获取的坐标进行等比例换算
		}
		if(xy.type == EV_ABS && xy.code == ABS_Y && flag == 1)
		{
			flag = 2;
			y1 = xy.value *480/600;
		}	
		if(flag == 2)		//获取的第一个坐标就是起点坐标
		{
			flag = 0;
			printf("start : (%d, %d)\n", x1, y1);
			break;		
		}			
	}
	x2 = x1;	y2 = y1;
	//获取终点坐标 (x2, y2)
	while(1)	
	{
		read(fd, &xy, sizeof(xy));		//如果触摸屏文件中没有数据-->程序在此阻塞!
		if(xy.type == EV_ABS && xy.code == ABS_X )
		{
			x2 = xy.value *800/1024;		//对获取的坐标进行等比例换算
		}
		if(xy.type == EV_ABS && xy.code == ABS_Y )
		{
			y2 = xy.value *480/600;
		}	
		if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)//压力值为0的时候此时获取终点坐标
		{
			printf("end : (%d, %d)\n", x2, y2);
			break;	
		}			
	}
	//判断终点位置相对起点的位置
	if(x2>x1 && (y2-y1)*(y2-y1) < (x2-x1)*(x2-x1))	//右划
	{
		printf("right slide -->\n");
		close(fd);
		return 1;
	}
	if(x2<x1 && (y2-y1)*(y2-y1) < (x2-x1)*(x2-x1))	//左划
	{
		printf("left slide <--\n");
		close(fd);
		return 2;
	}	
	if(y2<y1 && (y2-y1)*(y2-y1) > (x2-x1)*(x2-x1))	//上划
	{
		printf("up slide ^\n");
		close(fd);
		return 3;
	}	
	if(y2>y1 && (y2-y1)*(y2-y1) > (x2-x1)*(x2-x1))	//下划
	{
		printf("down slide v\n");
		close(fd);
		return 4;
	}
	if(x1 == x2 && y1 == y2)	//不划
	{
		printf("点击 !\n");
		ts_x = x1;
		ts_y = y1;
		close(fd);
		return 5;
	}		
}

/*************************************************************************************/
//获取一次点击触摸屏坐标函数
int get_ts()
{
	//1, 打开触摸屏文件
	int fd = open(TS_DEV, O_RDWR);
	if(-1 == fd)
	{
		perror("open ts failed");
		return -1;
	}
	
	//2, 读取分析触摸屏数据
	int flag = 0;		//记录当前获取到的坐标的个数 : 0 --> 无;  1-->横坐标;	2-->横纵坐标
	struct input_event xy;
	
	while(1)	//触摸屏坐标范围: 1024 * 600		LCD : 800*480
	{
		read(fd, &xy, sizeof(xy));		//如果触摸屏文件中没有数据-->程序在此阻塞!
		if(xy.type == EV_ABS && xy.code == ABS_X && flag == 0)
		{
			flag = 1;
			ts_x = xy.value *800/1024;		//对获取的坐标进行等比例换算
		}
		if(xy.type == EV_ABS && xy.code == ABS_Y && flag == 1)
		{
			flag = 2;
			ts_y = xy.value *480/600;
		}	
		if(flag == 2)
		{
			flag = 0;
            break;
		}

    }
	//3, 关闭触摸屏文件
	close(fd);
}

Logo

更多推荐