Fixed header, and fixed small limit on # of devices.
[evhz] / evhz.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <linux/input.h>
4 #include <fcntl.h>
5 #include <signal.h>
6
7 #define EVENTS 50
8 #define HZ_LIST 64
9
10 typedef struct event_s {
11 int fd;
12 int hz[HZ_LIST];
13 int count;
14 double prvtime;
15 } event_t;
16
17 int quit = 0;
18
19 void sigint() {
20 signal(SIGINT, sigint);
21 quit = 1;
22 }
23
24 int main(int argc, char **argv) {
25 int i;
26 event_t events[EVENTS];
27
28 signal(SIGINT, sigint);
29
30 printf("Press CTRL-C to exit.\n\n");
31
32 memset(events, 0, sizeof(events));
33
34 for(i = 0; i < EVENTS; i++) {
35 char device[18];
36
37 sprintf(device, "/dev/input/event%i", i);
38 events[i].fd = open(device, O_RDONLY);
39
40 if(events[i].fd != -1) {
41 char name[128];
42 ioctl(events[i].fd, EVIOCGNAME(sizeof(name)), name);
43 printf("event%i: %s\n", i, name);
44 }
45 }
46
47 while(!quit) {
48 fd_set set;
49
50 FD_ZERO(&set);
51
52 for(i = 0; i < EVENTS; i++) {
53 if(events[i].fd != -1) {
54 FD_SET(events[i].fd, &set);
55 }
56 }
57
58 if(select(FD_SETSIZE, &set, NULL, NULL, NULL) > 0) {
59 int bytes;
60 struct input_event event;
61
62 for(i = 0; i < EVENTS; i++) {
63 if(events[i].fd == -1) {
64 continue;
65 }
66
67 if(!FD_ISSET(events[i].fd, &set)) {
68 continue;
69 }
70
71 bytes = read(events[i].fd, &event, sizeof(event));
72
73 if(bytes != sizeof(event)) {
74 continue;
75 }
76
77 if(event.type == EV_REL) {
78 double time;
79 int hz;
80
81 time = event.time.tv_sec * 1000 + event.time.tv_usec / 1000;
82 hz = 1000 / (time - events[i].prvtime);
83
84 if(hz > 0) {
85 int avghz;
86 int j;
87
88 events[i].count++;
89 events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
90
91 avghz = 0;
92
93 for(j = 0; j < HZ_LIST; j++) {
94 avghz += events[i].hz[j];
95 }
96
97 avghz /= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
98
99 printf("event%i: latest hz = %i (average hz = %i)\n", i, hz, avghz);
100 }
101
102 events[i].prvtime = time;
103 }
104 }
105 }
106 }
107
108 for(i = 0; i < EVENTS; i++) {
109 if(events[i].fd != -1) {
110 close(events[i].fd);
111 }
112 }
113 }