First Release

Dependencies:   USBDevice

Committer:
sankichi
Date:
Sat Jul 27 14:05:47 2013 +0000
Revision:
0:e1265f6b3565
First Release

Who changed what in which revision?

UserRevisionLine numberNew 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