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.

serial_mouse_mousesystems.c 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. Copyright 2014 Robin Haberkorn <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include <stdint.h>
  15. #include <avr/io.h>
  16. #include <util/delay.h>
  17. #include "serial.h"
  18. #include "serial_mouse.h"
  19. #include "report.h"
  20. #include "host.h"
  21. #include "timer.h"
  22. #include "print.h"
  23. #include "debug.h"
  24. #ifdef MAX
  25. #undef MAX
  26. #endif
  27. #define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
  28. //#define SERIAL_MOUSE_CENTER_SCROLL
  29. static void print_usb_data(const report_mouse_t *report);
  30. void serial_mouse_task(void)
  31. {
  32. /* 5 byte ring buffer */
  33. static uint8_t buffer[5];
  34. static int buffer_cur = 0;
  35. int16_t rcv;
  36. report_mouse_t report = {0, 0, 0, 0, 0};
  37. rcv = serial_recv2();
  38. if (rcv < 0)
  39. /* no new data */
  40. return;
  41. if (debug_mouse)
  42. xprintf("serial_mouse: byte: %04X\n", rcv);
  43. /*
  44. * Synchronization: mouse(4) says that all
  45. * bytes but the first one in the packet have
  46. * bit 7 == 0, but this is untrue.
  47. * Therefore we discard all bytes up to the
  48. * first one with the characteristic bit pattern.
  49. */
  50. if (buffer_cur == 0 && (rcv >> 3) != 0x10)
  51. return;
  52. buffer[buffer_cur++] = (uint8_t)rcv;
  53. if (buffer_cur < 5)
  54. return;
  55. buffer_cur = 0;
  56. #ifdef SERIAL_MOUSE_CENTER_SCROLL
  57. if ((buffer[0] & 0x7) == 0x5 && (buffer[1] || buffer[2])) {
  58. /* USB HID uses only values from -127 to 127 */
  59. report.h = MAX((int8_t)buffer[1], -127);
  60. report.v = MAX((int8_t)buffer[2], -127);
  61. print_usb_data(&report);
  62. host_mouse_send(&report);
  63. if (buffer[3] || buffer[4]) {
  64. report.h = MAX((int8_t)buffer[3], -127);
  65. report.v = MAX((int8_t)buffer[4], -127);
  66. print_usb_data(&report);
  67. host_mouse_send(&report);
  68. }
  69. return;
  70. }
  71. #endif
  72. /*
  73. * parse 5 byte packet.
  74. * NOTE: We only get a complete packet
  75. * if the mouse moved or the button states
  76. * change.
  77. */
  78. if (!(buffer[0] & (1 << 2)))
  79. report.buttons |= MOUSE_BTN1;
  80. if (!(buffer[0] & (1 << 1)))
  81. report.buttons |= MOUSE_BTN3;
  82. if (!(buffer[0] & (1 << 0)))
  83. report.buttons |= MOUSE_BTN2;
  84. /* USB HID uses only values from -127 to 127 */
  85. report.x = MAX((int8_t)buffer[1], -127);
  86. report.y = MAX(-(int8_t)buffer[2], -127);
  87. print_usb_data(&report);
  88. host_mouse_send(&report);
  89. if (buffer[3] || buffer[4]) {
  90. report.x = MAX((int8_t)buffer[3], -127);
  91. report.y = MAX(-(int8_t)buffer[4], -127);
  92. print_usb_data(&report);
  93. host_mouse_send(&report);
  94. }
  95. }
  96. static void print_usb_data(const report_mouse_t *report)
  97. {
  98. if (!debug_mouse)
  99. return;
  100. xprintf("serial_mouse usb: [%02X|%d %d %d %d]\n",
  101. report->buttons, report->x, report->y,
  102. report->v, report->h);
  103. }