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 // USBMouse.c
okini3939 0:02c293160df3 2 // USB device example: 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 "USBMouse.h"
okini3939 0:02c293160df3 7
okini3939 0:02c293160df3 8 bool USBMouse::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
okini3939 0:02c293160df3 9 switch (mouse_type) {
okini3939 0:02c293160df3 10 case REL_MOUSE:
okini3939 0:02c293160df3 11 while (x > 127) {
okini3939 0:02c293160df3 12 if (!mouseSend(127, 0, button, z)) return false;
okini3939 0:02c293160df3 13 x = x - 127;
okini3939 0:02c293160df3 14 }
okini3939 0:02c293160df3 15 while (x < -128) {
okini3939 0:02c293160df3 16 if (!mouseSend(-128, 0, button, z)) return false;
okini3939 0:02c293160df3 17 x = x + 128;
okini3939 0:02c293160df3 18 }
okini3939 0:02c293160df3 19 while (y > 127) {
okini3939 0:02c293160df3 20 if (!mouseSend(0, 127, button, z)) return false;
okini3939 0:02c293160df3 21 y = y - 127;
okini3939 0:02c293160df3 22 }
okini3939 0:02c293160df3 23 while (y < -128) {
okini3939 0:02c293160df3 24 if (!mouseSend(0, -128, button, z)) return false;
okini3939 0:02c293160df3 25 y = y + 128;
okini3939 0:02c293160df3 26 }
okini3939 0:02c293160df3 27 return mouseSend(x, y, button, z);
okini3939 0:02c293160df3 28 case ABS_MOUSE:
okini3939 0:02c293160df3 29 HID_REPORT report;
okini3939 0:02c293160df3 30
okini3939 0:02c293160df3 31 report.data[0] = x & 0xff;
okini3939 0:02c293160df3 32 report.data[1] = (x >> 8) & 0xff;
okini3939 0:02c293160df3 33 report.data[2] = y & 0xff;
okini3939 0:02c293160df3 34 report.data[3] = (y >> 8) & 0xff;
okini3939 0:02c293160df3 35 report.data[4] = -z;
okini3939 0:02c293160df3 36 report.data[5] = button & 0x07;
okini3939 0:02c293160df3 37
okini3939 0:02c293160df3 38 report.length = 6;
okini3939 0:02c293160df3 39
okini3939 0:02c293160df3 40 return send(&report);
okini3939 0:02c293160df3 41 default:
okini3939 0:02c293160df3 42 return false;
okini3939 0:02c293160df3 43 }
okini3939 0:02c293160df3 44 }
okini3939 0:02c293160df3 45
okini3939 0:02c293160df3 46 bool USBMouse::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
okini3939 0:02c293160df3 47 HID_REPORT report;
okini3939 0:02c293160df3 48 report.data[0] = buttons & 0x07;
okini3939 0:02c293160df3 49 report.data[1] = x;
okini3939 0:02c293160df3 50 report.data[2] = y;
okini3939 0:02c293160df3 51 report.data[3] = -z; // >0 to scroll down, <0 to scroll up
okini3939 0:02c293160df3 52
okini3939 0:02c293160df3 53 report.length = 4;
okini3939 0:02c293160df3 54
okini3939 0:02c293160df3 55 return send(&report);
okini3939 0:02c293160df3 56 }
okini3939 0:02c293160df3 57
okini3939 0:02c293160df3 58 bool USBMouse::move(int16_t x, int16_t y) {
okini3939 0:02c293160df3 59 return update(x, y, button, 0);
okini3939 0:02c293160df3 60 }
okini3939 0:02c293160df3 61
okini3939 0:02c293160df3 62 bool USBMouse::scroll(int8_t z) {
okini3939 0:02c293160df3 63 return update(0, 0, button, z);
okini3939 0:02c293160df3 64 }
okini3939 0:02c293160df3 65
okini3939 0:02c293160df3 66
okini3939 0:02c293160df3 67 bool USBMouse::doubleClick() {
okini3939 0:02c293160df3 68 if (!click(MOUSE_LEFT))
okini3939 0:02c293160df3 69 return false;
okini3939 0:02c293160df3 70 wait(0.1);
okini3939 0:02c293160df3 71 return click(MOUSE_LEFT);
okini3939 0:02c293160df3 72 }
okini3939 0:02c293160df3 73
okini3939 0:02c293160df3 74 bool USBMouse::click(uint8_t button) {
okini3939 0:02c293160df3 75 if (!update(0, 0, button, 0))
okini3939 0:02c293160df3 76 return false;
okini3939 0:02c293160df3 77 wait(0.01);
okini3939 0:02c293160df3 78 return update(0, 0, 0, 0);
okini3939 0:02c293160df3 79 }
okini3939 0:02c293160df3 80
okini3939 0:02c293160df3 81 bool USBMouse::press(uint8_t button_) {
okini3939 0:02c293160df3 82 button = button_ & 0x07;
okini3939 0:02c293160df3 83 return update(0, 0, button, 0);
okini3939 0:02c293160df3 84 }
okini3939 0:02c293160df3 85
okini3939 0:02c293160df3 86 bool USBMouse::release(uint8_t button_) {
okini3939 0:02c293160df3 87 button = (button & (~button_)) & 0x07;
okini3939 0:02c293160df3 88 return update(0, 0, button, 0);
okini3939 0:02c293160df3 89 }
okini3939 0:02c293160df3 90
okini3939 0:02c293160df3 91
okini3939 0:02c293160df3 92 uint8_t * USBMouse::reportDesc() {
okini3939 0:02c293160df3 93
okini3939 0:02c293160df3 94 if (mouse_type == REL_MOUSE) {
okini3939 0:02c293160df3 95 static uint8_t reportDescriptor[] = {
okini3939 0:02c293160df3 96 USAGE_PAGE(1), 0x01, // Genric Desktop
okini3939 0:02c293160df3 97 USAGE(1), 0x02, // Mouse
okini3939 0:02c293160df3 98 COLLECTION(1), 0x01, // Application
okini3939 0:02c293160df3 99 USAGE(1), 0x01, // Pointer
okini3939 0:02c293160df3 100 COLLECTION(1), 0x00, // Physical
okini3939 0:02c293160df3 101
okini3939 0:02c293160df3 102 REPORT_COUNT(1), 0x03,
okini3939 0:02c293160df3 103 REPORT_SIZE(1), 0x01,
okini3939 0:02c293160df3 104 USAGE_PAGE(1), 0x09, // Buttons
okini3939 0:02c293160df3 105 USAGE_MINIMUM(1), 0x1,
okini3939 0:02c293160df3 106 USAGE_MAXIMUM(1), 0x3,
okini3939 0:02c293160df3 107 LOGICAL_MINIMUM(1), 0x00,
okini3939 0:02c293160df3 108 LOGICAL_MAXIMUM(1), 0x01,
okini3939 0:02c293160df3 109 INPUT(1), 0x02,
okini3939 0:02c293160df3 110 REPORT_COUNT(1), 0x01,
okini3939 0:02c293160df3 111 REPORT_SIZE(1), 0x05,
okini3939 0:02c293160df3 112 INPUT(1), 0x01,
okini3939 0:02c293160df3 113
okini3939 0:02c293160df3 114 REPORT_COUNT(1), 0x03,
okini3939 0:02c293160df3 115 REPORT_SIZE(1), 0x08,
okini3939 0:02c293160df3 116 USAGE_PAGE(1), 0x01,
okini3939 0:02c293160df3 117 USAGE(1), 0x30, // X
okini3939 0:02c293160df3 118 USAGE(1), 0x31, // Y
okini3939 0:02c293160df3 119 USAGE(1), 0x38, // scroll
okini3939 0:02c293160df3 120 LOGICAL_MINIMUM(1), 0x81,
okini3939 0:02c293160df3 121 LOGICAL_MAXIMUM(1), 0x7f,
okini3939 0:02c293160df3 122 INPUT(1), 0x06, // Relative data
okini3939 0:02c293160df3 123
okini3939 0:02c293160df3 124 END_COLLECTION(0),
okini3939 0:02c293160df3 125 END_COLLECTION(0),
okini3939 0:02c293160df3 126 };
okini3939 0:02c293160df3 127 reportLength = sizeof(reportDescriptor);
okini3939 0:02c293160df3 128 return reportDescriptor;
okini3939 0:02c293160df3 129 } else if (mouse_type == ABS_MOUSE) {
okini3939 0:02c293160df3 130 static uint8_t reportDescriptor[] = {
okini3939 0:02c293160df3 131
okini3939 0:02c293160df3 132 USAGE_PAGE(1), 0x01, // Generic Desktop
okini3939 0:02c293160df3 133 USAGE(1), 0x02, // Mouse
okini3939 0:02c293160df3 134 COLLECTION(1), 0x01, // Application
okini3939 0:02c293160df3 135 USAGE(1), 0x01, // Pointer
okini3939 0:02c293160df3 136 COLLECTION(1), 0x00, // Physical
okini3939 0:02c293160df3 137
okini3939 0:02c293160df3 138 USAGE_PAGE(1), 0x01, // Generic Desktop
okini3939 0:02c293160df3 139 USAGE(1), 0x30, // X
okini3939 0:02c293160df3 140 USAGE(1), 0x31, // Y
okini3939 0:02c293160df3 141 LOGICAL_MINIMUM(1), 0x00, // 0
okini3939 0:02c293160df3 142 LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
okini3939 0:02c293160df3 143 REPORT_SIZE(1), 0x10,
okini3939 0:02c293160df3 144 REPORT_COUNT(1), 0x02,
okini3939 0:02c293160df3 145 INPUT(1), 0x02, // Data, Variable, Absolute
okini3939 0:02c293160df3 146
okini3939 0:02c293160df3 147 USAGE_PAGE(1), 0x01, // Generic Desktop
okini3939 0:02c293160df3 148 USAGE(1), 0x38, // scroll
okini3939 0:02c293160df3 149 LOGICAL_MINIMUM(1), 0x81, // -127
okini3939 0:02c293160df3 150 LOGICAL_MAXIMUM(1), 0x7f, // 127
okini3939 0:02c293160df3 151 REPORT_SIZE(1), 0x08,
okini3939 0:02c293160df3 152 REPORT_COUNT(1), 0x01,
okini3939 0:02c293160df3 153 INPUT(1), 0x06, // Data, Variable, Relative
okini3939 0:02c293160df3 154
okini3939 0:02c293160df3 155 USAGE_PAGE(1), 0x09, // Buttons
okini3939 0:02c293160df3 156 USAGE_MINIMUM(1), 0x01,
okini3939 0:02c293160df3 157 USAGE_MAXIMUM(1), 0x03,
okini3939 0:02c293160df3 158 LOGICAL_MINIMUM(1), 0x00, // 0
okini3939 0:02c293160df3 159 LOGICAL_MAXIMUM(1), 0x01, // 1
okini3939 0:02c293160df3 160 REPORT_COUNT(1), 0x03,
okini3939 0:02c293160df3 161 REPORT_SIZE(1), 0x01,
okini3939 0:02c293160df3 162 INPUT(1), 0x02, // Data, Variable, Absolute
okini3939 0:02c293160df3 163 REPORT_COUNT(1), 0x01,
okini3939 0:02c293160df3 164 REPORT_SIZE(1), 0x05,
okini3939 0:02c293160df3 165 INPUT(1), 0x01, // Constant
okini3939 0:02c293160df3 166
okini3939 0:02c293160df3 167 END_COLLECTION(0),
okini3939 0:02c293160df3 168 END_COLLECTION(0)
okini3939 0:02c293160df3 169 };
okini3939 0:02c293160df3 170 reportLength = sizeof(reportDescriptor);
okini3939 0:02c293160df3 171 return reportDescriptor;
okini3939 0:02c293160df3 172 }
okini3939 0:02c293160df3 173 return NULL;
okini3939 0:02c293160df3 174 }
okini3939 0:02c293160df3 175
okini3939 0:02c293160df3 176