/******************************************************************************
* 线程:获取当前触摸屏事件类型:单击/双击/长按
* @Author liujian
* @version 1.0
* @入口参数 arg: 线程传参
* @返回值 null
*****************************************************************************/
void *Ts_event_type(void *arg)
{
int on_num = 0; // 记录按下时压力值为255的次数
int down_x = -999, down_y = -999; // 按下时的x y坐标
int f_sec =0, f_usec = 0; // 压力为255时的时间
int z_sec =0, z_usec = 0; // 压力位0时的时间
int down_time_sec=0, down_time_usec =0; // 按下时间
int area_det_flag = 0; // 区域检测标志位
//int on_flag = 0;
struct ts_sample ts;
Init_tslib(SCREEN_DEVICE);
while(1)
{
get_local_x_y(&ts);
if(255 == ts.pressure) // 压力值为255时
{
on_num++;
}
else if(0 == ts.pressure) // 压力值为0时
{
on_num = 0; // 这次按下结束,重新计数
if((ts.tv.tv_sec == z_sec) && ((ts.tv.tv_usec - z_usec) < 500000)||
((ts.tv.tv_sec == z_sec+1) && (ts.tv.tv_usec - z_usec < -500000))) // 两次点击时间小于0.5s)
{
if(area_det_flag) // 确认两次点击在误差范围内
{
area_det_flag = 0;
printf("***********double-click\n");
Event_type = 1;
}
}
else // 为普通点击
{
z_sec = ts.tv.tv_sec; // 保存松开时的时刻
z_usec = ts.tv.tv_usec;
down_time_sec = z_sec - f_sec; // 松开时刻与按下时刻的差值
down_time_usec = z_usec - f_usec;
if((down_time_sec == 1 && down_time_usec > 0) || down_time_sec > 1) // 按下时间超过一秒为长按
{
printf("***********Long-press\n");
Event_type = 2;
}
else
{
printf("***********Single-click\n");
}
}
}
if(1 == on_num) // 只记录第一次为255按下的值
{
f_sec = ts.tv.tv_sec; // 保存按下的时刻
f_usec = ts.tv.tv_usec;
if( (ts.x - down_x <= 10 && ts.x - down_x >= -10) && (ts.y - down_y <= 10 && ts.y - down_y >= -10)// 点击区域误差
&& down_x != -999 && down_y != -999)// 第一次点击防止默认值被纳入计算
{
area_det_flag = 1;
printf("area_det_flag\n");
}
down_x = ts.x; // 保存当前坐标
down_y = ts.y;
}
}
}