// --------------------------------------------------- // HID Report Descriptor for Force Feedback Steering Wheel // --------------------------------------------------- 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x04, // Usage (Joystick) 0xA1, 0x01, // Collection (Application) // --------------------------------------------------- // INPUT REPORT (ID = 1) // --------------------------------------------------- 0x85, 0x01, // Report ID (1) // --- Steering wheel 0x05, 0x02, // Usage Page (Simulation Controls) 0x09, 0xC8, // Usage (Steering) 0x15, 0x81, // Logical Min (-127) 0x25, 0x7F, // Logical Max (+127) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x81, 0x02, // Input (Data, Var, Abs) // --- Pedals + Clutch 0x05, 0x02, // Usage Page (Simulation Controls) // Usage order: Accelerator, Brake, Clutch 0x09, 0xC4, // Usage (Accelerator) 0x09, 0xC5, // Usage (Brake) 0x09, 0xC6, // Usage (Clutch) 0x15, 0x00, // Logical Min (0) 0x26, 0xFF, 0x00, // Logical Max (255) 0x75, 0x08, // Report Size (8) 0x95, 0x03, // Report Count (3) 0x81, 0x02, // Input (Data, Var, Abs) // --- Shifter (radio-button style) 0x09, 0xC7, // Usage (Shifter) 0x15, 0xFF, // Logical Min (-1) ← allows reverse 0x25, 0x07, // Logical Max (+7) ← up to 7 forward gears 0x35, 0xFF, // Physical Min (-1) 0x46, 0x07, 0x00, // Physical Max (7) 0x75, 0x04, // Report Size (4) 0x95, 0x01, // Report Count (1) 0x81, 0x42, // Input (Data, Var, Abs, Null) // --- Padding to align to byte 0x75, 0x04, 0x95, 0x01, 0x81, 0x01, // --- Shifter buttons (e.g., 8 manual buttons or paddle shifters) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Min (Button 1) 0x29, 0x08, // Usage Max (Button 8) 0x15, 0x00, // Logical Min (0) 0x25, 0x01, // Logical Max (1) 0x75, 0x01, // Size (1) 0x95, 0x08, // Count (8) 0x81, 0x02, // Input (Data, Var, Abs) // // --- Wheel (Steering) // 0x05, 0x02, // Usage Page (Simulation Controls) // 0x09, 0xC8, // Usage (Steering) // 0x15, 0x81, // Logical Minimum (-127) // 0x25, 0x7F, // Logical Maximum (+127) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x81, 0x02, // Input (Data, Variable, Absolute) // // --- Pedals: Throttle, Brake, Clutch // 0x09, 0xBB, // Usage (Throttle) // 0x09, 0xC5, // Usage (Brake) // 0x09, 0xC4, // Usage (Accelerator) // 0x75, 0x08, // Report Size (8) // 0x95, 0x03, // Report Count (3) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x81, 0x02, // Input (Data, Variable, Absolute) // // --- Hat switch (shifter) // 0x05, 0x01, // Usage Page (Generic Desktop) // 0x09, 0x39, // Usage (Hat switch) // 0x15, 0x00, // Logical Minimum (0) // 0x25, 0x07, // Logical Maximum (7) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0x3B, 0x01, // Physical Maximum (315) // 0x65, 0x14, // Unit (Eng Rot: Degrees) // 0x75, 0x04, // Report Size (4) // 0x95, 0x01, // Report Count (1) // 0x81, 0x42, // Input (Data, Variable, Absolute, Null) // // --- Padding // 0x75, 0x04, // Report Size (4) // 0x95, 0x01, // Report Count (1) // 0x81, 0x01, // Input (Constant) // // --- Shifter buttons (e.g., 8 buttons) // 0x05, 0x09, // Usage Page (Button) // 0x19, 0x01, // Usage Minimum (Button 1) // 0x29, 0x08, // Usage Maximum (Button 8) // 0x15, 0x00, // Logical Minimum (0) // 0x25, 0x01, // Logical Maximum (1) // 0x75, 0x01, // Report Size (1) // 0x95, 0x08, // Report Count (8) // 0x81, 0x02, // Input (Data, Variable, Absolute) // --------------------------------------------------- // Remaining: Feature and Output Reports for PID // (same as previously described) // --------------------------------------------------- // (Add PID Feature/Output reports as per earlier example) // --------------------------------------------------- // End Collection // --------------------------------------------------- 0xC0 // // NASKOO // // 0x05, 0x01, // Usage Page (Generic) // // 0x09, 0x04, // Usage (Joystick) // 0x05, 0x02, // Usage Page (Simulation) // 0x09, 0x02, // Usage (Automotive) // // 0xA1, 0x01, // Collection (Application) // 0xA1, 0x01, // Collection (Application) // 0x85, 0x01, // Report ID (1) // 0x09, 0xC6, // Usage (Z) // 0x09, 0xC7, // Usage (Rz) // 0x09, 0xC4, // Usage (X) // 0x09, 0xC5, // Usage (Y) // 0x16, 0x00, 0x80, // Logical Minimum (0) // 0x26, 0xFF, 0x7F, // Logical Maximum (255) // 0x75, 0x10, // Report Size (8) // 0x95, 0x04, // Report Count (4) // 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) // // 0xC0, // End Collection // 0xC0, // End Collection // // END NASKOO // 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 0x09, 0x04, // USAGE (Joystick) // 0xA1, 0x01, // COLLECTION (Application) // //================================Input Report======================================// // 0x09, 0x01, // USAGE (Pointer) // // WheelReport // 0x85, 0x01, // REPORT_ID (1) // 0xA1, 0x00, // COLLECTION (Physical) // //6 Axis for steering wheel, accelerator, brake, clutch, handbrake and spare // 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 0xa1, 0x00, // COLLECTION (Physical) // 0x09, 0x30, // USAGE (X) // 0x09, 0x31, // USAGE (Y) // 0x09, 0x32, // USAGE (Z) // 0x09, 0x33, // USAGE (Rx) // 0x09, 0x34, // USAGE (Ry) // 0x09, 0x35, // USAGE (Rz) // 0x09, 0x36, // USAGE (Slider) // 0x09, 0x37, // USAGE (Dial) // 0x16, 0x00, 0x80, // LOGICAL_MINIMUM (-32768) // 0x26, 0xFF, 0x7F, // LOGICAL_MAXIMUM (32767) // 0x75, 0x10, // REPORT_SIZE (16) // 0x95, 0x08, // REPORT_COUNT (8) // 0x81, 0x02, // INPUT (Data,Var,Abs) // 0xc0, // END_COLLECTION // //32 buttons // 0x05, 0x09, // USAGE_PAGE (Button) // 0x19, 0x01, // Usage Minimum (1), // 0x29, 0x20, // Usage Maximum (32) // 0x15, 0x00, // LOGICAL_MINIMUM (0) // 0x25, 0x01, // Logical Maximum (1), // 0x35, 0x00, // PHYSICAL_MINIMUM (0) // 0x45, 0x01, // Physical Maximum (1), // 0x95, 0x20, // Report Count (32 fields), // 0x75, 0x01, // Report Size (1 bit), // 0x81, 0x02, // INPUT (Data,Var,Abs) // #ifdef HATSWITCH // 0x05, 0x01, // Usage Page (Desktop), // 0x95, 0x01, // Report Count (1 field), // 0x75, 0x04, // Report Size (4 bit), // 0x25, 0x07, // Logical Maximum (7), // 0x46, 0x3B, 0x01, // Physical Maximum (315), // //0x65, 0x14, // Unit (Degrees), // 0x09, 0x39, // Usage (Hat Switch), // 0x81, 0x42, // >>>> Input (Variable) // //padding 4bits // 0x75, 0x04, // REPORT_SIZE (06) // 0x95, 0x01, // REPORT_COUNT (01) // 0x81, 0x03, // Input (Constant, Variable) // #endif // 0xc0, // END_COLLECTION // // PIDStateReport // 0x05, 0x0F, // USAGE_PAGE (Physical Interface) // 0x09, 0x92, // USAGE (PID State Report) // 0xA1, 0x02, // COLLECTION (Logical) // 0x85, 0x02, // REPORT_ID (02) // 0x09, 0x9F, // USAGE (Device Paused) // 0x09, 0xA0, // USAGE (Actuators Enabled) // 0x09, 0xA4, // USAGE (Safety Switch) // 0x09, 0xA5, // USAGE (Actuator Override Switch) // 0x09, 0xA6, // USAGE (Actuator Power) // 0x15, 0x00, // LOGICAL_MINIMUM (00) // 0x25, 0x01, // Logical Maximum (1) // 0x35, 0x00, // Physical Minimum (0) // 0x45, 0x01, // Physical Maximum (1) // 0x75, 0x01, // Report Size (1) // 0x95, 0x05, // Report Count (5) // 0x81, 0x02, // Input (variable,absolute) // 0x95, 0x03, // Report Count (3) // 0x81, 0x03, // Input (Constant, Variable) // 0x09, 0x94, // Usage (Effect Playing) // 0x15, 0x00, // Logical Minimum (0) // 0x25, 0x01, // Logical Maximum (1) // 0x35, 0x00, // Physical Minimum (0) // 0x45, 0x01, // Physical Maximum (1) // 0x75, 0x01, // Report Size (1) // 0x95, 0x01, // Report Count (1) // 0x81, 0x02, // Input (variable,absolute) // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x07, // Report Size (7) // 0x95, 0x01, // Report Count (1) // 0x81, 0x02, // Input (variable,absolute) // 0xC0, //End Collection Datalink (Logical) (OK) // //================================OutputReport======================================// // // SetEffectReport // 0x09, 0x21, //Usage (Set Effect Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x01, //Report ID 1 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x25, // Usage (Effect Type) // 0xA1, 0x02, // Collection Datalink (Logical) // 0x09, 0x26, // USAGE (26) Constant // 0x09, 0x27, // USAGE (27) Ramp // 0x09, 0x30, // USAGE (30) Square // 0x09, 0x31, // USAGE (31) Sine // 0x09, 0x32, // USAGE (32) Triangle // 0x09, 0x33, // USAGE (33) Sawtooth Up // 0x09, 0x34, // USAGE (34) Sawtooth Down // 0x09, 0x40, // USAGE (40) Spring // 0x09, 0x41, // USAGE (41) Damper // 0x09, 0x42, // USAGE (42) Inertia // 0x09, 0x43, // USAGE (43) Friction // // 0x09, 0x28, // Usage (28) (ET Custom Force Data) // 0x15, 0x01, // Logical Minimum (1) // //0x25, 0x0C, // Logical Maximum (12) // 0x25, 0x0B, // Logical Maximum (11) // 0x35, 0x01, // Physical Minimum (1) // //0x45, 0x0C, // Physical Maximum (12) // 0x45, 0x0B, // Physical Maximum (11) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x00, // Output (Data) // 0xC0, // End Collection Datalink (Logical) // 0x09, 0x50, // Usage (Duration) // 0x09, 0x54, // Usage (Trigger Repeat Interval) // 0x09, 0x51, // Usage (Sample Period) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x7F, // Logical Maximum (32767) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x7F, // Physical Maximum (32767) // 0x66, 0x03, 0x10, // Unit (4099) // 0x55, 0xFD, // Unit Exponent (253) // 0x75, 0x10, // Report Size (16) // 0x95, 0x03, // Report Count (3) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x55, 0x00, // Unit Exponent (0) // 0x66, 0x00, 0x00, // Unit (0) // 0x09, 0x52, // Usage (Gain) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x35, 0x00, // Physical Minimum (1) // 0x46, 0x10, 0x27, // Physical Maximum (10000) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x53, // Usage (Trigger Button) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x08, // Logical Maximum (8) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x08, // Physical Maximum (8) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x55, // Usage (Axes Enable) // 0xA1, 0x02, // Collection Datalink (Logical) // 0x05, 0x01, // Usage Page (Generic Desktop) // 0x09, 0x30, // Usage (X) // 0x09, 0x31, // Usage (Y) // 0x15, 0x00, // Logical Minimum (0) // 0x25, 0x01, // Logical Maximum (1) // 0x75, 0x01, // Report Size (1) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, // End Collection Datalink (Logical) // 0x05, 0x0F, // Usage Page (Physical Interface) // 0x09, 0x56, // Usage (Direction Enable) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x95, 0x05, // Report Count (5) // 0x91, 0x03, // Output (Constant, Variable) // 0x09, 0x57, // Usage (Direction) // 0xA1, 0x02, // Collection Datalink (Logical) // 0x0B, 0x01, 0, 0x0A, 0, // Usage (Ordinals: Instance 1) // 0x0B, 0x02, 0, 0x0A, 0, // Usage (Ordinals: Instance 2) // 0x66, 0x14, 0x00, // Unit (20) // 0x55, 0xFE, // Unit Exponent (254) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x35, 0x00, // Physical Minimum (1) // 0x47, 0xA0, 0x8C, 0, 0, // Physical Maximum (36000) // 0x66, 0x00, 0x00, // Unit (0) // 0x75, 0x08, // Report Size (8) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x55, 0x00, // Unit Exponent (0) // 0x66, 0x00, 0x00, // Unit (0) // 0xC0, // End Collection Datalink (Logical) // 0x05, 0x0F, // Usage Page (Physical Interface) // 0x09, 0x58, // Usage (Type Specific Block Offset) // 0xA1, 0x02, // Collection (Logical) // 0x0B, 0x01, 0, 0x0A, 0, // Usage (Ordinals: Instance 1) // 0x0B, 0x02, 0, 0x0A, 0, // Usage (Ordinals: Instance 2) // 0x26, 0xFD, 0x7F, // Logical Maximum (32765); 32K RAM or ROM max. // 0x75, 0x10, // Report Size (16) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, // End Collection (Logical) // 0xC0, //End Collection Datalink (Logical) (OK) // // SetEnvelopeReport // 0x09, 0x5A, //Usage (Set Envelope Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x02, //Report ID 2 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x5B, // Usage (Attack Level) // 0x09, 0x5D, // Usage (Fade Level) // 0x16, 0x00, 0x00, // Logical Minimum (0) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0x00, // Physical Minimum (0) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x75, 0x10, // Report Size (16) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x5C, // Usage (Attack Time) // 0x09, 0x5E, // Usage (Fade Time) // 0x66, 0x03, 0x10, // Unit (1003h) English Linear, Seconds // 0x55, 0xFD, // Unit Exponent (FDh) (X10^-3 ==> Milisecond) // 0x26, 0xFF, 0x7F, // Logical Maximum (32767) // 0x46, 0xFF, 0x7F, // Physical Maximum (32767) // 0x75, 0x10, // Report Size (16) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x45, 0x00, // Physical Maximum (0) // 0x66, 0x00, 0x00, // Unit (0) // 0x55, 0x00, // Unit Exponent (0) // 0xC0, //End Collection Datalink (Logical) (OK) // // SetConditionReport // 0x09, 0x5F, //Usage (Set Condition Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x03, //Report ID 3 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x23, // Usage (Parameter Block Offset) // 0x15, 0x00, // Logical Minimum (0) // 0x25, 0x03, // Logical Maximum (3) // 0x35, 0x00, // Physical Minimum (0) // 0x45, 0x03, // Physical Maximum (3) // 0x75, 0x04, // Report Size (4) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x58, // Usage (Type Specific Block Off...) // 0xA1, 0x02, // Collection Datalink (Logical) // 0x0B, 0x01, 0, 0x0A, 0, // Usage (Ordinals: Instance 1) // 0x0B, 0x02, 0, 0x0A, 0, // Usage (Ordinals: Instance 2) // 0x75, 0x02, // Report Size (2) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, // End Collection Datalink (Logical) // 0x16, 0x00, 0xC0, // Logical Minimum (-16384) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0xC0, // Physical Minimum (-16384) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x09, 0x60, // Usage (CP Offset) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x16, 0x00, 0xC0, // Logical Minimum (-16384) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0xC0, // Physical Minimum (-16384) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x09, 0x61, // Usage (Positive Coefficient) // 0x09, 0x62, // Usage (Negative Coefficient) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x16, 0x00, 0x00, // Logical Minimum (0) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0x00, // Physical Minimum (0) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x09, 0x63, // Usage (Positive Saturation) // 0x09, 0x64, // Usage (Negative Saturation) // 0x75, 0x10, // Report Size (16) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x65, // Usage (Dead Band) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // // SetPeriodicReport // 0x09, 0x6E, //Usage (Set Periodic Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x04, //Report ID 4 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x70, // Usage (Magnitude) // 0x16, 0x00, 0x00, // Logical Minimum (0) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0x00, // Physical Minimum (0) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x6F, // Usage (Offset) // 0x16, 0x00, 0xC0, // Logical Minimum (-16384) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0xC0, // Physical Minimum (-16384) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x95, 0x01, // Report Count (1) // 0x75, 0x10, // Report Size (16) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x71, // Usage (Phase) // 0x66, 0x14, 0x00, // Unit (14h) (Eng Rotation, Degrees) // 0x55, 0xFE, // Unit Exponent (FEh) (X10^-2) // 0x15, 0x00, // Logical Minimum (0) // 0x27, 0x9F, 0x8C, 0, 0, // Logical Maximum (35999) // 0x35, 0x00, // Physical Minimum (0) // 0x47, 0x9F, 0x8C, 0, 0, // Physical Maximum (35999) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x72, // Usage (Period) // 0x15, 0x00, // Logical Minimum (0) // 0x27, 0xFF, 0x7F, 0, 0, // Logical Maximum (32K) // 0x35, 0x00, // Physical Minimum (0) // 0x47, 0xFF, 0x7F, 0, 0, // Physical Maximum (32K) // 0x66, 0x03, 0x10, // Unit (1003h) (English Linear, Seconds) // 0x55, 0xFD, // Unit Exponent (FDh) (X10^-3 ==> Milisecond) // 0x75, 0x20, // Report Size (32) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x66, 0x00, 0x00, // Unit (0) // 0x55, 0x00, // Unit Exponent (0) // 0xC0, //End Collection Datalink (Logical) (OK) // // SetConstantForceReport // 0x09, 0x73, //Usage (Set Constant Force Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x05, // Report ID 5 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x70, // Usage (Magnitude) // 0x16, 0x00, 0xC0, // Logical Minimum (-16384) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0xC0, // Physical Minimum (-16384) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // // SetRampForceReport // 0x09, 0x74, //Usage (Set Ramp Force Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x06, // Report ID 6 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x75, // Usage (Ramp Start) // 0x09, 0x76, // Usage (Ramp End) // 0x16, 0x00, 0xC0, // Logical Minimum (-16384) // 0x26, 0x00, 0x40, // Logical Maximum (16384) // 0x36, 0x00, 0xC0, // Physical Minimum (-16384) // 0x46, 0x00, 0x40, // Physical Maximum (16384) // 0x75, 0x10, // Report Size (16) // 0x95, 0x02, // Report Count (2) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // /* // // CustomForceDataReport // 0x09, 0x68, //Usage (Custom Force Data Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x07, // Report ID 7 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x6C, // Usage (Custom Force Data Offset) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0x10, 0x27, // Logical Maximum (10000) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0x10, 0x27, // Physical Maximum (10000) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x69, // Usage (Custom Force Data) // 0x15, 0x81, // Logical Minimum (-127) // 0x25, 0x7F, // Logical Maximum (127) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x00, // Physical Maximum (255) // 0x75, 0x08, // Report Size (8) // 0x95, 0x0C, // Report Count (12) // 0x92, 0x02, 0x01, // Output (Variable, Buffered) // 0xC0, //End Collection Datalink (Logical) (OK) // // DownloadForceSample // 0x09, 0x66, //Usage (Download Force Sample) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x08, //Report ID 8 // 0x05, 0x01, // Usage Page (Generic Desktop) // 0x09, 0x30, // Usage (X) // // 0x09, 0x31, // Usage (Y) // 0x15, 0x81, // Logical Minimum (-127) // 0x25, 0x7F, // Logical Maximum (127) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x00, // Physical Maximum (255) // 0x75, 0x08, // Report Size (8) // // 0x95, 0x02, // Report Count (2) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // */ // // EffectOperationReport // 0x05, 0x0F, //Usage Page (Physical Interface) // 0x09, 0x77, //Usage (Effect Operation Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x0A, //Report ID 10 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x78, // Usage (Effect Operation) // 0xA1, 0x02, // Collection Datalink (Logical) // 0x09, 0x79, // Usage (Op Effect Start) // 0x09, 0x7A, // Usage (Op Effect Start Solo) // 0x09, 0x7B, // Usage (Op Effect Stop) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x03, // Logical Maximum (3) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x00, // Output (Data) // 0xC0, // End Collection Datalink (Logical) // 0x09, 0x7C, // Usage (Loop Count) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x00, // Physical Maximum (255) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // // PIDBlockFreeReport // 0x09, 0x90, //Usage (PID Block Free Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x0B, // Report ID 11 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // //PIDDeviceControl // 0x09, 0x96, //Usage (PID Device Control) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x0C, // Report ID 12 // 0x09, 0x97, // Usage (DC Enable Actuators) // 0x09, 0x98, // Usage (DC Disable Actuators) // 0x09, 0x99, // Usage (DC Stop All Effects) // 0x09, 0x9A, // Usage (DC Device Reset) // 0x09, 0x9B, // Usage (DC Device Pause) // 0x09, 0x9C, // Usage (DC Device Continue) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x06, // Logical Maximum (6) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x00, // Output (Data) // 0xC0, //End Collection Datalink (Logical) (OK) // // DeviceGainReport // 0x09, 0x7D, //Usage (Device Gain Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x0D, //Report ID 13 // 0x09, 0x7E, // Usage (Device Gain) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0x10, 0x27, // Physical Maximum (10000) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0xC0, //End Collection Datalink (Logical) (OK) // /* // //SetCustomForceReport // 0x09, 0x6B, //Usage (Set Custom Force Report) // 0xA1, 0x02, //Collection Datalink (Logical) // 0x85, 0x0E, // Report ID 14 // 0x09, 0x22, // Usage (Effect Block Index) // 0x15, 0x01, // Logical Minimum (1) // 0x25, 0x28, // Logical Maximum (40) // 0x35, 0x01, // Physical Minimum (1) // 0x45, 0x28, // Physical Maximum (40) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x6D, // Usage (Sample Count) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x00, // Logical Maximum (255) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x00, // Physical Maximum (255) // 0x75, 0x08, // Report Size (8) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x09, 0x51, // Usage (Sample Period) // 0x66, 0x03, 0x10, // Unit 4099 // 0x55, 0xFD, // Unit (Exponent 253) // 0x15, 0x00, // Logical Minimum (0) // 0x26, 0xFF, 0x7F, // Logical Maximum (32767) // 0x35, 0x00, // Physical Minimum (0) // 0x46, 0xFF, 0x7F, // Physical Maximum (32767) // 0x75, 0x10, // Report Size (16) // 0x95, 0x01, // Report Count (1) // 0x91, 0x02, // Output (Data,Var,Abs) // 0x55, 0x00, // Unit (Exponent 0) // 0x66, 0x00, 0x00, // Unit 0 // 0xC0, //End Collection Datalink (Logical) (OK) // //=========================================FeatureReport======================================// // */ // //CreateNewEffectReport // 0x09, 0xAB, // USAGE (Create New Effect Report) // 0xA1, 0x02, // COLLECTION (Logical) // 0x85, 0x05, // REPORT_ID (05) // 0x09, 0x25, // USAGE (Effect Type) // 0xA1, 0x02, // COLLECTION (Logical) // 0x09, 0x26, // USAGE (26) // 0x09, 0x27, // USAGE (27) // 0x09, 0x30, // USAGE (30) // 0x09, 0x31, // USAGE (31) // 0x09, 0x32, // USAGE (32) // 0x09, 0x33, // USAGE (33) // 0x09, 0x34, // USAGE (34) // 0x09, 0x40, // USAGE (40) // 0x09, 0x41, // USAGE (41) // 0x09, 0x42, // USAGE (42) // 0x09, 0x43, // USAGE (43) // //0x09, 0x28, // USAGE (28) // //0x25, 0x0C, // LOGICAL_MAXIMUM (0C) // 0x25, 0x0B, // LOGICAL_MAXIMUM (0B) // 0x15, 0x01, // LOGICAL_MINIMUM (01) // 0x35, 0x01, // PHYSICAL_MINIMUM (01) // //0x45, 0x0C, // PHYSICAL_MAXIMUM (0C) // 0x45, 0x0B, // PHYSICAL_MAXIMUM (0B) // 0x75, 0x08, // REPORT_SIZE (08) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x00, // FEATURE (Data) // 0xC0, // END COLLECTION () // 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 0x09, 0x3B, // USAGE (Byte Count) // 0x15, 0x00, // LOGICAL_MINIMUM (00) // 0x26, 0xFF, 0x01, // LOGICAL_MAXIMUM (511) // 0x35, 0x00, // PHYSICAL_MINIMUM (00) // 0x46, 0xFF, 0x01, // PHYSICAL_MAXIMUM (511) // 0x75, 0x0A, // REPORT_SIZE (0A) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x02, // FEATURE (Data,Var,Abs) // 0x75, 0x06, // REPORT_SIZE (06) // 0xB1, 0x01, // FEATURE (Constant,Ary,Abs) // 0xC0, // END COLLECTION () // // PIDBlockLoadReport // 0x05, 0x0F, // USAGE_PAGE (Physical Interface) // 0x09, 0x89, // USAGE (PID Block Load Report) // 0xA1, 0x02, // COLLECTION (Logical) // 0x85, 0x06, // REPORT_ID (06) // 0x09, 0x22, // USAGE (Effect Block Index) // 0x25, 0x28, // LOGICAL_MAXIMUM (28) // 0x15, 0x01, // LOGICAL_MINIMUM (01) // 0x35, 0x01, // PHYSICAL_MINIMUM (01) // 0x45, 0x28, // PHYSICAL_MAXIMUM (28) // 0x75, 0x08, // REPORT_SIZE (08) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x02, // FEATURE (Data,Var,Abs) // 0x09, 0x8B, // USAGE (Block Load Status) // 0xA1, 0x02, // COLLECTION (Logical) // 0x09, 0x8C, // USAGE (Block Load Success) // 0x09, 0x8D, // USAGE (Block Load Full) // 0x09, 0x8E, // USAGE (Block Load Error) // 0x25, 0x03, // LOGICAL_MAXIMUM (03) // 0x15, 0x01, // LOGICAL_MINIMUM (01) // 0x35, 0x01, // PHYSICAL_MINIMUM (01) // 0x45, 0x03, // PHYSICAL_MAXIMUM (03) // 0x75, 0x08, // REPORT_SIZE (08) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x00, // FEATURE (Data) // 0xC0, // END COLLECTION () // 0x09, 0xAC, // USAGE (RAM Pool Available) // 0x15, 0x00, // LOGICAL_MINIMUM (00) // 0x27, 0xFF, 0xFF, 0x00, 0x00, // LOGICAL_MAXIMUM (00 00 FF FF) // 0x35, 0x00, // PHYSICAL_MINIMUM (00) // 0x47, 0xFF, 0xFF, 0x00, 0x00, // PHYSICAL_MAXIMUM (00 00 FF FF) // 0x75, 0x10, // REPORT_SIZE (10) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x00, // FEATURE (Data) // 0xC0, // END COLLECTION () // // PIDPoolReport // 0x09, 0x7F, // USAGE (PID Pool Report) // 0xA1, 0x02, // COLLECTION (Logical) // 0x85, 0x07, // REPORT_ID (07) // 0x09, 0x80, // USAGE (RAM Pool Size) // 0x75, 0x10, // REPORT_SIZE (10) // 0x95, 0x01, // REPORT_COUNT (01) // 0x15, 0x00, // LOGICAL_MINIMUM (00) // 0x35, 0x00, // PHYSICAL_MINIMUM (00) // 0x27, 0xFF, 0xFF, 0x00, 0x00, // LOGICAL_MAXIMUM (00 00 FF FF) // 0x47, 0xFF, 0xFF, 0x00, 0x00, // PHYSICAL_MAXIMUM (00 00 FF FF) // 0xB1, 0x02, // FEATURE (Data,Var,Abs) // 0x09, 0x83, // USAGE (Simultaneous Effects Max) // 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (00 FF) // 0x46, 0xFF, 0x00, // PHYSICAL_MAXIMUM (00 FF) // 0x75, 0x08, // REPORT_SIZE (08) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x02, // FEATURE (Data,Var,Abs) // 0x09, 0xA9, // USAGE (Device Managed Pool) // 0x09, 0xAA, // USAGE (Shared Parameter Blocks) // 0x75, 0x01, // REPORT_SIZE (01) // 0x95, 0x02, // REPORT_COUNT (02) // 0x15, 0x00, // LOGICAL_MINIMUM (00) // 0x25, 0x01, // LOGICAL_MAXIMUM (01) // 0x35, 0x00, // PHYSICAL_MINIMUM (00) // 0x45, 0x01, // PHYSICAL_MAXIMUM (01) // 0xB1, 0x02, // FEATURE (Data,Var,Abs) // 0x75, 0x06, // REPORT_SIZE (06) // 0x95, 0x01, // REPORT_COUNT (01) // 0xB1, 0x03, // FEATURE ( Cnst,Var,Abs) // 0xC0, // END COLLECTION () // 0x85, 0x0F, // REPORT_ID (15) // 0x09, 0x03, // USAGE (Vendor Usage 3) // 0x15, 0x00, // LOGICAL_MINIMUM (0) // 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) // 0x75, 0x08, // REPORT_SIZE (8) // 0x95, 0x01, // REPORT_COUNT (1) // 0x91, 0x02, // Output (Data,Var,Abs) // //0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) //command // 0x09, 0x03, // USAGE (Vendor Usage 3) // 0x15, 0x00, // LOGICAL_MINIMUM (0) // 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) // 0x75, 0x10, // REPORT_SIZE (16) // 0x95, 0x03, // REPORT_COUNT (3) // 0x91, 0x02, // Output (Data,Var,Abs) // //0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) //3 args // 0x85, 0x10, // REPORT_ID (16) // 0x09, 0x04, // USAGE (Vendor Usage 4) // 0x75, 0x08, // REPORT_SIZE (8) // 0x95, 0x1f, // REPORT_COUNT (31) // //0x81, 0x82, // INPUT (Data,Var,Abs,Vol) // 0x81, 0x02, // INPUT (Data,Var,Abs) // 0xC0, // END COLLECTION ()