Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: USBJoystick_HelloWorld2_wip
Fork of USBJoystick by
USBJoystick.cpp
00001 /* mbed USBJoystick Library 00002 * Copyright (c) 2012, v01: Initial version, WH, 00003 * Modified USBMouse code ARM Limited. 00004 * (c) 2010-2011 mbed.org, MIT License 00005 * 2016, v02: Updated USBDevice Lib, Added waitForConnect, Updated 32 bits button 00006 * 00007 * Permission is hereby granted, free of charge, to any person obtaining a copy 00008 * of this software and associated documentation files (the "Software"), to deal 00009 * in the Software without restriction, inclumosig without limitation the rights 00010 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00011 * copies of the Software, and to permit persons to whom the Software is 00012 * furnished to do so, subject to the following conditions: 00013 * 00014 * The above copyright notice and this permission notice shall be included in 00015 * all copies or substantial portions of the Software. 00016 * 00017 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00018 * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00019 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00020 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00021 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00022 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00023 * THE SOFTWARE. 00024 */ 00025 00026 00027 #include "stdint.h" 00028 #include "USBJoystick.h" 00029 00030 bool USBJoystick::update(int16_t t, int16_t r, int16_t f, int16_t b, int16_t x, int16_t y, uint32_t buttons, uint8_t hat) 00031 { 00032 00033 _t = t; 00034 _r = r; 00035 _f = f; 00036 _b = b; 00037 _x = x; 00038 _y = y; 00039 _buttons = buttons; 00040 _hat = hat; 00041 00042 return update(); 00043 } 00044 00045 bool USBJoystick::update() 00046 { 00047 PID_REPORT report; 00048 00049 // Fill the report according to the Joystick Descriptor 00050 report.data[0] = _t & 0xff; 00051 report.data[1] = _r & 0xff; 00052 report.data[2] = _f & 0xff; 00053 report.data[3] = _b & 0xff; 00054 report.data[4] = _x & 0xff; 00055 report.data[5] = _y & 0xff; 00056 00057 00058 #if (BUTTONS4 == 1) 00059 //Hat and 4 Buttons 00060 // report.data[4] = ((_buttons & 0x0f) << 4) | (_hat & 0x0f) ; 00061 // report.length = 5; 00062 00063 00064 //Use 4 bit padding for hat4 or hat8 00065 report.data[6] = (_hat & 0x0f) ; 00066 00067 //Use 4 bit padding for buttons 00068 report.data[7] = (_buttons & 0x0f) ; 00069 report.length = 8; 00070 #endif 00071 00072 #if (BUTTONS8 == 1) 00073 //Hat and first 4 Buttons 00074 // report.data[4] = ((_buttons & 0x0f) << 4) | (_hat & 0x0f) ; 00075 // 00076 //Use bit padding for last 4 Buttons 00077 // report.data[5] = (_buttons & 0xf0) >> 4; 00078 // report.length = 6; 00079 00080 //Use 4 bit padding for hat4 or hat8 00081 report.data[6] = (_hat & 0x0f) ; 00082 00083 //Use 8 bits for buttons 00084 report.data[7] = (_buttons & 0xff) ; 00085 report.length = 8; 00086 #endif 00087 00088 #if (BUTTONS32 == 1) 00089 //Use 4 bit padding for hat4 or hat8 00090 report.data[6] = (_hat & 0x0f) ; 00091 00092 //No bit padding for 32 buttons 00093 report.data[7] = (_buttons >> 0) & 0xff; 00094 report.data[8] = (_buttons >> 8) & 0xff; 00095 report.data[9] = (_buttons >> 16) & 0xff; 00096 report.data[10] = (_buttons >> 24) & 0xff; 00097 report.length = 11; 00098 #endif 00099 00100 return send(&report); 00101 } 00102 00103 bool USBJoystick::throttle(int16_t t) 00104 { 00105 _t = t; 00106 return update(); 00107 } 00108 00109 bool USBJoystick::rudder(int16_t r) 00110 { 00111 _r = r; 00112 return update(); 00113 } 00114 00115 bool USBJoystick::flaps(int16_t f) 00116 { 00117 _f = f; 00118 return update(); 00119 } 00120 00121 bool USBJoystick::breaks(int16_t b) 00122 { 00123 _b = b; 00124 return update(); 00125 } 00126 00127 bool USBJoystick::move(int16_t x, int16_t y) 00128 { 00129 _x = x; 00130 _y = y; 00131 return update(); 00132 } 00133 00134 bool USBJoystick::buttons(uint32_t buttons) 00135 { 00136 _buttons = buttons; 00137 return update(); 00138 } 00139 00140 bool USBJoystick::hat(uint8_t hat) 00141 { 00142 _hat = hat; 00143 return update(); 00144 } 00145 00146 00147 void USBJoystick::_init() 00148 { 00149 _t = -127; 00150 _r = -127; 00151 _f = -127; 00152 _b = -127; 00153 _x = 0; 00154 _y = 0; 00155 _buttons = 0x00000000; 00156 _hat = 0x00; 00157 } 00158 00159 00160 uint8_t * USBJoystick::stringIinterfaceDesc() 00161 { 00162 static uint8_t stringIinterfaceDescriptor[] = { 00163 0x08, //bLength 00164 STRING_DESCRIPTOR, //bDescriptorType 0x03 00165 'S',0, //bString iInterface - PID 00166 'i',0, 00167 'm',0, 00168 'u',0, 00169 'l',0, 00170 'a',0, 00171 't',0, 00172 'o',0, 00173 'r',0, 00174 }; 00175 return stringIinterfaceDescriptor; 00176 } 00177 00178 uint8_t * USBJoystick::stringIproductDesc() 00179 { 00180 static uint8_t stringIproductDescriptor[] = { 00181 0x16, //bLength 00182 STRING_DESCRIPTOR, //bDescriptorType 0x03 00183 'C',0, //bString iProduct - PID device 00184 'o',0, 00185 'n',0, 00186 'd',0, 00187 'o',0, 00188 'r',0, 00189 '-',0, 00190 'S',0, 00191 'i',0, 00192 'm',0 00193 }; 00194 return stringIproductDescriptor; 00195 } 00196 00197 uint8_t * USBJoystick::reportDesc() 00198 { 00199 static uint8_t reportDescriptor[] = { 00200 00201 USAGE_PAGE(1), 0x01, // Generic Desktop 00202 LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0) 00203 USAGE(1), 0x04, // Usage (Joystick) 00204 COLLECTION(1), 0x01, // Application 00205 USAGE_PAGE(1), 0x02, // Simulation Controls 00206 USAGE(1), 0xBB, // Throttle 00207 USAGE(1), 0xBA, // Rudder 00208 USAGE(1), 0xC3, // Wing Flaps 00209 USAGE(1), 0xB6, // Dive Breaks 00210 LOGICAL_MINIMUM(1), 0x81, // -127 00211 LOGICAL_MAXIMUM(1), 0x7f, // 127 00212 REPORT_SIZE(1), 0x08, 00213 REPORT_COUNT(1), 0x02, 00214 INPUT(1), 0x02, // Data, Variable, Absolute 00215 USAGE_PAGE(1), 0x01, // Generic Desktop 00216 USAGE(1), 0x01, // Usage (Pointer) 00217 COLLECTION(1), 0x00, // Physical 00218 USAGE(1), 0x30, // X 00219 USAGE(1), 0x31, // Y 00220 // 8 bit values 00221 LOGICAL_MINIMUM(1), 0x81, // -127 00222 LOGICAL_MAXIMUM(1), 0x7f, // 127 00223 REPORT_SIZE(1), 0x08, 00224 REPORT_COUNT(1), 0x02, 00225 INPUT(1), 0x02, // Data, Variable, Absolute 00226 // 16 bit values 00227 // LOGICAL_MINIMUM(1), 0x00, // 0 00228 // LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 00229 // REPORT_SIZE(1), 0x10, 00230 // REPORT_COUNT(1), 0x02, 00231 // INPUT(1), 0x02, // Data, Variable, Absolute 00232 00233 END_COLLECTION(0), 00234 00235 #if (HAT4 == 1) 00236 // 4 Position Hat Switch 00237 USAGE(1), 0x39, // Usage (Hat switch) 00238 LOGICAL_MINIMUM(1), 0x00, // 0 00239 LOGICAL_MAXIMUM(1), 0x03, // 3 00240 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0) 00241 PHYSICAL_MAXIMUM(2), 0x0E, 0x01, // Physical_Maximum (270) 00242 UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos) 00243 REPORT_SIZE(1), 0x04, 00244 REPORT_COUNT(1), 0x01, 00245 INPUT(1), 0x02, // Data, Variable, Absolute 00246 #endif 00247 #if (HAT8 == 1) 00248 // 8 Position Hat Switch 00249 USAGE(1), 0x39, // Usage (Hat switch) 00250 LOGICAL_MINIMUM(1), 0x00, // 0 00251 LOGICAL_MAXIMUM(1), 0x07, // 7 00252 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0) 00253 PHYSICAL_MAXIMUM(2), 0x3B, 0x01, // Physical_Maximum (315) 00254 UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos) 00255 REPORT_SIZE(1), 0x04, 00256 REPORT_COUNT(1), 0x01, 00257 INPUT(1), 0x02, // Data, Variable, Absolute 00258 #endif 00259 00260 // Padding 4 bits 00261 REPORT_SIZE(1), 0x01, 00262 REPORT_COUNT(1), 0x04, 00263 INPUT(1), 0x01, // Constant 00264 00265 00266 #if (BUTTONS4 == 1) 00267 // 4 Buttons 00268 USAGE_PAGE(1), 0x09, // Buttons 00269 USAGE_MINIMUM(1), 0x01, // 1 00270 USAGE_MAXIMUM(1), 0x04, // 4 00271 LOGICAL_MINIMUM(1), 0x00, // 0 00272 LOGICAL_MAXIMUM(1), 0x01, // 1 00273 REPORT_SIZE(1), 0x01, 00274 REPORT_COUNT(1), 0x04, 00275 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0) 00276 UNIT(1), 0x00, // Unit (None) 00277 INPUT(1), 0x02, // Data, Variable, Absolute 00278 00279 // Padding 4 bits 00280 REPORT_SIZE(1), 0x01, 00281 REPORT_COUNT(1), 0x04, 00282 INPUT(1), 0x01, // Constant 00283 00284 #endif 00285 #if (BUTTONS8 == 1) 00286 // 8 Buttons 00287 USAGE_PAGE(1), 0x09, // Buttons 00288 USAGE_MINIMUM(1), 0x01, // 1 00289 USAGE_MAXIMUM(1), 0x08, // 8 00290 LOGICAL_MINIMUM(1), 0x00, // 0 00291 LOGICAL_MAXIMUM(1), 0x01, // 1 00292 REPORT_SIZE(1), 0x01, 00293 REPORT_COUNT(1), 0x08, 00294 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0) 00295 UNIT(1), 0x00, // Unit (None) 00296 INPUT(1), 0x02, // Data, Variable, Absolute 00297 #endif 00298 00299 #if (BUTTONS32 == 1) 00300 // 32 Buttons 00301 USAGE_PAGE(1), 0x09, // Buttons 00302 USAGE_MINIMUM(1), 0x01, // 1 00303 USAGE_MAXIMUM(1), 0x20, // 32 00304 LOGICAL_MINIMUM(1), 0x00, // 0 00305 LOGICAL_MAXIMUM(1), 0x01, // 1 00306 REPORT_SIZE(1), 0x01, 00307 REPORT_COUNT(1), 0x20, 00308 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0) 00309 UNIT(1), 0x00, // Unit (None) 00310 INPUT(1), 0x02, // Data, Variable, Absolute 00311 #endif 00312 #if (FFB == 1) 00313 PHYSICAL_MINIMUM(1), 0x00, // PHYSICAL_MINIMUM (0) 00314 INPUT(1), 0x02, // INPUT (Data,Var,Abs) 00315 USAGE_PAGE(1), 0x0f, // USAGE_PAGE (Physical Interface Device) 00316 USAGE(1), 0x21, // USAGE (Set Effect Report) 00317 COLLECTION(1), 0x02, // COLLECTION (Logical) 00318 USAGE(1), 0x22, // USAGE (Effect Block Index) 00319 LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) 00320 REPORT_SIZE(1), 0x07, // REPORT_SIZE (7) 00321 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00322 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00323 USAGE(1), 0x24, // USAGE (ROM Flag) 00324 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00325 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00326 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00327 USAGE(1), 0x25, // USAGE (Effect Type) 00328 COLLECTION(1), 0x02, // COLLECTION (Logical) 00329 USAGE(1), 0x26, // USAGE (ET Constant Force) 00330 USAGE(1), 0x27, // USAGE (ET Ramp) 00331 USAGE(1), 0x30, // USAGE (ET Square) 00332 USAGE(1), 0x31, // USAGE (ET Sine) 00333 USAGE(1), 0x32, // USAGE (ET Triangle) 00334 USAGE(1), 0x33, // USAGE (ET Sawtooth Up) 00335 USAGE(1), 0x34, // USAGE (ET Sawtooth Down) 00336 USAGE(1), 0x40, // USAGE (ET Spring) 00337 USAGE(1), 0x41, // USAGE (ET Damper) 00338 USAGE(1), 0x42, // USAGE (ET Inertia) 00339 LOGICAL_MINIMUM(1), 0x01, // LOGICAL_MINIMUM (1) 00340 LOGICAL_MAXIMUM(1), 0x0a, // LOGICAL_MAXIMUM (10) 00341 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00342 OUTPUT(1), 0x00, // OUTPUT (Data,Ary,Abs) 00343 END_COLLECTION(0), // END_COLLECTION 00344 USAGE(1), 0x50, // USAGE (Duration) 00345 USAGE(1), 0x54, // USAGE (Trigger Repeat Interval) 00346 LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) 00347 LOGICAL_MAXIMUM(2), 0x10, 0x27, // LOGICAL_MAXIMUM (10000) 00348 PHYSICAL_MAXIMUM(2), 0x10, 0x27,// PHYSICAL_MAXIMUM (10000) 00349 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00350 UNIT(2), 0x03, 0x10, // UNIT (Eng Lin:Time) 00351 UNIT_EXPONENT(1), 0x0d, // UNIT_EXPONENT (-3) 00352 REPORT_COUNT(1), 0x02, // REPORT_COUNT (2) 00353 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00354 UNIT_EXPONENT(1), 0x0a, // UNIT_EXPONENT (-6) 00355 USAGE(1), 0x51, // USAGE (Sample Period) 00356 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00357 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00358 PHYSICAL_MAXIMUM(1), 0x00, // PHYSICAL_MAXIMUM (0) 00359 UNIT_EXPONENT(1), 0x00, // UNIT_EXPONENT (0) 00360 UNIT(1), 0x00, // UNIT (None) 00361 USAGE(1), 0x52, // USAGE (Gain) 00362 USAGE(1), 0x53, // USAGE (Trigger Button) 00363 LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) 00364 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00365 REPORT_COUNT(1), 0x02, // REPORT_COUNT (2) 00366 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00367 USAGE(1), 0x55, // USAGE (Axes Enable) 00368 COLLECTION(1), 0x02, // COLLECTION (Logical) 00369 USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop) 00370 USAGE(1), 0x01, // USAGE (Pointer) 00371 COLLECTION(1), 0x00, // COLLECTION (Physical) 00372 USAGE(1), 0x30, // USAGE (X) 00373 USAGE(1), 0x31, // USAGE (Y) 00374 USAGE(1), 0x32, // USAGE (Z) 00375 LOGICAL_MINIMUM(1), 0x01, // LOGICAL_MINIMUM (1) 00376 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00377 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00378 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00379 END_COLLECTION(0), // END_COLLECTION 00380 END_COLLECTION(0), // END_COLLECTION 00381 REPORT_COUNT(1), 0x06, // REPORT_COUNT (6) 00382 OUTPUT(1), 0x03, // OUTPUT (Cnst,Var,Abs) 00383 USAGE_PAGE(1), 0x0f, // USAGE_PAGE (Physical Interface Device) 00384 USAGE(1), 0x57, // USAGE (Direction) 00385 COLLECTION(1), 0x02, // COLLECTION (Logical) 00386 USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop) 00387 USAGE(1), 0x01, // USAGE (Pointer) 00388 COLLECTION(1), 0x00, // COLLECTION (Physical) 00389 USAGE(1), 0x30, // USAGE (X) 00390 USAGE(1), 0x31, // USAGE (Y) 00391 USAGE(1), 0x32, // USAGE (Z) 00392 LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) 00393 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00394 0xPHYSICAL_MAXIMUM(2)6, 0x68, 0x01, // PHYSICAL_MAXIMUM (360) 00395 UNIT(1), 0x14, // UNIT (Eng Rot:Angular Pos) 00396 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00397 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00398 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00399 UNIT(1), 0x00, // UNIT (None) 00400 PHYSICAL_MAXIMUM(1), 0x00, // PHYSICAL_MAXIMUM (0) 00401 END_COLLECTION(0), // END_COLLECTION 00402 END_COLLECTION(0), // END_COLLECTION 00403 USAGE_PAGE(1), 0x0f, // USAGE_PAGE (Physical Interface Device) 00404 USAGE(1), 0x58, // USAGE (Type Specific Block Offset) 00405 COLLECTION(1), 0x02, // COLLECTION (Logical) 00406 USAGE(3), 0x01, 0x00, 0x0a, 0x00, // USAGE (Ordinals:Instance 1) 00407 USAGE(3), 0x02, 0x00, 0x0a, 0x00, // USAGE (Ordinals:Instance 2) 00408 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00409 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00410 REPORT_COUNT(1), 0x02, // REPORT_COUNT (2) 00411 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00412 END_COLLECTION(0), // END_COLLECTION 00413 END_COLLECTION(0), // END_COLLECTION 00414 USAGE_PAGE(1), 0x0f, // USAGE_PAGE (Physical Interface Device) 00415 USAGE(1), 0x5a, // USAGE (Set Envelope Report) 00416 COLLECTION(1), 0x02, // COLLECTION (Logical) 00417 REPORT_ID(1), 0x02, // REPORT_ID (2) 00418 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00419 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00420 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00421 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00422 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00423 USAGE(1), 0x24, // USAGE (ROM Flag) 00424 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00425 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00426 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00427 USAGE(1), 0x5b, // USAGE (Attack Level) 00428 USAGE(1), 0x5d, // USAGE (Fade Level) 00429 LOGICAL_MAXIMUM(1), 0xff // LOGICAL_MAXIMUM (255) 00430 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00431 REPORT_COUNT(1), 0x02, // REPORT_COUNT (2) 00432 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00433 USAGE(1), 0x5c, // USAGE (Attack Time) 00434 USAGE(1), 0x5e, // USAGE (Fade Time) 00435 LOGICAL_MAXIMUM(2), 0x10, 0x27, // LOGICAL_MAXIMUM (10000) 00436 PHYSICAL_MAXIMUM(1), 0x10, 0x27,// PHYSICAL_MAXIMUM (10000) 00437 UNIT(2), 0x03, 0x10, // UNIT (Eng Lin:Time) 00438 UNIT_EXPONENT(1), 0x0d, // UNIT_EXPONENT (-3) 00439 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00440 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00441 PHYSICAL_MAXIMUM(1), 0x00, // PHYSICAL_MAXIMUM (0) 00442 UNIT(1), 0x00, // UNIT (None) 00443 UNIT_EXPONENT(1), 0x00, // UNIT_EXPONENT (0) 00444 END_COLLECTION(0), // END_COLLECTION 00445 USAGE(1), 0x5f, // USAGE (Set Condition Report) 00446 COLLECTION(1), 0x02, // COLLECTION (Logical) 00447 REPORT_ID(1), 0x03, // REPORT_ID (3) 00448 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00449 LOGICAL_MAXIMUM(1), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00450 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00451 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00452 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00453 USAGE(1), 0x24, // USAGE (ROM Flag) 00454 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00455 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00456 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00457 USAGE(1), 0x60, // USAGE (CP Offset) 00458 USAGE(1), 0x61, // USAGE (Positive Coefficient) 00459 USAGE(1), 0x62, // USAGE (Negative Coefficient) 00460 USAGE(1), 0x63, // USAGE (Positive Saturation) 00461 USAGE(1), 0x64, // USAGE (Negative Saturation) 00462 USAGE(1), 0x65, // USAGE (Dead Band) 00463 LOGICAL_MAXIMUM(1), 0xff // LOGICAL_MAXIMUM (255) 00464 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00465 REPORT_COUNT(1), 0x06, // REPORT_COUNT (6) 00466 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00467 END_COLLECTION(0), // END_COLLECTION 00468 USAGE(1), 0x6e, // USAGE (Set Periodic Report) 00469 COLLECTION(1), 0x02, // COLLECTION (Logical) 00470 REPORT_ID(1), 0x04, // REPORT_ID (4) 00471 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00472 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00473 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00474 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00475 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00476 USAGE(1), 0x24, // USAGE (ROM Flag) 00477 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00478 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00479 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00480 USAGE(1), 0x70, // USAGE (Magnitude) 00481 USAGE(1), 0x6f, // USAGE (Offset) 00482 USAGE(1), 0x71, // USAGE (Phase) 00483 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00484 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00485 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00486 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00487 USAGE(1), 0x72, // USAGE (Period) 00488 LOGICAL_MAXIMUM(2), 0x10, 0x27, // LOGICAL_MAXIMUM (10000) 00489 PHYSICAL_MAXIMUM(2), 0x10, 0x27,// PHYSICAL_MAXIMUM (10000) 00490 UNIT(2), 0x03, 0x10, // UNIT (Eng Lin:Time) 00491 UNIT_EXPONENT(1), 0x0d, // UNIT_EXPONENT (-3) 00492 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00493 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00494 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00495 PHYSICAL_MAXIMUM(1), 0x00, // PHYSICAL_MAXIMUM (0) 00496 UNIT(1), 0x00, // UNIT (None) 00497 UNIT_EXPONENT(1), 0x00, // UNIT_EXPONENT (0)) 00498 END_COLLECTION(0), // END_COLLECTION 00499 USAGE(1), 0x73, // USAGE (Set Constant Force Report) 00500 COLLECTION(1), 0x02, // COLLECTION (Logical) 00501 REPORT_ID(1), 0x05, // REPORT_ID (5) 00502 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00503 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00504 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00505 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00506 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00507 USAGE(1), 0x24, // USAGE (ROM Flag) 00508 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00509 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00510 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00511 USAGE(1), 0x70, // USAGE (Magnitude) 00512 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00513 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00514 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00515 COLLECTION(0), // END_COLLECTION 00516 USAGE(1), 0x74, // USAGE (Set Ramp Force Report) 00517 COLLECTION(1), 0x02, // COLLECTION (Logical) 00518 REPORT_ID(1), 0x06, // REPORT_ID (6) 00519 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00520 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00521 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00522 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00523 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00524 USAGE(1), 0x24, // USAGE (ROM Flag) 00525 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00526 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00527 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00528 USAGE(1), 0x75, // USAGE (Ramp Start) 00529 USAGE(1), 0x76, // USAGE (Ramp End) 00530 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00531 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00532 REPORT_COUNT(1), 0x02, // REPORT_COUNT (2) 00533 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00534 END_COLLECTION(0), // END_COLLECTION 00535 USAGE(1), 0x68, // USAGE (Custom Force Data Report) 00536 COLLECTION(1), 0x02, // COLLECTION (Logical) 00537 REPORT_ID(1), 0x07, // REPORT_ID (7) 00538 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00539 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00540 REPORT_SIZE(1), 0x0f, // REPORT_SIZE (15) 00541 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00542 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00543 USAGE(3), 0x3b, 0x00, 0x01, 0x00// USAGE (Generic Desktop:Byte Count) 00544 LOGICAL_MAXIMUM(2), 0x00, 0x01, // LOGICAL_MAXIMUM (256) 00545 REPORT_SIZE(1), 0x09, // REPORT_SIZE (9) 00546 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00547 USAGE(1), 0x69, // USAGE (Custom Force Data) 00548 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00549 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00550 REPORT_COUNT(2), 0x00, 0x01, // REPORT_COUNT (256) 00551 OUTPUT(2), 0x02, 0x01, // OUTPUT (Data,Var,Abs,Buf) 00552 END_COLLECTION(0), // END_COLLECTION 00553 USAGE(1), 0x66, // USAGE (Download Force Sample) 00554 COLLECTION(1), 0x02, // COLLECTION (Logical) 00555 REPORT_ID(1), 0x08, // REPORT_ID (8) 00556 USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop) 00557 USAGE(1), 0x01, // USAGE (Pointer) 00558 COLLECTION(1), 0x02, // COLLECTION (Logical) 00559 USAGE(1), 0x30, // USAGE (X) 00560 USAGE(1), 0x31, // USAGE (Y) 00561 USAGE(1), 0x32, // USAGE (Z) 00562 LOGICAL_MINIMUM(1), 0x81, // LOGICAL_MINIMUM (-127) 00563 LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) 00564 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00565 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00566 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00567 END_COLLECTION(0), // END_COLLECTION 00568 END_COLLECTION(0), // END_COLLECTION 00569 USAGE_PAGE(1), 0x0f, // USAGE_PAGE (Physical Interface Device) 00570 USAGE(1), 0x6b, // USAGE (Set Custom Force Report) 00571 COLLECTION(1), 0x02, // COLLECTION (Logical) 00572 REPORT_ID(1), 0x09, // REPORT_ID (9) 00573 USAGE(1), 0x23, // USAGE (Parameter Block Offset) 00574 USAGE(1), 0x6c, // USAGE (Custom Force Data Offset) 00575 USAGE(1), 0x6d, // USAGE (Sample Count) 00576 LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) 00577 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00578 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00579 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00580 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00581 END_COLLECTION(0), // END_COLLECTION 00582 USAGE(1), 0x77, // USAGE (Effect Operation Report) 00583 COLLECTION(1), 0x02, // COLLECTION (Logical) 00584 REPORT_ID(1), 0x0a, // REPORT_ID (10) 00585 USAGE(1), 0x22, // USAGE (Effect Block Index) 00586 LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) 00587 REPORT_SIZE(1), 0x07, // REPORT_SIZE (7) 00588 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00589 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00590 USAGE(1), 0x24, // USAGE (ROM Flag) 00591 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00592 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00593 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00594 USAGE(1), 0x78, // USAGE (Effect Operation) 00595 COLLECTION(1), 0x02, // COLLECTION (Logical) 00596 USAGE(1), 0x79, // USAGE (Op Effect Start) 00597 USAGE(1), 0x7a, // USAGE (Op Effect Start Solo) 00598 USAGE(1), 0x7b, // USAGE (Op Effect Stop) 00599 LOGICAL_MINIMUM(1), 0x01, // LOGICAL_MINIMUM (1) 00600 LOGICAL_MAXIMUM(1), 0x03, // LOGICAL_MAXIMUM (3) 00601 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00602 OUTPUT(1), 0x00, // OUTPUT (Data,Ary,Abs) 00603 END_COLLECTION(0), // END_COLLECTION 00604 USAGE(1), 0x7c, // USAGE (Loop Count) 00605 LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) 00606 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00607 OUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs) 00608 END_COLLECTION(0), // END_COLLECTION 00609 USAGE(1), 0x7f, // USAGE (PID Pool Report) 00610 COLLECTION(1), 0x02, // COLLECTION (Logical) 00611 REPORT_ID(1), 0x01, // REPORT_ID (1) 00612 USAGE(1), 0x80, // USAGE (RAM Pool Size) 00613 USAGE(1), 0x81, // USAGE (ROM Pool Size) 00614 USAGE(1), 0x82, // USAGE (ROM Effect Block Count) 00615 LOGICAL_MAXIMUM(2), 0xfd, 0x7f, // LOGICAL_MAXIMUM (32765) 00616 REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) 00617 REPORT_SIZE(1), 0x10, // REPORT_SIZE (16) 00618 FEATURE(1), 0x02, // FEATURE (Data,Var,Abs) 00619 END_COLLECTION(0), // END_COLLECTION 00620 USAGE(1), 0x92, // USAGE (PID State Report) 00621 COLLECTION(1), 0x02, // COLLECTION (Logical) 00622 REPORT_ID(1), 0x02, // REPORT_ID (2) 00623 USAGE(1), 0x22, // USAGE (Effect Block Index) 00624 LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) 00625 REPORT_SIZE(1), 0x07, // REPORT_SIZE (7) 00626 INPUT(1), 0x02, // INPUT (Data,Var,Abs) 00627 USAGE(1), 0x24, // USAGE (ROM Flag) 00628 LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) 00629 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00630 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00631 INPUT(1), 0x02, // INPUT (Data,Var,Abs) 00632 USAGE(1), 0x94, // USAGE (Effect Playing) 00633 USAGE(1), 0xa0, // USAGE (Actuators Enabled) 00634 USAGE(1), 0xa4, // USAGE (Safety Switch) 00635 USAGE(1), 0xa6, // USAGE (Actuator Power) 00636 REPORT_COUNT(1), 0x04, // REPORT_COUNT (4) 00637 INPUT(1), 0x02, // INPUT (Data,Var,Abs) 00638 INPUT(1), 0x03, // INPUT (Cnst,Var,Abs) 00639 END_COLLECTION(0), // END_COLLECTION 00640 USAGE(1), 0x95, // USAGE (PID Device Control Report) 00641 COLLECTION(1), 0x02, // COLLECTION (Logical) 00642 REPORT_ID(1), 0x0b, // REPORT_ID (11) 00643 USAGE(1), 0x96, // USAGE (PID Device Control) 00644 COLLECTION(1), 0x02, // COLLECTION (Logical) 00645 USAGE(1), 0x97, // USAGE (DC Enable Actuators) 00646 USAGE(1), 0x98, // USAGE (DC Disable Actuators) 00647 USAGE(1), 0x99, // USAGE (DC Stop All Effects) 00648 USAGE(1), 0x9a, // USAGE (DC Device Reset) 00649 USAGE(1), 0x9b, // USAGE (DC Device Pause) 00650 USAGE(1), 0x9c, // USAGE (DC Device Continue) 00651 LOGICAL_MINIMUM(1), 0x01, // LOGICAL_MINIMUM (1) 00652 LOGICAL_MAXIMUM(1), 0x06, // LOGICAL_MAXIMUM (6) 00653 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00654 REPORT_COUNT(1), 0x04, // REPORT_COUNT (4) 00655 OUTPUT(1), 0x00, // OUTPUT (Data,Ary,Abs) 00656 END_COLLECTION(0), // END_COLLECTION 00657 END_COLLECTION(0), // END_COLLECTION 00658 USAGE(1), 0x85, // USAGE (PID Pool Move Report) 00659 COLLECTION(1), 0x02, // COLLECTION (Logical) 00660 REPORT_ID(1), 0x0c, // REPORT_ID (12) 00661 USAGE(1), 0x86, // USAGE (Move Source) 00662 USAGE(1), 0x87, // USAGE (Move Destination) 00663 USAGE(1), 0x88, // USAGE (Move Length) 00664 LOGICAL_MAXIMUM(2), 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) 00665 REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) 00666 REPORT_COUNT(1), 0x04, // REPORT_COUNT (4) 00667 OUTPUT(1), 0x00, // OUTPUT (Data,Ary,Abs) 00668 END_COLLECTION(0), // END_COLLECTION 00669 USAGE(1), 0x7d, // USAGE (Device Gain Report) 00670 COLLECTION(1), 0x02, // COLLECTION (Logical) 00671 REPORT_ID(1), 0x02, // REPORT_ID (2) 00672 USAGE(1), 0x7e, // USAGE (Device Gain) 00673 LOGICAL_MAXIMUM(2), 0xff, 0x00, // LOGICAL_MAXIMUM (255) 00674 REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) 00675 REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) 00676 FEATURE(1), 0x02, // FEATURE (Data,Var,Abs) 00677 END_COLLECTION(0), // END_COLLECTION 00678 #endif 00679 END_COLLECTION(0) // END_COLLECTION 00680 }; 00681 00682 reportLength = sizeof(reportDescriptor); 00683 return reportDescriptor; 00684 } 00685 00686 bool USBPID::EPINT_OUT_callback() { 00687 uint32_t bytesRead = 0; 00688 uint8_t output[65]; 00689 uint8_t rID; 00690 USBDevice::readEP(EPINT_OUT, output, &bytesRead, MAX_PID_REPORT_SIZE); 00691 00692 // get the report ID 00693 rID = output[0] 00694 00695 switch(rID) 00696 // Set Envelope Report 00697 case 1 : 00698 // we take led[1] because led[0] is the report ID 00699 lock_status = led[1] & 0x07; 00700 00701 // We activate the endpoint to be able to recceive data 00702 if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE)) 00703 return false; 00704 return true; 00705 }
Generated on Tue Jul 19 2022 20:53:24 by
1.7.2
