tslib-1.19实现触摸屏单击/双击/长按检测

博客可能围绕tslib展开,但因内容缺失,关键信息不明。tslib是信息技术领域相关内容,推测可能涉及它的功能、应用等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/******************************************************************************

 * 线程:获取当前触摸屏事件类型:单击/双击/长按
 * @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;                        
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值