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