minor doc update
[evhz] / evhz.c
diff --git a/evhz.c b/evhz.c
index 193185ae16f22f5a46d94eca46720ff9aaec4a60..217e8b0710f4c5fe86a991fd82733a94e468d3bc 100644 (file)
--- a/evhz.c
+++ b/evhz.c
@@ -3,6 +3,8 @@
 #include <linux/input.h>
 #include <fcntl.h>
 #include <signal.h>
+#include <getopt.h>
+#include <unistd.h>
 
 #define EVENTS 50
 #define HZ_LIST 64
@@ -11,19 +13,41 @@ typedef struct event_s {
        int fd;
        int hz[HZ_LIST];
        int count;
+       int avghz;
        double prvtime;
+       char name[128];
 } event_t;
 
 int quit = 0;
 
 void sigint() {
-       signal(SIGINT, sigint);
        quit = 1;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char *argv[]) {
+       int optch;
        int i;
        event_t events[EVENTS];
+       int verbose = 1;
+
+       while((optch = getopt(argc, argv, "hn")) != -1) {
+               switch(optch) {
+                       case('h'):
+                               printf("Usage: %s [-n|-h]\n", argv[0]);
+                               printf("-n     nonverbose\n");
+                               printf("-h     help\n");
+                               return 0;
+                               break;
+                       case('n'):
+                               verbose = 0;
+                               break;
+               }
+       }
+
+    if(geteuid() != 0) {
+        printf("%s must be used as superuser\n", argv[0]);
+        return 1;
+    }
 
        signal(SIGINT, sigint);
 
@@ -31,16 +55,16 @@ int main(int argc, char **argv) {
 
        memset(events, 0, sizeof(events));
 
+       // List input devices
        for(i = 0; i < EVENTS; i++) {
-               char device[18];
+               char device[19];
 
                sprintf(device, "/dev/input/event%i", i);
                events[i].fd = open(device, O_RDONLY);
                
                if(events[i].fd != -1) {
-                       char name[128];
-                       ioctl(events[i].fd, EVIOCGNAME(sizeof(name)), name);
-                       printf("event%i: %s\n", i, name);
+                       ioctl(events[i].fd, EVIOCGNAME(sizeof(events[i].name)), events[i].name);
+                       if(verbose) printf("event%i: %s\n", i, events[i].name);
                }
        }
 
@@ -60,11 +84,7 @@ int main(int argc, char **argv) {
                        struct input_event event;
 
                        for(i = 0; i < EVENTS; i++) {
-                               if(events[i].fd == -1) {
-                                       continue;
-                               }
-
-                               if(!FD_ISSET(events[i].fd, &set)) {
+                               if(events[i].fd == -1 || !FD_ISSET(events[i].fd, &set)) {
                                        continue;
                                }
 
@@ -82,21 +102,20 @@ int main(int argc, char **argv) {
                                        hz = 1000 / (time - events[i].prvtime);
 
                                        if(hz > 0) {
-                                               int avghz;
                                                int j;
 
                                                events[i].count++;
                                                events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
 
-                                               avghz = 0;
+                                               events[i].avghz = 0;
 
                                                for(j = 0; j < HZ_LIST; j++) {
-                                                       avghz += events[i].hz[j];
+                                                       events[i].avghz += events[i].hz[j];
                                                }
 
-                                               avghz /= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
+                                               events[i].avghz /= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
 
-                                               printf("event%i: latest hz = %i (average hz = %i)\n", i, hz, avghz);
+                                               if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
                                        }
 
                                        events[i].prvtime = time;
@@ -107,7 +126,12 @@ int main(int argc, char **argv) {
 
        for(i = 0; i < EVENTS; i++) {
                if(events[i].fd != -1) {
+                       if (events[i].avghz != 0) {
+                               printf("\nAverage for %s: % 5iHz\n", events[i].name, events[i].avghz);
+                       }
                        close(events[i].fd);
                }
        }
+
+       return 0;
 }