First Release
Out_PS3USB/USBHID/USBJoystick.cpp@0:e1265f6b3565, 2013-07-27 (annotated)
- Committer:
- sankichi
- Date:
- Sat Jul 27 14:05:47 2013 +0000
- Revision:
- 0:e1265f6b3565
First Release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sankichi | 0:e1265f6b3565 | 1 | /* Copyright (c) 2010-2011 mbed.org, MIT License |
sankichi | 0:e1265f6b3565 | 2 | * Modified Mouse code for Joystick - WH 2012 |
sankichi | 0:e1265f6b3565 | 3 | * |
sankichi | 0:e1265f6b3565 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
sankichi | 0:e1265f6b3565 | 5 | * and associated documentation files (the "Software"), to deal in the Software without |
sankichi | 0:e1265f6b3565 | 6 | * restriction, including without limitation the rights to use, copy, modify, merge, publish, |
sankichi | 0:e1265f6b3565 | 7 | * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the |
sankichi | 0:e1265f6b3565 | 8 | * Software is furnished to do so, subject to the following conditions: |
sankichi | 0:e1265f6b3565 | 9 | * |
sankichi | 0:e1265f6b3565 | 10 | * The above copyright notice and this permission notice shall be included in all copies or |
sankichi | 0:e1265f6b3565 | 11 | * substantial portions of the Software. |
sankichi | 0:e1265f6b3565 | 12 | * |
sankichi | 0:e1265f6b3565 | 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
sankichi | 0:e1265f6b3565 | 14 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
sankichi | 0:e1265f6b3565 | 15 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
sankichi | 0:e1265f6b3565 | 16 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
sankichi | 0:e1265f6b3565 | 17 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
sankichi | 0:e1265f6b3565 | 18 | */ |
sankichi | 0:e1265f6b3565 | 19 | |
sankichi | 0:e1265f6b3565 | 20 | #include "stdint.h" |
sankichi | 0:e1265f6b3565 | 21 | #include "USBJoystick.h" |
sankichi | 0:e1265f6b3565 | 22 | |
sankichi | 0:e1265f6b3565 | 23 | bool USBJoystick::update(int16_t x, int16_t y, int16_t z, int16_t rz, uint32_t buttons, uint8_t stick) |
sankichi | 0:e1265f6b3565 | 24 | { |
sankichi | 0:e1265f6b3565 | 25 | HID_REPORT report; |
sankichi | 0:e1265f6b3565 | 26 | int idx = 0; |
sankichi | 0:e1265f6b3565 | 27 | |
sankichi | 0:e1265f6b3565 | 28 | _x = x; |
sankichi | 0:e1265f6b3565 | 29 | _y = y; |
sankichi | 0:e1265f6b3565 | 30 | _z = z; |
sankichi | 0:e1265f6b3565 | 31 | _rz = rz; |
sankichi | 0:e1265f6b3565 | 32 | _buttons = buttons; |
sankichi | 0:e1265f6b3565 | 33 | _stick = stick; |
sankichi | 0:e1265f6b3565 | 34 | |
sankichi | 0:e1265f6b3565 | 35 | unsigned char hatswitch; |
sankichi | 0:e1265f6b3565 | 36 | if (_stick & JOYSTICK_UP) { |
sankichi | 0:e1265f6b3565 | 37 | hatswitch = 0; |
sankichi | 0:e1265f6b3565 | 38 | if (_stick & JOYSTICK_RIGHT) hatswitch = 1; |
sankichi | 0:e1265f6b3565 | 39 | if (_stick & JOYSTICK_LEFT) hatswitch = 7; |
sankichi | 0:e1265f6b3565 | 40 | } else if (_stick & JOYSTICK_RIGHT) { |
sankichi | 0:e1265f6b3565 | 41 | hatswitch = 2; |
sankichi | 0:e1265f6b3565 | 42 | if (_stick & JOYSTICK_DOWN) hatswitch = 3; |
sankichi | 0:e1265f6b3565 | 43 | } else if (_stick & JOYSTICK_DOWN) { |
sankichi | 0:e1265f6b3565 | 44 | hatswitch = 4; |
sankichi | 0:e1265f6b3565 | 45 | if (_stick & JOYSTICK_LEFT) hatswitch = 5; |
sankichi | 0:e1265f6b3565 | 46 | } else if (_stick & JOYSTICK_LEFT) { |
sankichi | 0:e1265f6b3565 | 47 | hatswitch = 6; |
sankichi | 0:e1265f6b3565 | 48 | } else { |
sankichi | 0:e1265f6b3565 | 49 | hatswitch = 0xf; |
sankichi | 0:e1265f6b3565 | 50 | } |
sankichi | 0:e1265f6b3565 | 51 | |
sankichi | 0:e1265f6b3565 | 52 | // Fill the report according to the Joystick Descriptor |
sankichi | 0:e1265f6b3565 | 53 | report.data[idx++] = _buttons & 0xff; |
sankichi | 0:e1265f6b3565 | 54 | report.data[idx++] = (_buttons>>8) & 0xff; |
sankichi | 0:e1265f6b3565 | 55 | report.data[idx++] = hatswitch & 0x0f; |
sankichi | 0:e1265f6b3565 | 56 | report.data[idx++] = _x + 0x80; |
sankichi | 0:e1265f6b3565 | 57 | report.data[idx++] = _y + 0x80; |
sankichi | 0:e1265f6b3565 | 58 | report.data[idx++] = _z + 0x80; |
sankichi | 0:e1265f6b3565 | 59 | report.data[idx++] = _rz + 0x80; |
sankichi | 0:e1265f6b3565 | 60 | |
sankichi | 0:e1265f6b3565 | 61 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 62 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 63 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 64 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 65 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 66 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 67 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 68 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 69 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 70 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 71 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 72 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 73 | report.length = idx; |
sankichi | 0:e1265f6b3565 | 74 | |
sankichi | 0:e1265f6b3565 | 75 | return send(&report); |
sankichi | 0:e1265f6b3565 | 76 | } |
sankichi | 0:e1265f6b3565 | 77 | |
sankichi | 0:e1265f6b3565 | 78 | bool USBJoystick::update() |
sankichi | 0:e1265f6b3565 | 79 | { |
sankichi | 0:e1265f6b3565 | 80 | HID_REPORT report; |
sankichi | 0:e1265f6b3565 | 81 | int idx = 0; |
sankichi | 0:e1265f6b3565 | 82 | |
sankichi | 0:e1265f6b3565 | 83 | unsigned char hatswitch; |
sankichi | 0:e1265f6b3565 | 84 | if (_stick & JOYSTICK_UP) { |
sankichi | 0:e1265f6b3565 | 85 | hatswitch = 0; |
sankichi | 0:e1265f6b3565 | 86 | if (_stick & JOYSTICK_RIGHT) hatswitch = 1; |
sankichi | 0:e1265f6b3565 | 87 | if (_stick & JOYSTICK_LEFT) hatswitch = 7; |
sankichi | 0:e1265f6b3565 | 88 | } else if (_stick & JOYSTICK_RIGHT) { |
sankichi | 0:e1265f6b3565 | 89 | hatswitch = 2; |
sankichi | 0:e1265f6b3565 | 90 | if (_stick & JOYSTICK_DOWN) hatswitch = 3; |
sankichi | 0:e1265f6b3565 | 91 | } else if (_stick & JOYSTICK_DOWN) { |
sankichi | 0:e1265f6b3565 | 92 | hatswitch = 4; |
sankichi | 0:e1265f6b3565 | 93 | if (_stick & JOYSTICK_LEFT) hatswitch = 5; |
sankichi | 0:e1265f6b3565 | 94 | } else if (_stick & JOYSTICK_LEFT) { |
sankichi | 0:e1265f6b3565 | 95 | hatswitch = 6; |
sankichi | 0:e1265f6b3565 | 96 | } else { |
sankichi | 0:e1265f6b3565 | 97 | hatswitch = 0xf; |
sankichi | 0:e1265f6b3565 | 98 | } |
sankichi | 0:e1265f6b3565 | 99 | |
sankichi | 0:e1265f6b3565 | 100 | // Fill the report according to the Joystick Descriptor |
sankichi | 0:e1265f6b3565 | 101 | report.data[idx++] = _buttons & 0xff; |
sankichi | 0:e1265f6b3565 | 102 | report.data[idx++] = (_buttons>>8) & 0xff; |
sankichi | 0:e1265f6b3565 | 103 | report.data[idx++] = hatswitch & 0x0f; |
sankichi | 0:e1265f6b3565 | 104 | report.data[idx++] = _x + 0x80; |
sankichi | 0:e1265f6b3565 | 105 | report.data[idx++] = _y + 0x80; |
sankichi | 0:e1265f6b3565 | 106 | report.data[idx++] = _z + 0x80; |
sankichi | 0:e1265f6b3565 | 107 | report.data[idx++] = _rz + 0x80; |
sankichi | 0:e1265f6b3565 | 108 | |
sankichi | 0:e1265f6b3565 | 109 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 110 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 111 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 112 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 113 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 114 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 115 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 116 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 117 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 118 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 119 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 120 | report.data[idx++] = 0; |
sankichi | 0:e1265f6b3565 | 121 | report.length = idx; |
sankichi | 0:e1265f6b3565 | 122 | |
sankichi | 0:e1265f6b3565 | 123 | return send(&report); |
sankichi | 0:e1265f6b3565 | 124 | } |
sankichi | 0:e1265f6b3565 | 125 | |
sankichi | 0:e1265f6b3565 | 126 | |
sankichi | 0:e1265f6b3565 | 127 | |
sankichi | 0:e1265f6b3565 | 128 | void USBJoystick::_init() |
sankichi | 0:e1265f6b3565 | 129 | { |
sankichi | 0:e1265f6b3565 | 130 | _x = 0; |
sankichi | 0:e1265f6b3565 | 131 | _y = 0; |
sankichi | 0:e1265f6b3565 | 132 | _z = 0; |
sankichi | 0:e1265f6b3565 | 133 | _rz = 0; |
sankichi | 0:e1265f6b3565 | 134 | _buttons = 0; |
sankichi | 0:e1265f6b3565 | 135 | _stick = 0; |
sankichi | 0:e1265f6b3565 | 136 | } |
sankichi | 0:e1265f6b3565 | 137 | |
sankichi | 0:e1265f6b3565 | 138 | |
sankichi | 0:e1265f6b3565 | 139 | uint8_t * USBJoystick::reportDesc() |
sankichi | 0:e1265f6b3565 | 140 | { |
sankichi | 0:e1265f6b3565 | 141 | static uint8_t reportDescriptor[] = |
sankichi | 0:e1265f6b3565 | 142 | { |
sankichi | 0:e1265f6b3565 | 143 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
sankichi | 0:e1265f6b3565 | 144 | 0x09, 0x05, // USAGE (Gamepad) |
sankichi | 0:e1265f6b3565 | 145 | 0xa1, 0x01, // COLLECTION (Application) |
sankichi | 0:e1265f6b3565 | 146 | |
sankichi | 0:e1265f6b3565 | 147 | 0x15, 0x00, // LOGICAL_MINIMUM (0) |
sankichi | 0:e1265f6b3565 | 148 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) |
sankichi | 0:e1265f6b3565 | 149 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) |
sankichi | 0:e1265f6b3565 | 150 | 0x45, 0x01, // PHYSICAL_MAXIMUM (1) |
sankichi | 0:e1265f6b3565 | 151 | 0x75, 0x01, // REPORT_SIZE (1) |
sankichi | 0:e1265f6b3565 | 152 | 0x95, 0x0d, // REPORT_COUNT (13) |
sankichi | 0:e1265f6b3565 | 153 | 0x05, 0x09, // USAGE_PAGE (Button) |
sankichi | 0:e1265f6b3565 | 154 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) |
sankichi | 0:e1265f6b3565 | 155 | 0x29, 0x0d, // USAGE_MAXIMUM (Button 13) |
sankichi | 0:e1265f6b3565 | 156 | 0x81, 0x02, // INPUT (Data,Var,Abs) |
sankichi | 0:e1265f6b3565 | 157 | 0x95, 0x03, // REPORT_COUNT (3) |
sankichi | 0:e1265f6b3565 | 158 | 0x81, 0x01, // INPUT (Cnst,Ary,Abs) |
sankichi | 0:e1265f6b3565 | 159 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
sankichi | 0:e1265f6b3565 | 160 | 0x25, 0x07, // LOGICAL_MAXIMUM (7) |
sankichi | 0:e1265f6b3565 | 161 | 0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM (315) |
sankichi | 0:e1265f6b3565 | 162 | 0x75, 0x04, // REPORT_SIZE (4) |
sankichi | 0:e1265f6b3565 | 163 | 0x95, 0x01, // REPORT_COUNT (1) |
sankichi | 0:e1265f6b3565 | 164 | 0x65, 0x14, // UNIT (Eng Rot:Angular Pos) |
sankichi | 0:e1265f6b3565 | 165 | 0x09, 0x39, // USAGE (Hat switch) |
sankichi | 0:e1265f6b3565 | 166 | 0x81, 0x42, // INPUT (Data,Var,Abs,Null) |
sankichi | 0:e1265f6b3565 | 167 | 0x65, 0x00, // UNIT (None) |
sankichi | 0:e1265f6b3565 | 168 | 0x95, 0x01, // REPORT_COUNT (1) |
sankichi | 0:e1265f6b3565 | 169 | 0x81, 0x01, // INPUT (Cnst,Ary,Abs) |
sankichi | 0:e1265f6b3565 | 170 | |
sankichi | 0:e1265f6b3565 | 171 | 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) |
sankichi | 0:e1265f6b3565 | 172 | 0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255) |
sankichi | 0:e1265f6b3565 | 173 | 0x09, 0x30, // USAGE (X) |
sankichi | 0:e1265f6b3565 | 174 | 0x09, 0x31, // USAGE (Y) |
sankichi | 0:e1265f6b3565 | 175 | 0x09, 0x32, // USAGE (Z) |
sankichi | 0:e1265f6b3565 | 176 | 0x09, 0x35, // USAGE (Rz) |
sankichi | 0:e1265f6b3565 | 177 | 0x75, 0x08, // REPORT_SIZE (8) |
sankichi | 0:e1265f6b3565 | 178 | 0x95, 0x04, // REPORT_COUNT (4) |
sankichi | 0:e1265f6b3565 | 179 | 0x81, 0x02, // INPUT (Data,Var,Abs) |
sankichi | 0:e1265f6b3565 | 180 | |
sankichi | 0:e1265f6b3565 | 181 | 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Specific) |
sankichi | 0:e1265f6b3565 | 182 | 0x09, 0x20, // Unknown |
sankichi | 0:e1265f6b3565 | 183 | 0x09, 0x21, // Unknown |
sankichi | 0:e1265f6b3565 | 184 | 0x09, 0x22, // Unknown |
sankichi | 0:e1265f6b3565 | 185 | 0x09, 0x23, // Unknown |
sankichi | 0:e1265f6b3565 | 186 | 0x09, 0x24, // Unknown |
sankichi | 0:e1265f6b3565 | 187 | 0x09, 0x25, // Unknown |
sankichi | 0:e1265f6b3565 | 188 | 0x09, 0x26, // Unknown |
sankichi | 0:e1265f6b3565 | 189 | 0x09, 0x27, // Unknown |
sankichi | 0:e1265f6b3565 | 190 | 0x09, 0x28, // Unknown |
sankichi | 0:e1265f6b3565 | 191 | 0x09, 0x29, // Unknown |
sankichi | 0:e1265f6b3565 | 192 | 0x09, 0x2a, // Unknown |
sankichi | 0:e1265f6b3565 | 193 | 0x09, 0x2b, // Unknown |
sankichi | 0:e1265f6b3565 | 194 | 0x95, 0x0c, // REPORT_COUNT (12) |
sankichi | 0:e1265f6b3565 | 195 | 0x81, 0x02, // INPUT (Data,Var,Abs) |
sankichi | 0:e1265f6b3565 | 196 | 0x0a, 0x21, 0x26, // Unknown |
sankichi | 0:e1265f6b3565 | 197 | 0x95, 0x08, // REPORT_COUNT (8) |
sankichi | 0:e1265f6b3565 | 198 | 0xb1, 0x02, // FEATURE (Data,Var,Abs) |
sankichi | 0:e1265f6b3565 | 199 | |
sankichi | 0:e1265f6b3565 | 200 | 0xc0, // END_COLLECTION |
sankichi | 0:e1265f6b3565 | 201 | |
sankichi | 0:e1265f6b3565 | 202 | /* |
sankichi | 0:e1265f6b3565 | 203 | USAGE_PAGE(1), 0x01, |
sankichi | 0:e1265f6b3565 | 204 | USAGE(1), 0x04, |
sankichi | 0:e1265f6b3565 | 205 | COLLECTION(1), 0x01, |
sankichi | 0:e1265f6b3565 | 206 | USAGE(1), 0x01, |
sankichi | 0:e1265f6b3565 | 207 | COLLECTION(1), 0x00, |
sankichi | 0:e1265f6b3565 | 208 | |
sankichi | 0:e1265f6b3565 | 209 | USAGE_PAGE(1), 0x09, |
sankichi | 0:e1265f6b3565 | 210 | USAGE_MINIMUM(1), 0x01, |
sankichi | 0:e1265f6b3565 | 211 | USAGE_MAXIMUM(1), 0x0C, |
sankichi | 0:e1265f6b3565 | 212 | LOGICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 213 | LOGICAL_MAXIMUM(1), 0x01, |
sankichi | 0:e1265f6b3565 | 214 | PHYSICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 215 | PHYSICAL_MAXIMUM(1), 0x01, |
sankichi | 0:e1265f6b3565 | 216 | REPORT_SIZE(1), 0x01, |
sankichi | 0:e1265f6b3565 | 217 | REPORT_COUNT(1), 0x0C, |
sankichi | 0:e1265f6b3565 | 218 | INPUT(1), 0x02, |
sankichi | 0:e1265f6b3565 | 219 | |
sankichi | 0:e1265f6b3565 | 220 | USAGE_PAGE(1), 0x01, |
sankichi | 0:e1265f6b3565 | 221 | USAGE(1), 0x39, |
sankichi | 0:e1265f6b3565 | 222 | LOGICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 223 | LOGICAL_MAXIMUM(1), 0x07, |
sankichi | 0:e1265f6b3565 | 224 | PHYSICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 225 | PHYSICAL_MAXIMUM(2), 0x3B, 0x01, |
sankichi | 0:e1265f6b3565 | 226 | UNIT(1), 0x14, |
sankichi | 0:e1265f6b3565 | 227 | REPORT_SIZE(1), 0x04, |
sankichi | 0:e1265f6b3565 | 228 | REPORT_COUNT(1), 0x01, |
sankichi | 0:e1265f6b3565 | 229 | INPUT(1), 0x42, |
sankichi | 0:e1265f6b3565 | 230 | |
sankichi | 0:e1265f6b3565 | 231 | USAGE_PAGE(1), 0x01, |
sankichi | 0:e1265f6b3565 | 232 | USAGE(1), 0x30, |
sankichi | 0:e1265f6b3565 | 233 | USAGE(1), 0x31, |
sankichi | 0:e1265f6b3565 | 234 | USAGE(1), 0x32, |
sankichi | 0:e1265f6b3565 | 235 | USAGE(1), 0x35, |
sankichi | 0:e1265f6b3565 | 236 | LOGICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 237 | LOGICAL_MAXIMUM(2), 0xff, 0x00, |
sankichi | 0:e1265f6b3565 | 238 | PHYSICAL_MINIMUM(1), 0x00, |
sankichi | 0:e1265f6b3565 | 239 | PHYSICAL_MAXIMUM(2), 0xff, 0x00, |
sankichi | 0:e1265f6b3565 | 240 | UNIT(2), 0x00, 0x00, |
sankichi | 0:e1265f6b3565 | 241 | REPORT_SIZE(1), 0x08, |
sankichi | 0:e1265f6b3565 | 242 | REPORT_COUNT(1), 0x04, |
sankichi | 0:e1265f6b3565 | 243 | INPUT(1), 0x02, |
sankichi | 0:e1265f6b3565 | 244 | |
sankichi | 0:e1265f6b3565 | 245 | END_COLLECTION(0), |
sankichi | 0:e1265f6b3565 | 246 | END_COLLECTION(0), |
sankichi | 0:e1265f6b3565 | 247 | */ |
sankichi | 0:e1265f6b3565 | 248 | }; |
sankichi | 0:e1265f6b3565 | 249 | |
sankichi | 0:e1265f6b3565 | 250 | reportLength = sizeof(reportDescriptor); |
sankichi | 0:e1265f6b3565 | 251 | return reportDescriptor; |
sankichi | 0:e1265f6b3565 | 252 | } |
sankichi | 0:e1265f6b3565 | 253 | |
sankichi | 0:e1265f6b3565 | 254 |