]> git.friedersdorff.com Git - max/tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/USBDevice/USBHID/USBMouseKeyboard.cpp
Merge commit '657d9f23fe47fb88cf221adb23095082f191ba6a'
[max/tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / USBDevice / USBHID / USBMouseKeyboard.cpp
1 /* Copyright (c) 2010-2011 mbed.org, MIT License
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
4 * and associated documentation files (the "Software"), to deal in the Software without
5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
7 * Software is furnished to do so, subject to the following conditions:
8 *
9 * The above copyright notice and this permission notice shall be included in all copies or
10 * substantial portions of the Software.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17 */
18
19 #include "stdint.h"
20 #include "USBMouseKeyboard.h"
21
22 typedef struct {
23     unsigned char usage;
24     unsigned char modifier;
25 } KEYMAP;
26
27 #ifdef US_KEYBOARD
28 /* US keyboard (as HID standard) */
29 #define KEYMAP_SIZE (152)
30 const KEYMAP keymap[KEYMAP_SIZE] = {
31     {0, 0},             /* NUL */
32     {0, 0},             /* SOH */
33     {0, 0},             /* STX */
34     {0, 0},             /* ETX */
35     {0, 0},             /* EOT */
36     {0, 0},             /* ENQ */
37     {0, 0},             /* ACK */
38     {0, 0},             /* BEL */
39     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
40     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
41     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
42     {0, 0},             /* VT  */
43     {0, 0},             /* FF  */
44     {0, 0},             /* CR  */
45     {0, 0},             /* SO  */
46     {0, 0},             /* SI  */
47     {0, 0},             /* DEL */
48     {0, 0},             /* DC1 */
49     {0, 0},             /* DC2 */
50     {0, 0},             /* DC3 */
51     {0, 0},             /* DC4 */
52     {0, 0},             /* NAK */
53     {0, 0},             /* SYN */
54     {0, 0},             /* ETB */
55     {0, 0},             /* CAN */
56     {0, 0},             /* EM  */
57     {0, 0},             /* SUB */
58     {0, 0},             /* ESC */
59     {0, 0},             /* FS  */
60     {0, 0},             /* GS  */
61     {0, 0},             /* RS  */
62     {0, 0},             /* US  */
63     {0x2c, 0},          /*   */
64     {0x1e, KEY_SHIFT},      /* ! */
65     {0x34, KEY_SHIFT},      /* " */
66     {0x20, KEY_SHIFT},      /* # */
67     {0x21, KEY_SHIFT},      /* $ */
68     {0x22, KEY_SHIFT},      /* % */
69     {0x24, KEY_SHIFT},      /* & */
70     {0x34, 0},          /* ' */
71     {0x26, KEY_SHIFT},      /* ( */
72     {0x27, KEY_SHIFT},      /* ) */
73     {0x25, KEY_SHIFT},      /* * */
74     {0x2e, KEY_SHIFT},      /* + */
75     {0x36, 0},          /* , */
76     {0x2d, 0},          /* - */
77     {0x37, 0},          /* . */
78     {0x38, 0},          /* / */
79     {0x27, 0},          /* 0 */
80     {0x1e, 0},          /* 1 */
81     {0x1f, 0},          /* 2 */
82     {0x20, 0},          /* 3 */
83     {0x21, 0},          /* 4 */
84     {0x22, 0},          /* 5 */
85     {0x23, 0},          /* 6 */
86     {0x24, 0},          /* 7 */
87     {0x25, 0},          /* 8 */
88     {0x26, 0},          /* 9 */
89     {0x33, KEY_SHIFT},      /* : */
90     {0x33, 0},          /* ; */
91     {0x36, KEY_SHIFT},      /* < */
92     {0x2e, 0},          /* = */
93     {0x37, KEY_SHIFT},      /* > */
94     {0x38, KEY_SHIFT},      /* ? */
95     {0x1f, KEY_SHIFT},      /* @ */
96     {0x04, KEY_SHIFT},      /* A */
97     {0x05, KEY_SHIFT},      /* B */
98     {0x06, KEY_SHIFT},      /* C */
99     {0x07, KEY_SHIFT},      /* D */
100     {0x08, KEY_SHIFT},      /* E */
101     {0x09, KEY_SHIFT},      /* F */
102     {0x0a, KEY_SHIFT},      /* G */
103     {0x0b, KEY_SHIFT},      /* H */
104     {0x0c, KEY_SHIFT},      /* I */
105     {0x0d, KEY_SHIFT},      /* J */
106     {0x0e, KEY_SHIFT},      /* K */
107     {0x0f, KEY_SHIFT},      /* L */
108     {0x10, KEY_SHIFT},      /* M */
109     {0x11, KEY_SHIFT},      /* N */
110     {0x12, KEY_SHIFT},      /* O */
111     {0x13, KEY_SHIFT},      /* P */
112     {0x14, KEY_SHIFT},      /* Q */
113     {0x15, KEY_SHIFT},      /* R */
114     {0x16, KEY_SHIFT},      /* S */
115     {0x17, KEY_SHIFT},      /* T */
116     {0x18, KEY_SHIFT},      /* U */
117     {0x19, KEY_SHIFT},      /* V */
118     {0x1a, KEY_SHIFT},      /* W */
119     {0x1b, KEY_SHIFT},      /* X */
120     {0x1c, KEY_SHIFT},      /* Y */
121     {0x1d, KEY_SHIFT},      /* Z */
122     {0x2f, 0},          /* [ */
123     {0x31, 0},          /* \ */
124     {0x30, 0},          /* ] */
125     {0x23, KEY_SHIFT},      /* ^ */
126     {0x2d, KEY_SHIFT},      /* _ */
127     {0x35, 0},          /* ` */
128     {0x04, 0},          /* a */
129     {0x05, 0},          /* b */
130     {0x06, 0},          /* c */
131     {0x07, 0},          /* d */
132     {0x08, 0},          /* e */
133     {0x09, 0},          /* f */
134     {0x0a, 0},          /* g */
135     {0x0b, 0},          /* h */
136     {0x0c, 0},          /* i */
137     {0x0d, 0},          /* j */
138     {0x0e, 0},          /* k */
139     {0x0f, 0},          /* l */
140     {0x10, 0},          /* m */
141     {0x11, 0},          /* n */
142     {0x12, 0},          /* o */
143     {0x13, 0},          /* p */
144     {0x14, 0},          /* q */
145     {0x15, 0},          /* r */
146     {0x16, 0},          /* s */
147     {0x17, 0},          /* t */
148     {0x18, 0},          /* u */
149     {0x19, 0},          /* v */
150     {0x1a, 0},          /* w */
151     {0x1b, 0},          /* x */
152     {0x1c, 0},          /* y */
153     {0x1d, 0},          /* z */
154     {0x2f, KEY_SHIFT},      /* { */
155     {0x31, KEY_SHIFT},      /* | */
156     {0x30, KEY_SHIFT},      /* } */
157     {0x35, KEY_SHIFT},      /* ~ */
158     {0,0},              /* DEL */
159
160     {0x3a, 0},          /* F1 */
161     {0x3b, 0},          /* F2 */
162     {0x3c, 0},          /* F3 */
163     {0x3d, 0},          /* F4 */
164     {0x3e, 0},          /* F5 */
165     {0x3f, 0},          /* F6 */
166     {0x40, 0},          /* F7 */
167     {0x41, 0},          /* F8 */
168     {0x42, 0},          /* F9 */
169     {0x43, 0},          /* F10 */
170     {0x44, 0},          /* F11 */
171     {0x45, 0},          /* F12 */
172
173     {0x46, 0},          /* PRINT_SCREEN */
174     {0x47, 0},          /* SCROLL_LOCK */
175     {0x39, 0},          /* CAPS_LOCK */
176     {0x53, 0},          /* NUM_LOCK */
177     {0x49, 0},          /* INSERT */
178     {0x4a, 0},          /* HOME */
179     {0x4b, 0},          /* PAGE_UP */
180     {0x4e, 0},          /* PAGE_DOWN */
181
182     {0x4f, 0},          /* RIGHT_ARROW */
183     {0x50, 0},          /* LEFT_ARROW */
184     {0x51, 0},          /* DOWN_ARROW */
185     {0x52, 0},          /* UP_ARROW */
186 };
187
188 #else
189 /* UK keyboard */
190 #define KEYMAP_SIZE (152)
191 const KEYMAP keymap[KEYMAP_SIZE] = {
192     {0, 0},             /* NUL */
193     {0, 0},             /* SOH */
194     {0, 0},             /* STX */
195     {0, 0},             /* ETX */
196     {0, 0},             /* EOT */
197     {0, 0},             /* ENQ */
198     {0, 0},             /* ACK */
199     {0, 0},             /* BEL */
200     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
201     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
202     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
203     {0, 0},             /* VT  */
204     {0, 0},             /* FF  */
205     {0, 0},             /* CR  */
206     {0, 0},             /* SO  */
207     {0, 0},             /* SI  */
208     {0, 0},             /* DEL */
209     {0, 0},             /* DC1 */
210     {0, 0},             /* DC2 */
211     {0, 0},             /* DC3 */
212     {0, 0},             /* DC4 */
213     {0, 0},             /* NAK */
214     {0, 0},             /* SYN */
215     {0, 0},             /* ETB */
216     {0, 0},             /* CAN */
217     {0, 0},             /* EM  */
218     {0, 0},             /* SUB */
219     {0, 0},             /* ESC */
220     {0, 0},             /* FS  */
221     {0, 0},             /* GS  */
222     {0, 0},             /* RS  */
223     {0, 0},             /* US  */
224     {0x2c, 0},          /*   */
225     {0x1e, KEY_SHIFT},      /* ! */
226     {0x1f, KEY_SHIFT},      /* " */
227     {0x32, 0},          /* # */
228     {0x21, KEY_SHIFT},      /* $ */
229     {0x22, KEY_SHIFT},      /* % */
230     {0x24, KEY_SHIFT},      /* & */
231     {0x34, 0},          /* ' */
232     {0x26, KEY_SHIFT},      /* ( */
233     {0x27, KEY_SHIFT},      /* ) */
234     {0x25, KEY_SHIFT},      /* * */
235     {0x2e, KEY_SHIFT},      /* + */
236     {0x36, 0},          /* , */
237     {0x2d, 0},          /* - */
238     {0x37, 0},          /* . */
239     {0x38, 0},          /* / */
240     {0x27, 0},          /* 0 */
241     {0x1e, 0},          /* 1 */
242     {0x1f, 0},          /* 2 */
243     {0x20, 0},          /* 3 */
244     {0x21, 0},          /* 4 */
245     {0x22, 0},          /* 5 */
246     {0x23, 0},          /* 6 */
247     {0x24, 0},          /* 7 */
248     {0x25, 0},          /* 8 */
249     {0x26, 0},          /* 9 */
250     {0x33, KEY_SHIFT},      /* : */
251     {0x33, 0},          /* ; */
252     {0x36, KEY_SHIFT},      /* < */
253     {0x2e, 0},          /* = */
254     {0x37, KEY_SHIFT},      /* > */
255     {0x38, KEY_SHIFT},      /* ? */
256     {0x34, KEY_SHIFT},      /* @ */
257     {0x04, KEY_SHIFT},      /* A */
258     {0x05, KEY_SHIFT},      /* B */
259     {0x06, KEY_SHIFT},      /* C */
260     {0x07, KEY_SHIFT},      /* D */
261     {0x08, KEY_SHIFT},      /* E */
262     {0x09, KEY_SHIFT},      /* F */
263     {0x0a, KEY_SHIFT},      /* G */
264     {0x0b, KEY_SHIFT},      /* H */
265     {0x0c, KEY_SHIFT},      /* I */
266     {0x0d, KEY_SHIFT},      /* J */
267     {0x0e, KEY_SHIFT},      /* K */
268     {0x0f, KEY_SHIFT},      /* L */
269     {0x10, KEY_SHIFT},      /* M */
270     {0x11, KEY_SHIFT},      /* N */
271     {0x12, KEY_SHIFT},      /* O */
272     {0x13, KEY_SHIFT},      /* P */
273     {0x14, KEY_SHIFT},      /* Q */
274     {0x15, KEY_SHIFT},      /* R */
275     {0x16, KEY_SHIFT},      /* S */
276     {0x17, KEY_SHIFT},      /* T */
277     {0x18, KEY_SHIFT},      /* U */
278     {0x19, KEY_SHIFT},      /* V */
279     {0x1a, KEY_SHIFT},      /* W */
280     {0x1b, KEY_SHIFT},      /* X */
281     {0x1c, KEY_SHIFT},      /* Y */
282     {0x1d, KEY_SHIFT},      /* Z */
283     {0x2f, 0},          /* [ */
284     {0x64, 0},          /* \ */
285     {0x30, 0},          /* ] */
286     {0x23, KEY_SHIFT},      /* ^ */
287     {0x2d, KEY_SHIFT},      /* _ */
288     {0x35, 0},          /* ` */
289     {0x04, 0},          /* a */
290     {0x05, 0},          /* b */
291     {0x06, 0},          /* c */
292     {0x07, 0},          /* d */
293     {0x08, 0},          /* e */
294     {0x09, 0},          /* f */
295     {0x0a, 0},          /* g */
296     {0x0b, 0},          /* h */
297     {0x0c, 0},          /* i */
298     {0x0d, 0},          /* j */
299     {0x0e, 0},          /* k */
300     {0x0f, 0},          /* l */
301     {0x10, 0},          /* m */
302     {0x11, 0},          /* n */
303     {0x12, 0},          /* o */
304     {0x13, 0},          /* p */
305     {0x14, 0},          /* q */
306     {0x15, 0},          /* r */
307     {0x16, 0},          /* s */
308     {0x17, 0},          /* t */
309     {0x18, 0},          /* u */
310     {0x19, 0},          /* v */
311     {0x1a, 0},          /* w */
312     {0x1b, 0},          /* x */
313     {0x1c, 0},          /* y */
314     {0x1d, 0},          /* z */
315     {0x2f, KEY_SHIFT},      /* { */
316     {0x64, KEY_SHIFT},      /* | */
317     {0x30, KEY_SHIFT},      /* } */
318     {0x32, KEY_SHIFT},      /* ~ */
319     {0,0},             /* DEL */
320
321     {0x3a, 0},          /* F1 */
322     {0x3b, 0},          /* F2 */
323     {0x3c, 0},          /* F3 */
324     {0x3d, 0},          /* F4 */
325     {0x3e, 0},          /* F5 */
326     {0x3f, 0},          /* F6 */
327     {0x40, 0},          /* F7 */
328     {0x41, 0},          /* F8 */
329     {0x42, 0},          /* F9 */
330     {0x43, 0},          /* F10 */
331     {0x44, 0},          /* F11 */
332     {0x45, 0},          /* F12 */
333
334     {0x46, 0},          /* PRINT_SCREEN */
335     {0x47, 0},          /* SCROLL_LOCK */
336     {0x39, 0},          /* CAPS_LOCK */
337     {0x53, 0},          /* NUM_LOCK */
338     {0x49, 0},          /* INSERT */
339     {0x4a, 0},          /* HOME */
340     {0x4b, 0},          /* PAGE_UP */
341     {0x4e, 0},          /* PAGE_DOWN */
342
343     {0x4f, 0},          /* RIGHT_ARROW */
344     {0x50, 0},          /* LEFT_ARROW */
345     {0x51, 0},          /* DOWN_ARROW */
346     {0x52, 0},          /* UP_ARROW */
347 };
348 #endif
349
350
351 uint8_t * USBMouseKeyboard::reportDesc() {
352     if (mouse_type == REL_MOUSE) {
353         static uint8_t reportDescriptor[] = {
354                 // Keyboard
355                 USAGE_PAGE(1),      0x01,
356                 USAGE(1),           0x06,
357                 COLLECTION(1),      0x01,
358                 REPORT_ID(1),       REPORT_ID_KEYBOARD,
359                 USAGE_PAGE(1),      0x07,
360                 USAGE_MINIMUM(1),       0xE0,
361                 USAGE_MAXIMUM(1),       0xE7,
362                 LOGICAL_MINIMUM(1),     0x00,
363                 LOGICAL_MAXIMUM(1),     0x01,
364                 REPORT_SIZE(1),     0x01,
365                 REPORT_COUNT(1),    0x08,
366                 INPUT(1),           0x02,
367                 REPORT_COUNT(1),    0x01,
368                 REPORT_SIZE(1),     0x08,
369                 INPUT(1),           0x01,
370                 REPORT_COUNT(1),    0x05,
371                 REPORT_SIZE(1),     0x01,
372                 USAGE_PAGE(1),      0x08,
373                 USAGE_MINIMUM(1),       0x01,
374                 USAGE_MAXIMUM(1),       0x05,
375                 OUTPUT(1),          0x02,
376                 REPORT_COUNT(1),    0x01,
377                 REPORT_SIZE(1),     0x03,
378                 OUTPUT(1),          0x01,
379                 REPORT_COUNT(1),    0x06,
380                 REPORT_SIZE(1),     0x08,
381                 LOGICAL_MINIMUM(1),     0x00,
382                 LOGICAL_MAXIMUM(2),     0xff, 0x00,
383                 USAGE_PAGE(1),      0x07,
384                 USAGE_MINIMUM(1),       0x00,
385                 USAGE_MAXIMUM(2),       0xff, 0x00,
386                 INPUT(1),           0x00,
387                 END_COLLECTION(0),
388
389                 // Mouse
390                 USAGE_PAGE(1),      0x01,           // Generic Desktop
391                 USAGE(1),           0x02,           // Mouse
392                 COLLECTION(1),      0x01,           // Application
393                 USAGE(1),           0x01,           // Pointer
394                 COLLECTION(1),      0x00,           // Physical
395                 REPORT_ID(1),       REPORT_ID_MOUSE,
396                 REPORT_COUNT(1),    0x03,
397                 REPORT_SIZE(1),     0x01,
398                 USAGE_PAGE(1),      0x09,           // Buttons
399                 USAGE_MINIMUM(1),       0x1,
400                 USAGE_MAXIMUM(1),       0x3,
401                 LOGICAL_MINIMUM(1),     0x00,
402                 LOGICAL_MAXIMUM(1),     0x01,
403                 INPUT(1),           0x02,
404                 REPORT_COUNT(1),    0x01,
405                 REPORT_SIZE(1),     0x05,
406                 INPUT(1),           0x01,
407                 REPORT_COUNT(1),    0x03,
408                 REPORT_SIZE(1),     0x08,
409                 USAGE_PAGE(1),      0x01,
410                 USAGE(1),           0x30,           // X
411                 USAGE(1),           0x31,           // Y
412                 USAGE(1),           0x38,           // scroll
413                 LOGICAL_MINIMUM(1),     0x81,
414                 LOGICAL_MAXIMUM(1),     0x7f,
415                 INPUT(1),           0x06,
416                 END_COLLECTION(0),
417                 END_COLLECTION(0),
418
419
420                 // Media Control
421                 USAGE_PAGE(1), 0x0C,
422                 USAGE(1), 0x01,
423                 COLLECTION(1), 0x01,
424                 REPORT_ID(1), REPORT_ID_VOLUME,
425                 USAGE_PAGE(1), 0x0C,
426                 LOGICAL_MINIMUM(1), 0x00,
427                 LOGICAL_MAXIMUM(1), 0x01,
428                 REPORT_SIZE(1), 0x01,
429                 REPORT_COUNT(1), 0x07,
430                 USAGE(1), 0xB5,             // Next Track
431                 USAGE(1), 0xB6,             // Previous Track
432                 USAGE(1), 0xB7,             // Stop
433                 USAGE(1), 0xCD,             // Play / Pause
434                 USAGE(1), 0xE2,             // Mute
435                 USAGE(1), 0xE9,             // Volume Up
436                 USAGE(1), 0xEA,             // Volume Down
437                 INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
438                 REPORT_COUNT(1), 0x01,
439                 INPUT(1), 0x01,
440                 END_COLLECTION(0),
441         };
442         reportLength = sizeof(reportDescriptor);
443         return reportDescriptor;
444     } else if (mouse_type == ABS_MOUSE) {
445         static uint8_t reportDescriptor[] = {
446
447                 // Keyboard
448                 USAGE_PAGE(1),      0x01,
449                 USAGE(1),           0x06,
450                 COLLECTION(1),      0x01,
451                 REPORT_ID(1),       REPORT_ID_KEYBOARD,
452                 USAGE_PAGE(1),      0x07,
453                 USAGE_MINIMUM(1),       0xE0,
454                 USAGE_MAXIMUM(1),       0xE7,
455                 LOGICAL_MINIMUM(1),     0x00,
456                 LOGICAL_MAXIMUM(1),     0x01,
457                 REPORT_SIZE(1),     0x01,
458                 REPORT_COUNT(1),    0x08,
459                 INPUT(1),           0x02,
460                 REPORT_COUNT(1),    0x01,
461                 REPORT_SIZE(1),     0x08,
462                 INPUT(1),           0x01,
463                 REPORT_COUNT(1),    0x05,
464                 REPORT_SIZE(1),     0x01,
465                 USAGE_PAGE(1),      0x08,
466                 USAGE_MINIMUM(1),       0x01,
467                 USAGE_MAXIMUM(1),       0x05,
468                 OUTPUT(1),          0x02,
469                 REPORT_COUNT(1),    0x01,
470                 REPORT_SIZE(1),     0x03,
471                 OUTPUT(1),          0x01,
472                 REPORT_COUNT(1),    0x06,
473                 REPORT_SIZE(1),     0x08,
474                 LOGICAL_MINIMUM(1),     0x00,
475                 LOGICAL_MAXIMUM(2),     0xff, 0x00,
476                 USAGE_PAGE(1),      0x07,
477                 USAGE_MINIMUM(1),       0x00,
478                 USAGE_MAXIMUM(2),       0xff, 0x00,
479                 INPUT(1),           0x00,
480                 END_COLLECTION(0),
481
482                 // Mouse
483                 USAGE_PAGE(1), 0x01,               // Generic Desktop
484                 USAGE(1), 0x02,                    // Mouse
485                 COLLECTION(1), 0x01,               // Application
486                 USAGE(1), 0x01,                    // Pointer
487                 COLLECTION(1), 0x00,               // Physical
488                 REPORT_ID(1),       REPORT_ID_MOUSE,
489
490                 USAGE_PAGE(1), 0x01,                // Generic Desktop
491                 USAGE(1), 0x30,                     // X
492                 USAGE(1), 0x31,                     // Y
493                 LOGICAL_MINIMUM(1), 0x00,           // 0
494                 LOGICAL_MAXIMUM(2), 0xff, 0x7f,     // 32767
495                 REPORT_SIZE(1), 0x10,
496                 REPORT_COUNT(1), 0x02,
497                 INPUT(1), 0x02,                     // Data, Variable, Absolute
498
499                 USAGE_PAGE(1), 0x01,                // Generic Desktop
500                 USAGE(1), 0x38,                     // scroll
501                 LOGICAL_MINIMUM(1), 0x81,           // -127
502                 LOGICAL_MAXIMUM(1), 0x7f,           // 127
503                 REPORT_SIZE(1), 0x08,
504                 REPORT_COUNT(1), 0x01,
505                 INPUT(1), 0x06,                     // Data, Variable, Relative
506
507                 USAGE_PAGE(1), 0x09,                // Buttons
508                 USAGE_MINIMUM(1), 0x01,
509                 USAGE_MAXIMUM(1), 0x03,
510                 LOGICAL_MINIMUM(1), 0x00,           // 0
511                 LOGICAL_MAXIMUM(1), 0x01,           // 1
512                 REPORT_COUNT(1), 0x03,
513                 REPORT_SIZE(1), 0x01,
514                 INPUT(1), 0x02,                     // Data, Variable, Absolute
515                 REPORT_COUNT(1), 0x01,
516                 REPORT_SIZE(1), 0x05,
517                 INPUT(1), 0x01,                     // Constant
518
519                 END_COLLECTION(0),
520                 END_COLLECTION(0),
521
522                 // Media Control
523                 USAGE_PAGE(1), 0x0C,
524                 USAGE(1), 0x01,
525                 COLLECTION(1), 0x01,
526                 REPORT_ID(1), REPORT_ID_VOLUME,
527                 USAGE_PAGE(1), 0x0C,
528                 LOGICAL_MINIMUM(1), 0x00,
529                 LOGICAL_MAXIMUM(1), 0x01,
530                 REPORT_SIZE(1), 0x01,
531                 REPORT_COUNT(1), 0x07,
532                 USAGE(1), 0xB5,             // Next Track
533                 USAGE(1), 0xB6,             // Previous Track
534                 USAGE(1), 0xB7,             // Stop
535                 USAGE(1), 0xCD,             // Play / Pause
536                 USAGE(1), 0xE2,             // Mute
537                 USAGE(1), 0xE9,             // Volume Up
538                 USAGE(1), 0xEA,             // Volume Down
539                 INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
540                 REPORT_COUNT(1), 0x01,
541                 INPUT(1), 0x01,
542                 END_COLLECTION(0),
543         };
544         reportLength = sizeof(reportDescriptor);
545         return reportDescriptor;
546     }
547
548     return NULL;
549 }
550
551 bool USBMouseKeyboard::EPINT_OUT_callback() {
552     uint32_t bytesRead = 0;
553     uint8_t led[65];
554     USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
555
556     // we take led[1] because led[0] is the report ID
557     lock_status = led[1] & 0x07;
558
559     // We activate the endpoint to be able to recceive data
560     if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
561         return false;
562     return true;
563 }
564
565 uint8_t USBMouseKeyboard::lockStatus() {
566     return lock_status;
567 }
568
569 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
570     switch (mouse_type) {
571     case REL_MOUSE:
572         while (x > 127) {
573             if (!mouseSend(127, 0, button, z)) return false;
574             x = x - 127;
575         }
576         while (x < -128) {
577             if (!mouseSend(-128, 0, button, z)) return false;
578             x = x + 128;
579         }
580         while (y > 127) {
581             if (!mouseSend(0, 127, button, z)) return false;
582             y = y - 127;
583         }
584         while (y < -128) {
585             if (!mouseSend(0, -128, button, z)) return false;
586             y = y + 128;
587         }
588         return mouseSend(x, y, button, z);
589     case ABS_MOUSE:
590         HID_REPORT report;
591
592         report.data[0] = REPORT_ID_MOUSE;
593         report.data[1] = x & 0xff;
594         report.data[2] = (x >> 8) & 0xff;
595         report.data[3] = y & 0xff;
596         report.data[4] = (y >> 8) & 0xff;
597         report.data[5] = -z;
598         report.data[6] = button & 0x07;
599
600         report.length = 7;
601
602         return send(&report);
603     default:
604         return false;
605     }
606 }
607
608 bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
609     HID_REPORT report;
610     report.data[0] = REPORT_ID_MOUSE;
611     report.data[1] = buttons & 0x07;
612     report.data[2] = x;
613     report.data[3] = y;
614     report.data[4] = -z; // >0 to scroll down, <0 to scroll up
615
616     report.length = 5;
617
618     return send(&report);
619 }
620
621 bool USBMouseKeyboard::move(int16_t x, int16_t y) {
622     return update(x, y, button, 0);
623 }
624
625 bool USBMouseKeyboard::scroll(int8_t z) {
626     return update(0, 0, button, z);
627 }
628
629 bool USBMouseKeyboard::doubleClick() {
630     if (!click(MOUSE_LEFT))
631         return false;
632     wait(0.1);
633     return click(MOUSE_LEFT);
634 }
635
636 bool USBMouseKeyboard::click(uint8_t button) {
637     if (!update(0, 0, button, 0))
638         return false;
639     wait(0.01);
640     return update(0, 0, 0, 0);
641 }
642
643 bool USBMouseKeyboard::press(uint8_t button_) {
644     button = button_ & 0x07;
645     return update(0, 0, button, 0);
646 }
647
648 bool USBMouseKeyboard::release(uint8_t button_) {
649     button = (button & (~button_)) & 0x07;
650     return update(0, 0, button, 0);
651 }
652
653 int USBMouseKeyboard::_putc(int c) {
654     return keyCode(c, keymap[c].modifier);
655 }
656
657 bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) {
658     // Send a simulated keyboard keypress. Returns true if successful.
659
660     HID_REPORT report;
661
662     report.data[0] = REPORT_ID_KEYBOARD;
663     report.data[1] = modifier;
664     report.data[2] = 0;
665     report.data[3] = keymap[key].usage;
666     report.data[4] = 0;
667     report.data[5] = 0;
668     report.data[6] = 0;
669     report.data[7] = 0;
670     report.data[8] = 0;
671
672     report.length = 9;
673
674     if (!send(&report)) {
675         return false;
676     }
677
678     report.data[1] = 0;
679     report.data[3] = 0;
680
681     if (!send(&report)) {
682         return false;
683     }
684
685     return true;
686
687 }
688
689
690 bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
691     HID_REPORT report;
692
693     report.data[0] = REPORT_ID_VOLUME;
694     report.data[1] = (1 << key) & 0x7f;
695
696     report.length = 2;
697
698     send(&report);
699
700     report.data[0] = REPORT_ID_VOLUME;
701     report.data[1] = 0;
702
703     report.length = 2;
704
705     return send(&report);
706 }