c4dd389763c5490748809a03db2d8b89a2494258
3 #include <linux/input.h>
12 typedef struct event_s
{
27 int main(int argc
, char *argv
[]) {
30 event_t events
[EVENTS
];
33 while((optch
= getopt(argc
, argv
, "hv")) != -1) {
36 printf("Usage: %s [-v|-h]\n", argv
[0]);
46 printf("%s must be used as superuser", argv
[0]);
50 signal(SIGINT
, sigint
);
52 printf("Press CTRL-C to exit.\n\n");
54 memset(events
, 0, sizeof(events
));
57 for(i
= 0; i
< EVENTS
; i
++) {
60 sprintf(device
, "/dev/input/event%i", i
);
61 events
[i
].fd
= open(device
, O_RDONLY
);
63 if(events
[i
].fd
!= -1) {
64 ioctl(events
[i
].fd
, EVIOCGNAME(sizeof(events
[i
].name
)), events
[i
].name
);
65 if(verbose
) printf("event%i: %s\n", i
, events
[i
].name
);
74 for(i
= 0; i
< EVENTS
; i
++) {
75 if(events
[i
].fd
!= -1) {
76 FD_SET(events
[i
].fd
, &set
);
80 if(select(FD_SETSIZE
, &set
, NULL
, NULL
, NULL
) > 0) {
82 struct input_event event
;
84 for(i
= 0; i
< EVENTS
; i
++) {
85 if(events
[i
].fd
== -1 || !FD_ISSET(events
[i
].fd
, &set
)) {
89 bytes
= read(events
[i
].fd
, &event
, sizeof(event
));
91 if(bytes
!= sizeof(event
)) {
95 if(event
.type
== EV_REL
) {
99 time
= event
.time
.tv_sec
* 1000 + event
.time
.tv_usec
/ 1000;
100 hz
= 1000 / (time
- events
[i
].prvtime
);
106 events
[i
].hz
[events
[i
].count
& (HZ_LIST
- 1)] = hz
;
110 for(j
= 0; j
< HZ_LIST
; j
++) {
111 events
[i
].avghz
+= events
[i
].hz
[j
];
114 events
[i
].avghz
/= (events
[i
].count
> HZ_LIST
) ? HZ_LIST
: events
[i
].count
;
116 if(verbose
) printf("%s: Latest % 5iHz, Average % 5iHz\n", events
[i
].name
, hz
, events
[i
].avghz
);
119 events
[i
].prvtime
= time
;
125 for(i
= 0; i
< EVENTS
; i
++) {
126 if(events
[i
].fd
!= -1) {
127 if (events
[i
].avghz
!= 0) {
128 printf("\nAverage for %s: % 5iHz\n", events
[i
].name
, events
[i
].avghz
);