【原创】wince 5.0/wince6.0 2440/6410/S5PV210 触摸屏驱动 滤波函数的介绍(作者:gooogleman)
2012-06-15 15:28
441 查看
作者:gooogleman 邮箱:gooogleman@foxmail.com
以前曾经遇到过wince 手持机,POS机触摸屏 抖动,跳点,飞点的问题,其中起作用最大的就是触摸屏滤波函数,现在给大家介绍一下。
//-----------------------------------------------------------------------------
//--函数介绍:触摸屏滤波函数,每次输入一个采集到的触摸屏点(x/y),然后进行滤波
//------------------------------------------------------------------------------
static BOOL
Touch_Pen_Filtering(INT *px, INT *py)
{
BOOL RetVal = TRUE;
// TRUE : Valid pen sample
// FALSE : Invalid pen sample
INT Filter_Margin;
static int count = 0; // 用来记录 存储点数,对static INT x[2], y[2];很有帮助,详情看函数。
static INT x[2], y[2];// 用数组来存储 采集数的两个点x[0],y[0]存储的是第一个点,x[1],y[1]存储的是(第二个点)
INT TmpX, TmpY; // 用来暂存点
INT dx, dy; // 点差值变量
if(*px <0 && *py <0) // 如果点的值小于0 ,那么就是无效点,函数返回FALSE
{
count = 0;
return FALSE;
}
else // 点有效,count 值加1
{
count++;
}
if (count > 2) // 当采集的点大于或者等于3 个的时候(count=0/1/2 )
{
// apply filtering rule
count = 2;// 重新 赋值2
// average between x,y[0] and *px,y 第一个点和当前点的平均值
TmpX = (x[0] + *px)>>1;
TmpY = (y[0] + *py)>>1;
// difference between x,y[1] and TmpX,Y 求出第二个点和第一个点和当前点的均值差值绝对值,
dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);
Filter_Margin = (x[1] > x[0]) ? (x[1]-x[0]) : (x[0]-x[1]);
Filter_Margin += (y[1] > y[0]) ? (y[1]-y[0]) : (y[0]-y[1]);
Filter_Margin += TSP_FILTER_LIMIT;
if ((dx > Filter_Margin) || (dy > Filter_Margin)) { // 无效 返回重新采集点
// Invalid pen sample
*px = x[1]; // 这个应该没有关系的
*py = y[1]; // previous valid sample
RetVal = FALSE;
count = 0;
}
else // 点有效,更新x[0] = x[1]; y[0] = y[1]; 存储的值
{
// Valid pen sample
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = TRUE;
}
}
else // (count < 2) // 采集点不够多,更新x[0] = x[1]; y[0] = y[1]; 存储的值,继续采集下面的值,至少采集三个点才行
{ // till 2 samples, no filtering rule
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = FALSE; //
}
return RetVal;
}
以前曾经遇到过wince 手持机,POS机触摸屏 抖动,跳点,飞点的问题,其中起作用最大的就是触摸屏滤波函数,现在给大家介绍一下。
//-----------------------------------------------------------------------------
//--函数介绍:触摸屏滤波函数,每次输入一个采集到的触摸屏点(x/y),然后进行滤波
//------------------------------------------------------------------------------
static BOOL
Touch_Pen_Filtering(INT *px, INT *py)
{
BOOL RetVal = TRUE;
// TRUE : Valid pen sample
// FALSE : Invalid pen sample
INT Filter_Margin;
static int count = 0; // 用来记录 存储点数,对static INT x[2], y[2];很有帮助,详情看函数。
static INT x[2], y[2];// 用数组来存储 采集数的两个点x[0],y[0]存储的是第一个点,x[1],y[1]存储的是(第二个点)
INT TmpX, TmpY; // 用来暂存点
INT dx, dy; // 点差值变量
if(*px <0 && *py <0) // 如果点的值小于0 ,那么就是无效点,函数返回FALSE
{
count = 0;
return FALSE;
}
else // 点有效,count 值加1
{
count++;
}
if (count > 2) // 当采集的点大于或者等于3 个的时候(count=0/1/2 )
{
// apply filtering rule
count = 2;// 重新 赋值2
// average between x,y[0] and *px,y 第一个点和当前点的平均值
TmpX = (x[0] + *px)>>1;
TmpY = (y[0] + *py)>>1;
// difference between x,y[1] and TmpX,Y 求出第二个点和第一个点和当前点的均值差值绝对值,
dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);
Filter_Margin = (x[1] > x[0]) ? (x[1]-x[0]) : (x[0]-x[1]);
Filter_Margin += (y[1] > y[0]) ? (y[1]-y[0]) : (y[0]-y[1]);
Filter_Margin += TSP_FILTER_LIMIT;
if ((dx > Filter_Margin) || (dy > Filter_Margin)) { // 无效 返回重新采集点
// Invalid pen sample
*px = x[1]; // 这个应该没有关系的
*py = y[1]; // previous valid sample
RetVal = FALSE;
count = 0;
}
else // 点有效,更新x[0] = x[1]; y[0] = y[1]; 存储的值
{
// Valid pen sample
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = TRUE;
}
}
else // (count < 2) // 采集点不够多,更新x[0] = x[1]; y[0] = y[1]; 存储的值,继续采集下面的值,至少采集三个点才行
{ // till 2 samples, no filtering rule
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = FALSE; //
}
return RetVal;
}
相关文章推荐
- 改善6410 触摸屏驱动(作者gooogleman) 改善641
- 介绍一种很棒的wince驱动调试方法——在wince应用程序中直接访问硬件(作者:gooogleman)
- 介绍一种很棒的wince驱动调试方法——在wince应用程序中直接访问硬件(作者:gooogleman)
- 改善6410 触摸屏驱动(作者gooogleman)
- 改善6410 触摸屏驱动(作者gooogleman) 改善641
- 介绍几种很棒的wince驱动调试方法——在wince应用程序中直接访问硬件(作者:gooogleman)
- 最近在S5pv210的平台的一些wince驱动完善进展情况(作者:gooogleman)
- 【原创】关于wince驱动中CDEFINES的一些认识(作者:gooogleman)
- 改善6410 触摸屏驱动(作者gooogleman)
- WinCE中串口驱动及接口函数介绍(转)
- WinCE中串口驱动及接口函数介绍
- WinCE中串口驱动及接口函数介绍(转)
- WinCE中串口驱动及接口函数介绍
- wince 5.0 .2440 5.0BSP的中断过程(作者:wogoyixikexie@gliet)
- 转:wince 5.0 .2440 5.0BSP的中断过程(作者:wogoyixikexie@gliet)
- (原创)6410触摸屏驱动分析(s3c-ts.c)(Linux)(分析)
- WinCE中串口驱动及接口函数介绍
- WinCE中串口驱动及接口函数介绍
- WinCE中串口驱动及接口函数介绍
- 如何 克隆wince 5.0 BSP (作者:gooogleman)