/* Through this source code, you could see the point output architechture of touch device. You could follow below code to do point parsing. And develop your own app. */ #include #include #include #include #include #include #include #include #include /*Note: If you couldn't build this source code successfully, it may caused by the old kernel issue. Please enable below define depending on your kernel version */ //#define KERNEL_2_6_35_DOWNWARD /* As kernel <= 2.6.35 */ //#define KERNEL_2_6_32_DOWNWARD /* As kernel <= 2.6.32 */ //#define KERNEL_2_6_29_DOWNWARD /* As kernel <= 2.6.29 */ typedef struct tagevent { struct timeval time; unsigned short type; unsigned short code; int value; } input_event; void ParseEvent( input_event ev ) { static unsigned short X, Y, State; static unsigned short X2, Y2, State2; static unsigned char bIsSecond; if( ev.type == EV_ABS ) { switch( ev.code ) { #ifndef KERNEL_2_6_35_DOWNWARD case ABS_MT_SLOT: printf(" [ABS_MT_SLOT] code = %3d, value = %4d\n", ev.code , ev.value); break; #endif #ifndef KERNEL_2_6_32_DOWNWARD case ABS_MT_PRESSURE: printf(" [ABS_MT_PRESSURE] code = %3d, value = %4d\n", ev.code , ev.value); break; #endif #ifndef KERNEL_2_6_29_DOWNWARD case ABS_MT_TRACKING_ID: printf(" [ABS_MT_TRACKING_ID] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_MT_POSITION_X: printf(" [ABS_MT_POSITION_X] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_MT_POSITION_Y: printf(" [ABS_MT_POSITION_Y] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_MT_TOUCH_MAJOR: printf(" [ABS_MT_TOUCH_MAJOR] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_MT_WIDTH_MAJOR: printf(" [ABS_MT_WIDTH_MAJOR] code = %3d, value = %4d\n", ev.code , ev.value); break; #endif case ABS_X: printf(" [ABS_X] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_Y: printf(" [ABS_Y] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_RX: printf(" [ABS_RX] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_RY: printf(" [ABS_RY] code = %3d, value = %4d\n", ev.code , ev.value); break; case ABS_PRESSURE: printf(" [ABS_PRESSURE] code = %3d, value = %4d\n", ev.code , ev.value); break; default: break; } } else if( ev.type == EV_KEY ){ switch( ev.code ){ case BTN_TOUCH: printf(" [BTN_TOUCH] code = %3d, value = %4d\n", ev.code , ev.value); break; case BTN_LEFT: printf(" [BTN_LEFT] code = %3d, value = %4d\n", ev.code , ev.value); break; case BTN_EXTRA: printf(" [BTN_EXTRA] code = %3d, value = %4d\n", ev.code , ev.value); break; default: break; } } else if( ev.type == EV_SYN ){ switch( ev.code ){ case SYN_REPORT: printf(" [SYN_REPORT] code = %3d, value = %4d\n\n", ev.code , ev.value); break; #ifndef KERNEL_2_6_29_DOWNWARD case SYN_MT_REPORT: printf(" [SYN_MT_REPORT] code = %3d, value = %4d\n", ev.code , ev.value); break; #endif default: break; } } else if( ev.type == EV_MSC ){ if( ev.code == MSC_SCAN ) printf(" [MSC_SCAN] code = %3d, value = %4d\n", ev.code , ev.value); } } int main( int argc, char **argv ) { int fd; unsigned char byFlag = 0; /* 0: Point */ char strPort[64] = { 0 }; fd_set readfds; if( argc == 1 || argc > 2 ) { printf(" \nUsage:\n \tGetEvent [Port]\n"); printf("Example:\n \tGetEvent /dev/input/event1\n\n"); return 0; } sprintf( strPort, "%s", argv[1] ); printf("Event Port = %s ", strPort); fd = open(strPort, O_RDONLY ); if( fd >= 0 ) { printf(" open: ok\n" ); FD_ZERO( &readfds ); FD_SET( fd , &readfds ); while( 1 ) { if( select( fd+1, &readfds, NULL, NULL, NULL ) > 0 ) { input_event ev; if( sizeof( input_event ) == read( fd, &ev, sizeof( input_event ) ) ) { ParseEvent( ev ); } else { printf(" Nothing read \n" ); } } } } return 0; }