You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

153 lines
4.3 KiB

/* 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 <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/input.h>
/*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;
}