summaryrefslogtreecommitdiff
path: root/wheel_hid_report_desc.h
diff options
context:
space:
mode:
Diffstat (limited to 'wheel_hid_report_desc.h')
-rw-r--r--wheel_hid_report_desc.h853
1 files changed, 853 insertions, 0 deletions
diff --git a/wheel_hid_report_desc.h b/wheel_hid_report_desc.h
new file mode 100644
index 0000000..738da43
--- /dev/null
+++ b/wheel_hid_report_desc.h
@@ -0,0 +1,853 @@
+// ---------------------------------------------------
+// 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 ()