Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mousekey.c 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <stdint.h>
  2. #include <util/delay.h>
  3. #include "usb_keycodes.h"
  4. #include "usb_mouse.h"
  5. #include "mousekey.h"
  6. static int8_t mousekey_x = 0;
  7. static int8_t mousekey_y = 0;
  8. static int8_t mousekey_v = 0;
  9. static int8_t mousekey_h = 0;
  10. static uint8_t mousekey_btn = 0;
  11. static uint8_t mousekey_btn_prev = 0;
  12. static uint8_t mousekey_repeat = 0;
  13. /*
  14. * TODO: fix acceleration algorithm
  15. * see wikipedia http://en.wikipedia.org/wiki/Mouse_keys
  16. */
  17. #ifndef MOUSEKEY_DELAY_TIME
  18. # define MOUSEKEY_DELAY_TIME 255
  19. #endif
  20. static inline uint8_t move_unit(void)
  21. {
  22. return 10 + (mousekey_repeat < 50 ? mousekey_repeat/5 : 10);
  23. }
  24. void mousekey_decode(uint8_t code)
  25. {
  26. if (code == MS_UP) mousekey_y -= move_unit();
  27. else if (code == MS_DOWN) mousekey_y += move_unit();
  28. else if (code == MS_LEFT) mousekey_x -= move_unit();
  29. else if (code == MS_RGHT) mousekey_x += move_unit();
  30. else if (code == MS_BTN1) mousekey_btn |= MOUSE_BTN1;
  31. else if (code == MS_BTN2) mousekey_btn |= MOUSE_BTN2;
  32. else if (code == MS_BTN3) mousekey_btn |= MOUSE_BTN3;
  33. else if (code == MS_BTN4) mousekey_btn |= MOUSE_BTN4;
  34. else if (code == MS_BTN5) mousekey_btn |= MOUSE_BTN5;
  35. else if (code == MS_WH_U) mousekey_v += 1;
  36. else if (code == MS_WH_D) mousekey_v -= 1;
  37. else if (code == MS_WH_L) mousekey_h -= 1;
  38. else if (code == MS_WH_R) mousekey_h += 1;
  39. }
  40. bool mousekey_changed(void)
  41. {
  42. return (mousekey_x || mousekey_y || mousekey_v || mousekey_h || mousekey_btn != mousekey_btn_prev);
  43. }
  44. void mousekey_usb_send(void)
  45. {
  46. if (mousekey_changed()) {
  47. mousekey_btn_prev = mousekey_btn;
  48. if (mousekey_x && mousekey_y)
  49. usb_mouse_send(mousekey_x*0.7, mousekey_y*0.7, mousekey_v, mousekey_h, mousekey_btn);
  50. else
  51. usb_mouse_send(mousekey_x, mousekey_y, mousekey_v, mousekey_h, mousekey_btn);
  52. usb_mouse_print(mousekey_x, mousekey_y, mousekey_v, mousekey_h, mousekey_btn);
  53. _delay_ms(MOUSEKEY_DELAY_TIME >> (mousekey_repeat < 5 ? mousekey_repeat : 4));
  54. mousekey_repeat++;
  55. } else {
  56. mousekey_repeat = 0;
  57. }
  58. mousekey_x = 0;
  59. mousekey_y = 0;
  60. mousekey_v = 0;
  61. mousekey_h = 0;
  62. mousekey_btn = 0;
  63. }