示例#1
0
static int xpt2046_read_values(struct XPT2046_TS_EVENT *ts_dev)
{
    uint16 *ptmpdata;
    int ret = 0,cnt = 0;
    bool accept = false;
    int tmp_p = 0;
    ptmpdata = kzalloc(sizeof(uint16)*2, GFP_KERNEL);
    do {
        ptmpdata[0] = gLastZvalue[0];
        ptmpdata[1] = gLastZvalue[1];
        accept = xpt2046_pressure_filter(ts_dev);
        //accept = true;
        if(accept)
        {
            ptmpdata[0]= PT2046_read_op(ts_dev,READ_X);
            udelay(ADC_DELAYS);
            ptmpdata[1]= PT2046_read_op(ts_dev,READ_Y);
            udelay(ADC_DELAYS);
            gLastZvalue[0] = ptmpdata[0];
            gLastZvalue[1] = ptmpdata[1];
            ret++;
        }
        //printk("pressure = %d,	x = %d	y = %d	   accept = %d \n",gDebugData[0], ptmpdata[0], ptmpdata[1], accept);
        cnt++;
    } while(cnt<2||0!=TouchFilter(&ptmpdata[0],&ptmpdata[1],ts_dev->pendown));
    tmp_p = tmp_save_ad_point_num % SAVEPOINTMAXNUM;
    if(ret)
    {
        ts_dev->x = gLastZvalue[0];
        ts_dev->y = gLastZvalue[1];
        if(cal_status_android < 5 && cal_status_android >= 0)
        {
            tmp_save_ad_point_x[tmp_p] = ts_dev->x;
            tmp_save_ad_point_y[tmp_p] = ts_dev->y;
            tmp_save_ad_point_num ++;
        }
    }
    else
    {
        ts_dev->x = 0;
        ts_dev->y = 4095;
    }

    //printk("xpt2046_read_values()   ts_dev->x = %d,	  ts_dev->y = %d	 cal_status_android = %d  tmp_save_ad_point_num = %d   tmp_p = %d \n",
    //	ts_dev->x, ts_dev->y, cal_status_android, tmp_save_ad_point_num, tmp_p);

    gDebugData[1] = ts_dev->x;
    gDebugData[2] = ts_dev->y;
    rk28printk("pressure = %d	adx = %d	ady = %d\n",gDebugData[0],gDebugData[1],gDebugData[2]);
    rk28printk("pressure = %d\n",gDebugData[0]);
    kfree(ptmpdata);
    return ret;
}
示例#2
0
/**************************************************************
** 函数名:ManageTouch
** 功能:触摸管理
** 注意事项:研究中...笔中断有效时开始消抖(非阻塞延迟),->进入有效读TOUCH,每个循环读一次并检测笔中断,够10个循环则滤波出值.
***************************************************************/
void ManageTouch(void)
{
	Touch_Cnt_Time++;
	/**************************************************************
		PEN为无效效
	***************************************************************/
	if(GET_PEN_INT)
	{
		/**************************************************************
			考虑这里也要使用消抖-释放消抖
		***************************************************************/

		if(!(Touch_Flag&TOUCH_F_RELEASE))
		{
			//如果之前有HOLD标志,则代表释放
			if(Touch_Flag&TOUCH_F_HOLD)
			{
				Touch_Flag=TOUCH_F_NULL;
				Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_HOLD;
				T_Release_X=T_Hold_X;
				T_Release_Y=T_Hold_Y;
			}
			//否则之前只有PUSH标志,也代表释放
			else if(Touch_Flag&TOUCH_F_PUSH)
			{
				Touch_Flag=TOUCH_F_NULL;
				Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_PUSH;
				T_Release_X=T_Push_X;
				T_Release_Y=T_Push_Y;
			}
		}
		return;
	}

	/**************************************************************
		PEN为有效
	***************************************************************/
	//如果之前有释放状态,则从新开始判断触摸
	if(Touch_Flag&TOUCH_F_RELEASE)
	{
		goto new_touch;
	}
	
	//-1.TOUCH_F_WAIT_HOLD标志,代表要开始计算等待保持时间
	if(Touch_Flag&TOUCH_F_WAIT_HOLD)
	{
		if(Touch_Cnt_Time>=TOUCH_CNT_WAIT_HOLD_TIME)
		{
			Touch_Flag|=TOUCH_F_HOLD;
			Touch_Flag&=~TOUCH_F_WAIT_HOLD;
			T_Hold_X=T_Release_X;
			T_Hold_Y=T_Release_Y;
		}
	}
	//-1.HOLD并且非滤波标志
	else if((Touch_Flag&TOUCH_F_HOLD)&&(!(Touch_Flag&TOUCH_F_FILTERING)))
	{
		Touch_Flag|=TOUCH_F_FILTERING;		//则开始滤波
		Filter_No=0;
	}
	
	//-3.PUSH标志并且非滤波标志*_*
	else if((Touch_Flag&TOUCH_F_PUSH)&&(!(Touch_Flag&TOUCH_F_FILTERING)))
	{
		if(Touch_Cnt_Time>=TOUCH_CNT_HOLD_TIME)	//则开始计算BPK,时间到则又进入滤波
		{
			Touch_Flag|=TOUCH_F_FILTERING;
			Filter_No=0;
		}
	}
	
	//-3.FLITERING-当没PUSH到PUSH的时候会进入这里一次,HOLD则连续进入
	else if(Touch_Flag&TOUCH_F_FILTERING)
	{
		GetOneCoordinate(Filter_No);
		if((++Filter_No)==MAX_TOUCH_FILTER_NO)
		{
			if(!(Touch_Flag&TOUCH_F_PUSH))		//之前没有PUSH,则这个是属于PUSH的滤波
			{
				TouchFilter(&T_Push_X,&T_Push_Y);
				Touch_Flag=TOUCH_F_PUSH;
				Touch_Cnt_Time=0;
			}
			else								//属于HOLD的滤波
			{
				TouchFilter(&T_Release_X,&T_Release_Y);//放到Release纯粹为了节省临时变量
				Touch_Flag&=~TOUCH_F_FILTERING;
				Touch_Flag|=TOUCH_F_WAIT_HOLD;
				Touch_Cnt_Time=0;
			}
		}
	}
	//-4.BCK-消抖时间到,则转入滤波
	else if(Touch_Flag&TOUCH_F_BCK_TIME)
	{
		if(Touch_Cnt_Time>=TOUCH_CNT_FLITER_TIME)
		{
			Touch_Flag=TOUCH_F_FILTERING;
			Filter_No=0;
		}
	}
	//-5.PUCH_NULL,置消抖标志
	else
	{
		new_touch:
		Touch_Flag=TOUCH_F_BCK_TIME;
		Touch_Cnt_Time=0;
	}

}