Added general purpus HID report

Fork of USBDevice by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBMouseKeyboard.cpp Source File

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                 
00443                 // Generic device
00444                 0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
00445                 0x09, 0x01,                    // USAGE (Vendor Usage 1)
00446                 0xa1, 0x01,                    // COLLECTION (Application)
00447                 REPORT_ID(1),REPORT_ID_UTILITY,
00448                 0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
00449                 0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
00450                 0x75, 0x08,                    //   REPORT_SIZE (8)
00451                 0x95, REPORT_PAYLOAD_SIZE,     //   REPORT_COUNT
00452                 0x09, 0x01,                    //   USAGE (Vendor Usage 1)
00453                 0x81, 0x02,                    //   INPUT (Data,Var,Abs)
00454                 0x09, 0x01,                    //   USAGE (Vendor Usage 1)
00455                 0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
00456                 0xc0                           // END_COLLECTION
00457         };
00458         reportLength = sizeof(reportDescriptor);
00459         return reportDescriptor;
00460     } else if (mouse_type == ABS_MOUSE) {
00461         static uint8_t reportDescriptor[] = {
00462 
00463                 // Keyboard
00464                 USAGE_PAGE(1),      0x01,
00465                 USAGE(1),           0x06,
00466                 COLLECTION(1),      0x01,
00467                 REPORT_ID(1),       REPORT_ID_KEYBOARD,
00468                 USAGE_PAGE(1),      0x07,
00469                 USAGE_MINIMUM(1),       0xE0,
00470                 USAGE_MAXIMUM(1),       0xE7,
00471                 LOGICAL_MINIMUM(1),     0x00,
00472                 LOGICAL_MAXIMUM(1),     0x01,
00473                 REPORT_SIZE(1),     0x01,
00474                 REPORT_COUNT(1),    0x08,
00475                 INPUT(1),           0x02,
00476                 REPORT_COUNT(1),    0x01,
00477                 REPORT_SIZE(1),     0x08,
00478                 INPUT(1),           0x01,
00479                 REPORT_COUNT(1),    0x05,
00480                 REPORT_SIZE(1),     0x01,
00481                 USAGE_PAGE(1),      0x08,
00482                 USAGE_MINIMUM(1),       0x01,
00483                 USAGE_MAXIMUM(1),       0x05,
00484                 OUTPUT(1),          0x02,
00485                 REPORT_COUNT(1),    0x01,
00486                 REPORT_SIZE(1),     0x03,
00487                 OUTPUT(1),          0x01,
00488                 REPORT_COUNT(1),    0x06,
00489                 REPORT_SIZE(1),     0x08,
00490                 LOGICAL_MINIMUM(1),     0x00,
00491                 LOGICAL_MAXIMUM(2),     0xff, 0x00,
00492                 USAGE_PAGE(1),      0x07,
00493                 USAGE_MINIMUM(1),       0x00,
00494                 USAGE_MAXIMUM(2),       0xff, 0x00,
00495                 INPUT(1),           0x00,
00496                 END_COLLECTION(0),
00497 
00498                 // Mouse
00499                 USAGE_PAGE(1), 0x01,               // Generic Desktop
00500                 USAGE(1), 0x02,                    // Mouse
00501                 COLLECTION(1), 0x01,               // Application
00502                 USAGE(1), 0x01,                    // Pointer
00503                 COLLECTION(1), 0x00,               // Physical
00504                 REPORT_ID(1),       REPORT_ID_MOUSE,
00505 
00506                 USAGE_PAGE(1), 0x01,                // Generic Desktop
00507                 USAGE(1), 0x30,                     // X
00508                 USAGE(1), 0x31,                     // Y
00509                 LOGICAL_MINIMUM(1), 0x00,           // 0
00510                 LOGICAL_MAXIMUM(2), 0xff, 0x7f,     // 32767
00511                 REPORT_SIZE(1), 0x10,
00512                 REPORT_COUNT(1), 0x02,
00513                 INPUT(1), 0x02,                     // Data, Variable, Absolute
00514 
00515                 USAGE_PAGE(1), 0x01,                // Generic Desktop
00516                 USAGE(1), 0x38,                     // scroll
00517                 LOGICAL_MINIMUM(1), 0x81,           // -127
00518                 LOGICAL_MAXIMUM(1), 0x7f,           // 127
00519                 REPORT_SIZE(1), 0x08,
00520                 REPORT_COUNT(1), 0x01,
00521                 INPUT(1), 0x06,                     // Data, Variable, Relative
00522 
00523                 USAGE_PAGE(1), 0x09,                // Buttons
00524                 USAGE_MINIMUM(1), 0x01,
00525                 USAGE_MAXIMUM(1), 0x03,
00526                 LOGICAL_MINIMUM(1), 0x00,           // 0
00527                 LOGICAL_MAXIMUM(1), 0x01,           // 1
00528                 REPORT_COUNT(1), 0x03,
00529                 REPORT_SIZE(1), 0x01,
00530                 INPUT(1), 0x02,                     // Data, Variable, Absolute
00531                 REPORT_COUNT(1), 0x01,
00532                 REPORT_SIZE(1), 0x05,
00533                 INPUT(1), 0x01,                     // Constant
00534 
00535                 END_COLLECTION(0),
00536                 END_COLLECTION(0),
00537 
00538                 // Media Control
00539                 USAGE_PAGE(1), 0x0C,
00540                 USAGE(1), 0x01,
00541                 COLLECTION(1), 0x01,
00542                 REPORT_ID(1), REPORT_ID_VOLUME,
00543                 USAGE_PAGE(1), 0x0C,
00544                 LOGICAL_MINIMUM(1), 0x00,
00545                 LOGICAL_MAXIMUM(1), 0x01,
00546                 REPORT_SIZE(1), 0x01,
00547                 REPORT_COUNT(1), 0x07,
00548                 USAGE(1), 0xB5,             // Next Track
00549                 USAGE(1), 0xB6,             // Previous Track
00550                 USAGE(1), 0xB7,             // Stop
00551                 USAGE(1), 0xCD,             // Play / Pause
00552                 USAGE(1), 0xE2,             // Mute
00553                 USAGE(1), 0xE9,             // Volume Up
00554                 USAGE(1), 0xEA,             // Volume Down
00555                 INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
00556                 REPORT_COUNT(1), 0x01,
00557                 INPUT(1), 0x01,
00558                 END_COLLECTION(0),
00559         };
00560         reportLength = sizeof(reportDescriptor);
00561         return reportDescriptor;
00562     }
00563 
00564     return NULL;
00565 }
00566 
00567 bool USBMouseKeyboard::EP1_OUT_callback() {
00568     uint32_t bytesRead = 0;
00569     uint8_t led[65];
00570     USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
00571 
00572     // we take led[1] because led[0] is the report ID
00573     if(led[0]==REPORT_ID_UTILITY)
00574     {
00575         genericHidCallback(bytesRead-1, &led[1]);
00576     }
00577     // We activate the endpoint to be able to recceive data
00578     if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
00579         return false;
00580     return true;
00581 }
00582 
00583 
00584 uint8_t USBMouseKeyboard::lockStatus() {
00585     return lock_status;
00586 }
00587 
00588 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
00589     switch (mouse_type) {
00590     case REL_MOUSE:
00591         while (x > 127) {
00592             if (!mouseSend(127, 0, button, z)) return false;
00593             x = x - 127;
00594         }
00595         while (x < -128) {
00596             if (!mouseSend(-128, 0, button, z)) return false;
00597             x = x + 128;
00598         }
00599         while (y > 127) {
00600             if (!mouseSend(0, 127, button, z)) return false;
00601             y = y - 127;
00602         }
00603         while (y < -128) {
00604             if (!mouseSend(0, -128, button, z)) return false;
00605             y = y + 128;
00606         }
00607         return mouseSend(x, y, button, z);
00608     case ABS_MOUSE:
00609         HID_REPORT report;
00610 
00611         report.data[0] = REPORT_ID_MOUSE;
00612         report.data[1] = x & 0xff;
00613         report.data[2] = (x >> 8) & 0xff;
00614         report.data[3] = y & 0xff;
00615         report.data[4] = (y >> 8) & 0xff;
00616         report.data[5] = -z;
00617         report.data[6] = button & 0x07;
00618 
00619         report.length = 7;
00620 
00621         return send(&report);
00622     default:
00623         return false;
00624     }
00625 }
00626 
00627 bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
00628     HID_REPORT report;
00629     report.data[0] = REPORT_ID_MOUSE;
00630     report.data[1] = buttons & 0x07;
00631     report.data[2] = x;
00632     report.data[3] = y;
00633     report.data[4] = -z; // >0 to scroll down, <0 to scroll up
00634 
00635     report.length = 5;
00636 
00637     return send(&report);
00638 }
00639 
00640 bool USBMouseKeyboard::move(int16_t x, int16_t y) {
00641     return update(x, y, button, 0);
00642 }
00643 
00644 bool USBMouseKeyboard::scroll(int8_t z) {
00645     return update(0, 0, button, z);
00646 }
00647 
00648 bool USBMouseKeyboard::doubleClick() {
00649     if (!click(MOUSE_LEFT))
00650         return false;
00651     wait(0.1);
00652     return click(MOUSE_LEFT);
00653 }
00654 
00655 bool USBMouseKeyboard::click(uint8_t button) {
00656     if (!update(0, 0, button, 0))
00657         return false;
00658     wait(0.01);
00659     return update(0, 0, 0, 0);
00660 }
00661 
00662 bool USBMouseKeyboard::press(uint8_t button_) {
00663     button = button_ & 0x07;
00664     return update(0, 0, button, 0);
00665 }
00666 
00667 bool USBMouseKeyboard::release(uint8_t button_) {
00668     button = (button & (~button_)) & 0x07;
00669     return update(0, 0, button, 0);
00670 }
00671 
00672 int USBMouseKeyboard::_putc(int c) {
00673     return keyCode(c, keymap[c].modifier);
00674 }
00675 
00676 bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) {
00677     // Send a simulated keyboard keypress. Returns true if successful.
00678 
00679     HID_REPORT report;
00680 
00681     report.data[0] = REPORT_ID_KEYBOARD;
00682     report.data[1] = modifier;
00683     report.data[2] = 0;
00684     report.data[3] = keymap[key].usage;
00685     report.data[4] = 0;
00686     report.data[5] = 0;
00687     report.data[6] = 0;
00688     report.data[7] = 0;
00689     report.data[8] = 0;
00690 
00691     report.length = 9;
00692 
00693     if (!send(&report)) {
00694         return false;
00695     }
00696 
00697     report.data[1] = 0;
00698     report.data[3] = 0;
00699 
00700     if (!send(&report)) {
00701         return false;
00702     }
00703 
00704     return true;
00705 
00706 }
00707 
00708 
00709 bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
00710     HID_REPORT report;
00711 
00712     report.data[0] = REPORT_ID_VOLUME;
00713     report.data[1] = (1 << key) & 0x7f;
00714 
00715     report.length = 2;
00716 
00717     send(&report);
00718 
00719     report.data[0] = REPORT_ID_VOLUME;
00720     report.data[1] = 0;
00721 
00722     report.length = 2;
00723 
00724     return send(&report);
00725 }