[Dica] Joystick Xbox no Linux {Clone, Genérico, Paralelo}

Na live do @Dio hoje alguém perguntou sobre o funcionamento de joystick xbox no linux, (não lembro o nome da pessoa), estava com dificultade de fazer funcionar os botões. Vou deixar esse tópico aqui, quem sabe ele venha consultar, ou se o @Dio repassar para a pessoa testar.

Aqui tenho um Joystick Xbox Clone e é chato pra funcionar no Linux, mas ai vai uma solução paleativa. Seguindo as dicas desse forum:

instale esse pacote:
sudo apt install -y xboxdrv

instale esse modulo python 3:
pip install pyusb

Agora vai precisar aplicar o script python “fix-controller” toda vez que for usar o joystick

Importante o controle deve estar plugado e ligado antes de executar o scprit “fix-controller”.
O script deve ser executado como sudo.
sudo ./fixcontroller

scprit “fix-controller”:

#!/usr/bin/env python3

import os
import sys
import time

import logging
import logging.handlers

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

handler = logging.handlers.SysLogHandler(address = '/dev/log')
handler.setFormatter(logging.Formatter('%(levelname)-8s %(pathname)-12s %(message)s'))
my_logger.addHandler(handler)


handler = logging.StreamHandler(sys.stdout)
my_logger.addHandler(handler)
print = my_logger.debug

try:
    import usb.core
    import usb.util
except ImportError:
    print("First, install the pyusb module with PIP or your package manager.")
else:
    if os.geteuid() != 0:
        print("You need to run this script with sudo")
        sys.exit()

    for i in range(4000,0,-1):
        if i%1000 ==0:
            print("waiting for controller {}".format(i/1000))
        dev = usb.core.find(idVendor=0x045e, idProduct=0x028e)
        if dev is not None:
            break
        time.sleep(.001)
    else:
        my_logger.critical("Failed to detect controller")
        sys.exit()
    if dev is not None:
        dev.ctrl_transfer(0xc1, 0x01, 0x0100, 0x00, 0x14)
        print("success")

No meu caso o joystick é USB com cabo, não é Bluetooth como no forum, e mesmo assim funcionou.
Testado no Linux Mint 20.2 Cinnamon

2 curtidas

Bizonho o controle não pegar as vezes plug & play. Tenho aqui um controle do Xbox one S e funciona, out of the box, com fio e via bluetooth :thinking:
Sugestão: coloca uma no flag do tópico como “Dica”.
Ex: [Dica] Joystick Xbox no Linux

2 curtidas

Atualizando o post:

modulo do kernel:

como o script abaixo já é possível instalar o modulo direto no kernel:
PS: deixe o controle plugado ao aplicar o script
Execute o script como sudo:

#!/usr/bin/env bash
set -e

PATH_BACKUP=${PWD}
TMP_DOWNLOADS=$PATH_BACKUP"/tmp-Backup-programas"

if [ ! -d "$TMP_DOWNLOADS" ] ; then
    su $SUDO_USER -c "mkdir ${[email protected]}"
fi
#---------------------


XPAD_GIT="https://github.com/paroj/xpad/archive/refs/heads/master.zip"
XPAD_VERSION="0.4"
DESTINATION="/usr/src/xpad-""$XPAD_VERSION"

if [ -d "$DESTINATION" ]; then
    dkms remove -m xpad -v "$XPAD_VERSION" --all
    rm -fR "$DESTINATION"
fi

su $SUDO_USER -c "wget -c ${[email protected]} -P ${[email protected]}"
unzip -o "$TMP_DOWNLOADS"/master.zip -d /usr/src/
mv -f /usr/src/xpad-master /usr/src/xpad-"$XPAD_VERSION"

dkms install -m xpad -v "$XPAD_VERSION"

ps: Com esse scrpit não preciso mais instalar o xboxdrv nem o pyusb e tambem não preciso mais aplicar o ./fixcontroller toda hora que vou usar o joystick