Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
USBMouseKeyboard.cpp
00001 /* Copyright (c) 2010-2011 mbed.org, MIT License 00002 * 00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 00004 * and associated documentation files (the "Software"), to deal in the Software without 00005 * restriction, including without limitation the rights to use, copy, modify, merge, publish, 00006 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 00007 * Software is furnished to do so, subject to the following conditions: 00008 * 00009 * The above copyright notice and this permission notice shall be included in all copies or 00010 * substantial portions of the Software. 00011 * 00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00017 */ 00018 00019 #include "stdint.h" 00020 #include "USBMouseKeyboard.h" 00021 00022 typedef struct { 00023 unsigned char usage; 00024 unsigned char modifier; 00025 } KEYMAP; 00026 00027 #ifdef US_KEYBOARD 00028 /* US keyboard (as HID standard) */ 00029 #define KEYMAP_SIZE (148) 00030 const KEYMAP keymap[KEYMAP_SIZE] = { 00031 {0, 0}, /* NUL */ 00032 {0, 0}, /* SOH */ 00033 {0, 0}, /* STX */ 00034 {0, 0}, /* ETX */ 00035 {0, 0}, /* EOT */ 00036 {0, 0}, /* ENQ */ 00037 {0, 0}, /* ACK */ 00038 {0, 0}, /* BEL */ 00039 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */ 00040 {0x2b, 0}, /* TAB */ /* Keyboard Tab */ 00041 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */ 00042 {0, 0}, /* VT */ 00043 {0, 0}, /* FF */ 00044 {0, 0}, /* CR */ 00045 {0, 0}, /* SO */ 00046 {0, 0}, /* SI */ 00047 {0, 0}, /* DEL */ 00048 {0, 0}, /* DC1 */ 00049 {0, 0}, /* DC2 */ 00050 {0, 0}, /* DC3 */ 00051 {0, 0}, /* DC4 */ 00052 {0, 0}, /* NAK */ 00053 {0, 0}, /* SYN */ 00054 {0, 0}, /* ETB */ 00055 {0, 0}, /* CAN */ 00056 {0, 0}, /* EM */ 00057 {0, 0}, /* SUB */ 00058 {0, 0}, /* ESC */ 00059 {0, 0}, /* FS */ 00060 {0, 0}, /* GS */ 00061 {0, 0}, /* RS */ 00062 {0, 0}, /* US */ 00063 {0x2c, 0}, /* */ 00064 {0x1e, KEY_SHIFT}, /* ! */ 00065 {0x34, KEY_SHIFT}, /* " */ 00066 {0x20, KEY_SHIFT}, /* # */ 00067 {0x21, KEY_SHIFT}, /* $ */ 00068 {0x22, KEY_SHIFT}, /* % */ 00069 {0x24, KEY_SHIFT}, /* & */ 00070 {0x34, 0}, /* ' */ 00071 {0x26, KEY_SHIFT}, /* ( */ 00072 {0x27, KEY_SHIFT}, /* ) */ 00073 {0x25, KEY_SHIFT}, /* * */ 00074 {0x2e, KEY_SHIFT}, /* + */ 00075 {0x36, 0}, /* , */ 00076 {0x2d, 0}, /* - */ 00077 {0x37, 0}, /* . */ 00078 {0x38, 0}, /* / */ 00079 {0x27, 0}, /* 0 */ 00080 {0x1e, 0}, /* 1 */ 00081 {0x1f, 0}, /* 2 */ 00082 {0x20, 0}, /* 3 */ 00083 {0x21, 0}, /* 4 */ 00084 {0x22, 0}, /* 5 */ 00085 {0x23, 0}, /* 6 */ 00086 {0x24, 0}, /* 7 */ 00087 {0x25, 0}, /* 8 */ 00088 {0x26, 0}, /* 9 */ 00089 {0x33, KEY_SHIFT}, /* : */ 00090 {0x33, 0}, /* ; */ 00091 {0x36, KEY_SHIFT}, /* < */ 00092 {0x2e, 0}, /* = */ 00093 {0x37, KEY_SHIFT}, /* > */ 00094 {0x38, KEY_SHIFT}, /* ? */ 00095 {0x1f, KEY_SHIFT}, /* @ */ 00096 {0x04, KEY_SHIFT}, /* A */ 00097 {0x05, KEY_SHIFT}, /* B */ 00098 {0x06, KEY_SHIFT}, /* C */ 00099 {0x07, KEY_SHIFT}, /* D */ 00100 {0x08, KEY_SHIFT}, /* E */ 00101 {0x09, KEY_SHIFT}, /* F */ 00102 {0x0a, KEY_SHIFT}, /* G */ 00103 {0x0b, KEY_SHIFT}, /* H */ 00104 {0x0c, KEY_SHIFT}, /* I */ 00105 {0x0d, KEY_SHIFT}, /* J */ 00106 {0x0e, KEY_SHIFT}, /* K */ 00107 {0x0f, KEY_SHIFT}, /* L */ 00108 {0x10, KEY_SHIFT}, /* M */ 00109 {0x11, KEY_SHIFT}, /* N */ 00110 {0x12, KEY_SHIFT}, /* O */ 00111 {0x13, KEY_SHIFT}, /* P */ 00112 {0x14, KEY_SHIFT}, /* Q */ 00113 {0x15, KEY_SHIFT}, /* R */ 00114 {0x16, KEY_SHIFT}, /* S */ 00115 {0x17, KEY_SHIFT}, /* T */ 00116 {0x18, KEY_SHIFT}, /* U */ 00117 {0x19, KEY_SHIFT}, /* V */ 00118 {0x1a, KEY_SHIFT}, /* W */ 00119 {0x1b, KEY_SHIFT}, /* X */ 00120 {0x1c, KEY_SHIFT}, /* Y */ 00121 {0x1d, KEY_SHIFT}, /* Z */ 00122 {0x2f, 0}, /* [ */ 00123 {0x31, 0}, /* \ */ 00124 {0x30, 0}, /* ] */ 00125 {0x23, KEY_SHIFT}, /* ^ */ 00126 {0x2d, KEY_SHIFT}, /* _ */ 00127 {0x35, 0}, /* ` */ 00128 {0x04, 0}, /* a */ 00129 {0x05, 0}, /* b */ 00130 {0x06, 0}, /* c */ 00131 {0x07, 0}, /* d */ 00132 {0x08, 0}, /* e */ 00133 {0x09, 0}, /* f */ 00134 {0x0a, 0}, /* g */ 00135 {0x0b, 0}, /* h */ 00136 {0x0c, 0}, /* i */ 00137 {0x0d, 0}, /* j */ 00138 {0x0e, 0}, /* k */ 00139 {0x0f, 0}, /* l */ 00140 {0x10, 0}, /* m */ 00141 {0x11, 0}, /* n */ 00142 {0x12, 0}, /* o */ 00143 {0x13, 0}, /* p */ 00144 {0x14, 0}, /* q */ 00145 {0x15, 0}, /* r */ 00146 {0x16, 0}, /* s */ 00147 {0x17, 0}, /* t */ 00148 {0x18, 0}, /* u */ 00149 {0x19, 0}, /* v */ 00150 {0x1a, 0}, /* w */ 00151 {0x1b, 0}, /* x */ 00152 {0x1c, 0}, /* y */ 00153 {0x1d, 0}, /* z */ 00154 {0x2f, KEY_SHIFT}, /* { */ 00155 {0x31, KEY_SHIFT}, /* | */ 00156 {0x30, KEY_SHIFT}, /* } */ 00157 {0x35, KEY_SHIFT}, /* ~ */ 00158 {0,0}, /* DEL */ 00159 00160 {0x3a, 0}, /* F1 */ 00161 {0x3b, 0}, /* F2 */ 00162 {0x3c, 0}, /* F3 */ 00163 {0x3d, 0}, /* F4 */ 00164 {0x3e, 0}, /* F5 */ 00165 {0x3f, 0}, /* F6 */ 00166 {0x40, 0}, /* F7 */ 00167 {0x41, 0}, /* F8 */ 00168 {0x42, 0}, /* F9 */ 00169 {0x43, 0}, /* F10 */ 00170 {0x44, 0}, /* F11 */ 00171 {0x45, 0}, /* F12 */ 00172 00173 {0x46, 0}, /* PRINT_SCREEN */ 00174 {0x47, 0}, /* SCROLL_LOCK */ 00175 {0x39, 0}, /* CAPS_LOCK */ 00176 {0x53, 0}, /* NUM_LOCK */ 00177 {0x49, 0}, /* INSERT */ 00178 {0x4a, 0}, /* HOME */ 00179 {0x4b, 0}, /* PAGE_UP */ 00180 {0x4e, 0}, /* PAGE_DOWN */ 00181 }; 00182 00183 #else 00184 /* UK keyboard */ 00185 #define KEYMAP_SIZE (148) 00186 const KEYMAP keymap[KEYMAP_SIZE] = { 00187 {0, 0}, /* NUL */ 00188 {0, 0}, /* SOH */ 00189 {0, 0}, /* STX */ 00190 {0, 0}, /* ETX */ 00191 {0, 0}, /* EOT */ 00192 {0, 0}, /* ENQ */ 00193 {0, 0}, /* ACK */ 00194 {0, 0}, /* BEL */ 00195 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */ 00196 {0x2b, 0}, /* TAB */ /* Keyboard Tab */ 00197 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */ 00198 {0, 0}, /* VT */ 00199 {0, 0}, /* FF */ 00200 {0, 0}, /* CR */ 00201 {0, 0}, /* SO */ 00202 {0, 0}, /* SI */ 00203 {0, 0}, /* DEL */ 00204 {0, 0}, /* DC1 */ 00205 {0, 0}, /* DC2 */ 00206 {0, 0}, /* DC3 */ 00207 {0, 0}, /* DC4 */ 00208 {0, 0}, /* NAK */ 00209 {0, 0}, /* SYN */ 00210 {0, 0}, /* ETB */ 00211 {0, 0}, /* CAN */ 00212 {0, 0}, /* EM */ 00213 {0, 0}, /* SUB */ 00214 {0, 0}, /* ESC */ 00215 {0, 0}, /* FS */ 00216 {0, 0}, /* GS */ 00217 {0, 0}, /* RS */ 00218 {0, 0}, /* US */ 00219 {0x2c, 0}, /* */ 00220 {0x1e, KEY_SHIFT}, /* ! */ 00221 {0x1f, KEY_SHIFT}, /* " */ 00222 {0x32, 0}, /* # */ 00223 {0x21, KEY_SHIFT}, /* $ */ 00224 {0x22, KEY_SHIFT}, /* % */ 00225 {0x24, KEY_SHIFT}, /* & */ 00226 {0x34, 0}, /* ' */ 00227 {0x26, KEY_SHIFT}, /* ( */ 00228 {0x27, KEY_SHIFT}, /* ) */ 00229 {0x25, KEY_SHIFT}, /* * */ 00230 {0x2e, KEY_SHIFT}, /* + */ 00231 {0x36, 0}, /* , */ 00232 {0x2d, 0}, /* - */ 00233 {0x37, 0}, /* . */ 00234 {0x38, 0}, /* / */ 00235 {0x27, 0}, /* 0 */ 00236 {0x1e, 0}, /* 1 */ 00237 {0x1f, 0}, /* 2 */ 00238 {0x20, 0}, /* 3 */ 00239 {0x21, 0}, /* 4 */ 00240 {0x22, 0}, /* 5 */ 00241 {0x23, 0}, /* 6 */ 00242 {0x24, 0}, /* 7 */ 00243 {0x25, 0}, /* 8 */ 00244 {0x26, 0}, /* 9 */ 00245 {0x33, KEY_SHIFT}, /* : */ 00246 {0x33, 0}, /* ; */ 00247 {0x36, KEY_SHIFT}, /* < */ 00248 {0x2e, 0}, /* = */ 00249 {0x37, KEY_SHIFT}, /* > */ 00250 {0x38, KEY_SHIFT}, /* ? */ 00251 {0x34, KEY_SHIFT}, /* @ */ 00252 {0x04, KEY_SHIFT}, /* A */ 00253 {0x05, KEY_SHIFT}, /* B */ 00254 {0x06, KEY_SHIFT}, /* C */ 00255 {0x07, KEY_SHIFT}, /* D */ 00256 {0x08, KEY_SHIFT}, /* E */ 00257 {0x09, KEY_SHIFT}, /* F */ 00258 {0x0a, KEY_SHIFT}, /* G */ 00259 {0x0b, KEY_SHIFT}, /* H */ 00260 {0x0c, KEY_SHIFT}, /* I */ 00261 {0x0d, KEY_SHIFT}, /* J */ 00262 {0x0e, KEY_SHIFT}, /* K */ 00263 {0x0f, KEY_SHIFT}, /* L */ 00264 {0x10, KEY_SHIFT}, /* M */ 00265 {0x11, KEY_SHIFT}, /* N */ 00266 {0x12, KEY_SHIFT}, /* O */ 00267 {0x13, KEY_SHIFT}, /* P */ 00268 {0x14, KEY_SHIFT}, /* Q */ 00269 {0x15, KEY_SHIFT}, /* R */ 00270 {0x16, KEY_SHIFT}, /* S */ 00271 {0x17, KEY_SHIFT}, /* T */ 00272 {0x18, KEY_SHIFT}, /* U */ 00273 {0x19, KEY_SHIFT}, /* V */ 00274 {0x1a, KEY_SHIFT}, /* W */ 00275 {0x1b, KEY_SHIFT}, /* X */ 00276 {0x1c, KEY_SHIFT}, /* Y */ 00277 {0x1d, KEY_SHIFT}, /* Z */ 00278 {0x2f, 0}, /* [ */ 00279 {0x64, 0}, /* \ */ 00280 {0x30, 0}, /* ] */ 00281 {0x23, KEY_SHIFT}, /* ^ */ 00282 {0x2d, KEY_SHIFT}, /* _ */ 00283 {0x35, 0}, /* ` */ 00284 {0x04, 0}, /* a */ 00285 {0x05, 0}, /* b */ 00286 {0x06, 0}, /* c */ 00287 {0x07, 0}, /* d */ 00288 {0x08, 0}, /* e */ 00289 {0x09, 0}, /* f */ 00290 {0x0a, 0}, /* g */ 00291 {0x0b, 0}, /* h */ 00292 {0x0c, 0}, /* i */ 00293 {0x0d, 0}, /* j */ 00294 {0x0e, 0}, /* k */ 00295 {0x0f, 0}, /* l */ 00296 {0x10, 0}, /* m */ 00297 {0x11, 0}, /* n */ 00298 {0x12, 0}, /* o */ 00299 {0x13, 0}, /* p */ 00300 {0x14, 0}, /* q */ 00301 {0x15, 0}, /* r */ 00302 {0x16, 0}, /* s */ 00303 {0x17, 0}, /* t */ 00304 {0x18, 0}, /* u */ 00305 {0x19, 0}, /* v */ 00306 {0x1a, 0}, /* w */ 00307 {0x1b, 0}, /* x */ 00308 {0x1c, 0}, /* y */ 00309 {0x1d, 0}, /* z */ 00310 {0x2f, KEY_SHIFT}, /* { */ 00311 {0x64, KEY_SHIFT}, /* | */ 00312 {0x30, KEY_SHIFT}, /* } */ 00313 {0x32, KEY_SHIFT}, /* ~ */ 00314 {0,0}, /* DEL */ 00315 00316 {0x3a, 0}, /* F1 */ 00317 {0x3b, 0}, /* F2 */ 00318 {0x3c, 0}, /* F3 */ 00319 {0x3d, 0}, /* F4 */ 00320 {0x3e, 0}, /* F5 */ 00321 {0x3f, 0}, /* F6 */ 00322 {0x40, 0}, /* F7 */ 00323 {0x41, 0}, /* F8 */ 00324 {0x42, 0}, /* F9 */ 00325 {0x43, 0}, /* F10 */ 00326 {0x44, 0}, /* F11 */ 00327 {0x45, 0}, /* F12 */ 00328 00329 {0x46, 0}, /* PRINT_SCREEN */ 00330 {0x47, 0}, /* SCROLL_LOCK */ 00331 {0x39, 0}, /* CAPS_LOCK */ 00332 {0x53, 0}, /* NUM_LOCK */ 00333 {0x49, 0}, /* INSERT */ 00334 {0x4a, 0}, /* HOME */ 00335 {0x4b, 0}, /* PAGE_UP */ 00336 {0x4e, 0}, /* PAGE_DOWN */ 00337 }; 00338 #endif 00339 00340 00341 uint8_t * USBMouseKeyboard::reportDesc() { 00342 if (mouse_type == REL_MOUSE) { 00343 static uint8_t reportDescriptor[] = { 00344 // Keyboard 00345 USAGE_PAGE(1), 0x01, 00346 USAGE(1), 0x06, 00347 COLLECTION(1), 0x01, 00348 REPORT_ID(1), REPORT_ID_KEYBOARD, 00349 USAGE_PAGE(1), 0x07, 00350 USAGE_MINIMUM(1), 0xE0, 00351 USAGE_MAXIMUM(1), 0xE7, 00352 LOGICAL_MINIMUM(1), 0x00, 00353 LOGICAL_MAXIMUM(1), 0x01, 00354 REPORT_SIZE(1), 0x01, 00355 REPORT_COUNT(1), 0x08, 00356 INPUT(1), 0x02, 00357 REPORT_COUNT(1), 0x01, 00358 REPORT_SIZE(1), 0x08, 00359 INPUT(1), 0x01, 00360 REPORT_COUNT(1), 0x05, 00361 REPORT_SIZE(1), 0x01, 00362 USAGE_PAGE(1), 0x08, 00363 USAGE_MINIMUM(1), 0x01, 00364 USAGE_MAXIMUM(1), 0x05, 00365 OUTPUT(1), 0x02, 00366 REPORT_COUNT(1), 0x01, 00367 REPORT_SIZE(1), 0x03, 00368 OUTPUT(1), 0x01, 00369 REPORT_COUNT(1), 0x06, 00370 REPORT_SIZE(1), 0x08, 00371 LOGICAL_MINIMUM(1), 0x00, 00372 LOGICAL_MAXIMUM(2), 0xff, 0x00, 00373 USAGE_PAGE(1), 0x07, 00374 USAGE_MINIMUM(1), 0x00, 00375 USAGE_MAXIMUM(2), 0xff, 0x00, 00376 INPUT(1), 0x00, 00377 END_COLLECTION(0), 00378 00379 // Mouse 00380 USAGE_PAGE(1), 0x01, // Generic Desktop 00381 USAGE(1), 0x02, // Mouse 00382 COLLECTION(1), 0x01, // Application 00383 USAGE(1), 0x01, // Pointer 00384 COLLECTION(1), 0x00, // Physical 00385 REPORT_ID(1), REPORT_ID_MOUSE, 00386 REPORT_COUNT(1), 0x03, 00387 REPORT_SIZE(1), 0x01, 00388 USAGE_PAGE(1), 0x09, // Buttons 00389 USAGE_MINIMUM(1), 0x1, 00390 USAGE_MAXIMUM(1), 0x3, 00391 LOGICAL_MINIMUM(1), 0x00, 00392 LOGICAL_MAXIMUM(1), 0x01, 00393 INPUT(1), 0x02, 00394 REPORT_COUNT(1), 0x01, 00395 REPORT_SIZE(1), 0x05, 00396 INPUT(1), 0x01, 00397 REPORT_COUNT(1), 0x03, 00398 REPORT_SIZE(1), 0x08, 00399 USAGE_PAGE(1), 0x01, 00400 USAGE(1), 0x30, // X 00401 USAGE(1), 0x31, // Y 00402 USAGE(1), 0x38, // scroll 00403 LOGICAL_MINIMUM(1), 0x81, 00404 LOGICAL_MAXIMUM(1), 0x7f, 00405 INPUT(1), 0x06, 00406 END_COLLECTION(0), 00407 END_COLLECTION(0), 00408 00409 00410 // Media Control 00411 USAGE_PAGE(1), 0x0C, 00412 USAGE(1), 0x01, 00413 COLLECTION(1), 0x01, 00414 REPORT_ID(1), REPORT_ID_VOLUME, 00415 USAGE_PAGE(1), 0x0C, 00416 LOGICAL_MINIMUM(1), 0x00, 00417 LOGICAL_MAXIMUM(1), 0x01, 00418 REPORT_SIZE(1), 0x01, 00419 REPORT_COUNT(1), 0x07, 00420 USAGE(1), 0xB5, // Next Track 00421 USAGE(1), 0xB6, // Previous Track 00422 USAGE(1), 0xB7, // Stop 00423 USAGE(1), 0xCD, // Play / Pause 00424 USAGE(1), 0xE2, // Mute 00425 USAGE(1), 0xE9, // Volume Up 00426 USAGE(1), 0xEA, // Volume Down 00427 INPUT(1), 0x02, // Input (Data, Variable, Absolute) 00428 REPORT_COUNT(1), 0x01, 00429 INPUT(1), 0x01, 00430 END_COLLECTION(0), 00431 }; 00432 reportLength = sizeof(reportDescriptor); 00433 return reportDescriptor; 00434 } else if (mouse_type == ABS_MOUSE) { 00435 static uint8_t reportDescriptor[] = { 00436 00437 // Keyboard 00438 USAGE_PAGE(1), 0x01, 00439 USAGE(1), 0x06, 00440 COLLECTION(1), 0x01, 00441 REPORT_ID(1), REPORT_ID_KEYBOARD, 00442 USAGE_PAGE(1), 0x07, 00443 USAGE_MINIMUM(1), 0xE0, 00444 USAGE_MAXIMUM(1), 0xE7, 00445 LOGICAL_MINIMUM(1), 0x00, 00446 LOGICAL_MAXIMUM(1), 0x01, 00447 REPORT_SIZE(1), 0x01, 00448 REPORT_COUNT(1), 0x08, 00449 INPUT(1), 0x02, 00450 REPORT_COUNT(1), 0x01, 00451 REPORT_SIZE(1), 0x08, 00452 INPUT(1), 0x01, 00453 REPORT_COUNT(1), 0x05, 00454 REPORT_SIZE(1), 0x01, 00455 USAGE_PAGE(1), 0x08, 00456 USAGE_MINIMUM(1), 0x01, 00457 USAGE_MAXIMUM(1), 0x05, 00458 OUTPUT(1), 0x02, 00459 REPORT_COUNT(1), 0x01, 00460 REPORT_SIZE(1), 0x03, 00461 OUTPUT(1), 0x01, 00462 REPORT_COUNT(1), 0x06, 00463 REPORT_SIZE(1), 0x08, 00464 LOGICAL_MINIMUM(1), 0x00, 00465 LOGICAL_MAXIMUM(2), 0xff, 0x00, 00466 USAGE_PAGE(1), 0x07, 00467 USAGE_MINIMUM(1), 0x00, 00468 USAGE_MAXIMUM(2), 0xff, 0x00, 00469 INPUT(1), 0x00, 00470 END_COLLECTION(0), 00471 00472 // Mouse 00473 USAGE_PAGE(1), 0x01, // Generic Desktop 00474 USAGE(1), 0x02, // Mouse 00475 COLLECTION(1), 0x01, // Application 00476 USAGE(1), 0x01, // Pointer 00477 COLLECTION(1), 0x00, // Physical 00478 REPORT_ID(1), REPORT_ID_MOUSE, 00479 00480 USAGE_PAGE(1), 0x01, // Generic Desktop 00481 USAGE(1), 0x30, // X 00482 USAGE(1), 0x31, // Y 00483 LOGICAL_MINIMUM(1), 0x00, // 0 00484 LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 00485 REPORT_SIZE(1), 0x10, 00486 REPORT_COUNT(1), 0x02, 00487 INPUT(1), 0x02, // Data, Variable, Absolute 00488 00489 USAGE_PAGE(1), 0x01, // Generic Desktop 00490 USAGE(1), 0x38, // scroll 00491 LOGICAL_MINIMUM(1), 0x81, // -127 00492 LOGICAL_MAXIMUM(1), 0x7f, // 127 00493 REPORT_SIZE(1), 0x08, 00494 REPORT_COUNT(1), 0x01, 00495 INPUT(1), 0x06, // Data, Variable, Relative 00496 00497 USAGE_PAGE(1), 0x09, // Buttons 00498 USAGE_MINIMUM(1), 0x01, 00499 USAGE_MAXIMUM(1), 0x03, 00500 LOGICAL_MINIMUM(1), 0x00, // 0 00501 LOGICAL_MAXIMUM(1), 0x01, // 1 00502 REPORT_COUNT(1), 0x03, 00503 REPORT_SIZE(1), 0x01, 00504 INPUT(1), 0x02, // Data, Variable, Absolute 00505 REPORT_COUNT(1), 0x01, 00506 REPORT_SIZE(1), 0x05, 00507 INPUT(1), 0x01, // Constant 00508 00509 END_COLLECTION(0), 00510 END_COLLECTION(0), 00511 00512 // Media Control 00513 USAGE_PAGE(1), 0x0C, 00514 USAGE(1), 0x01, 00515 COLLECTION(1), 0x01, 00516 REPORT_ID(1), REPORT_ID_VOLUME, 00517 USAGE_PAGE(1), 0x0C, 00518 LOGICAL_MINIMUM(1), 0x00, 00519 LOGICAL_MAXIMUM(1), 0x01, 00520 REPORT_SIZE(1), 0x01, 00521 REPORT_COUNT(1), 0x07, 00522 USAGE(1), 0xB5, // Next Track 00523 USAGE(1), 0xB6, // Previous Track 00524 USAGE(1), 0xB7, // Stop 00525 USAGE(1), 0xCD, // Play / Pause 00526 USAGE(1), 0xE2, // Mute 00527 USAGE(1), 0xE9, // Volume Up 00528 USAGE(1), 0xEA, // Volume Down 00529 INPUT(1), 0x02, // Input (Data, Variable, Absolute) 00530 REPORT_COUNT(1), 0x01, 00531 INPUT(1), 0x01, 00532 END_COLLECTION(0), 00533 }; 00534 reportLength = sizeof(reportDescriptor); 00535 return reportDescriptor; 00536 } 00537 00538 return NULL; 00539 } 00540 00541 bool USBMouseKeyboard::EP1_OUT_callback() { 00542 uint16_t bytesRead = 0; 00543 uint8_t led[65]; 00544 USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE); 00545 00546 // we take led[1] because led[0] is the report ID 00547 lock_status = led[1] & 0x07; 00548 00549 // We activate the endpoint to be able to recceive data 00550 if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE)) 00551 return false; 00552 return true; 00553 } 00554 00555 uint8_t USBMouseKeyboard::lockStatus() { 00556 return lock_status; 00557 } 00558 00559 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) { 00560 switch (mouse_type) { 00561 case REL_MOUSE: 00562 while (x > 127) { 00563 if (!mouseSend(127, 0, button, z)) return false; 00564 x = x - 127; 00565 } 00566 while (x < -128) { 00567 if (!mouseSend(-128, 0, button, z)) return false; 00568 x = x + 128; 00569 } 00570 while (y > 127) { 00571 if (!mouseSend(0, 127, button, z)) return false; 00572 y = y - 127; 00573 } 00574 while (y < -128) { 00575 if (!mouseSend(0, -128, button, z)) return false; 00576 y = y + 128; 00577 } 00578 return mouseSend(x, y, button, z); 00579 case ABS_MOUSE: 00580 HID_REPORT report; 00581 00582 report.data[0] = REPORT_ID_MOUSE; 00583 report.data[1] = x & 0xff; 00584 report.data[2] = (x >> 8) & 0xff; 00585 report.data[3] = y & 0xff; 00586 report.data[4] = (y >> 8) & 0xff; 00587 report.data[5] = -z; 00588 report.data[6] = button & 0x07; 00589 00590 report.length = 7; 00591 00592 return send(&report); 00593 default: 00594 return false; 00595 } 00596 } 00597 00598 bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) { 00599 HID_REPORT report; 00600 report.data[0] = REPORT_ID_MOUSE; 00601 report.data[1] = buttons & 0x07; 00602 report.data[2] = x; 00603 report.data[3] = y; 00604 report.data[4] = -z; // >0 to scroll down, <0 to scroll up 00605 00606 report.length = 5; 00607 00608 return send(&report); 00609 } 00610 00611 bool USBMouseKeyboard::move(int16_t x, int16_t y) { 00612 return update(x, y, button, 0); 00613 } 00614 00615 bool USBMouseKeyboard::scroll(int8_t z) { 00616 return update(0, 0, button, z); 00617 } 00618 00619 bool USBMouseKeyboard::doubleClick() { 00620 if (!click(MOUSE_LEFT)) 00621 return false; 00622 wait(0.1); 00623 return click(MOUSE_LEFT); 00624 } 00625 00626 bool USBMouseKeyboard::click(uint8_t button) { 00627 if (!update(0, 0, button, 0)) 00628 return false; 00629 wait(0.01); 00630 return update(0, 0, 0, 0); 00631 } 00632 00633 bool USBMouseKeyboard::press(uint8_t button_) { 00634 button = button_ & 0x07; 00635 return update(0, 0, button, 0); 00636 } 00637 00638 bool USBMouseKeyboard::release(uint8_t button_) { 00639 button = (button & (~button_)) & 0x07; 00640 return update(0, 0, button, 0); 00641 } 00642 00643 int USBMouseKeyboard::_putc(int c) { 00644 return keyCode(c, keymap[c].modifier); 00645 } 00646 00647 bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) { 00648 // Send a simulated keyboard keypress. Returns true if successful. 00649 00650 HID_REPORT report; 00651 00652 report.data[0] = REPORT_ID_KEYBOARD; 00653 report.data[1] = modifier; 00654 report.data[2] = 0; 00655 report.data[3] = keymap[key].usage; 00656 report.data[4] = 0; 00657 report.data[5] = 0; 00658 report.data[6] = 0; 00659 report.data[7] = 0; 00660 report.data[8] = 0; 00661 00662 report.length = 9; 00663 00664 if (!send(&report)) { 00665 return false; 00666 } 00667 00668 report.data[1] = 0; 00669 report.data[3] = 0; 00670 00671 if (!send(&report)) { 00672 return false; 00673 } 00674 00675 return true; 00676 00677 } 00678 00679 00680 bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) { 00681 HID_REPORT report; 00682 00683 report.data[0] = REPORT_ID_VOLUME; 00684 report.data[1] = (1 << key) & 0x7f; 00685 00686 report.length = 2; 00687 00688 send(&report); 00689 00690 report.data[0] = REPORT_ID_VOLUME; 00691 report.data[1] = 0; 00692 00693 report.length = 2; 00694 00695 return send(&report); 00696 }
Generated on Wed Jul 13 2022 10:21:29 by
1.7.2