Am Mo., 11. Feb. 2019 um 22:26 Uhr schrieb Kai Krakow kai@kaishome.de:
Hey Zeb!
Wine can pick up controllers from udev, either via hidraw or evdev, as well as from SDL. As of bd9e130ee, we shouldn't be using signed offsets anymore when reporting SDL controllers, so I assumed that your controller was coming through hidraw directly.
Not sure, does the log show this? I'm pretty sure it's going through SDL because I can apply SDL controller mappings to it through environment.
Log should show this, yes.
The symptoms you describe imply that anything above 0x6000 (?) is somehow wrapping around to negative, though that doesn't necessarily make very much sense.
Indeed, I'm confused too. ;-)
Well, it's close to an explanation. INSIDE, which prompted these patches, showed very similar symptoms: the game assumed that the controller had a range of 0-32767, and so mapped 0-16383 to "left" and 16384-32767 to "right", and negative values were interpreted as above 16384 and therefore also "right". Thus the effect was basically the same as you describe, except inverted.
Can you provide a log with +hid,+hidp,+hid_report,+rawinput?
Sure, I'll do. But please wait, I really need some sleep now, this was bothering me for a few hours now. ;-)
Just let me know: Two logs? One with patches reverted and one without?
Just without any patches reverted (so with the bug visible) will hopefully be enough.
Here's the log: https://gist.github.com/a9b51a975f933482a7125792a66bf3cd
This looks correct:
0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x30: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 65535, PhysicalMin 0, PhysicalMax 65535 -- StartBit 24/16 0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x31: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 65535, PhysicalMin 0, PhysicalMax 65535 -- StartBit 40/16 0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x33: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 65535, PhysicalMin 0, PhysicalMax 65535 -- StartBit 56/16 0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x34: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 65535, PhysicalMin 0, PhysicalMax 65535 -- StartBit 72/16 0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x32: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 32767, PhysicalMin 0, PhysicalMax 32767 -- StartBit 88/16 0022:trace:hid:debug_print_value_cap INPUT Value: 0x1/0x35: ReportId 0, IsAbsolute 1, HasNull 0, Bit Size 16, ReportCount 1, UnitsExp 0, Units 0, LogicalMin 0, Logical Max 32767, PhysicalMin 0, PhysicalMax 32767 -- StartBit 104/16
Confirming with evtest:
Event type 3 (EV_ABS) Event code 0 (ABS_X) Value 0 Min -32768 Max 32767 Flat 4095 Event code 1 (ABS_Y) Value 0 Min -32768 Max 32767 Flat 4095 Event code 2 (ABS_Z) Value 0 Min 0 Max 1023 Fuzz 3 Flat 63 Event code 3 (ABS_RX) Value 0 Min -32768 Max 32767 Fuzz 255 Flat 4095 Event code 4 (ABS_RY) Value 0 Min -32768 Max 32767 Fuzz 255 Flat 4095 Event code 5 (ABS_RZ) Value 0 Min 0 Max 1023 Fuzz 3 Flat 63
Thanks, Kai