Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sun Jul 22 10:34:23 2018 +0000
Revision:
1:92574cf6e9af
Parent:
0:e086541742c3
Child:
2:265e03bf82af
Initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:e086541742c3 1 /* mbed USBJoystick Library
wim 0:e086541742c3 2 * Copyright (c) 2012, v01: Initial version, WH,
wim 0:e086541742c3 3 * Modified USBMouse code ARM Limited.
wim 0:e086541742c3 4 * (c) 2010-2011 mbed.org, MIT License
Cirrus01 1:92574cf6e9af 5 * 2016, v02: Updated USBDevice Lib, Added waitForConnect, Updated 32 bits button
wim 0:e086541742c3 6 *
wim 0:e086541742c3 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
wim 0:e086541742c3 8 * of this software and associated documentation files (the "Software"), to deal
wim 0:e086541742c3 9 * in the Software without restriction, inclumosig without limitation the rights
wim 0:e086541742c3 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
wim 0:e086541742c3 11 * copies of the Software, and to permit persons to whom the Software is
wim 0:e086541742c3 12 * furnished to do so, subject to the following conditions:
wim 0:e086541742c3 13 *
wim 0:e086541742c3 14 * The above copyright notice and this permission notice shall be included in
wim 0:e086541742c3 15 * all copies or substantial portions of the Software.
wim 0:e086541742c3 16 *
wim 0:e086541742c3 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
wim 0:e086541742c3 18 * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
wim 0:e086541742c3 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
wim 0:e086541742c3 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
wim 0:e086541742c3 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
wim 0:e086541742c3 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
wim 0:e086541742c3 23 * THE SOFTWARE.
wim 0:e086541742c3 24 */
wim 0:e086541742c3 25
wim 0:e086541742c3 26
wim 0:e086541742c3 27 #include "stdint.h"
wim 0:e086541742c3 28 #include "USBJoystick.h"
wim 0:e086541742c3 29
Cirrus01 1:92574cf6e9af 30 bool USBJoystick::update(int16_t t, int16_t r, int16_t d, int16_t w, int16_t x, int16_t y, uint32_t buttons, uint8_t hat)
Cirrus01 1:92574cf6e9af 31 {
wim 0:e086541742c3 32
Cirrus01 1:92574cf6e9af 33 _t = t;
Cirrus01 1:92574cf6e9af 34 _r = r;
Cirrus01 1:92574cf6e9af 35 _d = d;
Cirrus01 1:92574cf6e9af 36 _w = w;
Cirrus01 1:92574cf6e9af 37 _x = x;
Cirrus01 1:92574cf6e9af 38 _y = y;
Cirrus01 1:92574cf6e9af 39 _buttons = buttons;
Cirrus01 1:92574cf6e9af 40 _hat = hat;
wim 0:e086541742c3 41
Cirrus01 1:92574cf6e9af 42 return update();
wim 0:e086541742c3 43 }
Cirrus01 1:92574cf6e9af 44
Cirrus01 1:92574cf6e9af 45 bool USBJoystick::update()
Cirrus01 1:92574cf6e9af 46 {
Cirrus01 1:92574cf6e9af 47 HID_REPORT report;
wim 0:e086541742c3 48
Cirrus01 1:92574cf6e9af 49 // Fill the report according to the Joystick Descriptor
Cirrus01 1:92574cf6e9af 50 report.data[0] = _t & 0xff;
Cirrus01 1:92574cf6e9af 51 report.data[1] = _r & 0xff;
Cirrus01 1:92574cf6e9af 52 report.data[2] = _d & 0xff;
Cirrus01 1:92574cf6e9af 53 report.data[3] = _w & 0xff;
Cirrus01 1:92574cf6e9af 54 report.data[4] = _x & 0xff;
Cirrus01 1:92574cf6e9af 55 report.data[5] = _y & 0xff;
wim 0:e086541742c3 56
Cirrus01 1:92574cf6e9af 57 #if (HAT4 == 1)
Cirrus01 1:92574cf6e9af 58 //Use 4 bit padding for hat4 or hat8
Cirrus01 1:92574cf6e9af 59 report.data[6] = (_hat & 0x0f) ;
Cirrus01 1:92574cf6e9af 60 #endif
wim 0:e086541742c3 61
Cirrus01 1:92574cf6e9af 62 #if (HAT8 == 1)
Cirrus01 1:92574cf6e9af 63 //Use 4 bit padding for hat4 or hat8
Cirrus01 1:92574cf6e9af 64 report.data[6] = (_hat & 0xff) ;
Cirrus01 1:92574cf6e9af 65 #endif
wim 0:e086541742c3 66
Cirrus01 1:92574cf6e9af 67 #if (BUTTONS4 == 1)
Cirrus01 1:92574cf6e9af 68 //Use 4 bit padding for buttons
Cirrus01 1:92574cf6e9af 69 report.data[7] = (_buttons & 0x0f) ;
Cirrus01 1:92574cf6e9af 70 report.length = 8;
Cirrus01 1:92574cf6e9af 71 #endif
wim 0:e086541742c3 72
Cirrus01 1:92574cf6e9af 73 #if (BUTTONS8 == 1)
Cirrus01 1:92574cf6e9af 74 //Use 8 bits for buttons
Cirrus01 1:92574cf6e9af 75 report.data[7] = (_buttons & 0xff) ;
Cirrus01 1:92574cf6e9af 76 report.length = 8;
wim 0:e086541742c3 77 #endif
wim 0:e086541742c3 78
Cirrus01 1:92574cf6e9af 79 #if (BUTTONS32 == 1)
Cirrus01 1:92574cf6e9af 80 //No bit padding for 32 buttons
Cirrus01 1:92574cf6e9af 81 report.data[7] = (_buttons >> 0) & 0xff;
Cirrus01 1:92574cf6e9af 82 report.data[8] = (_buttons >> 8) & 0xff;
Cirrus01 1:92574cf6e9af 83 report.data[9] = (_buttons >> 16) & 0xff;
Cirrus01 1:92574cf6e9af 84 report.data[10] = (_buttons >> 24) & 0xff;
Cirrus01 1:92574cf6e9af 85 report.length = 11;
wim 0:e086541742c3 86 #endif
wim 0:e086541742c3 87
Cirrus01 1:92574cf6e9af 88 return send(&report);
Cirrus01 1:92574cf6e9af 89 }
wim 0:e086541742c3 90
Cirrus01 1:92574cf6e9af 91 bool USBJoystick::throttle(int16_t t)
Cirrus01 1:92574cf6e9af 92 {
Cirrus01 1:92574cf6e9af 93 _t = t;
Cirrus01 1:92574cf6e9af 94 return update();
wim 0:e086541742c3 95 }
wim 0:e086541742c3 96
Cirrus01 1:92574cf6e9af 97 bool USBJoystick::rudder(int16_t r)
Cirrus01 1:92574cf6e9af 98 {
Cirrus01 1:92574cf6e9af 99 _r = r;
Cirrus01 1:92574cf6e9af 100 return update();
Cirrus01 1:92574cf6e9af 101 }
Cirrus01 1:92574cf6e9af 102
Cirrus01 1:92574cf6e9af 103 bool USBJoystick::diveBreak(int16_t d)
Cirrus01 1:92574cf6e9af 104 {
Cirrus01 1:92574cf6e9af 105 _d = d;
Cirrus01 1:92574cf6e9af 106 return update();
wim 0:e086541742c3 107 }
wim 0:e086541742c3 108
Cirrus01 1:92574cf6e9af 109 bool USBJoystick::flaps(int16_t w)
Cirrus01 1:92574cf6e9af 110 {
Cirrus01 1:92574cf6e9af 111 _w = w;
Cirrus01 1:92574cf6e9af 112 return update();
wim 0:e086541742c3 113 }
wim 0:e086541742c3 114
Cirrus01 1:92574cf6e9af 115 bool USBJoystick::move(int16_t x, int16_t y)
Cirrus01 1:92574cf6e9af 116 {
Cirrus01 1:92574cf6e9af 117 _x = x;
Cirrus01 1:92574cf6e9af 118 _y = y;
Cirrus01 1:92574cf6e9af 119 return update();
wim 0:e086541742c3 120 }
wim 0:e086541742c3 121
Cirrus01 1:92574cf6e9af 122 bool USBJoystick::buttons(uint32_t buttons)
Cirrus01 1:92574cf6e9af 123 {
Cirrus01 1:92574cf6e9af 124 _buttons = buttons;
Cirrus01 1:92574cf6e9af 125 return update();
wim 0:e086541742c3 126 }
wim 0:e086541742c3 127
Cirrus01 1:92574cf6e9af 128 bool USBJoystick::hat(uint8_t hat)
Cirrus01 1:92574cf6e9af 129 {
Cirrus01 1:92574cf6e9af 130 _hat = hat;
Cirrus01 1:92574cf6e9af 131 return update();
wim 0:e086541742c3 132 }
wim 0:e086541742c3 133
wim 0:e086541742c3 134
Cirrus01 1:92574cf6e9af 135 void USBJoystick::_init()
Cirrus01 1:92574cf6e9af 136 {
Cirrus01 1:92574cf6e9af 137 _t = -127;
Cirrus01 1:92574cf6e9af 138 _r = -127;
Cirrus01 1:92574cf6e9af 139 _d = -127;
Cirrus01 1:92574cf6e9af 140 _w = -127;
Cirrus01 1:92574cf6e9af 141 _x = 0;
Cirrus01 1:92574cf6e9af 142 _y = 0;
Cirrus01 1:92574cf6e9af 143 _buttons = 0x00000000;
Cirrus01 1:92574cf6e9af 144 _hat = 0x00;
wim 0:e086541742c3 145 }
wim 0:e086541742c3 146
wim 0:e086541742c3 147
Cirrus01 1:92574cf6e9af 148 uint8_t * USBJoystick::reportDesc()
Cirrus01 1:92574cf6e9af 149 {
Cirrus01 1:92574cf6e9af 150 static uint8_t reportDescriptor[] = {
wim 0:e086541742c3 151
Cirrus01 1:92574cf6e9af 152 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 1:92574cf6e9af 153 LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0)
Cirrus01 1:92574cf6e9af 154 USAGE(1), 0x04, // Usage (Joystick)
Cirrus01 1:92574cf6e9af 155 COLLECTION(1), 0x01, // Application
Cirrus01 1:92574cf6e9af 156 USAGE_PAGE(1), 0x02, // Simulation Controls
Cirrus01 1:92574cf6e9af 157 USAGE(1), 0xBB, // Throttle
Cirrus01 1:92574cf6e9af 158 USAGE(1), 0xBA, // Rudder
Cirrus01 1:92574cf6e9af 159 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 160 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 161 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 162 REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 163 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 1:92574cf6e9af 164 USAGE(1), 0xB6, // Dive Breaks
Cirrus01 1:92574cf6e9af 165 USAGE(1), 0xC3, // Wing Flaps
Cirrus01 1:92574cf6e9af 166 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 167 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 168 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 169 REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 170 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 1:92574cf6e9af 171 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 1:92574cf6e9af 172 USAGE(1), 0x01, // Usage (Pointer)
Cirrus01 1:92574cf6e9af 173 COLLECTION(1), 0x00, // Physical
Cirrus01 1:92574cf6e9af 174 USAGE(1), 0x30, // X
Cirrus01 1:92574cf6e9af 175 USAGE(1), 0x31, // Y
wim 0:e086541742c3 176 // 8 bit values
Cirrus01 1:92574cf6e9af 177 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 178 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 179 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 180 REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 181 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 182 // 16 bit values
wim 0:e086541742c3 183 // LOGICAL_MINIMUM(1), 0x00, // 0
wim 0:e086541742c3 184 // LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
wim 0:e086541742c3 185 // REPORT_SIZE(1), 0x10,
wim 0:e086541742c3 186 // REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 187 // INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 188
Cirrus01 1:92574cf6e9af 189 END_COLLECTION(0),
wim 0:e086541742c3 190
wim 0:e086541742c3 191 #if (HAT4 == 1)
wim 0:e086541742c3 192 // 4 Position Hat Switch
Cirrus01 1:92574cf6e9af 193 USAGE(1), 0x39, // Usage (Hat switch)
Cirrus01 1:92574cf6e9af 194 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 195 LOGICAL_MAXIMUM(1), 0x03, // 3
Cirrus01 1:92574cf6e9af 196 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 1:92574cf6e9af 197 PHYSICAL_MAXIMUM(2), 0x0E, 0x01, // Physical_Maximum (270)
Cirrus01 1:92574cf6e9af 198 UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos)
Cirrus01 1:92574cf6e9af 199 REPORT_SIZE(1), 0x04,
Cirrus01 1:92574cf6e9af 200 REPORT_COUNT(1), 0x01,
Cirrus01 1:92574cf6e9af 201 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 202 #endif
wim 0:e086541742c3 203 #if (HAT8 == 1)
wim 0:e086541742c3 204 // 8 Position Hat Switch
Cirrus01 1:92574cf6e9af 205 USAGE(1), 0x39, // Usage (Hat switch)
Cirrus01 1:92574cf6e9af 206 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 207 LOGICAL_MAXIMUM(1), 0x07, // 7
Cirrus01 1:92574cf6e9af 208 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 1:92574cf6e9af 209 PHYSICAL_MAXIMUM(2), 0x3B, 0x01, // Physical_Maximum (315)
Cirrus01 1:92574cf6e9af 210 UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos)
Cirrus01 1:92574cf6e9af 211 REPORT_SIZE(1), 0x04,
Cirrus01 1:92574cf6e9af 212 REPORT_COUNT(1), 0x01,
Cirrus01 1:92574cf6e9af 213 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 214 #endif
wim 0:e086541742c3 215
wim 0:e086541742c3 216 // Padding 4 bits
Cirrus01 1:92574cf6e9af 217 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 218 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 219 INPUT(1), 0x01, // Constant
wim 0:e086541742c3 220
wim 0:e086541742c3 221
wim 0:e086541742c3 222 #if (BUTTONS4 == 1)
wim 0:e086541742c3 223 // 4 Buttons
Cirrus01 1:92574cf6e9af 224 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 225 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 226 USAGE_MAXIMUM(1), 0x04, // 4
Cirrus01 1:92574cf6e9af 227 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 228 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 229 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 230 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 231 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 232 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 233 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 234
wim 0:e086541742c3 235 // Padding 4 bits
Cirrus01 1:92574cf6e9af 236 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 237 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 238 INPUT(1), 0x01, // Constant
wim 0:e086541742c3 239
wim 0:e086541742c3 240 #endif
wim 0:e086541742c3 241 #if (BUTTONS8 == 1)
wim 0:e086541742c3 242 // 8 Buttons
Cirrus01 1:92574cf6e9af 243 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 244 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 245 USAGE_MAXIMUM(1), 0x08, // 8
Cirrus01 1:92574cf6e9af 246 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 247 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 248 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 249 REPORT_COUNT(1), 0x08,
Cirrus01 1:92574cf6e9af 250 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 251 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 252 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 253 #endif
wim 0:e086541742c3 254
wim 0:e086541742c3 255 #if (BUTTONS32 == 1)
wim 0:e086541742c3 256 // 32 Buttons
Cirrus01 1:92574cf6e9af 257 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 258 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 259 USAGE_MAXIMUM(1), 0x20, // 32
Cirrus01 1:92574cf6e9af 260 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 261 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 262 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 263 REPORT_COUNT(1), 0x20,
Cirrus01 1:92574cf6e9af 264 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 265 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 266 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 267 #endif
wim 0:e086541742c3 268
Cirrus01 1:92574cf6e9af 269 END_COLLECTION(0)
Cirrus01 1:92574cf6e9af 270 };
wim 0:e086541742c3 271
Cirrus01 1:92574cf6e9af 272 reportLength = sizeof(reportDescriptor);
Cirrus01 1:92574cf6e9af 273 return reportDescriptor;
wim 0:e086541742c3 274 }