event read-- read a event and print it out


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <linux/input.h>


#define test_bit(bit) (mask[(bit) / 8] & (1 << ((bit) % 8)))


int main(int argc, char **argv)
{
	char		name[64];               /* RATS: Use ok, but could be better */
	char		buf[256] = { 0, };      /* RATS: Use ok */
	unsigned char	mask[EV_MAX / 8 + 1];   /* RATS: Use ok */
	int		version;
	int		fd = 0;
	int		rc;
	int		i, j;
	char		*tmp;
	struct input_event evCurrent;
	struct input_event evLast = {{ 0 }, 0};


	for(i = 0; i < 32; i++)
	{
		sprintf(name, "/dev/input/evCurrent%d", i);
		if((fd = open(name, O_RDONLY, 0)) >= 0)
		{
			ioctl(fd, EVIOCGVERSION, &version);
			ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);
			ioctl(fd, EVIOCGBIT(0, sizeof(mask)), mask);
			printf("%s\n", name);
			printf("    evdev version: %d.%d.%d\n", version >> 16, (version >> 8) & 0xff, version & 0xff);
			printf("    name: %s\n", buf);
			printf("    features:");
			for(j = 0; j < EV_MAX; j++)
			{
				if(test_bit(j))
				{
					const char *type = "unknown";
					switch(j)
					{
						case EV_KEY: type	= "keys/buttons"; break;
						case EV_REL: type	= "relative";     break;
						case EV_ABS: type	= "absolute";     break;
						case EV_MSC: type	= "reserved";     break;
						case EV_LED: type	= "leds";         break;
						case EV_SND: type	= "sound";        break;
						case EV_REP: type	= "repeat";       break;
						case EV_FF:  type	= "feedback";     break;
					}
					printf(" %s", type);
				}
			}
			printf("\n");
			close(fd);
		}
	}

	if(argc > 1)
	{
		sprintf(name, "/dev/input/evCurrent%d", atoi(argv[1]));
		if((fd = open(name, O_RDWR, 0)) >= 0)
		{
			printf("%s: open, fd = %d\n", name, fd);
			for(i = 0; i < LED_MAX; i++)
			{
				evCurrent.time.tv_sec	= time(0);
				evCurrent.time.tv_usec	= 0;
				evCurrent.type		= EV_LED;
				evCurrent.code		= i;
				evCurrent.value		= 0;
				write(fd, &evCurrent, sizeof(evCurrent));
			}

			while((rc = read(fd, &evCurrent, sizeof(evCurrent))) > 0)
			{
				if(evLast.time.tv_sec == 0 && evLast.time.tv_usec == 0)
					evLast = evCurrent;
				
				printf("%-24.24s.%06lu type 0x%04x; code 0x%04x;" " value 0x%08x; ", ctime(&evCurrent.time.tv_sec),
				       evCurrent.time.tv_usec, evCurrent.type, evCurrent.code, evCurrent.value);
				
				//we just care about release
				if(evCurrent.value == 0)
				{
					i = evCurrent.time.tv_sec - evLast.time.tv_sec;
					i *= 1000;
					j = evCurrent.time.tv_usec - evLast.time.tv_usec;
					j /= 1000;
					
					if(i + j > 0)
					{
						printf(" Time Interval %d ms between press, release\n", i + j);
					}
				}
				
				evLast = evCurrent;
				
				
				switch(evCurrent.type)
				{
					case EV_KEY:
						if(evCurrent.code > BTN_MISC)
						{
							printf("Button %d %s",
							       evCurrent.code & 0xff,
							       evCurrent.value ? "press" : "release");
						}
						else
						{
							printf("Key %d (0x%x) %s",
							       evCurrent.code & 0xff,
							       evCurrent.code & 0xff,
							       evCurrent.value ? "press" : "release");
						}
						break;
					case EV_REL:
						switch(evCurrent.code)
						{
							case REL_X:      tmp	= "X";       break;
							case REL_Y:      tmp	= "Y";       break;
							case REL_HWHEEL: tmp	= "HWHEEL";  break;
							case REL_DIAL:   tmp	= "DIAL";    break;
							case REL_WHEEL:  tmp	= "WHEEL";   break;
							case REL_MISC:   tmp	= "MISC";    break;
							default:         tmp	= "UNKNOWN"; break;
						}
						printf("Relative %s %d", tmp, evCurrent.value);
						break;
					case EV_ABS:
						switch(evCurrent.code)
						{
							case ABS_X:        tmp	= "X";        break;
							case ABS_Y:        tmp	= "Y";        break;
							case ABS_Z:        tmp	= "Z";        break;
							case ABS_RX:       tmp	= "RX";       break;
							case ABS_RY:       tmp	= "RY";       break;
							case ABS_RZ:       tmp	= "RZ";       break;
							case ABS_THROTTLE: tmp	= "THROTTLE"; break;
							case ABS_RUDDER:   tmp	= "RUDDER";   break;
							case ABS_WHEEL:    tmp	= "WHEEL";    break;
							case ABS_GAS:      tmp	= "GAS";      break;
							case ABS_BRAKE:    tmp	= "BRAKE";    break;
							case ABS_HAT0X:    tmp	= "HAT0X";    break;
							case ABS_HAT0Y:    tmp	= "HAT0Y";    break;
							case ABS_HAT1X:    tmp	= "HAT1X";    break;
							case ABS_HAT1Y:    tmp	= "HAT1Y";    break;
							case ABS_HAT2X:    tmp	= "HAT2X";    break;
							case ABS_HAT2Y:    tmp	= "HAT2Y";    break;
							case ABS_HAT3X:    tmp	= "HAT3X";    break;
							case ABS_HAT3Y:    tmp	= "HAT3Y";    break;
							case ABS_PRESSURE: tmp	= "PRESSURE"; break;
							case ABS_DISTANCE: tmp	= "DISTANCE"; break;
							case ABS_TILT_X:   tmp	= "TILT_X";   break;
							case ABS_TILT_Y:   tmp	= "TILT_Y";   break;
							case ABS_MISC:     tmp	= "MISC";     break;
							default:           tmp	= "UNKNOWN";  break;
						}
						printf("Absolute %s %d", tmp, evCurrent.value);
						break;
					case EV_MSC: printf("Misc"); break;
					case EV_LED: printf("Led");  break;
					case EV_SND: printf("Snd");  break;
					case EV_REP: printf("Rep");  break;
					case EV_FF:  printf("FF");   break;
						break;
				}
				printf("\n");
			}
			printf("rc = %d, (%s)\n", rc, strerror(errno));
			close(fd);
		}
	}
	return(0);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值