ADC Niose test Connect four analog signals to your MBED. and then run the Windows app. The four traces are displayed on an oscilloscope like display. I have used a USB HID DEVICE link, so connections to D+, D- are required. The MBED code is otherwise quite basic, So you can modify it to your own test needs. Additionaly, there is a 16 bit count value, in my MBED code Mainly to test if MSB & LSB are correct.

Dependencies:   mbed

Committer:
ceri
Date:
Sat Nov 19 22:54:22 2011 +0000
Revision:
0:cbe01b678bd4
just enough to work

Who changed what in which revision?

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