fix handlig of string /dev/input/event[10..49]
[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 #include <getopt.h>
7 #include <unistd.h>
8
9 #define EVENTS 50
10 #define HZ_LIST 64
11
12 typedef struct event_s {
13 int fd;
14 int hz[HZ_LIST];
15 int count;
16 int avghz;
17 double prvtime;
18 char name[128];
19 } event_t;
20
21 int quit = 0;
22
23 void sigint() {
24 quit = 1;
25 }
26
27 int main(int argc, char *argv[]) {
28 int optch;
29 int i;
30 event_t events[EVENTS];
31 int verbose = 1;
32
33 while((optch = getopt(argc, argv, "hn")) != -1) {
34 switch(optch) {
35 case('h'):
36 printf("Usage: %s [-n|-h]\n", argv[0]);
37 printf("-n nonverbose\n");
38 printf("-h help\n");
39 return 0;
40 break;
41 case('n'):
42 verbose = 0;
43 break;
44 }
45 }
46
47 if(geteuid() != 0) {
48 printf("%s must be used as superuser\n", argv[0]);
49 return 1;
50 }
51
52 signal(SIGINT, sigint);
53
54 printf("Press CTRL-C to exit.\n\n");
55
56 memset(events, 0, sizeof(events));
57
58 // List input devices
59 for(i = 0; i < EVENTS; i++) {
60 char device[19];
61
62 sprintf(device, "/dev/input/event%i", i);
63 events[i].fd = open(device, O_RDONLY);
64
65 if(events[i].fd != -1) {
66 ioctl(events[i].fd, EVIOCGNAME(sizeof(events[i].name)), events[i].name);
67 if(verbose) printf("event%i: %s\n", i, events[i].name);
68 }
69 }
70
71 while(!quit) {
72 fd_set set;
73
74 FD_ZERO(&set);
75
76 for(i = 0; i < EVENTS; i++) {
77 if(events[i].fd != -1) {
78 FD_SET(events[i].fd, &set);
79 }
80 }
81
82 if(select(FD_SETSIZE, &set, NULL, NULL, NULL) > 0) {
83 int bytes;
84 struct input_event event;
85
86 for(i = 0; i < EVENTS; i++) {
87 if(events[i].fd == -1 || !FD_ISSET(events[i].fd, &set)) {
88 continue;
89 }
90
91 bytes = read(events[i].fd, &event, sizeof(event));
92
93 if(bytes != sizeof(event)) {
94 continue;
95 }
96
97 if(event.type == EV_REL) {
98 double time;
99 int hz;
100
101 time = event.time.tv_sec * 1000 + event.time.tv_usec / 1000;
102 hz = 1000 / (time - events[i].prvtime);
103
104 if(hz > 0) {
105 int j;
106
107 events[i].count++;
108 events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
109
110 events[i].avghz = 0;
111
112 for(j = 0; j < HZ_LIST; j++) {
113 events[i].avghz += events[i].hz[j];
114 }
115
116 events[i].avghz /= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
117
118 if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
119 }
120
121 events[i].prvtime = time;
122 }
123 }
124 }
125 }
126
127 for(i = 0; i < EVENTS; i++) {
128 if(events[i].fd != -1) {
129 if (events[i].avghz != 0) {
130 printf("\nAverage for %s: % 5iHz\n", events[i].name, events[i].avghz);
131 }
132 close(events[i].fd);
133 }
134 }
135
136 return 0;
137 }