From: Clinton Sprain <clintonsprain@gmail.com>
To: Henrik Rydberg <rydberg@euromail.se>,
linux-input <linux-input@vger.kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Subject: Re: [PATCH v2 2/3] input: appletouch: use better cursor movement smoothing algorithm
Date: Tue, 11 Feb 2014 01:19:28 -0600 [thread overview]
Message-ID: <52F9CF00.8080202@gmail.com> (raw)
In-Reply-To: <52F7714D.7040409@euromail.se>
Hi Henrik,
On 02/09/2014 06:15 AM, Henrik Rydberg wrote:
> Hi Clinton,
>
>> Use smoothed version of sensor array data to calculate movement and add weight
> to prior values when calculating average. This gives more granular and more
> predictable movement.
>>
>> Signed-off-by: Clinton Sprain <clintonsprain@gmail.com>
>> ---
>> drivers/input/mouse/appletouch.c | 60 ++++++++++++++++++++++++++------------
>> 1 file changed, 42 insertions(+), 18 deletions(-)
>
> I like this patch, but there are some technical glitches, comments below.
>
>> diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c
>> index d48181b..edbdd95 100644
>> --- a/drivers/input/mouse/appletouch.c
>> +++ b/drivers/input/mouse/appletouch.c
>> @@ -338,21 +338,51 @@ static void atp_reinit(struct work_struct *work)
>> static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
>> int *z, int *fingers)
>> {
>> - int i;
>> + int i, k;
>> + int smooth[nb_sensors + 2];
>> + int smooth_tmp[nb_sensors + 2];
>> +
>> /* values to calculate mean */
>> int pcum = 0, psum = 0;
>> int is_increasing = 0;
>>
>> *fingers = 0;
>>
>> + /*
>> + * Use a smoothed version of sensor data for movement calculations, to
>> + * combat noise without needing to toss out values based on a threshold.
>> + * This improves tracking. Finger count is calculated separately based
>> + * on raw data.
>> + */
>> +
>> + for (i = 0; i < nb_sensors; i++) { /* Scale up to minimize */
>> + smooth[i] = xy_sensors[i] << 12; /* rounding/truncation. */
>> + }
>> +
>> + /* Mitigate some of the data loss from smoothing on the edge sensors. */
>> + smooth[-1] = smooth[0] >> 2;
>> + smooth[nb_sensors] = smooth[nb_sensors - 1] >> 2;
>
> Out of bounds array... also, the boundary condition seems odd. If you want to
> extrapolate the edge velocity, and assuming smooth[0] is the first sensor, you
> would get something like (N = nb_sensors)
>
> smooth_tmp[0] = 2 * smooth[1] - smooth[2];
> smooth_tmp[N-1] = 2 * smooth[N-2] - smooth[N-3];
>
This produces a big velocity increase when the finger crosses over from sensor 0 to sensor 1 or vice versa.
We might get by with something relatively simple:
smooth_tmp[0] = (3 * smooth[0] + smooth[1]) >> 2;
...and the same thing on the other edge. This produces predictable behavior while keeping values from bleeding off the board so to speak. (Less important now than if someone down the line ever decides to increase the number of passes.)
>> + for (k = 0; k < 4; k++) {
>> + for (i = 0; i < nb_sensors; i++) { /* Blend with neighbors. */
>
> And here would be for (i = 1; i < nb_sensors - 1; i++)
>
>> + smooth_tmp[i] = (smooth[i - 1] + smooth[i] * 2 + smooth[i + 1]) >> 2;
>> + }
>> +
>> + for (i = 0; i < nb_sensors; i++) {
>> + smooth[i] = smooth_tmp[i];
>> + if (k == 3) /* Last go-round, so scale back down. */
>> + smooth[i] = smooth[i] >> 12;
>
> The scale-up is done separately, so why not make the scale-down separately too?
>
>> + }
>> +
>> + smooth[-1] = smooth[0] >> 2;
>> + smooth[nb_sensors] = smooth[nb_sensors - 1] >> 2;
>
> And these would be dropped.
>
>> + }
>> +
>> for (i = 0; i < nb_sensors; i++) {
>> if (xy_sensors[i] < threshold) {
>> if (is_increasing)
>> is_increasing = 0;
>>
>> - continue;
>> - }
>> -
>> /*
>> * Makes the finger detection more versatile. For example,
>> * two fingers with no gap will be detected. Also, my
>> @@ -367,7 +397,8 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
>> *
>> * - Jason Parekh <jasonparekh@gmail.com>
>> */
>> - if (i < 1 ||
>> +
>> + } else if (i < 1 ||
>> (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) {
>> (*fingers)++;
>> is_increasing = 1;
>> @@ -375,15 +406,8 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
>> is_increasing = 0;
>> }
>>
>> - /*
>> - * Subtracts threshold so a high sensor that just passes the
>> - * threshold won't skew the calculated absolute coordinate.
>> - * Fixes an issue where slowly moving the mouse would
>> - * occasionally jump a number of pixels (slowly moving the
>> - * finger makes this issue most apparent.)
>> - */
>> - pcum += (xy_sensors[i] - threshold) * i;
>> - psum += (xy_sensors[i] - threshold);
>> + pcum += (smooth[i]) * i;
>> + psum += (smooth[i]);
>
> Great, this makes so much more sense.
>
>> }
>>
>> if (psum > 0) {
>> @@ -565,8 +589,8 @@ static void atp_complete_geyser_1_2(struct urb *urb)
>>
>> if (x && y) {
>> if (dev->x_old != -1) {
>> - x = (dev->x_old * 3 + x) >> 2;
>> - y = (dev->y_old * 3 + y) >> 2;
>> + x = (dev->x_old * 7 + x) >> 3;
>> + y = (dev->y_old * 7 + y) >> 3;
>> dev->x_old = x;
>> dev->y_old = y;
>>
>> @@ -677,8 +701,8 @@ static void atp_complete_geyser_3_4(struct urb *urb)
>>
>> if (x && y) {
>> if (dev->x_old != -1) {
>> - x = (dev->x_old * 3 + x) >> 2;
>> - y = (dev->y_old * 3 + y) >> 2;
>> + x = (dev->x_old * 7 + x) >> 3;
>> + y = (dev->y_old * 7 + y) >> 3;
>> dev->x_old = x;
>> dev->y_old = y;
>
> Would you say that the cursor slow-down here is noticeable, or are there enough
> samples per second that it does not matter?
Noticeable but not major. It's still possible to move the cursor across the screen in one movement with typical defaults, and the gain in smoothness is pretty big, so it seems like a reasonable trade-off. (The 'base' speed is also still quicker than the native OS driver, FWIW.)
>
> Thanks,
> Henrik
>
Thanks,
Clinton
next prev parent reply other threads:[~2014-02-11 7:19 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-18 1:52 [PATCH 0/3] input: appletouch: fixes for jagged/uneven cursor movement Clinton Sprain
2014-01-18 1:55 ` [PATCH 1/3] input: appletouch: parametrize and set saner defaults for fuzz and threshold Clinton Sprain
2014-01-18 7:07 ` Henrik Rydberg
2014-01-18 1:56 ` [PATCH 2/3] input: appletouch: use better cursor movement smoothing algorithm Clinton Sprain
2014-01-18 1:58 ` [PATCH 3/3] input: appletouch: fix jumps when additional fingers are detected Clinton Sprain
2014-02-07 0:38 ` [PATCH v2 0/3] input: appletouch: fixes for jagged/uneven cursor movement Clinton Sprain
2014-02-07 0:40 ` [PATCH v2 1/3] input: appletouch: parametrize and set saner defaults for fuzz and threshold Clinton Sprain
2014-02-09 12:01 ` Henrik Rydberg
2014-02-11 4:46 ` Clinton Sprain
2014-02-07 0:43 ` [PATCH v2 2/3] input: appletouch: use better cursor movement smoothing algorithm Clinton Sprain
2014-02-09 12:15 ` Henrik Rydberg
2014-02-11 7:19 ` Clinton Sprain [this message]
2014-02-07 0:46 ` [PATCH v2 3/3] input: appletouch: fix jumps when additional fingers are detected Clinton Sprain
2014-02-09 12:16 ` Henrik Rydberg
2014-03-09 6:03 ` [PATCH v3 0/3] input: appletouch: fixes for jagged/uneven cursor movement Clinton Sprain
2014-03-09 6:05 ` [PATCH v3 1/3] input: appletouch: dial back fuzz setting Clinton Sprain
2014-03-09 6:17 ` [PATCH v3 2/3] input: appletouch: implement sensor data smoothing Clinton Sprain
2014-03-09 13:54 ` Henrik Rydberg
2014-03-09 15:03 ` Clinton Sprain
2014-03-09 6:19 ` [PATCH v3 3/3] input: appletouch: fix jumps when additional fingers are detected Clinton Sprain
2014-03-12 23:13 ` [PATCH v4 0/3] input: appletouch: fixes for jagged/uneven cursor movement Clinton Sprain
2014-03-12 23:14 ` [PATCH v4 1/3] input: appletouch: dial back fuzz setting Clinton Sprain
2014-03-12 23:16 ` [PATCH v4 2/3] input: appletouch: implement sensor data smoothing Clinton Sprain
2014-03-23 13:59 ` Henrik Rydberg
2014-03-27 18:26 ` Dmitry Torokhov
2014-03-29 21:47 ` [PATCH v5 " Clinton Sprain
2014-03-29 21:48 ` [PATCH v5 3/3] input: appletouch: fix jumps when additional fingers are detected Clinton Sprain
2014-03-12 23:17 ` [PATCH v4 " Clinton Sprain
2014-03-23 13:34 ` [PATCH v4 0/3] input: appletouch: fixes for jagged/uneven cursor movement Clinton Sprain
2014-03-23 14:02 ` Henrik Rydberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52F9CF00.8080202@gmail.com \
--to=clintonsprain@gmail.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=rydberg@euromail.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.