Script para configuração de controle de PSX na porta paralela

Iniciado por Akuhn, 02 de Janeiro de 2007, 20:16

tópico anterior - próximo tópico

Akuhn

Fiz um script para ajudar quem está com dificuldades para usar seus controles de PSX na porta paralela.

Ele já é funcional, mas precisa de alguns ajustes ainda, por favor postem suas dúvidas/sugestões e quem puder contribua para melhorá-lo.

Para rodar o script copie o conteúdo abaixo e cole dentro de um arquivo, por exemplo joypl.sh.
Depois é preciso dar permissão de execução para esse arquivo:
Citarchmod +x joypl.sh

Para executar ele é preciso usar o sudo ou ser root, pois ele carrega e descarrega módulos do kernel:
Citarsudo ./joypl.sh

Citar
#!/bin/bash
# #########################################################
# Script para configuração de Joystick na porta paralela  #
# Desenvolvido por Aldefax Gilvan Kuhn           #
# Módulo utilizado gamecon - Kernel 2.6 Ubuntu 06.06     #
# Fiz este script para uso pessoal e estou compartilhando #
# a idéia, ele é livre para quem quiser copiar, modificar #
# ou fazer qualquer alteração, sugestões são bem-vindas.  #
# Correções, sugestões e contribuições aldefax@gmail.com  #
###########################################################

# Funções
Checa_Status() {
if [ $? -ne 0 ]
then
   zenity --error --text="Seu joystick não foi configurado!"
   exit 1
fi
}

# Verificar se o usuário possui permissões sudo ou root para gravar em /etc/modules
if ! [ -w /etc/modules ]
then
   zenity --error --text="Não tenho permissão para gravar as alterações, desculpe!"
   zenity --error --text="Tente assim: sudo $0"
   exit 1
fi

# Verificar se o pacote zenity e joystick estão instalados
dpkg -l zenity >/dev/null 2>/dev/null
Checa_Status
dpkg -l joystick >/dev/null 2>/dev/null
Checa_Status

# Se não estiverem instalados fazer a instalação deles

# Em qual porta de impressora o joystick está conectado?
PORTA=`zenity --title="Selecionando a porta" --width=400 --height=400 --list \
--text="Selecione a porta em que seu controle está conectado:" \
--radiolist --separator=separator --column "" --column "Cod." --column "Porta Paralela" --hide-column="2" \
   TRUE  0 "lp0 (Default para a maioria dos casos)" \
   FALSE 1 "lp1" \
   FALSE 2 "lp2" \
   FALSE 3   "lp3"`
Checa_Status

# Quantos joysticks você tem conectados a essa porta?
QTDADE=`zenity --title="Quantos controles você tem contectados?" --width=400 --height=400 --list --text="Selecione quantos controles estão conectados na mesma porta:" \
--radiolist --column "" --column "Cod." --column "Quantidade" --hide-column="2" \
   TRUE  1 "Um" \
`
# Desabilitei porque a sequencia nem sempre confere.
#   FALSE 2 "Dois" \
#   FALSE 3 "Três" \
#   FALSE 4 "Quantro" \
#   FALSE 5 "Cinco"
Checa_Status

# Qual o modelo do seu joystick?
MODELO=`zenity --title="Selecionando o controle" --width=400 --height=400 --list --text="Selecione o modelo do seu controle:" \
--radiolist --column "" --column "Cod." --column "Joystick/Gamepad" --hide-column="2" \
   TRUE  0 "Nenhum (Restaura configuração da porta paralela)" \
   FALSE 1 "Super Nintendo" \
   FALSE 2 "Nintendo" \
   FALSE 4 "Multisystem 1-botão joystick" \
   FALSE 5 "Multisystem 2-botão joystick" \
   FALSE 6 "Nintendo 64" \
   FALSE 7 "Sony PSX gamepad controller" \
   FALSE 8 "Sony PSX DDR (Dance Dance Revolution) controller" \
   FALSE 9 "SNES mouse"`
Checa_Status

# Remove joystick e instala porta de impressora
if [ $MODELO -eq 0 ]
then
        (
        echo "10" ; sleep 1
        echo "# Removendo módulo joydev" ; sleep 1
   modprobe -r joydev >/dev/null 2>/dev/null
        echo "25" ; sleep 1
        echo "# Removendo módulo gamecon" ; sleep 1
   modprobe -r gamecon >/dev/null 2>/dev/null
        echo "50" ; sleep 1
        echo "# Adicionando módulo lp" ; sleep 1
   modprobe lp >/dev/null 2>/dev/null
        echo "75" ; sleep 1
        echo "# Concluíndo" ; sleep 1
        echo "100" ; sleep 1
        ) |
        zenity --progress \
          --title="Removendo joystick" \
          --text="Selecionando Módulos..." \
          --percentage=0

        if [ "$?" = -1 ] ; then
                zenity --error \
                  --text="Ação cancelada."
        fi
   zenity --error --text="Nenhum joystick não foi configurado!"

   grep -i -v gamecon /etc/modules |grep -i -v lp >/tmp/modules
   echo "lp" >>/tmp/modules
   cp /etc/modules /etc/modules-`date +%s`
   cat /tmp/modules >/etc/modules
   exit 1
fi

case $QTDADE in
1) CONF=$PORTA,$MODELO,0,0,0,0;;
2) CONF=$PORTA,$MODELO,$MODELO,0,0,0;;
3) CONF=$PORTA,$MODELO,$MODELO,$MODELO,0,0;;
4) CONF=$PORTA,$MODELO,$MODELO,$MODELO,$MODELO,0;;
5) CONF=$PORTA,$MODELO,$MODELO,$MODELO,$MODELO,$MODELO;;
esac

zenity --question --text="Deseja ativar o(s) joystick(s) agora?"
Checa_Status

# Remove porta de impressora e instala joystick
        (
        echo "15" ; sleep 1
        echo "# Removendo módulo joydev" ; sleep 1
   modprobe -r joydev >/dev/null 2>/dev/null
        echo "30" ; sleep 1
        echo "# Removendo módulo gamecon" ; sleep 1
   modprobe -r gamecon >/dev/null 2>/dev/null
        echo "50" ; sleep 1
        echo "# Removendo módulo lp" ; sleep 1
   modprobe -r lp >/dev/null 2>/dev/null
        echo "75" ; sleep 1
        echo "# Adicionando módulo gamecon" ; sleep 1
   modprobe gamecon map=$CONF >/dev/null 2>/dev/null
        echo "100" ; sleep 1
        ) |
        zenity --progress \
          --title="Instalando joystick" \
          --text="Selecionando Módulos..." \
          --percentage=0

        if [ "$?" = -1 ] ; then
                zenity --error \
                  --text="Ação cancelada."
        fi

# Testando joystick (não consegui colocar saída em um information dialog box)
sleep 1
jstest /dev/input/js0

# Para funcionar o joystick é necessário calibrá-lo
jscalibrator
Checa_Status

# Remove porta de impressora e instala joystick
        (
        echo "15" ; sleep 1
#        echo "# Removendo módulo joydev" ; sleep 1
   modprobe -r joydev >/dev/null 2>/dev/null
        echo "30" ; sleep 1
#        echo "# Removendo módulo gamecon" ; sleep 1
   modprobe -r gamecon >/dev/null 2>/dev/null
        echo "50" ; sleep 1
#        echo "# Removendo módulo lp" ; sleep 1
   modprobe -r lp >/dev/null 2>/dev/null
        echo "75" ; sleep 1
#        echo "# Atualizando módulo gamecon" ; sleep 1
#   modprobe gamecon map=$CONF >/dev/null 2>/dev/null
        echo "100" ; sleep 1
        ) |
        zenity --progress \
          --title="Atualizando configuração" \
          --text="Atualizando Módulos..." \
          --percentage=0

        if [ "$?" = -1 ] ; then
                zenity --error \
                  --text="Ação cancelada."
        fi

zenity --question --text="Deseja tornar essas configurações permanentes?"
Checa_Status

grep -i -v gamecon /etc/modules |grep -i -v lp >/tmp/modules
echo "gamecon map=$CONF" >>/tmp/modules
cp /etc/modules /etc/modules-`date +%s`
cat /tmp/modules >/etc/modules

zenity --info --text="Configuração concluída."


Aldefax Gilvan Kuhn

Linux User 410689

_Luks


Dead_Angel

muito bom *.*

soh consegui instalar o driver do tapete ddr por causa do teu script
vlw X)

Lucas_Panurge

eu tento o "./joypl.sh" e dá nisso:

root@lucas:/home/lucas# ./joypl.sh
./joypl.sh: line 44: zenity: comando não encontrado
./joypl.sh: line 16: zenity: comando não encontrado

???
gtalk: lucas.pan@gmail.com
icq: lucasspan
GNU/Linux User #440333

_Luks

o zenity é um programa do GNOME.
tenta trocar zenity por kdialog ou xdialog

Akuhn

Exatamente, o Zenity é um interpretador de diálogos para gnome, infelizmente ele não usa o dialog padrão então não é possível mudar para xdialog, kdialog ou gdialog sem fazer grandes alterações no script.

Se estiver usando gnome é só instalar o zenity que vai funcionar numa boa.

Citarsudo aptitude install zenity

Estou melhorando o script e pretendo migrar ele para o dialog padrão, fiz em Shell+Zenity por conhecer melhor.

[ ]'s.
Aldefax Gilvan Kuhn

Linux User 410689

Virus_cg

#6
Akuhn seu script de detecção é muito legal, parabéns!

Sobre a detecção, eu tenho dois gamepads analógicos ligados na porta da impressora (os dois cabos convergindo na mesma porta paralela) e o seu script só detecta 1, isso é normal?  ???

Lucas_Panurge

gtalk: lucas.pan@gmail.com
icq: lucasspan
GNU/Linux User #440333

Akuhn

Citação de: Virus_cg online 05 de Junho de 2007, 21:02
Akuhn seu script de detecção é muito legal, parabéns!

Sobre a detecção, eu tenho dois gamepads analógicos ligados na porta da impressora (os dois cabos convergindo na mesma porta paralela) e o seu script só detecta 1, isso é normal?  ???

É normal sim, por enquanto ainda não consegui elaborar uma rotina para fazer funcionar de forma automática  quando tem mais de um joystick, mas já estou vendo para arrumar um tempo e melhorar um pouco o script.
Estou estudando a linguagem python e pyGTK, acho que assim consigo fazer algo mais funcional do que em Shell script e zenity.

Qualquer dúvida pergunte, se quiser posso te passar a forma manual de configurar os joysticks, eu também tenho 2 joy de play ligados a mesma porta paralela e ambos funcionam perfeitamente.

[ ]'s.
Aldefax Gilvan Kuhn

Linux User 410689

Akuhn

Citação de: Lucas_Panurge online 07 de Junho de 2007, 18:19
quando chega no jstest, como faz pra finalizar?

É só fechar que ele volta para a configuração do script.

Dúvidas pergunte, [ ]'s.
Aldefax Gilvan Kuhn

Linux User 410689

Virus_cg

Por favor me passe a forma manual, com ou sem muito trabalho quero os dois funcionando... Agradeço seu tempo...  :D

Akuhn

Citação de: Virus_cg online 16 de Junho de 2007, 00:40
Por favor me passe a forma manual, com ou sem muito trabalho quero os dois funcionando... Agradeço seu tempo...  :D

OK, para funcionar de forma manual é assim,
Essa sequência prepara o sistema para receber o módulo:
Citarsudo su
modprobe -r joydev
modprobe -r lp
modprobe -r gamecon

Aqui você instala e configura ele:
modprobe gamecon map=PORTA,JOY1,JOY2,JOY3,JOY4,JOY5

Geralmente esse funciona:
Citarmodprobe gamecon map=0,7,0,0,7,0

Se não der tente trocar de lugar o segundo joystick, na ordem, pois isso depende de como os fios estão ligados internamente quando o controle foi adaptado, por isso a dificuldade para fazer o script funcionar com mais de 1 joystick.
Estou testando para que o script teste todas as condições de porta até achar os joystick, mas ainda estou com alguns probleminhas.

[ ]'s.
Aldefax Gilvan Kuhn

Linux User 410689

ironjunior

Cara, o teu Script ficou absurdamente show!!

A única forma que consegui achar para configurar um tapete "PSX DDR" podendo apertar dois botões  simultaneamente foi com o seu script!  :D
(pois em outras configurações as setas do tapede são reconhecidas como eixo, não aceitando os botões simultaneos).

Agora os tapetes que são plugados na porta USB, que são reconhecidos automaticamente pelo Ubuntu eu não consegui configurar de forma a apertar os botões simultaneamente (reconhecendo as setas como botões, e não como eicho).

Você saberia como??

Desde já agradeço e parabéns pelo seu script!

Akuhn

Não consegui nenhum joystick usb ainda pra fazer testes, mas assim que conseguir eu adiciono no script também.

É possível que seja algum problema ou conflito de módulo, pelo pouco que li sobre joysticks usb eles utilizam outros módulos, diferentes dos que são utilizados pelos de porta paralela, talvez haja algum parâmetro específico que deve ser adicionado no módulo para funcionar com os tapetes usb.

[ ]'s.
Aldefax Gilvan Kuhn

Linux User 410689

Fotondf

#14
Sempre que eu uso este Script, ao final abre o JScalibrator e emite a seguinte mensagem.

CitarCould not access the specified path(s), verify that the patch(s) are specified correctly and that you have sufficient permission to access them. Also make sure that the joystick in question is actually connected, on (as needed), not in use by another program, and that the joystick driver or module is loaded (type 'modprobe <driver_name>').

Pelo o que eu entendi fala que eu não tenho acesso aos patchs e pede para eu verificar se o jostick está conectado, se está em uso por outro programa e se o driver está ativo.
Mas eu sei que o controle está devidamente conectado, não está em uso por outro programa, eu estou no modo root (sudo -i). O que está errado?
Depois de clicar em OK neste erro, aparece a mensagem:
CitarDeseja tornar essas configurações permanentes?
Clico em OK e aparece a mensagem de que a configuração está concluída.
Abro um emulador de SNES e não está funcionando.

Uso O Ubuntu Feisty 7.04. E o joystick é um de Playstation 1 original.

Analisando melhor vi que este erro também aparece no terminal:
Citarjstest: No such file or directory
O que vem a ser isto?



Bom, fui à /dev/input e criei a pasta js0. Com isso o primeiro erro foi trocado para
Citar
Joystick (Unknown) has 2 axes ((null), ?)
./joypl.sh: line 147:  9725 Falha de segmentação  (core dumped) jstest /dev/input/js0
Failed to set joystick /dev/input/js0 correction values: Inappropriate ioctl for device
Alguém poderia me dar uma força?
AMD Phenom II X4 955 / 8Gb de ram DDR3 1333 / NVidia GTX 550Ti / MB Asus M4N68T-LE
Ubuntu 14.04 64Bits / Windows 8 Pro 64Bits