Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sat Sep 15 07:46:30 2018 +0000
Revision:
2:265e03bf82af
Parent:
1:92574cf6e9af
Child:
4:71835900760f
Hat Switch Bug fixed; - HID Descriptor fixed; - Hat Switch values transleted

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 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 2:265e03bf82af 51 report.data[pos] = (_t >> 0) & 0xff;
Cirrus01 2:265e03bf82af 52 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 53 report.data[pos++] = (_t >> 8) & 0xff;
Cirrus01 2:265e03bf82af 54 #endif
Cirrus01 2:265e03bf82af 55 report.data[pos++] = _r & 0xff;
Cirrus01 2:265e03bf82af 56 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 57 report.data[pos++] = (_r >> 8) & 0xff;
Cirrus01 2:265e03bf82af 58 #endif
Cirrus01 2:265e03bf82af 59 report.data[pos++] = _d & 0xff;
Cirrus01 2:265e03bf82af 60 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 61 report.data[pos++] = (_d >> 8) & 0xff;
Cirrus01 2:265e03bf82af 62 #endif
Cirrus01 2:265e03bf82af 63 report.data[pos++] = _w & 0xff;
Cirrus01 2:265e03bf82af 64 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 65 report.data[pos++] = (_w >> 8) & 0xff;
Cirrus01 2:265e03bf82af 66 #endif
Cirrus01 2:265e03bf82af 67 report.data[pos++] = _x & 0xff;
Cirrus01 2:265e03bf82af 68 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 69 report.data[pos++] = (_x >> 8) & 0xff;
Cirrus01 2:265e03bf82af 70 #endif
Cirrus01 2:265e03bf82af 71 report.data[pos++] = _y & 0xff;
Cirrus01 2:265e03bf82af 72 #if (SWORD == 1)
Cirrus01 2:265e03bf82af 73 report.data[pos++] = (_y >> 8) & 0xff;
Cirrus01 2:265e03bf82af 74 #endif
wim 0:e086541742c3 75
Cirrus01 1:92574cf6e9af 76 #if (HAT4 == 1)
Cirrus01 1:92574cf6e9af 77 //Use 4 bit padding for hat4 or hat8
Cirrus01 2:265e03bf82af 78 report.data[pos++] = (_hat & 0x0f) ;
Cirrus01 1:92574cf6e9af 79 #endif
wim 0:e086541742c3 80
Cirrus01 1:92574cf6e9af 81 #if (HAT8 == 1)
Cirrus01 1:92574cf6e9af 82 //Use 4 bit padding for hat4 or hat8
Cirrus01 2:265e03bf82af 83 report.data[pos++] = (_hat & 0xff) ;
Cirrus01 1:92574cf6e9af 84 #endif
wim 0:e086541742c3 85
Cirrus01 1:92574cf6e9af 86 #if (BUTTONS4 == 1)
Cirrus01 1:92574cf6e9af 87 //Use 4 bit padding for buttons
Cirrus01 2:265e03bf82af 88 report.data[pos++] = (_buttons & 0x0f) ;
Cirrus01 2:265e03bf82af 89 report.length = pos++;
Cirrus01 1:92574cf6e9af 90 #endif
wim 0:e086541742c3 91
Cirrus01 1:92574cf6e9af 92 #if (BUTTONS8 == 1)
Cirrus01 1:92574cf6e9af 93 //Use 8 bits for buttons
Cirrus01 2:265e03bf82af 94 report.data[pos++] = (_buttons & 0xff) ;
Cirrus01 2:265e03bf82af 95 report.length = pos++;
wim 0:e086541742c3 96 #endif
wim 0:e086541742c3 97
Cirrus01 1:92574cf6e9af 98 #if (BUTTONS32 == 1)
Cirrus01 1:92574cf6e9af 99 //No bit padding for 32 buttons
Cirrus01 2:265e03bf82af 100 report.data[pos++] = (_buttons >> 0) & 0xff;
Cirrus01 2:265e03bf82af 101 report.data[pos++] = (_buttons >> 8) & 0xff;
Cirrus01 2:265e03bf82af 102 report.data[pos++] = (_buttons >> 16) & 0xff;
Cirrus01 2:265e03bf82af 103 report.data[pos++] = (_buttons >> 24) & 0xff;
Cirrus01 2:265e03bf82af 104 report.length = pos++;
wim 0:e086541742c3 105 #endif
wim 0:e086541742c3 106
Cirrus01 1:92574cf6e9af 107 return send(&report);
Cirrus01 1:92574cf6e9af 108 }
wim 0:e086541742c3 109
Cirrus01 1:92574cf6e9af 110 bool USBJoystick::throttle(int16_t t)
Cirrus01 1:92574cf6e9af 111 {
Cirrus01 1:92574cf6e9af 112 _t = t;
Cirrus01 1:92574cf6e9af 113 return update();
wim 0:e086541742c3 114 }
wim 0:e086541742c3 115
Cirrus01 1:92574cf6e9af 116 bool USBJoystick::rudder(int16_t r)
Cirrus01 1:92574cf6e9af 117 {
Cirrus01 1:92574cf6e9af 118 _r = r;
Cirrus01 1:92574cf6e9af 119 return update();
Cirrus01 1:92574cf6e9af 120 }
Cirrus01 1:92574cf6e9af 121
Cirrus01 1:92574cf6e9af 122 bool USBJoystick::diveBreak(int16_t d)
Cirrus01 1:92574cf6e9af 123 {
Cirrus01 1:92574cf6e9af 124 _d = d;
Cirrus01 1:92574cf6e9af 125 return update();
wim 0:e086541742c3 126 }
wim 0:e086541742c3 127
Cirrus01 1:92574cf6e9af 128 bool USBJoystick::flaps(int16_t w)
Cirrus01 1:92574cf6e9af 129 {
Cirrus01 1:92574cf6e9af 130 _w = w;
Cirrus01 1:92574cf6e9af 131 return update();
wim 0:e086541742c3 132 }
wim 0:e086541742c3 133
Cirrus01 1:92574cf6e9af 134 bool USBJoystick::move(int16_t x, int16_t y)
Cirrus01 1:92574cf6e9af 135 {
Cirrus01 1:92574cf6e9af 136 _x = x;
Cirrus01 1:92574cf6e9af 137 _y = y;
Cirrus01 1:92574cf6e9af 138 return update();
wim 0:e086541742c3 139 }
wim 0:e086541742c3 140
Cirrus01 1:92574cf6e9af 141 bool USBJoystick::buttons(uint32_t buttons)
Cirrus01 1:92574cf6e9af 142 {
Cirrus01 1:92574cf6e9af 143 _buttons = buttons;
Cirrus01 1:92574cf6e9af 144 return update();
wim 0:e086541742c3 145 }
wim 0:e086541742c3 146
Cirrus01 1:92574cf6e9af 147 bool USBJoystick::hat(uint8_t hat)
Cirrus01 1:92574cf6e9af 148 {
Cirrus01 1:92574cf6e9af 149 _hat = hat;
Cirrus01 1:92574cf6e9af 150 return update();
wim 0:e086541742c3 151 }
wim 0:e086541742c3 152
wim 0:e086541742c3 153
Cirrus01 1:92574cf6e9af 154 void USBJoystick::_init()
Cirrus01 1:92574cf6e9af 155 {
Cirrus01 1:92574cf6e9af 156 _t = -127;
Cirrus01 1:92574cf6e9af 157 _r = -127;
Cirrus01 1:92574cf6e9af 158 _d = -127;
Cirrus01 1:92574cf6e9af 159 _w = -127;
Cirrus01 1:92574cf6e9af 160 _x = 0;
Cirrus01 1:92574cf6e9af 161 _y = 0;
Cirrus01 1:92574cf6e9af 162 _buttons = 0x00000000;
Cirrus01 1:92574cf6e9af 163 _hat = 0x00;
wim 0:e086541742c3 164 }
wim 0:e086541742c3 165
wim 0:e086541742c3 166
Cirrus01 1:92574cf6e9af 167 uint8_t * USBJoystick::reportDesc()
Cirrus01 1:92574cf6e9af 168 {
Cirrus01 1:92574cf6e9af 169 static uint8_t reportDescriptor[] = {
wim 0:e086541742c3 170
Cirrus01 1:92574cf6e9af 171 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 1:92574cf6e9af 172 LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0)
Cirrus01 1:92574cf6e9af 173 USAGE(1), 0x04, // Usage (Joystick)
Cirrus01 1:92574cf6e9af 174 COLLECTION(1), 0x01, // Application
Cirrus01 1:92574cf6e9af 175 USAGE_PAGE(1), 0x02, // Simulation Controls
Cirrus01 1:92574cf6e9af 176 USAGE(1), 0xBB, // Throttle
Cirrus01 1:92574cf6e9af 177 USAGE(1), 0xBA, // Rudder
Cirrus01 1:92574cf6e9af 178 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 179 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 180 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 181 REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 182 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 1:92574cf6e9af 183 USAGE(1), 0xB6, // Dive Breaks
Cirrus01 2:265e03bf82af 184 USAGE(1), 0xC3, // Wing Flaps
Cirrus01 2:265e03bf82af 185 // 8 bit values
Cirrus01 2:265e03bf82af 186 #if (SBYTE == 1)
Cirrus01 1:92574cf6e9af 187 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 188 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 189 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 190 REPORT_COUNT(1), 0x02,
Cirrus01 2:265e03bf82af 191 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 2:265e03bf82af 192 #endif
Cirrus01 2:265e03bf82af 193 // 16 bit values
Cirrus01 2:265e03bf82af 194 #if (SWORD ==1)
Cirrus01 2:265e03bf82af 195 LOGICAL_MINIMUM(2), 0x80, 0x01 // -32767
Cirrus01 2:265e03bf82af 196 LOGICAL_MAXIMUM(2), 0x7f, 0xff, // 32767
Cirrus01 2:265e03bf82af 197 REPORT_SIZE(1), 0x10,
Cirrus01 2:265e03bf82af 198 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 199 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 2:265e03bf82af 200 #endif
Cirrus01 1:92574cf6e9af 201 USAGE_PAGE(1), 0x01, // Generic Desktop
Cirrus01 1:92574cf6e9af 202 USAGE(1), 0x01, // Usage (Pointer)
Cirrus01 1:92574cf6e9af 203 COLLECTION(1), 0x00, // Physical
Cirrus01 1:92574cf6e9af 204 USAGE(1), 0x30, // X
Cirrus01 1:92574cf6e9af 205 USAGE(1), 0x31, // Y
wim 0:e086541742c3 206 // 8 bit values
Cirrus01 2:265e03bf82af 207 #if (SBYTE == 1)
Cirrus01 1:92574cf6e9af 208 LOGICAL_MINIMUM(1), 0x81, // -127
Cirrus01 1:92574cf6e9af 209 LOGICAL_MAXIMUM(1), 0x7f, // 127
Cirrus01 1:92574cf6e9af 210 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 211 REPORT_COUNT(1), 0x02,
Cirrus01 1:92574cf6e9af 212 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 2:265e03bf82af 213 #endif
wim 0:e086541742c3 214 // 16 bit values
Cirrus01 2:265e03bf82af 215 #if (SWORD ==1)
Cirrus01 2:265e03bf82af 216 LOGICAL_MINIMUM(2), 0x80, 0x01 // -32767
Cirrus01 2:265e03bf82af 217 LOGICAL_MAXIMUM(2), 0x7f, 0xff, // 32767
Cirrus01 2:265e03bf82af 218 REPORT_SIZE(1), 0x10,
Cirrus01 2:265e03bf82af 219 REPORT_COUNT(1), 0x04,
Cirrus01 2:265e03bf82af 220 INPUT(1), 0x02, // Data, Variable, Absolute
Cirrus01 2:265e03bf82af 221 #endif
wim 0:e086541742c3 222
Cirrus01 1:92574cf6e9af 223 END_COLLECTION(0),
wim 0:e086541742c3 224
Cirrus01 2:265e03bf82af 225 #if (HAT4 == 1 && HAT4_8 == 0)
wim 0:e086541742c3 226 // 4 Position Hat Switch
Cirrus01 1:92574cf6e9af 227 USAGE(1), 0x39, // Usage (Hat switch)
Cirrus01 1:92574cf6e9af 228 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 229 LOGICAL_MAXIMUM(1), 0x03, // 3
Cirrus01 1:92574cf6e9af 230 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 1:92574cf6e9af 231 PHYSICAL_MAXIMUM(2), 0x0E, 0x01, // Physical_Maximum (270)
Cirrus01 2:265e03bf82af 232 UNIT_EXPONENT(1), 0x00, // Unit Exponent (0)
Cirrus01 2:265e03bf82af 233 UNIT(1), 0x14, // Unit (Degrees)
Cirrus01 1:92574cf6e9af 234 REPORT_SIZE(1), 0x04,
Cirrus01 1:92574cf6e9af 235 REPORT_COUNT(1), 0x01,
Cirrus01 2:265e03bf82af 236 INPUT(1), 0x42, // Data, Variable, Absolute, Null State
Cirrus01 2:265e03bf82af 237 // Padding 4 bits
Cirrus01 2:265e03bf82af 238 REPORT_SIZE(1), 0x01,
Cirrus01 2:265e03bf82af 239 REPORT_COUNT(1), 0x04,
Cirrus01 2:265e03bf82af 240 INPUT(1), 0x01, // Constant
wim 0:e086541742c3 241 #endif
Cirrus01 2:265e03bf82af 242 #if (HAT8 == 1) || (HAT4 == 1 && HAT4_8 == 1)
wim 0:e086541742c3 243 // 8 Position Hat Switch
Cirrus01 1:92574cf6e9af 244 USAGE(1), 0x39, // Usage (Hat switch)
Cirrus01 1:92574cf6e9af 245 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 246 LOGICAL_MAXIMUM(1), 0x07, // 7
Cirrus01 1:92574cf6e9af 247 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
Cirrus01 1:92574cf6e9af 248 PHYSICAL_MAXIMUM(2), 0x3B, 0x01, // Physical_Maximum (315)
Cirrus01 2:265e03bf82af 249 UNIT_EXPONENT(1), 0x00, // Unit Exponent (0)
Cirrus01 2:265e03bf82af 250 UNIT(1), 0x14, // Unit (Degrees)
Cirrus01 2:265e03bf82af 251 REPORT_SIZE(1), 0x08,
Cirrus01 1:92574cf6e9af 252 REPORT_COUNT(1), 0x01,
Cirrus01 2:265e03bf82af 253 INPUT(1), 0x42, // Data, Variable, Absolute, Null State
wim 0:e086541742c3 254 #endif
wim 0:e086541742c3 255
wim 0:e086541742c3 256 #if (BUTTONS4 == 1)
wim 0:e086541742c3 257 // 4 Buttons
Cirrus01 1:92574cf6e9af 258 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 259 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 260 USAGE_MAXIMUM(1), 0x04, // 4
Cirrus01 1:92574cf6e9af 261 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 262 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 263 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 264 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 265 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 266 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 267 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 268
wim 0:e086541742c3 269 // Padding 4 bits
Cirrus01 1:92574cf6e9af 270 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 271 REPORT_COUNT(1), 0x04,
Cirrus01 1:92574cf6e9af 272 INPUT(1), 0x01, // Constant
wim 0:e086541742c3 273
wim 0:e086541742c3 274 #endif
wim 0:e086541742c3 275 #if (BUTTONS8 == 1)
wim 0:e086541742c3 276 // 8 Buttons
Cirrus01 1:92574cf6e9af 277 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 278 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 279 USAGE_MAXIMUM(1), 0x08, // 8
Cirrus01 1:92574cf6e9af 280 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 281 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 282 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 283 REPORT_COUNT(1), 0x08,
Cirrus01 1:92574cf6e9af 284 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 285 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 286 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 287 #endif
wim 0:e086541742c3 288 #if (BUTTONS32 == 1)
wim 0:e086541742c3 289 // 32 Buttons
Cirrus01 1:92574cf6e9af 290 USAGE_PAGE(1), 0x09, // Buttons
Cirrus01 1:92574cf6e9af 291 USAGE_MINIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 292 USAGE_MAXIMUM(1), 0x20, // 32
Cirrus01 1:92574cf6e9af 293 LOGICAL_MINIMUM(1), 0x00, // 0
Cirrus01 1:92574cf6e9af 294 LOGICAL_MAXIMUM(1), 0x01, // 1
Cirrus01 1:92574cf6e9af 295 REPORT_SIZE(1), 0x01,
Cirrus01 1:92574cf6e9af 296 REPORT_COUNT(1), 0x20,
Cirrus01 1:92574cf6e9af 297 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
Cirrus01 1:92574cf6e9af 298 UNIT(1), 0x00, // Unit (None)
Cirrus01 1:92574cf6e9af 299 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:e086541742c3 300 #endif
wim 0:e086541742c3 301
Cirrus01 1:92574cf6e9af 302 END_COLLECTION(0)
Cirrus01 1:92574cf6e9af 303 };
wim 0:e086541742c3 304
Cirrus01 1:92574cf6e9af 305 reportLength = sizeof(reportDescriptor);
Cirrus01 1:92574cf6e9af 306 return reportDescriptor;
wim 0:e086541742c3 307 }