Xbox Controllers

So I finally connected my XBOX One S gamepad to my PC via Bluetooth. And guess what, it needed a remapping in jme in order for it to work properly. Just like any different version of Xbox controllers ever. I do understand that @pspeed had generic and Playstation controllers at hand when he was writing gamepad support, but Xbox pads are used by quite a lot of people too and it’s a bit of a shame that every single one of them has to be remapped.
Would some additional code in the joystick manager that would automatically apply xbox remap if it detects xbox button layout do the trick? If you look here, all the remappings are pretty much the same, so this would probably make sense. In what class should I add that code?

How would it detect xbox button layout?

Is the joystick not reporting an ID that can be put in the mappings file?

If it has rx and ry axes, it’s an xbox based pad.

The whole point of this thread is to write some code that removes the requirement for manual remapping of every single pad.

I mean, eventually won’t we have all of the 90 different “xbox” controller names covered?

…I could see adding regex support to the mappings but it also seems like a problem that creates more problems in the future than simply updating the file when new names pop up.

Is this a provable statement?

What do you need paul, I have 2 different styles of xbox controllers, an xbox 1, a steam controller, a super nintendo controller by buffalo.

I will buy a ps4 controller for this …

What do you need from these to be able to support them?

No need… I already have one and it works just fine. It’s only XBox controllers that are different enough to cause issues… and I don’t have one of those and have no desire to buy one (I think they are stupidly laid out for my personal preferences and so can’t see spending more than $4 on one.)

I doubt we can cover all the knock offs, but even if we do when a new console generation is released we’re back to square one.

Probably not. Tried to look through Microsoft’s documentation, but they don’t seem to have anything gamepad related publicly available.
However if you look at the remappings, after remapped, rx and ry are not used for anything and all buttons report their proper locations in TestJoystick. If we assume that the remapped values are how non xbox pads are (since that’s how the engine detects them), there is no rx or ry axes in there.

(Also sorry if this sounds like a mess. Reasoning in English is not my strong point.)

EDIT: Dropping this here: https://docs.microsoft.com/en-us/windows/desktop/api/xinput/ns-xinput-_xinput_gamepad

The output of TextJoystick for all my controllers.

Joystick[0]:Microsoft X-Box 360 pad
  buttons:10
   JoystickButton[name=A, parent=Microsoft X-Box 360 pad, id=0, logicalId=0]
   JoystickButton[name=B, parent=Microsoft X-Box 360 pad, id=1, logicalId=1]
   JoystickButton[name=X, parent=Microsoft X-Box 360 pad, id=2, logicalId=2]
   JoystickButton[name=Y, parent=Microsoft X-Box 360 pad, id=3, logicalId=3]
   JoystickButton[name=Left Thumb, parent=Microsoft X-Box 360 pad, id=4, logicalId=4]
   JoystickButton[name=Right Thumb, parent=Microsoft X-Box 360 pad, id=5, logicalId=5]
   JoystickButton[name=Select, parent=Microsoft X-Box 360 pad, id=6, logicalId=6]
   JoystickButton[name=Mode, parent=Microsoft X-Box 360 pad, id=7, logicalId=7]
   JoystickButton[name=Left Thumb 3, parent=Microsoft X-Box 360 pad, id=8, logicalId=8]
   JoystickButton[name=Right Thumb 3, parent=Microsoft X-Box 360 pad, id=9, logicalId=9]
  axes:9
   JoystickAxis[name=x, parent=Microsoft X-Box 360 pad, id=0, logicalId=x, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=y, parent=Microsoft X-Box 360 pad, id=1, logicalId=y, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=z, parent=Microsoft X-Box 360 pad, id=2, logicalId=z, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rx, parent=Microsoft X-Box 360 pad, id=3, logicalId=rx, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=ry, parent=Microsoft X-Box 360 pad, id=4, logicalId=ry, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rz, parent=Microsoft X-Box 360 pad, id=5, logicalId=rz, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov, parent=Microsoft X-Box 360 pad, id=6, logicalId=pov, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_x, parent=Microsoft X-Box 360 pad, id=7, logicalId=pov_x, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_y, parent=Microsoft X-Box 360 pad, id=8, logicalId=pov_y, isAnalog=false, isRelative=false, deadZone=0.0]

Joystick[1]:Microsoft X-Box One S pad
  buttons:10
   JoystickButton[name=A, parent=Microsoft X-Box One S pad, id=0, logicalId=0]
   JoystickButton[name=B, parent=Microsoft X-Box One S pad, id=1, logicalId=1]
   JoystickButton[name=X, parent=Microsoft X-Box One S pad, id=2, logicalId=2]
   JoystickButton[name=Y, parent=Microsoft X-Box One S pad, id=3, logicalId=3]
   JoystickButton[name=Left Thumb, parent=Microsoft X-Box One S pad, id=4, logicalId=4]
   JoystickButton[name=Right Thumb, parent=Microsoft X-Box One S pad, id=5, logicalId=5]
   JoystickButton[name=Select, parent=Microsoft X-Box One S pad, id=6, logicalId=6]
   JoystickButton[name=Mode, parent=Microsoft X-Box One S pad, id=7, logicalId=7]
   JoystickButton[name=Left Thumb 3, parent=Microsoft X-Box One S pad, id=8, logicalId=8]
   JoystickButton[name=Right Thumb 3, parent=Microsoft X-Box One S pad, id=9, logicalId=9]
  axes:9
   JoystickAxis[name=x, parent=Microsoft X-Box One S pad, id=0, logicalId=x, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=y, parent=Microsoft X-Box One S pad, id=1, logicalId=y, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=z, parent=Microsoft X-Box One S pad, id=2, logicalId=z, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rx, parent=Microsoft X-Box One S pad, id=3, logicalId=rx, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=ry, parent=Microsoft X-Box One S pad, id=4, logicalId=ry, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rz, parent=Microsoft X-Box One S pad, id=5, logicalId=rz, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov, parent=Microsoft X-Box One S pad, id=6, logicalId=pov, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_x, parent=Microsoft X-Box One S pad, id=7, logicalId=pov_x, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_y, parent=Microsoft X-Box One S pad, id=8, logicalId=pov_y, isAnalog=false, isRelative=false, deadZone=0.0]

Joystick[0]:PDP Xbox One Controller
  buttons:10
   JoystickButton[name=A, parent=PDP Xbox One Controller, id=0, logicalId=0]
   JoystickButton[name=B, parent=PDP Xbox One Controller, id=1, logicalId=1]
   JoystickButton[name=X, parent=PDP Xbox One Controller, id=2, logicalId=2]
   JoystickButton[name=Y, parent=PDP Xbox One Controller, id=3, logicalId=3]
   JoystickButton[name=Left Thumb, parent=PDP Xbox One Controller, id=4, logicalId=4]
   JoystickButton[name=Right Thumb, parent=PDP Xbox One Controller, id=5, logicalId=5]
   JoystickButton[name=Select, parent=PDP Xbox One Controller, id=6, logicalId=6]
   JoystickButton[name=Mode, parent=PDP Xbox One Controller, id=7, logicalId=7]
   JoystickButton[name=Left Thumb 3, parent=PDP Xbox One Controller, id=8, logicalId=8]
   JoystickButton[name=Right Thumb 3, parent=PDP Xbox One Controller, id=9, logicalId=9]
  axes:9
   JoystickAxis[name=x, parent=PDP Xbox One Controller, id=0, logicalId=x, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=y, parent=PDP Xbox One Controller, id=1, logicalId=y, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=z, parent=PDP Xbox One Controller, id=2, logicalId=z, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rx, parent=PDP Xbox One Controller, id=3, logicalId=rx, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=ry, parent=PDP Xbox One Controller, id=4, logicalId=ry, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rz, parent=PDP Xbox One Controller, id=5, logicalId=rz, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov, parent=PDP Xbox One Controller, id=6, logicalId=pov, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_x, parent=PDP Xbox One Controller, id=7, logicalId=pov_x, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_y, parent=PDP Xbox One Controller, id=8, logicalId=pov_y, isAnalog=false, isRelative=false, deadZone=0.0]

Joystick[2]:Wireless Steam Controller
  buttons:14
   JoystickButton[name=Thumb, parent=Wireless Steam Controller, id=0, logicalId=0]
   JoystickButton[name=Thumb 2, parent=Wireless Steam Controller, id=1, logicalId=1]
   JoystickButton[name=A, parent=Wireless Steam Controller, id=2, logicalId=2]
   JoystickButton[name=B, parent=Wireless Steam Controller, id=3, logicalId=3]
   JoystickButton[name=X, parent=Wireless Steam Controller, id=4, logicalId=4]
   JoystickButton[name=Y, parent=Wireless Steam Controller, id=5, logicalId=5]
   JoystickButton[name=Left Thumb, parent=Wireless Steam Controller, id=6, logicalId=6]
   JoystickButton[name=Right Thumb, parent=Wireless Steam Controller, id=7, logicalId=7]
   JoystickButton[name=Left Thumb 2, parent=Wireless Steam Controller, id=8, logicalId=8]
   JoystickButton[name=Right Thumb 2, parent=Wireless Steam Controller, id=9, logicalId=9]
   JoystickButton[name=Select, parent=Wireless Steam Controller, id=10, logicalId=10]
   JoystickButton[name=Mode, parent=Wireless Steam Controller, id=11, logicalId=11]
   JoystickButton[name=Left Thumb 3, parent=Wireless Steam Controller, id=12, logicalId=12]
   JoystickButton[name=Right Thumb 3, parent=Wireless Steam Controller, id=13, logicalId=13]
  axes:10
   JoystickAxis[name=x, parent=Wireless Steam Controller, id=0, logicalId=x, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=y, parent=Wireless Steam Controller, id=1, logicalId=y, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=rx, parent=Wireless Steam Controller, id=2, logicalId=rx, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=ry, parent=Wireless Steam Controller, id=3, logicalId=ry, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov, parent=Wireless Steam Controller, id=4, logicalId=pov, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_x, parent=Wireless Steam Controller, id=5, logicalId=pov_x, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_y, parent=Wireless Steam Controller, id=6, logicalId=pov_y, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov, parent=Wireless Steam Controller, id=7, logicalId=pov, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_x, parent=Wireless Steam Controller, id=8, logicalId=pov_x, isAnalog=false, isRelative=false, deadZone=0.0]
   JoystickAxis[name=pov_y, parent=Wireless Steam Controller, id=9, logicalId=pov_y, isAnalog=false, isRelative=false, deadZone=0.0]

Joystick[1]:USB,2-axis 8-button gamepad  
  buttons:8
   JoystickButton[name=Trigger, parent=USB,2-axis 8-button gamepad  , id=0, logicalId=0]
   JoystickButton[name=Thumb, parent=USB,2-axis 8-button gamepad  , id=1, logicalId=1]
   JoystickButton[name=Thumb 2, parent=USB,2-axis 8-button gamepad  , id=2, logicalId=2]
   JoystickButton[name=Top, parent=USB,2-axis 8-button gamepad  , id=3, logicalId=3]
   JoystickButton[name=Top 2, parent=USB,2-axis 8-button gamepad  , id=4, logicalId=4]
   JoystickButton[name=Pinkie, parent=USB,2-axis 8-button gamepad  , id=5, logicalId=5]
   JoystickButton[name=Base, parent=USB,2-axis 8-button gamepad  , id=6, logicalId=6]
   JoystickButton[name=Base 2, parent=USB,2-axis 8-button gamepad  , id=7, logicalId=7]
  axes:2
   JoystickAxis[name=x, parent=USB,2-axis 8-button gamepad  , id=0, logicalId=x, isAnalog=true, isRelative=false, deadZone=0.0]
   JoystickAxis[name=y, parent=USB,2-axis 8-button gamepad  , id=1, logicalId=y, isAnalog=true, isRelative=false, deadZone=0.0]