diff options
| author | tmk <nobody@nowhere> | 2012-10-10 15:31:00 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2012-10-17 15:55:37 +0900 | 
| commit | 0a70be9a97215e2b514841f67e52b4c55a6adab1 (patch) | |
| tree | 22b584fa6ec728c519dd5c78156da0154db0a199 | |
| parent | 5b00cf3f024a09d834d125374d93cacc269f84ba (diff) | |
| download | firmware-0a70be9a97215e2b514841f67e52b4c55a6adab1.tar.gz firmware-0a70be9a97215e2b514841f67e52b4c55a6adab1.tar.bz2 firmware-0a70be9a97215e2b514841f67e52b4c55a6adab1.zip  | |
Add subset of Xorg MouseKey acceleration parameters.
| -rw-r--r-- | common/mousekey.c | 102 | 
1 files changed, 74 insertions, 28 deletions
diff --git a/common/mousekey.c b/common/mousekey.c index 6fe8e2d26..4b1fe1740 100644 --- a/common/mousekey.c +++ b/common/mousekey.c @@ -32,41 +32,87 @@ static uint8_t mousekey_repeat =  0;  static void mousekey_debug(void); +/* max value on report descriptor */ +#define MOUSEKEY_MOVE_MAX       127 +#define MOUSEKEY_WHEEL_MAX      15 + +#ifndef MOUSEKEY_MOVE_DELTA +#define MOUSEKEY_MOVE_DELTA     5 +#endif +#ifndef MOUSEKEY_WHEEL_DELTA +#define MOUSEKEY_WHEEL_DELTA    1 +#endif +#ifndef MOUSEKEY_DELAY +#define MOUSEKEY_DELAY 300 +#endif +#ifndef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 50 +#endif +#ifndef MOUSEKEY_MAX_SPEED +#define MOUSEKEY_MAX_SPEED 10 +#endif +#ifndef MOUSEKEY_TIME_TO_MAX +#define MOUSEKEY_TIME_TO_MAX 20 +#endif +#ifndef MOUSEKEY_WHEEL_MAX_SPEED +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#endif +#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#endif + +  /* - * TODO: fix acceleration algorithm - * see wikipedia http://en.wikipedia.org/wiki/Mouse_keys + * Mouse keys  acceleration algorithm + *  http://en.wikipedia.org/wiki/Mouse_keys + * + *  speed = delta * max_speed * (repeat / time_to_max)**((1000+curve)/1000)   */ -#ifndef MOUSEKEY_DELAY_TIME -#   define MOUSEKEY_DELAY_TIME 100 -#endif +/* milliseconds between the initial key press and first repeated motion event (0-2550) */ +static uint8_t mk_delay = MOUSEKEY_DELAY/10; +/* milliseconds between repeated motion events (0-255) */ +static uint8_t mk_interval = MOUSEKEY_INTERVAL; +/* steady speed (in action_delta units) applied each event (0-255) */ +static uint8_t mk_max_speed = MOUSEKEY_MAX_SPEED; +/* number of events (count) accelerating to steady speed (0-255) */ +static uint8_t mk_time_to_max = MOUSEKEY_TIME_TO_MAX; +/* ramp used to reach maximum pointer speed (NOT SUPPORTED) */ +//static int8_t mk_curve = 0; -#define MOUSEKEY_MOVE_INIT      5 -#define MOUSEKEY_WHEEL_INIT     1 -#define MOUSEKEY_MOVE_ACCEL     5 -#define MOUSEKEY_WHEEL_ACCEL    1 +static uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED; +static uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX; -static uint16_t last_timer = 0; -// acceleration parameters -//uint8_t mousekey_move_unit = 2; -//uint8_t mousekey_resolution = 5; +static uint16_t last_timer = 0; -static inline uint8_t move_unit(void) +static uint8_t move_unit(void)  { -    uint16_t unit = MOUSEKEY_MOVE_INIT + MOUSEKEY_MOVE_ACCEL * mousekey_repeat; -    return (unit > 63 ? 63 : unit); +    uint16_t unit; +    if (mousekey_repeat > mk_time_to_max) { +        unit = MOUSEKEY_MOVE_DELTA * mk_max_speed; +    } else { +        unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed * mousekey_repeat) / mk_time_to_max; +    } +    if (unit == 0) return 1; +    return (unit > MOUSEKEY_MOVE_MAX ? MOUSEKEY_MOVE_MAX : unit);  } -static inline uint8_t wheel_unit(void) +static uint8_t wheel_unit(void)  { -    uint16_t unit = MOUSEKEY_WHEEL_INIT + MOUSEKEY_WHEEL_ACCEL * mousekey_repeat; -    return (unit > 15 ? 15 : unit); +    uint16_t unit; +    if (mousekey_repeat > mk_time_to_max) { +        unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed; +    } else { +        unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_repeat) / mk_time_to_max; +    } +    if (unit == 0) return 1; +    return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : unit);  }  void mousekey_task(void)  { -    if (timer_elapsed(last_timer) < MOUSEKEY_DELAY_TIME) +    if (timer_elapsed(last_timer) < (mousekey_repeat ? mk_interval : mk_delay*10))          return;      if (report.x == 0 && report.y == 0 && report.v == 0 && report.h == 0) @@ -96,14 +142,14 @@ void mousekey_task(void)  void mousekey_on(uint8_t code)  { -    if      (code == KC_MS_UP)       report.y = MOUSEKEY_MOVE_INIT * -1; -    else if (code == KC_MS_DOWN)     report.y = MOUSEKEY_MOVE_INIT; -    else if (code == KC_MS_LEFT)     report.x = MOUSEKEY_MOVE_INIT * -1; -    else if (code == KC_MS_RIGHT)    report.x = MOUSEKEY_MOVE_INIT; -    else if (code == KC_MS_WH_UP)    report.v = MOUSEKEY_WHEEL_INIT; -    else if (code == KC_MS_WH_DOWN)  report.v = MOUSEKEY_WHEEL_INIT * -1; -    else if (code == KC_MS_WH_LEFT)  report.h = MOUSEKEY_WHEEL_INIT * -1; -    else if (code == KC_MS_WH_RIGHT) report.h = MOUSEKEY_WHEEL_INIT; +    if      (code == KC_MS_UP)       report.y = MOUSEKEY_MOVE_DELTA * -1; +    else if (code == KC_MS_DOWN)     report.y = MOUSEKEY_MOVE_DELTA; +    else if (code == KC_MS_LEFT)     report.x = MOUSEKEY_MOVE_DELTA * -1; +    else if (code == KC_MS_RIGHT)    report.x = MOUSEKEY_MOVE_DELTA; +    else if (code == KC_MS_WH_UP)    report.v = MOUSEKEY_WHEEL_DELTA; +    else if (code == KC_MS_WH_DOWN)  report.v = MOUSEKEY_WHEEL_DELTA * -1; +    else if (code == KC_MS_WH_LEFT)  report.h = MOUSEKEY_WHEEL_DELTA * -1; +    else if (code == KC_MS_WH_RIGHT) report.h = MOUSEKEY_WHEEL_DELTA;      else if (code == KC_MS_BTN1)     report.buttons |= MOUSE_BTN1;      else if (code == KC_MS_BTN2)     report.buttons |= MOUSE_BTN2;      else if (code == KC_MS_BTN3)     report.buttons |= MOUSE_BTN3;  | 
