[PATCH libevdev] tools: print the mean frequency together with the max frequency
Peter Hutterer
peter.hutterer at who-t.net
Wed Sep 21 06:55:40 UTC 2016
On Mon, Sep 19, 2016 at 04:06:20PM +0200, Benjamin Tissoires wrote:
> >> > than 1ms apart, but at one recording showed a 37ms delay before we go back to
> >> > the normal 70ms (~15Hz) the mouse has otherwise.
> >> >
> >> > This is unpredictable enough that we can't just work around it so instead
> >> > print a warning to the user so they can go investigate.
> >>
> >> Well, if this is the same type of bug we had in USB, we could have the
> >> same in this tool. If the first reports are obviously too close to
> >> each other, discard them.
> >
> > problem is, in userspace we don't know what the "first" reports are because
> > the timeout is undefined. and while it's easy to ignore events that are
> > within 1ms of each other, one of the recordings shows a 37ms (as opposed to
> > the average 70ms). This is something we couldn't detect.
>
> To me, "first reports", were the firsts in the recording, when we
> actually start counting.
> If it's triggered also in the middle (if the user stops for a few
> secs), then yes, we can't detect those.
for confirmation: it's triggered before the physical movement, not just on
node open. so short of magic timeouts we can't do much.
Cheers,
Peter
> >> > https://bugs.freedesktop.org/show_bug.cgi?id=97812
> >> >
> >> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> >> > ---
> >> > tools/mouse-dpi-tool.c | 43 +++++++++++++++++++++++++++++++++++++++----
> >> > 1 file changed, 39 insertions(+), 4 deletions(-)
> >> >
> >> > diff --git a/tools/mouse-dpi-tool.c b/tools/mouse-dpi-tool.c
> >> > index 30d689a..852ff07 100644
> >> > --- a/tools/mouse-dpi-tool.c
> >> > +++ b/tools/mouse-dpi-tool.c
> >> > @@ -44,6 +44,9 @@
> >> > struct measurements {
> >> > int distance;
> >> > double max_frequency;
> >> > + double *frequencies;
> >> > + size_t frequencies_sz;
> >> > + size_t nfrequencies;
> >> > uint64_t us;
> >> > };
> >> >
> >> > @@ -70,6 +73,21 @@ get_frequency(uint64_t last, uint64_t current)
> >> > return 1000000.0/(current - last);
> >> > }
> >> >
> >> > +static inline void
> >> > +push_frequency(struct measurements *m, double freq)
> >> > +{
> >> > + if (m->nfrequencies == m->frequencies_sz) {
> >> > + m->frequencies_sz += 100;
> >> > + m->frequencies = realloc(m->frequencies,
> >> > + m->frequencies_sz * sizeof *m->frequencies);
> >>
> >> That's going to be a lot of realloc if the user goes slow :/
> >
> > well, i can up it to 200 or so. note that this is just the mouse dpi tool,
> > "good enough" is very much good enough here ;)
>
> k, good enough then
>
> >
> >> > + if (!m->frequencies)
> >> > + abort();
> >> > + }
> >> > +
> >> > + m->frequencies[m->nfrequencies] = freq;
> >> > + m->nfrequencies++;
> >> > +}
> >> > +
> >> > static int
> >> > print_current_values(const struct measurements *m)
> >> > {
> >> > @@ -109,8 +127,8 @@ handle_event(struct measurements *m, const struct input_event *ev)
> >> > m->distance = 0;
> >> > } else {
> >> > double freq = get_frequency(last_us, m->us);
> >> > - if (freq < 1200)
> >> > - m->max_frequency = max(freq, m->max_frequency);
> >> > + push_frequency(m, freq);
> >> > + m->max_frequency = max(freq, m->max_frequency);
> >> > return print_current_values(m);
> >> > }
> >> >
> >> > @@ -166,12 +184,29 @@ mainloop(struct libevdev *dev, struct measurements *m) {
> >> > return 0;
> >> > }
> >> >
> >> > +static inline double
> >> > +mean_frequency(struct measurements *m)
> >> > +{
> >> > + int idx;
> >> > +
> >> > + idx = m->nfrequencies/2;
> >> > + return m->frequencies[idx];
> >> > +}
> >> > +
> >> > static void
> >> > print_summary(struct measurements *m)
> >> > {
> >> > int res;
> >> > + int max_freq = (int)m->max_frequency,
> >> > + mean_freq = (int)mean_frequency(m);
> >> > +
> >> > + printf("Estimated sampling frequency: %dHz (mean %dHz)\n",
> >> > + max_freq, mean_freq);
> >>
> >> Isn't the mean frequency the most interesting?
> >
> > depends on what you want to do with it I guess. we're not using it anywhere,
> > so for now I'd like to stick to the max frequency actually used. mean
> > frequency may depend on speed of movement, etc.
> >
> >> I am sure you can also directly discard some frequencies depending on
> >> the bus used: USB max should be around 1000Hz, maybe slightly more,
> >> Bluetooth not more than 500Hz I'd say (I'll need to check on the
> >> spec).
> >> So if you remove the obviously wrong ones (20000 is simply not
> >> possible, the mean frequency should be closer to the real one).
> >
> > yes, but since this is a debugging tool only, I figured it's easier to just
> > print the warning and let the user catch the rest since I suspect that any
> > device that breaks the current bits needs manual intervention anyway. so I
> > don't want to spend too much time trying to catch the corner-cases here.
>
> K.
>
> Acked-By: Benjamin Tissoires <benjamin.tissoires at gmail.com>
>
> (I think I reviewed it properly today, by lack of brain currently
> gives me a simple acked-by :-P )
>
> Cheers,
> Benjamin
>
> >
> > Cheers,
> > Peter
> >
> >> > +
> >> > + if (max_freq > mean_freq * 1.3)
> >> > + printf("WARNING: Max frequency is more than 30%% higher "
> >> > + "than mean frequency. Manual verification required!\n");
> >> >
> >> > - printf("Estimated sampling frequency: %dHz\n", (int)m->max_frequency);
> >> > printf("To calculate resolution, measure physical distance covered\n"
> >> > "and look up the matching resolution in the table below\n");
> >> >
> >> > @@ -213,7 +248,7 @@ main (int argc, char **argv) {
> >> > int fd;
> >> > const char *path;
> >> > struct libevdev *dev;
> >> > - struct measurements measurements = {0, 0, 0};
> >> > + struct measurements measurements = {0};
> >> >
> >> > if (argc < 2)
> >> > return usage();
> >> > --
> >> > 2.7.4
> >> >
> >> > _______________________________________________
> >> > Input-tools mailing list
> >> > Input-tools at lists.freedesktop.org
> >> > https://lists.freedesktop.org/mailman/listinfo/input-tools
More information about the Input-tools
mailing list