Joystick : Remapeando botões e eixos no Linux

Saturday, July 4, 2009

Tenho muitos joypads / joysticks com muitos esquemas diferentes botão, e utilizando este simples utilitário posso reconfigurar o layout dos botões, executando um simples script, ao invés de reconfigurar todos os jogos e emuladores sempre que eu quiser usar um joystick diferente.

Faça o DOWNLOAD aqui:
http://www.mediafire.com/?msitbdej0ad
http://ubuntuforums.org/attachment.php?attachmentid=66632&d=1208782381

É uma versão alterada do utilitário "jscal" do pacote "joystick". Este utilitário permite o remapeamento de botões e eixos diretamente junto ao driver.

Compilei para o Ubuntu 7.10 AMD64, mas vai funcionar com qualquer versão posterior. Além disso, você pode recompila-lo para qualquer versão, ao fazer um "make clean; make"

Procurei uma ferramenta que me permitisse fazer isso durante muito tempo. Encontrei-a aqui: http://bugs.debian.org/cgi-bin/bugreport.cgi? bug = 444142

Citando o autor do patch (traduzido com Google translator):


Citação:
Pacote: joystick
Versão: 20051019-1
Severity: wishlist
Tags: patch

Motivação

Eu encontrei nenhuma ferramenta simples que remapear o joystick eixos
e botões no dispositivo controlador nível (joydev módulo), enquanto que o condutor
prevê claramente a interface para isso. Meu sistema estende-se a
capacidades de jscal, a fim de remapear eixos e botões. Enquanto
remapeamento X no ficheiro de configuração é possível, que o mapeamento não
aparentemente para ajudar em todos os jogos.


Detalhe

Eu comprei uma Trust GM-2550 Predator joystick no outro dia, e eu reparei
que os eixos foram mapeados incorretamente: a borboleta no lugar do
leme, bem como o botão do pinky eixos foram deslocados até 1 ranhura no eixo
mapa. Eu encontrei nenhuma ferramenta para re-mapear os eixos sobre o driver de dispositivo (joydev)
nível. Embora remapeamento é possível, no X config, esta situação não se resolve
para o problema - por exemplo - SearchAndRescue.

Também achei nada para remapear os botões do joystick driver de dispositivo
nível. Isto é muito necessário, por exemplo, para tuxkart, porque alguns dos
utiliza os botões do jogo são, infelizmente, inacessível, mantendo
confortavelmente o joystick (alguns botões estão demasiado longe no stick).

Achei que o módulo do kernel joydev API para não fornecer os eixos e
botão remapeamento. Eu adicionei duas opções de linha de comando para jscal e dois
respectivas funções que utilizam a API e remapear botões e eixos.
Eu testei os eixos e remapeamento botão, e ele funciona como se pretende. I
podem trocar botões e eixos como eu desejo.


Implementação

Por favor, localize o diff do joystick jscal.c em anexo (joystick.diff).

A modificação jscal.c acrescenta dois argumentos da linha de comando:

-q - print-mapeamentos Imprimir o actual eixo eo botão
mapeamentos jscal como uma linha de comando

e

-u n_of_buttons, btnmap1, btnmap2,
...> - Set-Define mapeamentos eixo eo botão mapeamentos para o
valores especificados

Um exemplo de saída de-q parece com isso (./jscal -q /dev/input/js0):

jscal -u
10,0,1,2,5,6,16,17,40,41,42,13,288,289,290,291,292, 293.294.295.296.297.298.299.300
/dev/input/js0

O joystick tem 10 eixos e 13 botões. Se agora é a de um interruptor eixos 2
e 5 (para obter o leme e do acelerador à direita), um tem de executar:

jscal -u
10,0,1,5,2,6,16,17,40,41,42,13,288,289,290,291,292, 293.294.295.296.297.298.299.300
/dev/input/js0

mudando 2,5 para 5,2 na linha.

Remapeamento botões é feito da mesma maneira.


Além disso, existe um método muito bom de carregar a configuração automaticamente quando você conecta seu joystick, usando o udev.

Primeiro você deve criar uma regra udev. Esta é a minha:

##/etc/udev/rules.d/85-joy-config.rules

# # digiusb 0e8f: 0013
BUS == "usb", ACTION == "add", attrs (idVendor) == "0e8f", attrs (idProduct) == "0013", RUN + = "/usr/bin/joy-config-digiusb.sh"

# # genesis6b 0f00: 0008
BUS == "usb", ACTION == "add", attrs (idVendor) == "0f00", attrs (idProduct) == "0008", RUN + = "/usr/bin/joy-config-genesis6b.sh"


Como você pode ver, a regra irá executar o script especificado, logo que o dispositivo com o dado idVendor e idProduct for conectado.

E assim eu fiz os scripts:

"/usr/bin/joy-config-digiusb.sh"
#!/bin/bash
# digiusb 0e8f: 0013
# /usr/bin/joy-config-digiusb.sh
sleep 1
jscal -u 4,0,1,16,17,10,289,290,291,293,294,295,296,297,288,292 /dev/input/js0
jscal -u 4,0,1,16,17,10,289,290,291,293,294,295,296,297,288,292 /dev/input/js1
jscal -u 4,0,1,16,17,10,289,290,291,293,294,295,296,297,288,292 /dev/input/js2
jscal -u 4,0,1,16,17,10,289,290,291,293,294,295,296,297,288,292 /dev/input/js3


"/usr/bin/joy-config-genesis6b.sh"
#!/bin/bash
#genesis6b 0f00: 0008
#/usr/bin/joy-config-genesis6b.sh
sleep 1
jscal -u 2,0,1,16,309,310,311,312,313,314,308,316,317,318,319,315,304,305,306,307 /dev/input/js0
jscal -u 2,0,1,16,309,310,311,312,313,314,308,316,317,318,319,315,304,305,306,307 /dev/input/js1
jscal -u 2,0,1,16,309,310,311,312,313,314,308,316,317,318,319,315,304,305,306,307 /dev/input/js2
jscal -u 2,0,1,16,309,310,311,312,313,314,308,316,317,318,319,315,304,305,306,307 /dev/input/js3


Acrescentei um "sleep 1" apenas no caso de o driver não carregar a tempo.

Importante: não se esqueça do "#!/bin/bash" ou tudo vai falhar silenciosamente.

Além disso, os meus scripts tentarão aplicar o layout para js0-3, uma vez que isso só terá êxito se o dispositivo corresponder ao layout de botões / eixos. Eu não pude descobrir uma solução mais elegante, mas esta funciona para mim.

Espero que você ache útil.

Divirta-se.

0 comentários:

Post a Comment

Easy-Share


template by Ourblogtemplates.com
©Copyright 2009, Cleber de Mattos Casali. All rights reserved.