Speed | bytesToIntLe(raw, 0, 2) * 0.01569358787 | May want to check the multiplier against an external GPS device
Brake position | min(C / 0.7, 100) | The third byte is the pressure in the brake system, in Bars. The 0.7 divider seems to be a good value to get 100% at pressure slightly higher than those you're likely to use on the track for cars with no aero. You can use 0.8 or 0.9 if you see 100% too often.
# PID 0xD4
Update frequency: 50 times per second.
Channel | RaceChrono equation | Notes
------- | ------------------- | -----
Wheel speed FL | bytesToIntLe(raw, 0, 2) * 0.01569358787 | Use same multiplier as for speed in 0xD1
Wheel speed FR | bytesToIntLe(raw, 2, 2) * 0.01569358787 | Use same multiplier as for speed in 0xD1
Wheel speed RL | bytesToIntLe(raw, 4, 2) * 0.01569358787 | Use same multiplier as for speed in 0xD1
Wheel speed RR | bytesToIntLe(raw, 6, 2) * 0.01569358787 | Use same multiplier as for speed in 0xD1
# PID 0x140
Update frequency: 100 times per second.
Channel | RaceChrono equation | Notes
------- | -------------------
Accelerator position | A / 2.55
Clutch position | (B & 0x80) / 1.28 | On/off only
Engine RPM | C + (D & 63) * 256
??? | E
Throttle position | F / 2.55 | Not tested
??? | G
??? | H
# PID 0x141
Update frequency: 100 times per second.
Channel | RaceChrono equation | Notes
------- | -------------------
Gear | G & 0xF | Not tested much. The value seems to jump so much that the usefulness is questionable.
Given how frequently 0x141 messages are sent, I presume there's a lot more