From e75327b33249cb2656281af2bd5368fe0edd2d48 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Mon, 19 Nov 2007 11:05:54 +0000 Subject: FS#7738 - Scroll wheel acceleration for iPod git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15681 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/button.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'firmware/drivers/button.c') diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index 000c478..c7d532e 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -522,26 +522,40 @@ void button_clear_queue(void) #endif /* SIMULATOR */ #ifdef HAVE_SCROLLWHEEL +/* WHEEL_ACCEL_FACTOR = 2^16 / WHEEL_ACCEL_START */ +#define WHEEL_ACCEL_FACTOR (1<<16)/WHEEL_ACCEL_START /** * data: * [31] Use acceleration * [30:24] Message post count (skipped + 1) (1-127) - * [23:0] Velocity - clicks/uS - 0.24 fixed point + * [23:0] Velocity - degree/sec * - * factor: - * Wheel acceleration scaling factor - x.24 fixed point - - * no greater than what will not overflow 64 bits when multiplied - * by the driver's maximum velocity in (clicks/usec)^2 in 0.24 + * WHEEL_ACCEL_FACTOR: + * Value in degree/sec -- configurable via settings -- above which + * the accelerated scrolling starts. Factor is internally scaled by + * 1<<16 in respect to the following 32bit integer operations. */ -int button_apply_acceleration(unsigned int data, unsigned int factor) +int button_apply_acceleration(const unsigned int data) { int delta = (data >> 24) & 0x7f; if ((data & (1 << 31)) != 0) { + /* read driver's velocity from data */ unsigned int v = data & 0xffffff; - v = factor * (unsigned long long)v*v / 0xffffffffffffull; + /* v = 28.4 fixed point */ + v = (WHEEL_ACCEL_FACTOR * v)>>(16-4); + + /* Calculate real numbers item to scroll based upon acceleration + * setting, use correct roundoff */ +#if (WHEEL_ACCELERATION == 1) + v = (v*v + (1<< 7))>> 8; +#elif (WHEEL_ACCELERATION == 2) + v = (v*v*v + (1<<11))>>12; +#elif (WHEEL_ACCELERATION == 3) + v = (v*v*v*v + (1<<15))>>16; +#endif if (v > 1) delta *= v; -- cgit v1.1