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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 == KB_MS_UP) mousekey_y -= move_unit();
  27. else if (code == KB_MS_DOWN) mousekey_y += move_unit();
  28. else if (code == KB_MS_LEFT) mousekey_x -= move_unit();
  29. else if (code == KB_MS_RIGHT) mousekey_x += move_unit();
  30. else if (code == KB_MS_BTN1) mousekey_btn |= MOUSE_BTN1;
  31. else if (code == KB_MS_BTN2) mousekey_btn |= MOUSE_BTN2;
  32. else if (code == KB_MS_BTN3) mousekey_btn |= MOUSE_BTN3;
  33. else if (code == KB_MS_BTN4) mousekey_btn |= MOUSE_BTN4;
  34. else if (code == KB_MS_BTN5) mousekey_btn |= MOUSE_BTN5;
  35. else if (code == KB_MS_WH_UP) mousekey_v += 1;
  36. else if (code == KB_MS_WH_DOWN) mousekey_v -= 1;
  37. else if (code == KB_MS_WH_LEFT) mousekey_h -= 1;
  38. else if (code == KB_MS_WH_RIGHT) 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. if (mousekey_x || mousekey_y || mousekey_v || mousekey_h)
  54. _delay_ms(MOUSEKEY_DELAY_TIME >> (mousekey_repeat < 5 ? mousekey_repeat : 4));
  55. mousekey_repeat++;
  56. } else {
  57. mousekey_repeat = 0;
  58. }
  59. mousekey_x = 0;
  60. mousekey_y = 0;
  61. mousekey_v = 0;
  62. mousekey_h = 0;
  63. mousekey_btn = 0;
  64. }