]>
git.gir.st - tmk_keyboard.git/blob - mousekey.c
2 #include <util/delay.h>
3 #include "usb_keycodes.h"
8 static int8_t mousekey_x
= 0;
9 static int8_t mousekey_y
= 0;
10 static int8_t mousekey_v
= 0;
11 static int8_t mousekey_h
= 0;
12 static uint8_t mousekey_btn
= 0;
13 static uint8_t mousekey_btn_prev
= 0;
14 static uint8_t mousekey_repeat
= 0;
18 * TODO: fix acceleration algorithm
19 * see wikipedia http://en.wikipedia.org/wiki/Mouse_keys
21 #ifndef MOUSEKEY_DELAY_TIME
22 # define MOUSEKEY_DELAY_TIME 255
26 static inline uint8_t move_unit(void)
28 return 10 + (mousekey_repeat
< 50 ? mousekey_repeat
/5 : 10);
31 void mousekey_decode(uint8_t code
)
33 if (code
== KB_MS_UP
) mousekey_y
-= move_unit();
34 else if (code
== KB_MS_DOWN
) mousekey_y
+= move_unit();
35 else if (code
== KB_MS_LEFT
) mousekey_x
-= move_unit();
36 else if (code
== KB_MS_RIGHT
) mousekey_x
+= move_unit();
37 else if (code
== KB_MS_BTN1
) mousekey_btn
|= MOUSE_BTN1
;
38 else if (code
== KB_MS_BTN2
) mousekey_btn
|= MOUSE_BTN2
;
39 else if (code
== KB_MS_BTN3
) mousekey_btn
|= MOUSE_BTN3
;
40 else if (code
== KB_MS_BTN4
) mousekey_btn
|= MOUSE_BTN4
;
41 else if (code
== KB_MS_BTN5
) mousekey_btn
|= MOUSE_BTN5
;
42 else if (code
== KB_MS_WH_UP
) mousekey_v
+= 1;
43 else if (code
== KB_MS_WH_DOWN
) mousekey_v
-= 1;
44 else if (code
== KB_MS_WH_LEFT
) mousekey_h
-= 1;
45 else if (code
== KB_MS_WH_RIGHT
) mousekey_h
+= 1;
48 bool mousekey_changed(void)
50 return (mousekey_x
|| mousekey_y
|| mousekey_v
|| mousekey_h
|| mousekey_btn
!= mousekey_btn_prev
);
53 void mousekey_usb_send(void)
55 if (mousekey_changed()) {
56 mousekey_btn_prev
= mousekey_btn
;
57 if (mousekey_x
&& mousekey_y
)
58 usb_mouse_send(mousekey_x
*0.7, mousekey_y
*0.7, mousekey_v
, mousekey_h
, mousekey_btn
);
60 usb_mouse_send(mousekey_x
, mousekey_y
, mousekey_v
, mousekey_h
, mousekey_btn
);
62 usb_mouse_print(mousekey_x
, mousekey_y
, mousekey_v
, mousekey_h
, mousekey_btn
);
64 if (mousekey_x
|| mousekey_y
|| mousekey_v
|| mousekey_h
)
65 _delay_ms(MOUSEKEY_DELAY_TIME
>> (mousekey_repeat
< 5 ? mousekey_repeat
: 4));