Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sun Oct 07 14:37:43 2018 +0000
Revision:
5:fa0a30d0ef3d
Parent:
4:71835900760f
Child:
6:cefcdf03ca0e
Slider Input values changed from uint to int

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 5:fa0a30d0ef3d 30 bool USBJoystick::update(int16_t x, int16_t y, int16_t b, int16_t f, int16_t r, int16_t t, uint8_t hat, uint32_t buttons)
Cirrus01 1:92574cf6e9af 31 {
wim 0:e086541742c3 32
Cirrus01 1:92574cf6e9af 33 _x = x;
Cirrus01 1:92574cf6e9af 34 _y = y;
Cirrus01 4:71835900760f 35 _b = b;
Cirrus01 4:71835900760f 36 _f = f;
Cirrus01 4:71835900760f 37 _r = r;
Cirrus01 4:71835900760f 38 _t = t;
Cirrus01 4:71835900760f 39 _hat = hat;
Cirrus01 1:92574cf6e9af 40 _buttons = buttons;
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 2:265e03bf82af 47 uint8_t pos = 0;
Cirrus01 1:92574cf6e9af 48 HID_REPORT report;
wim 0:e086541742c3 49
Cirrus01 1:92574cf6e9af 50 // Fill the report according to the Joystick Descriptor
Cirrus01 4:71835900760f 51 report.data[pos] = (_x >> 0) & 0xff;
Cirrus01 4:71835900760f 52
Cirrus01 4:71835900760f 53 report.data[++pos] = (_x >> 8) & 0xff;
Cirrus01 4:71835900760f 54 report.data[++pos] = _y & 0xff;
Cirrus01 4:71835900760f 55 report.data[++pos] = (_y >> 8) & 0xff;
Cirrus01 4:71835900760f 56 report.data[++pos] = _b & 0xff;
Cirrus01 4:71835900760f 57 report.data[++pos] = (_b >> 8) & 0xff;
Cirrus01 4:71835900760f 58 report.data[++pos] = _f & 0xff;
Cirrus01 4:71835900760f 59 report.data[++pos] = (_f >> 8) & 0xff;
Cirrus01 4:71835900760f 60 report.data[++pos] = _r & 0xff;
Cirrus01 4:71835900760f 61 report.data[++pos] = (_r >> 8) & 0xff;
Cirrus01 4:71835900760f 62 report.data[++pos] = _t & 0xff;
Cirrus01 4:71835900760f 63 report.data[++pos] = (_t >> 8) & 0xff;
wim 0:e086541742c3 64
Cirrus01 1:92574cf6e9af 65 #if (HAT4 == 1)
Cirrus01 1:92574cf6e9af 66 //Use 4 bit padding for hat4 or hat8
Cirrus01 4:71835900760f 67 report.data[++pos] = (_hat & 0x0f) ;
Cirrus01 1:92574cf6e9af 68 #endif
wim 0:e086541742c3 69
Cirrus01 1:92574cf6e9af 70 #if (HAT8 == 1)
Cirrus01 1:92574cf6e9af 71 //Use 4 bit padding for hat4 or hat8
Cirrus01 4:71835900760f 72 report.data[++pos] = (_hat & 0x0f) ;
Cirrus01 1:92574cf6e9af 73 #endif
wim 0:e086541742c3 74
Cirrus01 1:92574cf6e9af 75 #if (BUTTONS4 == 1)
Cirrus01 1:92574cf6e9af 76 //Use 4 bit padding for buttons
Cirrus01 4:71835900760f 77 report.data[++pos] = (_buttons & 0x0f) ;
Cirrus01 4:71835900760f 78 report.length = ++pos;
Cirrus01 1:92574cf6e9af 79 #endif
wim 0:e086541742c3 80
Cirrus01 1:92574cf6e9af 81 #if (BUTTONS8 == 1)
Cirrus01 1:92574cf6e9af 82 //Use 8 bits for buttons
Cirrus01 4:71835900760f 83 report.data[++pos] = (_buttons & 0xff) ;
Cirrus01 4:71835900760f 84 report.length = ++pos;
wim 0:e086541742c3 85 #endif
wim 0:e086541742c3 86
Cirrus01 1:92574cf6e9af 87 #if (BUTTONS32 == 1)
Cirrus01 1:92574cf6e9af 88 //No bit padding for 32 buttons
Cirrus01 4:71835900760f 89 report.data[++pos] = (_buttons >> 0) & 0xff;
Cirrus01 4:71835900760f 90 report.data[++pos] = (_buttons >> 8) & 0xff;
Cirrus01 4:71835900760f 91 report.data[++pos] = (_buttons >> 16) & 0xff;
Cirrus01 4:71835900760f 92 report.data[++pos] = (_buttons >> 24) & 0xff;
Cirrus01 4:71835900760f 93 report.length = ++pos;
wim 0:e086541742c3 94 #endif
wim 0:e086541742c3 95
Cirrus01 1:92574cf6e9af 96 return send(&report);
Cirrus01 1:92574cf6e9af 97 }
wim 0:e086541742c3 98
Cirrus01 5:fa0a30d0ef3d 99 bool USBJoystick::move(int16_t x, int16_t y)
Cirrus01 1:92574cf6e9af 100 {
Cirrus01 1:92574cf6e9af 101 _x = x;
Cirrus01 1:92574cf6e9af 102 _y = y;
Cirrus01 1:92574cf6e9af 103 return update();
wim 0:e086541742c3 104 }
wim 0:e086541742c3 105
Cirrus01 5:fa0a30d0ef3d 106 bool USBJoystick::diveBreak(int16_t b)
Cirrus01 4:71835900760f 107 {
Cirrus01 4:71835900760f 108 _b = b;
Cirrus01 4:71835900760f 109 return update();
Cirrus01 4:71835900760f 110 }
Cirrus01 4:71835900760f 111
Cirrus01 5:fa0a30d0ef3d 112 bool USBJoystick::flaps(int16_t f)
Cirrus01 1:92574cf6e9af 113 {
Cirrus01 4:71835900760f 114 _f = f;
Cirrus01 4:71835900760f 115 return update();
Cirrus01 4:71835900760f 116 }
Cirrus01 4:71835900760f 117
Cirrus01 5:fa0a30d0ef3d 118 bool USBJoystick::rudder(int16_t r)
Cirrus01 4:71835900760f 119 {
Cirrus01 4:71835900760f 120 _r = r;
Cirrus01 4:71835900760f 121 return update();
Cirrus01 4:71835900760f 122 }
Cirrus01 4:71835900760f 123
Cirrus01 5:fa0a30d0ef3d 124 bool USBJoystick::throttle(int16_t t)
Cirrus01 4:71835900760f 125 {
Cirrus01 4:71835900760f 126 _t = t;
Cirrus01 1:92574cf6e9af 127 return update();
wim 0:e086541742c3 128 }
wim 0:e086541742c3 129
Cirrus01 1:92574cf6e9af 130 bool USBJoystick::hat(uint8_t hat)
Cirrus01 1:92574cf6e9af 131 {
Cirrus01 1:92574cf6e9af 132 _hat = hat;
Cirrus01 1:92574cf6e9af 133 return update();
wim 0:e086541742c3 134 }
wim 0:e086541742c3 135
Cirrus01 4:71835900760f 136 bool USBJoystick::buttons(uint32_t buttons)
Cirrus01 4:71835900760f 137 {
Cirrus01 4:71835900760f 138 _buttons = buttons;
Cirrus01 4:71835900760f 139 return update();
Cirrus01 4:71835900760f 140 }
Cirrus01 4:71835900760f 141
Cirrus01 4:71835900760f 142
wim 0:e086541742c3 143
Cirrus01 1:92574cf6e9af 144 void USBJoystick::_init()
Cirrus01 1:92574cf6e9af 145 {
Cirrus01 4:71835900760f 146 _x = 0; // X-Axis
Cirrus01 4:71835900760f 147 _y = 0; // Y-Axis
Cirrus01 4:71835900760f 148 _b = 0; // Breaks
Cirrus01 4:71835900760f 149 _f = 0; // Wing Flaps
Cirrus01 4:71835900760f 150 _r = 0; // Rudder
Cirrus01 4:71835900760f 151 _t = 0; // Throttle
Cirrus01 4:71835900760f 152 _hat = 0x00; // POV Hat-Switches
Cirrus01 4:71835900760f 153 _buttons = 0x00000000; // Buttons
wim 0:e086541742c3 154 }
wim 0:e086541742c3 155
wim 0:e086541742c3 156
Cirrus01 1:92574cf6e9af 157 uint8_t * USBJoystick::reportDesc()
Cirrus01 1:92574cf6e9af 158 {
Cirrus01 1:92574cf6e9af 159 static uint8_t reportDescriptor[] = {
wim 0:e086541742c3 160
Cirrus01 4:71835900760f 161 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 4:71835900760f 162 USAGE(1), 0x04, // Usage (Joystick)
Cirrus01 4:71835900760f 163 COLLECTION(1), 0x01, // Application
Cirrus01 4:71835900760f 164
Cirrus01 4:71835900760f 165 //******* Joystick Axis and Sliders *******
Cirrus01 4:71835900760f 166 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 4:71835900760f 167 USAGE(1), 0x01, // Usage (Pointer) - (Joystick = 0x04)
Cirrus01 4:71835900760f 168 COLLECTION(1), 0x00, // Physical Usage in main.cpp
Cirrus01 4:71835900760f 169 USAGE(1), 0x30, // X X
Cirrus01 4:71835900760f 170 USAGE(1), 0x31, // Y Y
Cirrus01 4:71835900760f 171 USAGE(1), 0x32, // Z Breaks
Cirrus01 4:71835900760f 172 USAGE(1), 0x33, // Rx Flaps
Cirrus01 4:71835900760f 173 // USAGE(1), 0x34, // Ry
Cirrus01 4:71835900760f 174 // USAGE(1), 0x35, // Rz (Rudder on Usage Page 0x02)
Cirrus01 4:71835900760f 175 // USAGE(1), 0x36 // Slider (Throttle on Usage Page 0x02)
Cirrus01 5:fa0a30d0ef3d 176 LOGICAL_MINIMUM(2), 0x01, 0x80, // -32767 ; war 0, 0x00
Cirrus01 5:fa0a30d0ef3d 177 LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 ; war 65536, 0xff 0xff
Cirrus01 4:71835900760f 178 REPORT_SIZE(1), 0x10,
Cirrus01 4:71835900760f 179 REPORT_COUNT(1), 0x04,
Cirrus01 4:71835900760f 180 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 4:71835900760f 181 END_COLLECTION(0),
wim 0:e086541742c3 182
Cirrus01 4:71835900760f 183 USAGE_PAGE(1), 0x02, // Simulation Controls
Cirrus01 4:71835900760f 184 USAGE(1), 0xBA, // Usage (Rudder)
Cirrus01 4:71835900760f 185 USAGE(1), 0xBB, // Usage (Throttle)
Cirrus01 4:71835900760f 186 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 187 LOGICAL_MAXIMUM(2), 0xff, 0xff, // 65536
Cirrus01 4:71835900760f 188 REPORT_SIZE(1), 0x10,
Cirrus01 4:71835900760f 189 REPORT_COUNT(1), 0x02,
Cirrus01 4:71835900760f 190 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 191
Cirrus01 4:71835900760f 192 //******* Hat Switches *******
Cirrus01 4:71835900760f 193 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 4:71835900760f 194 USAGE(1), 0x39, // Usage (Hat switch)
Cirrus01 2:265e03bf82af 195 #if (HAT4 == 1 && HAT4_8 == 0)
wim 0:e086541742c3 196 // 4 Position Hat Switch
Cirrus01 4:71835900760f 197 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 198 LOGICAL_MAXIMUM(1), 0x03, // 3
Cirrus01 4:71835900760f 199 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 4:71835900760f 200 PHYSICAL_MAXIMUM(2), 0x0E, 0x01, // Physical_Maximum (270)
Cirrus01 4:71835900760f 201 //UNIT_EXPONENT(1), 0x00, // Unit Exponent (0)
Cirrus01 4:71835900760f 202 UNIT(1), 0x14, // Unit (Degrees)
wim 0:e086541742c3 203 #endif
Cirrus01 2:265e03bf82af 204 #if (HAT8 == 1) || (HAT4 == 1 && HAT4_8 == 1)
wim 0:e086541742c3 205 // 8 Position Hat Switch
Cirrus01 4:71835900760f 206 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 207 LOGICAL_MAXIMUM(1), 0x07, // 7
Cirrus01 4:71835900760f 208 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 4:71835900760f 209 PHYSICAL_MAXIMUM(2), 0x3B, 0x01, // Physical_Maximum (315)
Cirrus01 4:71835900760f 210 //UNIT_EXPONENT(1), 0x00, // Unit Exponent (0)
Cirrus01 4:71835900760f 211 UNIT(1), 0x14, // Unit (Degrees)
wim 0:e086541742c3 212 #endif
Cirrus01 4:71835900760f 213 REPORT_SIZE(1), 0x04,
Cirrus01 4:71835900760f 214 REPORT_COUNT(1), 0x01,
Cirrus01 4:71835900760f 215 INPUT(1), 0x42, // Data, Variable, Absolute, Null State
Cirrus01 4:71835900760f 216 // Padding 4 bits
Cirrus01 4:71835900760f 217 REPORT_SIZE(1), 0x01,
Cirrus01 4:71835900760f 218 REPORT_COUNT(1), 0x04,
Cirrus01 4:71835900760f 219 INPUT(1), 0x01, // Constant
Cirrus01 4:71835900760f 220
Cirrus01 4:71835900760f 221 //******* Buttons *******
Cirrus01 4:71835900760f 222 USAGE_PAGE(1), 0x09, // Buttons
wim 0:e086541742c3 223 #if (BUTTONS4 == 1)
wim 0:e086541742c3 224 // 4 Buttons
Cirrus01 4:71835900760f 225 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 226 USAGE_MAXIMUM(1), 0x04, // 4
Cirrus01 4:71835900760f 227 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 228 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 229 REPORT_SIZE(1), 0x01,
Cirrus01 4:71835900760f 230 REPORT_COUNT(1), 0x04,
Cirrus01 4:71835900760f 231 //UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 4:71835900760f 232 UNIT(1), 0x00, // Unit (None)
Cirrus01 4:71835900760f 233 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 234 // Padding 4 bits
Cirrus01 4:71835900760f 235 REPORT_SIZE(1), 0x01,
Cirrus01 4:71835900760f 236 REPORT_COUNT(1), 0x04,
Cirrus01 4:71835900760f 237 INPUT(1), 0x01, // Constant
wim 0:e086541742c3 238 #endif
wim 0:e086541742c3 239 #if (BUTTONS8 == 1)
wim 0:e086541742c3 240 // 8 Buttons
Cirrus01 4:71835900760f 241 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 242 USAGE_MAXIMUM(1), 0x08, // 8
Cirrus01 4:71835900760f 243 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 244 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 245 REPORT_SIZE(1), 0x01,
Cirrus01 4:71835900760f 246 REPORT_COUNT(1), 0x08,
Cirrus01 4:71835900760f 247 //UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 4:71835900760f 248 UNIT(1), 0x00, // Unit (None)
Cirrus01 4:71835900760f 249 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 250 #endif
wim 0:e086541742c3 251 #if (BUTTONS32 == 1)
wim 0:e086541742c3 252 // 32 Buttons
Cirrus01 4:71835900760f 253 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 254 USAGE_MAXIMUM(1), 0x20, // 32
Cirrus01 4:71835900760f 255 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 4:71835900760f 256 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 4:71835900760f 257 REPORT_SIZE(1), 0x01,
Cirrus01 4:71835900760f 258 REPORT_COUNT(1), 0x20,
Cirrus01 4:71835900760f 259 //UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 4:71835900760f 260 UNIT(1), 0x00, // Unit (None)
Cirrus01 4:71835900760f 261 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 262 #endif
wim 0:e086541742c3 263
Cirrus01 1:92574cf6e9af 264 END_COLLECTION(0)
Cirrus01 1:92574cf6e9af 265 };
wim 0:e086541742c3 266
Cirrus01 1:92574cf6e9af 267 reportLength = sizeof(reportDescriptor);
Cirrus01 1:92574cf6e9af 268 return reportDescriptor;
wim 0:e086541742c3 269 }
Cirrus01 4:71835900760f 270