Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@andsve
Last active March 27, 2021 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andsve/1805fdaec8cb45fb7971f81fb8d3a656 to your computer and use it in GitHub Desktop.
Save andsve/1805fdaec8cb45fb7971f81fb8d3a656 to your computer and use it in GitHub Desktop.
Thrustmasters T150 Pro USB, Mac data report
Investigating values in the report data for Thrustmasters T150 Pro (including and connected pedals) when connected to a MacBook Pro.
The wheel is set in the PS4 mode, NOT the "recommended" PC mode "PS3".
The values were snooped up using Wireshark, listening to the USB.
Vendor: 0x44F (1103)
Product: 0xB66D (46701)
(Note: The values were recorded while the "switch clutch and acc" mode was enabled, sadly... But hopefully it should only be those two "axis" being swapped.)
Example of report data (in idle):
01 80 80 80 80 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c6 7f 00 00 ff ff ff ff 00 ff ff 00 00 00 00 00 00 00 00 00 00
(Note: Clutch in this case seems to report 00 00 as idle, but "should" be ff ff. It does however fall back to ff ff when anything else is being pressed, but might be something to keep in mind when reading the clutch values.)
Naive interpretation of the different bytes:
--------------------------------------------------------------------------
BYTE: 0
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | 1 | CONST (=0x01)
+-------------------+
BYTE: 1, 2, 3, 4
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| 1 | 0 | CONST (=0x80)
+-------------------+
HAT and BUTTONS
BYTE: 5
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | 1 | IDLE
+-------------------+
| 1 | | TRIANGLE (=8x)
+-------------------+
| 1 | | CIRCLE (=4x)
+-------------------+
| 1 | | CROSS (=2x)
+-------------------+
| 1 | | SQUARE (=1x)
+-------------------+
| | | HAT UP (=x0)
+-------------------+
| | 1 | HAT RIGHT (=x2)
+-------------------+
| | 1 | HAT DOWN (=x4)
+-------------------+
| | 1 1 | HAT LEFT (=x6)
+-------------------+
TRIGGERS, SHARE, OPTIONS
BYTE: 6
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | | IDLE
+-------------------+
| | 1 | L1
+-------------------+
| | 1 | L2 (NOTE, Byte 8 is 0xFF when active)
+-------------------+
| 1 | | L3
+-------------------+
| | 1 | R1
+-------------------+
| | 1 | R2 (NOTE, Byte 9 is 0xFF when active)
+-------------------+
| 1 | | R3
+-------------------+
| 1 | | SE/Share
+-------------------+
| 1 | | ST/Options
+-------------------+
PS Button
BYTE: 7
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | | IDLE
+-------------------+
| | 1 | PS Button
+-------------------+
L2 and R2, extra data? (See Byte 6 above)
BYTE: 8, 9
8 9
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| | | | | IDLE
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | | | L2
+-------------------+-------------------+
| | | 1 1 1 1 | 1 1 1 1 | R2
+-------------------+-------------------+
Unused (could be force feedback data?)
BYTE: 10 to (and including) 42
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | | IDLE
+-------------------+
WHEEL
BYTE: 43, 44
NOTE:
Center can differ, after self test/setup the wheel will auto turn into "center".
The data is least significant byte first, so example below, center position is reported as 0xc67f, but should be read as a uint16_t as 0x7fc6!
43 44
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| 1 1 | 1 1 | 1 1 1 | 1 1 1 1 | Center position (=0xc67f)
+-------------------+-------------------+
| 1 | 1 1 1 | 1 1 | 1 1 | Wheel to the right (=0x2d9a)
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | Right max (=0xffff)
+-------------------+-------------------+
| 1 1 | 1 | 1 1 | 1 1 | Wheel to the left (=0x525a)
+-------------------+-------------------+
| | | | | Left max (=0x0000)
+-------------------+-------------------+
| 1 1 | 1 | | 1 1 1 | Left max-~30DEG (=0x3407)
+-------------------+-------------------+
The range is 0x0000 to 0xffff, 0 to 65535. Center should be half, so: 65535/2 -> ~32767.
True value center compared to reported value after init/bootup;
"True": 32767 -> 0x7fff
After boot: 0xc67f (swap bytes) -> 0x7fc6 -> 32710
(But after boot center can differ!)
PEDALS (CLUTCH, BREAK, ACC)
BYTE: 45, 46, 47, 48, 49, 50
45 46
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | Idle
+-------------------+-------------------+
| | | | | Clutch Max
+-------------------+-------------------+
47 48
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | Idle
+-------------------+-------------------+
| | | | | Break Max
+-------------------+-------------------+
49 50
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | Idle
+-------------------+-------------------+
| | | | | Acc Max
+-------------------+-------------------+
Rest of vendor data is constant, as far as I understand.
BYTE: 51
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | | CONST (=0x00)
+-------------------+
BYTE: 52, 53
+-------------------+-------------------+
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
+-------------------+-------------------+
| 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | CONST (=0xffff)
+-------------------+-------------------+
BYTE: 54 to (and including) 63
+-------------------+
| 7 6 5 4 3 2 1 0 |
+-------------------+
| | | CONST (=0x00)
+-------------------+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment