Dependencies:   ChaNFSSD mbed ChaNFS

Committer:
okini3939
Date:
Thu Nov 10 03:20:42 2011 +0000
Revision:
1:efbcfbae4747
Parent:
0:02c293160df3

        

Who changed what in which revision?

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