Use proper 64-bit integer arithmetic for Hz calculation
authorTobias Jakobi <tjakobi@math.uni-bielefeld.de>
Wed, 1 Feb 2017 20:48:50 +0000 (21:48 +0100)
committerIan Kelling <ian@iankelling.org>
Wed, 1 Feb 2017 23:31:29 +0000 (15:31 -0800)
The current code uses double floats, which makes no sense since
time differences are always integer and never fractional.

Also fix up the averaging code a bit.

This fixes some spurious wrong Hz values reported for
my Logitech Rumblepad 2.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
evhz.c

diff --git a/evhz.c b/evhz.c
index e515ce5415eeeda6bb46690d9185b29453d0db93..4fd770dadc8e30ce843c5f1b8fb585c5ff2686d2 100644 (file)
--- a/evhz.c
+++ b/evhz.c
@@ -27,7 +27,7 @@ typedef struct event_s {
     int hz[HZ_LIST];
     int count;
     int avghz;
-    double prev_time;
+    unsigned long long prev_time;
     char name[128];
 } event_t;
 
@@ -115,25 +115,32 @@ int main(int argc, char *argv[]) {
             }
 
             if(event.type == EV_REL || event.type == EV_ABS) {
-                double time;
-                int hz;
+                unsigned long long time, timediff;
+                unsigned hz = 0;
 
-                time = event.time.tv_sec * 1000 + event.time.tv_usec / 1000;
-                hz = 1000 / (time - events[i].prev_time);
+                time = (unsigned long long)event.time.tv_sec * 1000ULL;
+                time += (unsigned long long)event.time.tv_usec / 1000ULL;
+
+                timediff = time - events[i].prev_time;
+
+                if(timediff != 0)
+                    hz = 1000ULL / timediff;
 
                 if(hz > 0) {
-                    int j;
+                    unsigned j, maxavg;
 
                     events[i].count++;
                     events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
 
                     events[i].avghz = 0;
 
-                    for(j = 0; j < HZ_LIST; j++) {
+                    maxavg = (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
+
+                    for(j = 0; j < maxavg; j++) {
                         events[i].avghz += events[i].hz[j];
                     }
 
-                    events[i].avghz /= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
+                    events[i].avghz /= maxavg;
 
                     if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
                 }