aboutsummaryrefslogtreecommitdiff
path: root/mousekey.c
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2011-01-02 23:52:13 +0900
committertmk <nobody@nowhere>2011-01-02 23:52:13 +0900
commit2a562a4191a5b9e88731efb5eabd921821f25f7e (patch)
tree20f5bb311ff99ced3dd8ee2d9430e2fbe8183f7b /mousekey.c
parent1ed336a06499c1baee2421141d59d115f0ee3c4b (diff)
downloadqmk_firmware-2a562a4191a5b9e88731efb5eabd921821f25f7e.tar.gz
qmk_firmware-2a562a4191a5b9e88731efb5eabd921821f25f7e.zip
Add PS/2 mouse support to connect TrackPoint Unit.
Change build options: Makefile and config.h. See README.
Diffstat (limited to 'mousekey.c')
-rw-r--r--mousekey.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/mousekey.c b/mousekey.c
new file mode 100644
index 000000000..be454e13e
--- /dev/null
+++ b/mousekey.c
@@ -0,0 +1,74 @@
1#include <stdint.h>
2#include <util/delay.h>
3#include "usb_keycodes.h"
4#include "usb_mouse.h"
5#include "mousekey.h"
6
7
8static int8_t mousekey_x = 0;
9static int8_t mousekey_y = 0;
10static int8_t mousekey_v = 0;
11static int8_t mousekey_h = 0;
12static uint8_t mousekey_btn = 0;
13static uint8_t mousekey_btn_prev = 0;
14static uint8_t mousekey_repeat = 0;
15
16
17/*
18 * TODO: fix acceleration algorithm
19 * see wikipedia http://en.wikipedia.org/wiki/Mouse_keys
20 */
21#ifndef MOUSEKEY_DELAY_TIME
22# define MOUSEKEY_DELAY_TIME 255
23#endif
24
25
26static inline uint8_t move_unit(void)
27{
28 return 10 + (mousekey_repeat < 50 ? mousekey_repeat/5 : 10);
29}
30
31void mousekey_decode(uint8_t code)
32{
33 if (code == MS_UP) mousekey_y -= move_unit();
34 else if (code == MS_DOWN) mousekey_y += move_unit();
35 else if (code == MS_LEFT) mousekey_x -= move_unit();
36 else if (code == MS_RGHT) mousekey_x += move_unit();
37 else if (code == MS_BTN1) mousekey_btn |= MOUSE_BTN1;
38 else if (code == MS_BTN2) mousekey_btn |= MOUSE_BTN2;
39 else if (code == MS_BTN3) mousekey_btn |= MOUSE_BTN3;
40 else if (code == MS_BTN4) mousekey_btn |= MOUSE_BTN4;
41 else if (code == MS_BTN5) mousekey_btn |= MOUSE_BTN5;
42 else if (code == MS_WH_U) mousekey_v += 1;
43 else if (code == MS_WH_D) mousekey_v -= 1;
44 else if (code == MS_WH_L) mousekey_h -= 1;
45 else if (code == MS_WH_R) mousekey_h += 1;
46}
47
48bool mousekey_changed(void)
49{
50 return (mousekey_x || mousekey_y || mousekey_v || mousekey_h || mousekey_btn != mousekey_btn_prev);
51}
52
53void mousekey_usb_send(void)
54{
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);
59 else
60 usb_mouse_send(mousekey_x, mousekey_y, mousekey_v, mousekey_h, mousekey_btn);
61
62 usb_mouse_print(mousekey_x, mousekey_y, mousekey_v, mousekey_h, mousekey_btn);
63
64 _delay_ms(MOUSEKEY_DELAY_TIME >> (mousekey_repeat < 5 ? mousekey_repeat : 4));
65 mousekey_repeat++;
66 } else {
67 mousekey_repeat = 0;
68 }
69 mousekey_x = 0;
70 mousekey_y = 0;
71 mousekey_v = 0;
72 mousekey_h = 0;
73 mousekey_btn = 0;
74}