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.
Fork of USBDevice by
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 (152) 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 {0x4f, 0}, /* RIGHT_ARROW */ 00183 {0x50, 0}, /* LEFT_ARROW */ 00184 {0x51, 0}, /* DOWN_ARROW */ 00185 {0x52, 0}, /* UP_ARROW */ 00186 }; 00187 00188 #else 00189 /* UK keyboard */ 00190 #define KEYMAP_SIZE (152) 00191 const KEYMAP keymap[KEYMAP_SIZE] = { 00192 {0, 0}, /* NUL */ 00193 {0, 0}, /* SOH */ 00194 {0, 0}, /* STX */ 00195 {0, 0}, /* ETX */ 00196 {0, 0}, /* EOT */ 00197 {0, 0}, /* ENQ */ 00198 {0, 0}, /* ACK */ 00199 {0, 0}, /* BEL */ 00200 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */ 00201 {0x2b, 0}, /* TAB */ /* Keyboard Tab */ 00202 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */ 00203 {0, 0}, /* VT */ 00204 {0, 0}, /* FF */ 00205 {0, 0}, /* CR */ 00206 {0, 0}, /* SO */ 00207 {0, 0}, /* SI */ 00208 {0, 0}, /* DEL */ 00209 {0, 0}, /* DC1 */ 00210 {0, 0}, /* DC2 */ 00211 {0, 0}, /* DC3 */ 00212 {0, 0}, /* DC4 */ 00213 {0, 0}, /* NAK */ 00214 {0, 0}, /* SYN */ 00215 {0, 0}, /* ETB */ 00216 {0, 0}, /* CAN */ 00217 {0, 0}, /* EM */ 00218 {0, 0}, /* SUB */ 00219 {0, 0}, /* ESC */ 00220 {0, 0}, /* FS */ 00221 {0, 0}, /* GS */ 00222 {0, 0}, /* RS */ 00223 {0, 0}, /* US */ 00224 {0x2c, 0}, /* */ 00225 {0x1e, KEY_SHIFT}, /* ! */ 00226 {0x1f, KEY_SHIFT}, /* " */ 00227 {0x32, 0}, /* # */ 00228 {0x21, KEY_SHIFT}, /* $ */ 00229 {0x22, KEY_SHIFT}, /* % */ 00230 {0x24, KEY_SHIFT}, /* & */ 00231 {0x34, 0}, /* ' */ 00232 {0x26, KEY_SHIFT}, /* ( */ 00233 {0x27, KEY_SHIFT}, /* ) */ 00234 {0x25, KEY_SHIFT}, /* * */ 00235 {0x2e, KEY_SHIFT}, /* + */ 00236 {0x36, 0}, /* , */ 00237 {0x2d, 0}, /* - */ 00238 {0x37, 0}, /* . */ 00239 {0x38, 0}, /* / */ 00240 {0x27, 0}, /* 0 */ 00241 {0x1e, 0}, /* 1 */ 00242 {0x1f, 0}, /* 2 */ 00243 {0x20, 0}, /* 3 */ 00244 {0x21, 0}, /* 4 */ 00245 {0x22, 0}, /* 5 */ 00246 {0x23, 0}, /* 6 */ 00247 {0x24, 0}, /* 7 */ 00248 {0x25, 0}, /* 8 */ 00249 {0x26, 0}, /* 9 */ 00250 {0x33, KEY_SHIFT}, /* : */ 00251 {0x33, 0}, /* ; */ 00252 {0x36, KEY_SHIFT}, /* < */ 00253 {0x2e, 0}, /* = */ 00254 {0x37, KEY_SHIFT}, /* > */ 00255 {0x38, KEY_SHIFT}, /* ? */ 00256 {0x34, KEY_SHIFT}, /* @ */ 00257 {0x04, KEY_SHIFT}, /* A */ 00258 {0x05, KEY_SHIFT}, /* B */ 00259 {0x06, KEY_SHIFT}, /* C */ 00260 {0x07, KEY_SHIFT}, /* D */ 00261 {0x08, KEY_SHIFT}, /* E */ 00262 {0x09, KEY_SHIFT}, /* F */ 00263 {0x0a, KEY_SHIFT}, /* G */ 00264 {0x0b, KEY_SHIFT}, /* H */ 00265 {0x0c, KEY_SHIFT}, /* I */ 00266 {0x0d, KEY_SHIFT}, /* J */ 00267 {0x0e, KEY_SHIFT}, /* K */ 00268 {0x0f, KEY_SHIFT}, /* L */ 00269 {0x10, KEY_SHIFT}, /* M */ 00270 {0x11, KEY_SHIFT}, /* N */ 00271 {0x12, KEY_SHIFT}, /* O */ 00272 {0x13, KEY_SHIFT}, /* P */ 00273 {0x14, KEY_SHIFT}, /* Q */ 00274 {0x15, KEY_SHIFT}, /* R */ 00275 {0x16, KEY_SHIFT}, /* S */ 00276 {0x17, KEY_SHIFT}, /* T */ 00277 {0x18, KEY_SHIFT}, /* U */ 00278 {0x19, KEY_SHIFT}, /* V */ 00279 {0x1a, KEY_SHIFT}, /* W */ 00280 {0x1b, KEY_SHIFT}, /* X */ 00281 {0x1c, KEY_SHIFT}, /* Y */ 00282 {0x1d, KEY_SHIFT}, /* Z */ 00283 {0x2f, 0}, /* [ */ 00284 {0x64, 0}, /* \ */ 00285 {0x30, 0}, /* ] */ 00286 {0x23, KEY_SHIFT}, /* ^ */ 00287 {0x2d, KEY_SHIFT}, /* _ */ 00288 {0x35, 0}, /* ` */ 00289 {0x04, 0}, /* a */ 00290 {0x05, 0}, /* b */ 00291 {0x06, 0}, /* c */ 00292 {0x07, 0}, /* d */ 00293 {0x08, 0}, /* e */ 00294 {0x09, 0}, /* f */ 00295 {0x0a, 0}, /* g */ 00296 {0x0b, 0}, /* h */ 00297 {0x0c, 0}, /* i */ 00298 {0x0d, 0}, /* j */ 00299 {0x0e, 0}, /* k */ 00300 {0x0f, 0}, /* l */ 00301 {0x10, 0}, /* m */ 00302 {0x11, 0}, /* n */ 00303 {0x12, 0}, /* o */ 00304 {0x13, 0}, /* p */ 00305 {0x14, 0}, /* q */ 00306 {0x15, 0}, /* r */ 00307 {0x16, 0}, /* s */ 00308 {0x17, 0}, /* t */ 00309 {0x18, 0}, /* u */ 00310 {0x19, 0}, /* v */ 00311 {0x1a, 0}, /* w */ 00312 {0x1b, 0}, /* x */ 00313 {0x1c, 0}, /* y */ 00314 {0x1d, 0}, /* z */ 00315 {0x2f, KEY_SHIFT}, /* { */ 00316 {0x64, KEY_SHIFT}, /* | */ 00317 {0x30, KEY_SHIFT}, /* } */ 00318 {0x32, KEY_SHIFT}, /* ~ */ 00319 {0,0}, /* DEL */ 00320 00321 {0x3a, 0}, /* F1 */ 00322 {0x3b, 0}, /* F2 */ 00323 {0x3c, 0}, /* F3 */ 00324 {0x3d, 0}, /* F4 */ 00325 {0x3e, 0}, /* F5 */ 00326 {0x3f, 0}, /* F6 */ 00327 {0x40, 0}, /* F7 */ 00328 {0x41, 0}, /* F8 */ 00329 {0x42, 0}, /* F9 */ 00330 {0x43, 0}, /* F10 */ 00331 {0x44, 0}, /* F11 */ 00332 {0x45, 0}, /* F12 */ 00333 00334 {0x46, 0}, /* PRINT_SCREEN */ 00335 {0x47, 0}, /* SCROLL_LOCK */ 00336 {0x39, 0}, /* CAPS_LOCK */ 00337 {0x53, 0}, /* NUM_LOCK */ 00338 {0x49, 0}, /* INSERT */ 00339 {0x4a, 0}, /* HOME */ 00340 {0x4b, 0}, /* PAGE_UP */ 00341 {0x4e, 0}, /* PAGE_DOWN */ 00342 00343 {0x4f, 0}, /* RIGHT_ARROW */ 00344 {0x50, 0}, /* LEFT_ARROW */ 00345 {0x51, 0}, /* DOWN_ARROW */ 00346 {0x52, 0}, /* UP_ARROW */ 00347 }; 00348 #endif 00349 00350 00351 uint8_t * USBMouseKeyboard::reportDesc() { 00352 if (mouse_type == REL_MOUSE) { 00353 static uint8_t reportDescriptor[] = { 00354 // Keyboard 00355 USAGE_PAGE(1), 0x01, 00356 USAGE(1), 0x06, 00357 COLLECTION(1), 0x01, 00358 REPORT_ID(1), REPORT_ID_KEYBOARD, 00359 USAGE_PAGE(1), 0x07, 00360 USAGE_MINIMUM(1), 0xE0, 00361 USAGE_MAXIMUM(1), 0xE7, 00362 LOGICAL_MINIMUM(1), 0x00, 00363 LOGICAL_MAXIMUM(1), 0x01, 00364 REPORT_SIZE(1), 0x01, 00365 REPORT_COUNT(1), 0x08, 00366 INPUT(1), 0x02, 00367 REPORT_COUNT(1), 0x01, 00368 REPORT_SIZE(1), 0x08, 00369 INPUT(1), 0x01, 00370 REPORT_COUNT(1), 0x05, 00371 REPORT_SIZE(1), 0x01, 00372 USAGE_PAGE(1), 0x08, 00373 USAGE_MINIMUM(1), 0x01, 00374 USAGE_MAXIMUM(1), 0x05, 00375 OUTPUT(1), 0x02, 00376 REPORT_COUNT(1), 0x01, 00377 REPORT_SIZE(1), 0x03, 00378 OUTPUT(1), 0x01, 00379 REPORT_COUNT(1), 0x06, 00380 REPORT_SIZE(1), 0x08, 00381 LOGICAL_MINIMUM(1), 0x00, 00382 LOGICAL_MAXIMUM(2), 0xff, 0x00, 00383 USAGE_PAGE(1), 0x07, 00384 USAGE_MINIMUM(1), 0x00, 00385 USAGE_MAXIMUM(2), 0xff, 0x00, 00386 INPUT(1), 0x00, 00387 END_COLLECTION(0), 00388 00389 // Mouse 00390 USAGE_PAGE(1), 0x01, // Generic Desktop 00391 USAGE(1), 0x02, // Mouse 00392 COLLECTION(1), 0x01, // Application 00393 USAGE(1), 0x01, // Pointer 00394 COLLECTION(1), 0x00, // Physical 00395 REPORT_ID(1), REPORT_ID_MOUSE, 00396 REPORT_COUNT(1), 0x03, 00397 REPORT_SIZE(1), 0x01, 00398 USAGE_PAGE(1), 0x09, // Buttons 00399 USAGE_MINIMUM(1), 0x1, 00400 USAGE_MAXIMUM(1), 0x3, 00401 LOGICAL_MINIMUM(1), 0x00, 00402 LOGICAL_MAXIMUM(1), 0x01, 00403 INPUT(1), 0x02, 00404 REPORT_COUNT(1), 0x01, 00405 REPORT_SIZE(1), 0x05, 00406 INPUT(1), 0x01, 00407 REPORT_COUNT(1), 0x03, 00408 REPORT_SIZE(1), 0x08, 00409 USAGE_PAGE(1), 0x01, 00410 USAGE(1), 0x30, // X 00411 USAGE(1), 0x31, // Y 00412 USAGE(1), 0x38, // scroll 00413 LOGICAL_MINIMUM(1), 0x81, 00414 LOGICAL_MAXIMUM(1), 0x7f, 00415 INPUT(1), 0x06, 00416 END_COLLECTION(0), 00417 END_COLLECTION(0), 00418 00419 00420 // Media Control 00421 USAGE_PAGE(1), 0x0C, 00422 USAGE(1), 0x01, 00423 COLLECTION(1), 0x01, 00424 REPORT_ID(1), REPORT_ID_VOLUME, 00425 USAGE_PAGE(1), 0x0C, 00426 LOGICAL_MINIMUM(1), 0x00, 00427 LOGICAL_MAXIMUM(1), 0x01, 00428 REPORT_SIZE(1), 0x01, 00429 REPORT_COUNT(1), 0x07, 00430 USAGE(1), 0xB5, // Next Track 00431 USAGE(1), 0xB6, // Previous Track 00432 USAGE(1), 0xB7, // Stop 00433 USAGE(1), 0xCD, // Play / Pause 00434 USAGE(1), 0xE2, // Mute 00435 USAGE(1), 0xE9, // Volume Up 00436 USAGE(1), 0xEA, // Volume Down 00437 INPUT(1), 0x02, // Input (Data, Variable, Absolute) 00438 REPORT_COUNT(1), 0x01, 00439 INPUT(1), 0x01, 00440 END_COLLECTION(0), 00441 }; 00442 reportLength = sizeof(reportDescriptor); 00443 return reportDescriptor; 00444 } else if (mouse_type == ABS_MOUSE) { 00445 static uint8_t reportDescriptor[] = { 00446 00447 // Keyboard 00448 USAGE_PAGE(1), 0x01, 00449 USAGE(1), 0x06, 00450 COLLECTION(1), 0x01, 00451 REPORT_ID(1), REPORT_ID_KEYBOARD, 00452 USAGE_PAGE(1), 0x07, 00453 USAGE_MINIMUM(1), 0xE0, 00454 USAGE_MAXIMUM(1), 0xE7, 00455 LOGICAL_MINIMUM(1), 0x00, 00456 LOGICAL_MAXIMUM(1), 0x01, 00457 REPORT_SIZE(1), 0x01, 00458 REPORT_COUNT(1), 0x08, 00459 INPUT(1), 0x02, 00460 REPORT_COUNT(1), 0x01, 00461 REPORT_SIZE(1), 0x08, 00462 INPUT(1), 0x01, 00463 REPORT_COUNT(1), 0x05, 00464 REPORT_SIZE(1), 0x01, 00465 USAGE_PAGE(1), 0x08, 00466 USAGE_MINIMUM(1), 0x01, 00467 USAGE_MAXIMUM(1), 0x05, 00468 OUTPUT(1), 0x02, 00469 REPORT_COUNT(1), 0x01, 00470 REPORT_SIZE(1), 0x03, 00471 OUTPUT(1), 0x01, 00472 REPORT_COUNT(1), 0x06, 00473 REPORT_SIZE(1), 0x08, 00474 LOGICAL_MINIMUM(1), 0x00, 00475 LOGICAL_MAXIMUM(2), 0xff, 0x00, 00476 USAGE_PAGE(1), 0x07, 00477 USAGE_MINIMUM(1), 0x00, 00478 USAGE_MAXIMUM(2), 0xff, 0x00, 00479 INPUT(1), 0x00, 00480 END_COLLECTION(0), 00481 00482 // Mouse 00483 USAGE_PAGE(1), 0x01, // Generic Desktop 00484 USAGE(1), 0x02, // Mouse 00485 COLLECTION(1), 0x01, // Application 00486 USAGE(1), 0x01, // Pointer 00487 COLLECTION(1), 0x00, // Physical 00488 REPORT_ID(1), REPORT_ID_MOUSE, 00489 00490 USAGE_PAGE(1), 0x01, // Generic Desktop 00491 USAGE(1), 0x30, // X 00492 USAGE(1), 0x31, // Y 00493 LOGICAL_MINIMUM(1), 0x00, // 0 00494 LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 00495 REPORT_SIZE(1), 0x10, 00496 REPORT_COUNT(1), 0x02, 00497 INPUT(1), 0x02, // Data, Variable, Absolute 00498 00499 USAGE_PAGE(1), 0x01, // Generic Desktop 00500 USAGE(1), 0x38, // scroll 00501 LOGICAL_MINIMUM(1), 0x81, // -127 00502 LOGICAL_MAXIMUM(1), 0x7f, // 127 00503 REPORT_SIZE(1), 0x08, 00504 REPORT_COUNT(1), 0x01, 00505 INPUT(1), 0x06, // Data, Variable, Relative 00506 00507 USAGE_PAGE(1), 0x09, // Buttons 00508 USAGE_MINIMUM(1), 0x01, 00509 USAGE_MAXIMUM(1), 0x03, 00510 LOGICAL_MINIMUM(1), 0x00, // 0 00511 LOGICAL_MAXIMUM(1), 0x01, // 1 00512 REPORT_COUNT(1), 0x03, 00513 REPORT_SIZE(1), 0x01, 00514 INPUT(1), 0x02, // Data, Variable, Absolute 00515 REPORT_COUNT(1), 0x01, 00516 REPORT_SIZE(1), 0x05, 00517 INPUT(1), 0x01, // Constant 00518 00519 END_COLLECTION(0), 00520 END_COLLECTION(0), 00521 00522 // Media Control 00523 USAGE_PAGE(1), 0x0C, 00524 USAGE(1), 0x01, 00525 COLLECTION(1), 0x01, 00526 REPORT_ID(1), REPORT_ID_VOLUME, 00527 USAGE_PAGE(1), 0x0C, 00528 LOGICAL_MINIMUM(1), 0x00, 00529 LOGICAL_MAXIMUM(1), 0x01, 00530 REPORT_SIZE(1), 0x01, 00531 REPORT_COUNT(1), 0x07, 00532 USAGE(1), 0xB5, // Next Track 00533 USAGE(1), 0xB6, // Previous Track 00534 USAGE(1), 0xB7, // Stop 00535 USAGE(1), 0xCD, // Play / Pause 00536 USAGE(1), 0xE2, // Mute 00537 USAGE(1), 0xE9, // Volume Up 00538 USAGE(1), 0xEA, // Volume Down 00539 INPUT(1), 0x02, // Input (Data, Variable, Absolute) 00540 REPORT_COUNT(1), 0x01, 00541 INPUT(1), 0x01, 00542 END_COLLECTION(0), 00543 }; 00544 reportLength = sizeof(reportDescriptor); 00545 return reportDescriptor; 00546 } 00547 00548 return NULL; 00549 } 00550 00551 bool USBMouseKeyboard::EPINT_OUT_callback() { 00552 uint32_t bytesRead = 0; 00553 uint8_t led[65]; 00554 USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE); 00555 00556 // we take led[1] because led[0] is the report ID 00557 lock_status = led[1] & 0x07; 00558 00559 // We activate the endpoint to be able to recceive data 00560 if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE)) 00561 return false; 00562 return true; 00563 } 00564 00565 uint8_t USBMouseKeyboard::lockStatus() { 00566 return lock_status; 00567 } 00568 00569 bool USBMouseKeyboard::connect(MOUSE_TYPE mouse_type, bool blocking) { 00570 this->mouse_type = mouse_type; 00571 this->lock_status = 0; 00572 this->button = 0; 00573 USBHID::connect(blocking); 00574 return true; 00575 } 00576 00577 00578 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) { 00579 switch (mouse_type) { 00580 case REL_MOUSE: 00581 while (x > 127) { 00582 if (!mouseSend(127, 0, button, z)) return false; 00583 x = x - 127; 00584 } 00585 while (x < -128) { 00586 if (!mouseSend(-128, 0, button, z)) return false; 00587 x = x + 128; 00588 } 00589 while (y > 127) { 00590 if (!mouseSend(0, 127, button, z)) return false; 00591 y = y - 127; 00592 } 00593 while (y < -128) { 00594 if (!mouseSend(0, -128, button, z)) return false; 00595 y = y + 128; 00596 } 00597 return mouseSend(x, y, button, z); 00598 case ABS_MOUSE: 00599 HID_REPORT report; 00600 00601 report.data[0] = REPORT_ID_MOUSE; 00602 report.data[1] = x & 0xff; 00603 report.data[2] = (x >> 8) & 0xff; 00604 report.data[3] = y & 0xff; 00605 report.data[4] = (y >> 8) & 0xff; 00606 report.data[5] = -z; 00607 report.data[6] = button & 0x07; 00608 00609 report.length = 7; 00610 00611 return send(&report); 00612 default: 00613 return false; 00614 } 00615 } 00616 00617 bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) { 00618 HID_REPORT report; 00619 report.data[0] = REPORT_ID_MOUSE; 00620 report.data[1] = buttons & 0x07; 00621 report.data[2] = x; 00622 report.data[3] = y; 00623 report.data[4] = -z; // >0 to scroll down, <0 to scroll up 00624 00625 report.length = 5; 00626 00627 return send(&report); 00628 } 00629 00630 bool USBMouseKeyboard::move(int16_t x, int16_t y) { 00631 return update(x, y, button, 0); 00632 } 00633 00634 bool USBMouseKeyboard::scroll(int8_t z) { 00635 return update(0, 0, button, z); 00636 } 00637 00638 bool USBMouseKeyboard::doubleClick() { 00639 if (!click(MOUSE_LEFT)) 00640 return false; 00641 wait(0.1); 00642 return click(MOUSE_LEFT); 00643 } 00644 00645 bool USBMouseKeyboard::click(uint8_t button) { 00646 if (!update(0, 0, button, 0)) 00647 return false; 00648 wait(0.01); 00649 return update(0, 0, 0, 0); 00650 } 00651 00652 bool USBMouseKeyboard::press(uint8_t button_) { 00653 button = button_ & 0x07; 00654 return update(0, 0, button, 0); 00655 } 00656 00657 bool USBMouseKeyboard::release(uint8_t button_) { 00658 button = (button & (~button_)) & 0x07; 00659 return update(0, 0, button, 0); 00660 } 00661 00662 int USBMouseKeyboard::_putc(int c) { 00663 return keyCode(c, keymap[c].modifier); 00664 } 00665 00666 bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) { 00667 // Send a simulated keyboard keypress. Returns true if successful. 00668 00669 HID_REPORT report; 00670 00671 report.data[0] = REPORT_ID_KEYBOARD; 00672 report.data[1] = modifier; 00673 report.data[2] = 0; 00674 report.data[3] = keymap[key].usage; 00675 report.data[4] = 0; 00676 report.data[5] = 0; 00677 report.data[6] = 0; 00678 report.data[7] = 0; 00679 report.data[8] = 0; 00680 00681 report.length = 9; 00682 00683 if (!send(&report)) { 00684 return false; 00685 } 00686 00687 report.data[1] = 0; 00688 report.data[3] = 0; 00689 00690 if (!send(&report)) { 00691 return false; 00692 } 00693 00694 return true; 00695 00696 } 00697 00698 00699 bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) { 00700 HID_REPORT report; 00701 00702 report.data[0] = REPORT_ID_VOLUME; 00703 report.data[1] = (1 << key) & 0x7f; 00704 00705 report.length = 2; 00706 00707 send(&report); 00708 00709 report.data[0] = REPORT_ID_VOLUME; 00710 report.data[1] = 0; 00711 00712 report.length = 2; 00713 00714 return send(&report); 00715 }
Generated on Wed Jul 13 2022 08:27:09 by
1.7.2
