Jörg Weber / USBJoystick

Dependents:   USBJoystick_HelloWorld2_wip

Fork of USBJoystick by Wim Huiskamp

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBJoystick.cpp Source File

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 }