diff options
| author | tmk <nobody@nowhere> | 2011-01-02 23:52:13 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2011-01-02 23:52:13 +0900 |
| commit | 2a562a4191a5b9e88731efb5eabd921821f25f7e (patch) | |
| tree | 20f5bb311ff99ced3dd8ee2d9430e2fbe8183f7b /mousekey.c | |
| parent | 1ed336a06499c1baee2421141d59d115f0ee3c4b (diff) | |
| download | qmk_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.c | 74 |
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 | |||
| 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; | ||
| 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 | |||
| 26 | static inline uint8_t move_unit(void) | ||
| 27 | { | ||
| 28 | return 10 + (mousekey_repeat < 50 ? mousekey_repeat/5 : 10); | ||
| 29 | } | ||
| 30 | |||
| 31 | void 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 | |||
| 48 | bool mousekey_changed(void) | ||
| 49 | { | ||
| 50 | return (mousekey_x || mousekey_y || mousekey_v || mousekey_h || mousekey_btn != mousekey_btn_prev); | ||
| 51 | } | ||
| 52 | |||
| 53 | void 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 | } | ||
