首页 > 代码库 > 项目中的小bug

项目中的小bug

最近在做电子书项目中,采用select方式输入子系统,运行后发现键盘输入没问题,可是触摸屏却没反应,触摸屏驱动没问题,tslib也移植正确。问题在哪呢?
在代码中加入打印语句:

 54 static int isOutOf500ms(struct timeval *ptPreTime, struct timeval *ptNowTime) 55 { 56     int iPreMs; 57     int iNowMs; 58      59     iPreMs = ptPreTime->tv_sec * 1000 + ptPreTime->tv_usec / 1000; 60     iNowMs = ptNowTime->tv_sec * 1000 + ptNowTime->tv_usec / 1000; 61     printf("PreTime %d ms , NowTime%d ms\n",iPreMs,iNowMs); 62  63     return (iNowMs > iPreMs + 500); 64 } 65  66 static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent) 67 { 68     struct ts_sample tSamp; 69     int iRet; 70  71     static struct timeval tPreTime; 72     printf("PreTime %ld:%ld\n",tPreTime.tv_sec,tPreTime.tv_usec); 73  74     iRet = ts_read(g_tTSDev, &tSamp, 1); 75     printf("tSamp : %ld.%06ld: %6d %6d %6d\n", tSamp.tv.tv_sec, tSamp.tv.tv_usec, tSamp.x, tSamp.y, tSamp.pressure); 76  77     if (iRet < 0) { 78         return -1; 79     } 80  81     if (isOutOf500ms(&tPreTime, &tSamp.tv)) 82     { 83         tPreTime = tSamp.tv; 84         ptInputEvent->tTime = tSamp.tv; 85         ptInputEvent->iType = INPUT_TYPE_TOUCHSCREEN; 86  87         if (tSamp.y < giYres/3) 88         { 89             ptInputEvent->iVal = INPUT_VALUE_UP; 90         } 91         else if (tSamp.y > 2*giYres/3) 92         { 93             ptInputEvent->iVal = INPUT_VALUE_DOWN; 94         } 95         else 96         { 97             ptInputEvent->iVal = INPUT_VALUE_UNKNOWN; 98         } 99         printf("Out 500ms\n");100         printf("Y = %d,giYres = %d\n",tSamp.y,giYres);101         return 0;102         103     }104     else105     {106         printf("In 500ms\n");107         return -1;108     }109     110 111     return 0;112 }

输出结果如下:

观察红色圈中的,PreTime为正,NowTime为负,那么NowTime永远不可能大于PreTime,所以永远返回0,所以触摸屏不会有反应。
在源码中,iPreMs,iNowMs定义为:
int iPreMs;
int iNowMs;
修改为:
unsigned int iPreMs;
unsigned int iNowMs;
运行结果如下:


完美运行。

虽然这只是一个小小的bug,但是我也是经过三天茶饭不思般的思考才找到的,阅读tslib源码库,自己重写代码,也是走了好大的弯路,但是,其中积累的经验也是不可多得的。

项目中的小bug