static int handle_event(struct measurements *m, const struct input_event *ev) { if (ev->type == EV_SYN) { const int idle_reset = 3000000; /* us */ uint64_t last_us = m->us; m->us = tv2us(&ev->time); /* reset after pause */ if (last_us + idle_reset < m->us) { m->max_frequency = 0.0; m->distance = 0; } else { double freq = get_frequency(last_us, m->us); push_frequency(m, freq); m->max_frequency = max(freq, m->max_frequency); return print_current_values(m); } return 0; } else if (ev->type != EV_REL) return 0; switch(ev->code) { case REL_X: m->distance += ev->value; break; } return 0; }
unsigned long medtv(struct timeval *tvarr, size_t tvsize) { struct timeval med; if (tvsize == 0) return 0; else if (tvsize == 1) med = tvarr[tvsize - 1]; else if (tvsize % 2 == 1) med = tvarr[(tvsize - 1) / 2]; else { timeradd(&tvarr[(tvsize - 1) / 2], &tvarr[(tvsize - 1) / 2 + 1], &med); return tv2us(&med) / 2; } return tv2us(&med); }
unsigned long stddevtv(struct timeval *tvarr, size_t tvsize, unsigned long avg) { unsigned long long diffsum; size_t i; if (tvsize <= 1) return 0; /* get the squared sum of differences from the mean */ for (i = 0, diffsum = 0; i < tvsize; ++i) { const unsigned long long diff = labs(tv2us(&tvarr[i]) - avg); diffsum += diff * diff; } return (unsigned long)lround(sqrt(((double)diffsum) / tvsize)); }
unsigned long avgtv(struct timeval *tvarr, size_t tvsize) { struct timeval sum, nsum; size_t i; if (tvsize == 0) return 0; timerclear(&sum); for (i = 0; i < tvsize; ++i) { /* don't assume multiple arguments to timer*() can point to same mem. */ timeradd(&sum, &tvarr[i], &nsum); sum = nsum; } return tv2us(&sum) / tvsize; }