B. H. / Mbed 2 deprecated trolololol

Dependencies:   mbed

Committer:
znuh
Date:
Tue Nov 29 21:26:20 2011 +0000
Revision:
0:505207de8566

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
znuh 0:505207de8566 1 /* Keyboard_RelMouse.c */
znuh 0:505207de8566 2
znuh 0:505207de8566 3 /* USB device example: Keyboard and a relative mouse */
znuh 0:505207de8566 4 /* Copyright (c) 2011 ARM Limited. All rights reserved. */
znuh 0:505207de8566 5
znuh 0:505207de8566 6 #include "stdint.h"
znuh 0:505207de8566 7
znuh 0:505207de8566 8 #include "USBMouseKeyboard.h"
znuh 0:505207de8566 9
znuh 0:505207de8566 10 uint8_t * USBMouseKeyboard::ReportDesc() {
znuh 0:505207de8566 11 if (mouse_type == REL_MOUSE) {
znuh 0:505207de8566 12 static uint8_t reportDescriptor[] = {
znuh 0:505207de8566 13 /* Keyboard */
znuh 0:505207de8566 14 USAGE_PAGE(1), 0x01,
znuh 0:505207de8566 15 USAGE(1), 0x06,
znuh 0:505207de8566 16 COLLECTION(1), 0x01,
znuh 0:505207de8566 17 REPORT_ID(1), REPORT_ID_KEYBOARD,
znuh 0:505207de8566 18 USAGE_PAGE(1), 0x07,
znuh 0:505207de8566 19 USAGE_MINIMUM(1), 0xE0,
znuh 0:505207de8566 20 USAGE_MAXIMUM(1), 0xE7,
znuh 0:505207de8566 21 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 22 LOGICAL_MAXIMUM(1), 0x01,
znuh 0:505207de8566 23 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 24 REPORT_COUNT(1), 0x08,
znuh 0:505207de8566 25 INPUT(1), 0x02,
znuh 0:505207de8566 26 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 27 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 28 INPUT(1), 0x01,
znuh 0:505207de8566 29 REPORT_COUNT(1), 0x05,
znuh 0:505207de8566 30 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 31 USAGE_PAGE(1), 0x08,
znuh 0:505207de8566 32 USAGE_MINIMUM(1), 0x01,
znuh 0:505207de8566 33 USAGE_MAXIMUM(1), 0x05,
znuh 0:505207de8566 34 OUTPUT(1), 0x02,
znuh 0:505207de8566 35 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 36 REPORT_SIZE(1), 0x03,
znuh 0:505207de8566 37 OUTPUT(1), 0x01,
znuh 0:505207de8566 38 REPORT_COUNT(1), 0x06,
znuh 0:505207de8566 39 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 40 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 41 LOGICAL_MAXIMUM(2), 0xff, 0x00,
znuh 0:505207de8566 42 USAGE_PAGE(1), 0x07,
znuh 0:505207de8566 43 USAGE_MINIMUM(1), 0x00,
znuh 0:505207de8566 44 USAGE_MAXIMUM(2), 0xff, 0x00,
znuh 0:505207de8566 45 INPUT(1), 0x00,
znuh 0:505207de8566 46 END_COLLECTION(0),
znuh 0:505207de8566 47
znuh 0:505207de8566 48 /* Mouse */
znuh 0:505207de8566 49 USAGE_PAGE(1), 0x01, /* Generic Desktop */
znuh 0:505207de8566 50 USAGE(1), 0x02, /* Mouse */
znuh 0:505207de8566 51 COLLECTION(1), 0x01, /* Application*/
znuh 0:505207de8566 52 USAGE(1), 0x01, /* Pointer */
znuh 0:505207de8566 53 COLLECTION(1), 0x00, /* Physical */
znuh 0:505207de8566 54 REPORT_ID(1), REPORT_ID_MOUSE,
znuh 0:505207de8566 55 REPORT_COUNT(1), 0x03,
znuh 0:505207de8566 56 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 57 USAGE_PAGE(1), 0x09, /* Buttons */
znuh 0:505207de8566 58 USAGE_MINIMUM(1), 0x1,
znuh 0:505207de8566 59 USAGE_MAXIMUM(1), 0x3,
znuh 0:505207de8566 60 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 61 LOGICAL_MAXIMUM(1), 0x01,
znuh 0:505207de8566 62 INPUT(1), 0x02,
znuh 0:505207de8566 63 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 64 REPORT_SIZE(1), 0x05,
znuh 0:505207de8566 65 INPUT(1), 0x01,
znuh 0:505207de8566 66 REPORT_COUNT(1), 0x03,
znuh 0:505207de8566 67 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 68 USAGE_PAGE(1), 0x01,
znuh 0:505207de8566 69 USAGE(1), 0x30, /* X */
znuh 0:505207de8566 70 USAGE(1), 0x31, /* Y */
znuh 0:505207de8566 71 USAGE(1), 0x38, /* scroll */
znuh 0:505207de8566 72 LOGICAL_MINIMUM(1), 0x81,
znuh 0:505207de8566 73 LOGICAL_MAXIMUM(1), 0x7f,
znuh 0:505207de8566 74 INPUT(1), 0x06,
znuh 0:505207de8566 75 END_COLLECTION(0),
znuh 0:505207de8566 76 END_COLLECTION(0),
znuh 0:505207de8566 77
znuh 0:505207de8566 78
znuh 0:505207de8566 79 /* Media Control */
znuh 0:505207de8566 80 USAGE_PAGE(1), 0x0C,
znuh 0:505207de8566 81 USAGE(1), 0x01,
znuh 0:505207de8566 82 COLLECTION(1), 0x01,
znuh 0:505207de8566 83 REPORT_ID(1), REPORT_ID_VOLUME,
znuh 0:505207de8566 84 USAGE_PAGE(1), 0x0C,
znuh 0:505207de8566 85 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 86 LOGICAL_MAXIMUM(1), 0x01,
znuh 0:505207de8566 87 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 88 REPORT_COUNT(1), 0x07,
znuh 0:505207de8566 89 USAGE(1), 0xB5, /* Next Track */
znuh 0:505207de8566 90 USAGE(1), 0xB6, /* Previous Track */
znuh 0:505207de8566 91 USAGE(1), 0xB7, /* Stop */
znuh 0:505207de8566 92 USAGE(1), 0xCD, /* Play / Pause */
znuh 0:505207de8566 93 USAGE(1), 0xE2, /* Mute */
znuh 0:505207de8566 94 USAGE(1), 0xE9, /* Volume Up */
znuh 0:505207de8566 95 USAGE(1), 0xEA, /* Volume Down */
znuh 0:505207de8566 96 INPUT(1), 0x02, /* Input (Data, Variable, Absolute) */
znuh 0:505207de8566 97 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 98 INPUT(1), 0x01,
znuh 0:505207de8566 99 END_COLLECTION(0),
znuh 0:505207de8566 100 };
znuh 0:505207de8566 101 reportLength = sizeof(reportDescriptor);
znuh 0:505207de8566 102 return reportDescriptor;
znuh 0:505207de8566 103 } else if (mouse_type == ABS_MOUSE) {
znuh 0:505207de8566 104 static uint8_t reportDescriptor[] = {
znuh 0:505207de8566 105
znuh 0:505207de8566 106 /* Keyboard */
znuh 0:505207de8566 107 USAGE_PAGE(1), 0x01,
znuh 0:505207de8566 108 USAGE(1), 0x06,
znuh 0:505207de8566 109 COLLECTION(1), 0x01,
znuh 0:505207de8566 110 REPORT_ID(1), REPORT_ID_KEYBOARD,
znuh 0:505207de8566 111 USAGE_PAGE(1), 0x07,
znuh 0:505207de8566 112 USAGE_MINIMUM(1), 0xE0,
znuh 0:505207de8566 113 USAGE_MAXIMUM(1), 0xE7,
znuh 0:505207de8566 114 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 115 LOGICAL_MAXIMUM(1), 0x01,
znuh 0:505207de8566 116 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 117 REPORT_COUNT(1), 0x08,
znuh 0:505207de8566 118 INPUT(1), 0x02,
znuh 0:505207de8566 119 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 120 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 121 INPUT(1), 0x01,
znuh 0:505207de8566 122 REPORT_COUNT(1), 0x05,
znuh 0:505207de8566 123 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 124 USAGE_PAGE(1), 0x08,
znuh 0:505207de8566 125 USAGE_MINIMUM(1), 0x01,
znuh 0:505207de8566 126 USAGE_MAXIMUM(1), 0x05,
znuh 0:505207de8566 127 OUTPUT(1), 0x02,
znuh 0:505207de8566 128 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 129 REPORT_SIZE(1), 0x03,
znuh 0:505207de8566 130 OUTPUT(1), 0x01,
znuh 0:505207de8566 131 REPORT_COUNT(1), 0x06,
znuh 0:505207de8566 132 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 133 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 134 LOGICAL_MAXIMUM(2), 0xff, 0x00,
znuh 0:505207de8566 135 USAGE_PAGE(1), 0x07,
znuh 0:505207de8566 136 USAGE_MINIMUM(1), 0x00,
znuh 0:505207de8566 137 USAGE_MAXIMUM(2), 0xff, 0x00,
znuh 0:505207de8566 138 INPUT(1), 0x00,
znuh 0:505207de8566 139 END_COLLECTION(0),
znuh 0:505207de8566 140
znuh 0:505207de8566 141 /* Mouse */
znuh 0:505207de8566 142
znuh 0:505207de8566 143
znuh 0:505207de8566 144 USAGE_PAGE(1), 0x01, /* Generic Desktop */
znuh 0:505207de8566 145 USAGE(1), 0x02, /* Mouse */
znuh 0:505207de8566 146 COLLECTION(1), 0x01, /* Application*/
znuh 0:505207de8566 147 USAGE(1), 0x01, /* Pointer */
znuh 0:505207de8566 148 COLLECTION(1), 0x00, /* Physical */
znuh 0:505207de8566 149 REPORT_ID(1), REPORT_ID_MOUSE,
znuh 0:505207de8566 150
znuh 0:505207de8566 151 USAGE_PAGE(1), 0x01, /* Generic Desktop */
znuh 0:505207de8566 152 USAGE(1), 0x30, /* X */
znuh 0:505207de8566 153 USAGE(1), 0x31, /* Y */
znuh 0:505207de8566 154 LOGICAL_MINIMUM(1), 0x00, /* 0 */
znuh 0:505207de8566 155 LOGICAL_MAXIMUM(2), 0xff, 0x7f, /* 32767 */
znuh 0:505207de8566 156 REPORT_SIZE(1), 0x10,
znuh 0:505207de8566 157 REPORT_COUNT(1), 0x02,
znuh 0:505207de8566 158 INPUT(1), 0x02, /* Data, Variable, Absolute */
znuh 0:505207de8566 159
znuh 0:505207de8566 160 USAGE_PAGE(1), 0x01, /* Generic Desktop */
znuh 0:505207de8566 161 USAGE(1), 0x38, /* scroll */
znuh 0:505207de8566 162 LOGICAL_MINIMUM(1), 0x81, /* -127 */
znuh 0:505207de8566 163 LOGICAL_MAXIMUM(1), 0x7f, /* 127 */
znuh 0:505207de8566 164 REPORT_SIZE(1), 0x08,
znuh 0:505207de8566 165 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 166 INPUT(1), 0x06, /* Data, Variable, Relative */
znuh 0:505207de8566 167
znuh 0:505207de8566 168 USAGE_PAGE(1), 0x09, /* Buttons */
znuh 0:505207de8566 169 USAGE_MINIMUM(1), 0x01,
znuh 0:505207de8566 170 USAGE_MAXIMUM(1), 0x03,
znuh 0:505207de8566 171 LOGICAL_MINIMUM(1), 0x00, /* 0 */
znuh 0:505207de8566 172 LOGICAL_MAXIMUM(1), 0x01, /* 1 */
znuh 0:505207de8566 173 REPORT_COUNT(1), 0x03,
znuh 0:505207de8566 174 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 175 INPUT(1), 0x02, /* Data, Variable, Absolute */
znuh 0:505207de8566 176 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 177 REPORT_SIZE(1), 0x05,
znuh 0:505207de8566 178 INPUT(1), 0x01, /* Constant */
znuh 0:505207de8566 179
znuh 0:505207de8566 180 END_COLLECTION(0),
znuh 0:505207de8566 181 END_COLLECTION(0),
znuh 0:505207de8566 182
znuh 0:505207de8566 183
znuh 0:505207de8566 184
znuh 0:505207de8566 185
znuh 0:505207de8566 186 /* Media Control */
znuh 0:505207de8566 187 USAGE_PAGE(1), 0x0C,
znuh 0:505207de8566 188 USAGE(1), 0x01,
znuh 0:505207de8566 189 COLLECTION(1), 0x01,
znuh 0:505207de8566 190 REPORT_ID(1), REPORT_ID_VOLUME,
znuh 0:505207de8566 191 USAGE_PAGE(1), 0x0C,
znuh 0:505207de8566 192 LOGICAL_MINIMUM(1), 0x00,
znuh 0:505207de8566 193 LOGICAL_MAXIMUM(1), 0x01,
znuh 0:505207de8566 194 REPORT_SIZE(1), 0x01,
znuh 0:505207de8566 195 REPORT_COUNT(1), 0x07,
znuh 0:505207de8566 196 USAGE(1), 0xB5, /* Next Track */
znuh 0:505207de8566 197 USAGE(1), 0xB6, /* Previous Track */
znuh 0:505207de8566 198 USAGE(1), 0xB7, /* Stop */
znuh 0:505207de8566 199 USAGE(1), 0xCD, /* Play / Pause */
znuh 0:505207de8566 200 USAGE(1), 0xE2, /* Mute */
znuh 0:505207de8566 201 USAGE(1), 0xE9, /* Volume Up */
znuh 0:505207de8566 202 USAGE(1), 0xEA, /* Volume Down */
znuh 0:505207de8566 203 INPUT(1), 0x02, /* Input (Data, Variable, Absolute) */
znuh 0:505207de8566 204 REPORT_COUNT(1), 0x01,
znuh 0:505207de8566 205 INPUT(1), 0x01,
znuh 0:505207de8566 206 END_COLLECTION(0),
znuh 0:505207de8566 207 };
znuh 0:505207de8566 208 reportLength = sizeof(reportDescriptor);
znuh 0:505207de8566 209 return reportDescriptor;
znuh 0:505207de8566 210 }
znuh 0:505207de8566 211
znuh 0:505207de8566 212 return NULL;
znuh 0:505207de8566 213 }
znuh 0:505207de8566 214
znuh 0:505207de8566 215 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
znuh 0:505207de8566 216 switch (mouse_type) {
znuh 0:505207de8566 217 case REL_MOUSE:
znuh 0:505207de8566 218 while (x > 127) {
znuh 0:505207de8566 219 if (!mouseSend(127, 0, button, z)) return false;
znuh 0:505207de8566 220 x = x - 127;
znuh 0:505207de8566 221 }
znuh 0:505207de8566 222 while (x < -128) {
znuh 0:505207de8566 223 if (!mouseSend(-128, 0, button, z)) return false;
znuh 0:505207de8566 224 x = x + 128;
znuh 0:505207de8566 225 }
znuh 0:505207de8566 226 while (y > 127) {
znuh 0:505207de8566 227 if (!mouseSend(0, 127, button, z)) return false;
znuh 0:505207de8566 228 y = y - 127;
znuh 0:505207de8566 229 }
znuh 0:505207de8566 230 while (y < -128) {
znuh 0:505207de8566 231 if (!mouseSend(0, -128, button, z)) return false;
znuh 0:505207de8566 232 y = y + 128;
znuh 0:505207de8566 233 }
znuh 0:505207de8566 234 return mouseSend(x, y, button, z);
znuh 0:505207de8566 235 case ABS_MOUSE:
znuh 0:505207de8566 236 HID_REPORT report;
znuh 0:505207de8566 237
znuh 0:505207de8566 238 report.data[0] = REPORT_ID_MOUSE;
znuh 0:505207de8566 239 report.data[1] = x & 0xff;
znuh 0:505207de8566 240 report.data[2] = (x >> 8) & 0xff;
znuh 0:505207de8566 241 report.data[3] = y & 0xff;
znuh 0:505207de8566 242 report.data[4] = (y >> 8) & 0xff;
znuh 0:505207de8566 243 report.data[5] = -z;
znuh 0:505207de8566 244 report.data[6] = button & 0x07;
znuh 0:505207de8566 245
znuh 0:505207de8566 246 report.length = 7;
znuh 0:505207de8566 247
znuh 0:505207de8566 248 return USBHID_send(EPINT_IN, &report);
znuh 0:505207de8566 249 default:
znuh 0:505207de8566 250 return false;
znuh 0:505207de8566 251 }
znuh 0:505207de8566 252 }
znuh 0:505207de8566 253
znuh 0:505207de8566 254 bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
znuh 0:505207de8566 255 HID_REPORT report;
znuh 0:505207de8566 256 report.data[0] = REPORT_ID_MOUSE;
znuh 0:505207de8566 257 report.data[1] = buttons & 0x07;
znuh 0:505207de8566 258 report.data[2] = x;
znuh 0:505207de8566 259 report.data[3] = y;
znuh 0:505207de8566 260 report.data[4] = -z; /* >0 to scroll down, <0 to scroll up */
znuh 0:505207de8566 261
znuh 0:505207de8566 262 report.length = 5;
znuh 0:505207de8566 263
znuh 0:505207de8566 264 return USBHID_send(EPINT_IN, &report);
znuh 0:505207de8566 265 }
znuh 0:505207de8566 266
znuh 0:505207de8566 267 bool USBMouseKeyboard::move(int16_t x, int16_t y) {
znuh 0:505207de8566 268 return update(x, y, button, 0);
znuh 0:505207de8566 269 }
znuh 0:505207de8566 270
znuh 0:505207de8566 271 bool USBMouseKeyboard::scroll(int8_t z) {
znuh 0:505207de8566 272 return update(0, 0, button, z);
znuh 0:505207de8566 273 }
znuh 0:505207de8566 274
znuh 0:505207de8566 275 bool USBMouseKeyboard::doubleClick() {
znuh 0:505207de8566 276 if (!click(MOUSE_LEFT))
znuh 0:505207de8566 277 return false;
znuh 0:505207de8566 278 wait(0.1);
znuh 0:505207de8566 279 return click(MOUSE_LEFT);
znuh 0:505207de8566 280 }
znuh 0:505207de8566 281
znuh 0:505207de8566 282 bool USBMouseKeyboard::click(uint8_t button) {
znuh 0:505207de8566 283 if (!update(0, 0, button, 0))
znuh 0:505207de8566 284 return false;
znuh 0:505207de8566 285 wait(0.01);
znuh 0:505207de8566 286 return update(0, 0, 0, 0);
znuh 0:505207de8566 287 }
znuh 0:505207de8566 288
znuh 0:505207de8566 289 bool USBMouseKeyboard::press(uint8_t button_) {
znuh 0:505207de8566 290 button = button_ & 0x07;
znuh 0:505207de8566 291 return update(0, 0, button, 0);
znuh 0:505207de8566 292 }
znuh 0:505207de8566 293
znuh 0:505207de8566 294 bool USBMouseKeyboard::release(uint8_t button_) {
znuh 0:505207de8566 295 button = (button & (~button_)) & 0x07;
znuh 0:505207de8566 296 return update(0, 0, button, 0);
znuh 0:505207de8566 297 }
znuh 0:505207de8566 298
znuh 0:505207de8566 299 int USBMouseKeyboard::_putc(int c) {
znuh 0:505207de8566 300 return keyCode(keymap[c].modifier, c);
znuh 0:505207de8566 301 }
znuh 0:505207de8566 302
znuh 0:505207de8566 303 bool USBMouseKeyboard::keyCode(uint8_t modifier, uint8_t key) {
znuh 0:505207de8566 304 /* Send a simulated keyboard keypress. Returns true if successful. */
znuh 0:505207de8566 305
znuh 0:505207de8566 306 HID_REPORT report;
znuh 0:505207de8566 307
znuh 0:505207de8566 308 report.data[0] = REPORT_ID_KEYBOARD;
znuh 0:505207de8566 309 report.data[1] = modifier;
znuh 0:505207de8566 310 report.data[2] = 0;
znuh 0:505207de8566 311 report.data[3] = keymap[key].usage;
znuh 0:505207de8566 312 report.data[4] = 0;
znuh 0:505207de8566 313 report.data[5] = 0;
znuh 0:505207de8566 314 report.data[6] = 0;
znuh 0:505207de8566 315 report.data[7] = 0;
znuh 0:505207de8566 316 report.data[8] = 0;
znuh 0:505207de8566 317
znuh 0:505207de8566 318 report.length = 9;
znuh 0:505207de8566 319
znuh 0:505207de8566 320 if (!USBHID_send(EPINT_IN, &report)) {
znuh 0:505207de8566 321 return false;
znuh 0:505207de8566 322 }
znuh 0:505207de8566 323
znuh 0:505207de8566 324 report.data[1] = 0;
znuh 0:505207de8566 325 report.data[3] = 0;
znuh 0:505207de8566 326
znuh 0:505207de8566 327 if (!USBHID_send(EPINT_IN, &report)) {
znuh 0:505207de8566 328 return false;
znuh 0:505207de8566 329 }
znuh 0:505207de8566 330
znuh 0:505207de8566 331 return true;
znuh 0:505207de8566 332
znuh 0:505207de8566 333 }
znuh 0:505207de8566 334
znuh 0:505207de8566 335
znuh 0:505207de8566 336 bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
znuh 0:505207de8566 337 HID_REPORT report;
znuh 0:505207de8566 338
znuh 0:505207de8566 339 report.data[0] = REPORT_ID_VOLUME;
znuh 0:505207de8566 340 report.data[1] = (1 << key) & 0x7f;
znuh 0:505207de8566 341
znuh 0:505207de8566 342 report.length = 2;
znuh 0:505207de8566 343
znuh 0:505207de8566 344 return USBHID_send(EPINT_IN, &report);
znuh 0:505207de8566 345 }
znuh 0:505207de8566 346
znuh 0:505207de8566 347
znuh 0:505207de8566 348
znuh 0:505207de8566 349
znuh 0:505207de8566 350
znuh 0:505207de8566 351
znuh 0:505207de8566 352
znuh 0:505207de8566 353
znuh 0:505207de8566 354