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