USBMSD test for GR-PEACH

Dependencies:   USBDevice USBMSD_SD mbed

Fork of USBMSD_SD_HelloWorld_Mbed by Samuel Mokrani

Committer:
samux
Date:
Wed Nov 16 17:17:42 2011 +0000
Revision:
11:a26e7b7a1221
GOOD COMMIT: msd and hid work even on MAC...

Who changed what in which revision?

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