summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7a9bfe1)
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>
int hz[HZ_LIST];
int count;
int avghz;
int hz[HZ_LIST];
int count;
int avghz;
+ unsigned long long prev_time;
char name[128];
} event_t;
char name[128];
} event_t;
}
if(event.type == EV_REL || event.type == EV_ABS) {
}
if(event.type == EV_REL || event.type == EV_ABS) {
+ 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;
events[i].count++;
events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
events[i].avghz = 0;
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].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);
}
if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
}