USB Mouse (relative) example for mbed NXP LPC11U24 beta

Committer:
chris
Date:
Wed Nov 09 15:55:10 2011 +0000
Revision:
1:e089be2a6aa1
Parent:
0:163560051396
removed include for <math.h> that is already included by mbed.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:163560051396 1 /* Keyboard_RelMouse.c */
chris 0:163560051396 2
chris 0:163560051396 3 /* USB device example: Keyboard and a relative mouse */
chris 0:163560051396 4 /* Copyright (c) 2011 ARM Limited. All rights reserved. */
chris 0:163560051396 5
chris 0:163560051396 6 #include "stdint.h"
chris 0:163560051396 7
chris 0:163560051396 8 #include "USBMouseKeyboard.h"
chris 0:163560051396 9
chris 0:163560051396 10 uint8_t * USBMouseKeyboard::ReportDesc() {
chris 0:163560051396 11 static uint8_t reportDescriptor[] = {
chris 0:163560051396 12 /* Keyboard */
chris 0:163560051396 13 USAGE_PAGE(1), 0x01,
chris 0:163560051396 14 USAGE(1), 0x06,
chris 0:163560051396 15 COLLECTION(1), 0x01,
chris 0:163560051396 16 REPORT_ID(1), REPORT_ID_KEYBOARD,
chris 0:163560051396 17 USAGE_PAGE(1), 0x07,
chris 0:163560051396 18 USAGE_MINIMUM(1), 0xE0,
chris 0:163560051396 19 USAGE_MAXIMUM(1), 0xE7,
chris 0:163560051396 20 LOGICAL_MINIMUM(1), 0x00,
chris 0:163560051396 21 LOGICAL_MAXIMUM(1), 0x01,
chris 0:163560051396 22 REPORT_SIZE(1), 0x01,
chris 0:163560051396 23 REPORT_COUNT(1), 0x08,
chris 0:163560051396 24 INPUT(1), 0x02,
chris 0:163560051396 25 REPORT_COUNT(1), 0x01,
chris 0:163560051396 26 REPORT_SIZE(1), 0x08,
chris 0:163560051396 27 INPUT(1), 0x01,
chris 0:163560051396 28 REPORT_COUNT(1), 0x05,
chris 0:163560051396 29 REPORT_SIZE(1), 0x01,
chris 0:163560051396 30 USAGE_PAGE(1), 0x08,
chris 0:163560051396 31 USAGE_MINIMUM(1), 0x01,
chris 0:163560051396 32 USAGE_MAXIMUM(1), 0x05,
chris 0:163560051396 33 OUTPUT(1), 0x02,
chris 0:163560051396 34 REPORT_COUNT(1), 0x01,
chris 0:163560051396 35 REPORT_SIZE(1), 0x03,
chris 0:163560051396 36 OUTPUT(1), 0x01,
chris 0:163560051396 37 REPORT_COUNT(1), 0x06,
chris 0:163560051396 38 REPORT_SIZE(1), 0x08,
chris 0:163560051396 39 LOGICAL_MINIMUM(1), 0x00,
chris 0:163560051396 40 LOGICAL_MAXIMUM(2), 0xff, 0x00,
chris 0:163560051396 41 USAGE_PAGE(1), 0x07,
chris 0:163560051396 42 USAGE_MINIMUM(1), 0x00,
chris 0:163560051396 43 USAGE_MAXIMUM(2), 0xff, 0x00,
chris 0:163560051396 44 INPUT(1), 0x00,
chris 0:163560051396 45 END_COLLECTION(0),
chris 0:163560051396 46
chris 0:163560051396 47 /* Mouse */
chris 0:163560051396 48 USAGE_PAGE(1), 0x01, /* Generic Desktop */
chris 0:163560051396 49 USAGE(1), 0x02, /* Mouse */
chris 0:163560051396 50 COLLECTION(1), 0x01, /* Application*/
chris 0:163560051396 51 USAGE(1), 0x01, /* Pointer */
chris 0:163560051396 52 COLLECTION(1), 0x00, /* Physical */
chris 0:163560051396 53 REPORT_ID(1), REPORT_ID_MOUSE,
chris 0:163560051396 54 REPORT_COUNT(1), 0x03,
chris 0:163560051396 55 REPORT_SIZE(1), 0x01,
chris 0:163560051396 56 USAGE_PAGE(1), 0x09, /* Buttons */
chris 0:163560051396 57 USAGE_MINIMUM(1), 0x1,
chris 0:163560051396 58 USAGE_MAXIMUM(1), 0x3,
chris 0:163560051396 59 LOGICAL_MINIMUM(1), 0x00,
chris 0:163560051396 60 LOGICAL_MAXIMUM(1), 0x01,
chris 0:163560051396 61 INPUT(1), 0x02,
chris 0:163560051396 62 REPORT_COUNT(1), 0x01,
chris 0:163560051396 63 REPORT_SIZE(1), 0x05,
chris 0:163560051396 64 INPUT(1), 0x01,
chris 0:163560051396 65 REPORT_COUNT(1), 0x03,
chris 0:163560051396 66 REPORT_SIZE(1), 0x08,
chris 0:163560051396 67 USAGE_PAGE(1), 0x01,
chris 0:163560051396 68 USAGE(1), 0x30, /* X */
chris 0:163560051396 69 USAGE(1), 0x31, /* Y */
chris 0:163560051396 70 USAGE(1), 0x38, /* scroll */
chris 0:163560051396 71 LOGICAL_MINIMUM(1), 0x81,
chris 0:163560051396 72 LOGICAL_MAXIMUM(1), 0x7f,
chris 0:163560051396 73 INPUT(1), 0x06,
chris 0:163560051396 74 END_COLLECTION(0),
chris 0:163560051396 75 END_COLLECTION(0),
chris 0:163560051396 76
chris 0:163560051396 77
chris 0:163560051396 78 USAGE_PAGE(1), 0x0c, /* USAGE_PAGE (Consumer Devices) */
chris 0:163560051396 79 USAGE(1), 0x01, /* USAGE (Consumer Control) */
chris 0:163560051396 80 COLLECTION(1), 0x01, /* COLLECTION (Application) */
chris 0:163560051396 81 REPORT_ID(1), REPORT_ID_VOLUME,
chris 0:163560051396 82 LOGICAL_MINIMUM(1), 0x00, /* LOGICAL_MINIMUM (0) */
chris 0:163560051396 83 LOGICAL_MAXIMUM(1), 0x01, /* LOGICAL_MAXIMUM (1) */
chris 0:163560051396 84 USAGE(1), 0xe9, /* Volume Up */
chris 0:163560051396 85 USAGE(1), 0xea, /* Volume Down */
chris 0:163560051396 86 REPORT_SIZE(1), 0x01,
chris 0:163560051396 87 REPORT_COUNT(1), 0x02,
chris 0:163560051396 88 INPUT(1), 0x06, /* INPUT (Data,Var,Rel) */
chris 0:163560051396 89 USAGE(1), 0xe2, /* Mute */
chris 0:163560051396 90 REPORT_COUNT(1), 0x01, /* REPORT_COUNT (1) */
chris 0:163560051396 91 INPUT(1), 0x06, /* INPUT (Data,Var,Rel) */
chris 0:163560051396 92 REPORT_COUNT(1), 0x05, /* REPORT_COUNT (5) */
chris 0:163560051396 93 INPUT(1), 0x07, /* INPUT (Cnst,Var,Rel) */
chris 0:163560051396 94 END_COLLECTION(0), /* END_COLLECTION */
chris 0:163560051396 95 };
chris 0:163560051396 96 reportLength = sizeof(reportDescriptor);
chris 0:163560051396 97 return reportDescriptor;
chris 0:163560051396 98 }
chris 0:163560051396 99
chris 0:163560051396 100
chris 0:163560051396 101 bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
chris 0:163560051396 102 while (x > 127) {
chris 0:163560051396 103 if (!mouseWrite(127, 0, button, z)) return false;
chris 0:163560051396 104 x = x - 127;
chris 0:163560051396 105 }
chris 0:163560051396 106 while (x < -128) {
chris 0:163560051396 107 if (!mouseWrite(-128, 0, button, z)) return false;
chris 0:163560051396 108 x = x + 128;
chris 0:163560051396 109 }
chris 0:163560051396 110 while (y > 127) {
chris 0:163560051396 111 if (!mouseWrite(0, 127, button, z)) return false;
chris 0:163560051396 112 y = y - 127;
chris 0:163560051396 113 }
chris 0:163560051396 114 while (y < -128) {
chris 0:163560051396 115 if (!mouseWrite(0, -128, button, z)) return false;
chris 0:163560051396 116 y = y + 128;
chris 0:163560051396 117 }
chris 0:163560051396 118 return mouseWrite(x, y, button, z);
chris 0:163560051396 119 }
chris 0:163560051396 120
chris 0:163560051396 121 bool USBMouseKeyboard::mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
chris 0:163560051396 122 HID_REPORT report;
chris 0:163560051396 123
chris 0:163560051396 124 report.data[0] = REPORT_ID_MOUSE;
chris 0:163560051396 125 report.data[1] = buttons & 0x07;
chris 0:163560051396 126 report.data[2] = x;
chris 0:163560051396 127 report.data[3] = y;
chris 0:163560051396 128 report.data[4] = -z; /* >0 to scroll down, <0 to scroll up */
chris 0:163560051396 129
chris 0:163560051396 130 report.length = 5;
chris 0:163560051396 131
chris 0:163560051396 132 return USBClass_HID_sendInputReport(EPINT_IN, &report);
chris 0:163560051396 133 }