# Consulta sobre joystick

## josedb

Que tal, estube investigando bastante pero no logre encontrar ni tutoriales ni howto's que hablen de lo que estaba buscando, lo que queria hacer es usar alguno de los 2joystick que tengo para asignarle funciones a sus botones, por ejemplo, tengo el Cyborg command unit de Saitek, y quiero que con el boton 1 se habra el firefox, con el 2 que suba el volumen etc.

lo que hice hasta ahora es conseguir que reconozca los dispositivos e incluso los use en juegos, pero no encuentro ni tengo la menor idea de como hacer esto. si alguien conoce un howto se lo agradeceria muchisimo.

gracias.

----------

## i92guboj

 *josedb wrote:*   

> Que tal, estube investigando bastante pero no logre encontrar ni tutoriales ni howto's que hablen de lo que estaba buscando, lo que queria hacer es usar alguno de los 2joystick que tengo para asignarle funciones a sus botones, por ejemplo, tengo el Cyborg command unit de Saitek, y quiero que con el boton 1 se habra el firefox, con el 2 que suba el volumen etc.
> 
> lo que hice hasta ahora es conseguir que reconozca los dispositivos e incluso los use en juegos, pero no encuentro ni tengo la menor idea de como hacer esto. si alguien conoce un howto se lo agradeceria muchisimo.
> 
> gracias.

 

DE joysticks no tengo ni repajolera idea, pero si producen un xevent, como debieran, entonces no debería ser problema crear bindings para esos botones. Así que primero lanza xev en un terminal, saldrá una ventanita. Asegúrate de que la ventanita blanca tiene el foco y luego déja el mouse y el teclado quietos y dale al joystick, mira a ver si xev registra algún evento (si es así, se producirá una salida en el terminal, si no, quedará quieto). En caso de que haya salida, x reconoce los eventos, y en tal caso, es  tan sencillo como regoger el evento que produce cada tecla o botón, y atarlos a un programa o acción con xmodmap o similar. Aunque como ya dije, jamás lo he probado yo mismo.

----------

## josedb

no reproducen un xevent, ya probe el xev, es mas todo mi teclado lo configure yo. el tema es ese, si reproduciesen un xevent seria facil....

----------

## i92guboj

 *josedb wrote:*   

> no reproducen un xevent, ya probe el xev, es mas todo mi teclado lo configure yo. el tema es ese, si reproduciesen un xevent seria facil....

 

Es solo un tiro a ciegas, por si acaso, pero tienes xorg-server configurado con soporte para joystick y tu joystick configurado como dispositivo de entrada en xorg.conf?

----------

## josedb

asi es

http://img180.imageshack.us/img180/4018/pantallazoaj0.jpg

----------

## achaw

emerge joystick

```
jscal
```

Para calibrar...

```
jstest
```

Para testear...

Saludos

----------

## josedb

ya los teste y los calibre a los dos joystick, mi problema es como usas sus botones para bindearlos a programas, como por ejemplo el boton de subir el volumen del teclado

----------

## paynalton

el xorg-server tiene un flag en los INPUT-DEVICES para Joystick. Yo siempre se lo pongo por si se da el caso en que lo quiera usar y he notado que el Joystick hace cosas como adelantar canciones del amarok o navegar en el firefox.

----------

## achaw

 *paynalton wrote:*   

> el xorg-server tiene un flag en los INPUT-DEVICES para Joystick. Yo siempre se lo pongo por si se da el caso en que lo quiera usar y he notado que el Joystick hace cosas como adelantar canciones del amarok o navegar en el firefox.

 

Si no me equivoco, eso siempre que el app tenga soporte paraa joystick...que no todos lo tienen.

Saludos

----------

## Cereza

Pues yo he dado hoy con la tecla, buscando una alternativa a qjoypad, que por motivos misteriosos parece no querer funcionar en mi ordenador. Como bien han dicho la cosa es que Xorg reconozca el joystick o gamepad en cuestión como un dispositivo de entrada, luego, bien configurado en xorg.conf, el joystick generará eventos que ahora sí, podras ver con xev y usar otros programas para crear bindings (o lo que era mi necesidad, traducirlos simples eventos de teclado y ratón, como pulsar las flechas de dirección o cualquier otra tecla, esto se puede hacer directamente desde xorg.conf)

El tutorial (en inglés) que lo explica perfectamente.

Mi post al respecto en el subforo de juegos.

Lo explico un poquito en castellano, la cosa es compilar Xorg con soporte para joysticks, para ello añade joystick a la linea INPUT_DEVICES en  /etc/make.conf, la mía queda así:

```
INPUT_DEVICES="keyboard mouse ps2mouse joystick"
```

Ahora a recompilar Xorg, comprueba que al añadir joystick a INPUT devices, la use flag joystick de xorg-server se ha marcado solita, y que pretende instalar xf86-input-joystick como dependencia.

Pues ahora toca editar xorg.conf a manita:

Lo primero es añadir a Section "ServerLayout" esta linea:

```
InputDevice "Joystick0" "SendCoreEvents"
```

Y lo chungo, configurar el joystick, se necesita un buen rato para configurar todos los botones y ejes y venga a probar jeje, yo lo he hecho así, sección de xorg.conf:

```
Section "InputDevice"

   Driver "joystick"

   Identifier "Joystick0"

   Option "Device" "/dev/input/js0"

   Option "Buttons" "10"

   Option "MapButton1" "key=38"

   Option "MapButton2" "key=39"

   Option "MapButton3" "key=53"

   Option "MapButton4" "key=24"

   Option "MapButton5" "key=25"

   Option "MapButton6" "key=52"

   Option "MapButton7" "key=36"

   Option "MapButton8" "key=12"

   Option "MapButton9" "key=13"

   Option "MapButton10" "key=22"

   Option "MapAxis1" "mode=accelerated keylow=100 keyhigh=102 axis=0.3key deadzone=10000"

   Option "MapAxis2" "mode=accelerated keylow=104 keyhigh=98 axis=0.3key deadzone=10000"

   Option "MapAxis4" "mode=relative axis=+1x deadzone=5000"

   Option "MapAxis5" "mode=relative axis=-1y deadzone=5000"

   Option "MapAxis3" "mode=accelerated keyhigh=10 axis=0.3key deadzone=7000"

   Option "MapAxis6" "mode=accelerated keyhigh=11 axis=0.3key deadzone=7000"

   Option "MapAxis7" "mode=accelerated keylow=100 keyhigh=102 axis=0.3key"

   Option "MapAxis8" "mode=accelerated keylow=98 keyhigh=104 axis=0.3key"

EndSection
```

Las opciones Driver, Identifier, Device y Buttons se explican solas, creo. Las siguientes opciones MapButtons y MapAxis traducen los eventos del los botones y ejes del joystick a teclas o botones y ejes de ratón.

De este modo, por ejemplo:

   Option "MapButton1" "key=38" -> convierte el botón 1 de mi mando en la tecla "a" de mi teclado.

   Option "MapButton2" "button=5" -> convertiría el botón 2 del mando al botón 5 del ratón, más adelante explico para qué puede ser util.

   Option "MapButton3" "key=64,23" -> convertiría el botón 3 del mando al evento de pulsar ALT_L+TAB.

   Option "MapAxis4" "mode=relative axis=+1x deadzone=5000" -> haría que el eje 4 del pad moviera el ratón a izquierda/derecha (eje x (horizontal), hay que cambiar +1x por -1x si se el movimiento resulta invertido al deseado), deadzone indica la zona muerta que ignorará Xorg para evitar que un leve movimiento del stick haga que se mueva el ratón.

   Option "MapAxis7" "mode=accelerated keylow=100 keyhigh=102 axis=0.3key" -> hará que al mover a derecha se izquierda el eje 7 se pulsen las teclas cursor derecho e izquierdo respectivamente.

Todo esto está mejor explicado en el howto inglés, se puede entender mirando todos sus ejemplos, pero si aún así alguien no lo entiende, que me lo haga saber y lo explicaré más detenidamente.

En cuanto al problema de @josedb, para hacer bindings con los botones y ejes, puedes, en primer lugar asignar a los botones del joystick a eventos no utilizados del ratón. Por ejemplo, botón 1 del mando = botón nº 10 del ratón, partiendo de que el botón 10 del ratón no existe ni se está usando para nada, ahora ya puedes crear un binding con terceros programas (o WMs que lo soporten) asiganandoselo a ese ficticio botón 10 del ratón, que corresponde al botón 1 de tu mando.

Saludos.

----------

## josedb

genial, eso suoluciono el problema, sin aclarar con las options el joystick funciona como el mouse con 3 botones. se puede usar los ejes como punteros secundarios, por ejemplo para girar el cubo en compiz?

quedaria asi?

   Option "MapButton1" "button=10"

y si quiero usarlo como si fuese una extension del teclado? puedo poner "key=200"?

----------

## Cereza

 *josedb wrote:*   

> genial, eso suoluciono el problema, sin aclarar con las options el joystick funciona como el mouse con 3 botones. se puede usar los ejes como punteros secundarios, por ejemplo para girar el cubo en compiz?
> 
> quedaria asi?
> 
>    Option "MapButton1" "button=10"

 

Lo que tú has puesto ahí (Option "MapButton1" "button=10") haría que el botón 1 de tu mando emulara un décimo botón del ratón, eso puede ser util para bindings, usando algún programa para asociar el botón 10 del ratón a alguna acción.

No tengo ni idea de como se gira el cubo en compiz jeje ¿no es solo acercando el ratón al borde?. Si lo que quieres es usar un stick del mando para mover el puntero del ratón, se puede, sí, en el caso de mi mando (que es un caos, tiene 14 ejes), el eje1 corresponde al eje horizontal del stick izquierdo y el eje2 al eje vertical del mismo stick, eso se haría así:

```
   Option "MapAxis1" "mode=relative axis=+1x deadzone=3000"

   Option "MapAxis2" "mode=relative axis=-1y deadzone=3000"
```

De este modo moviendo la palanquita de tu mando moveras el ratón.

Si algún eje se mueve invertido, cambia el valor + por - o vicerversa, por ejemplo, si con "axis=+1x" el mover el stick a la izquierda, el puntero se mueve a la derecha, pues cambialo por "axis=-1x"

Si notas que el cursor se mueve levemente sin que toques nada, es porque el stick es demasiado sensible, en ese caso ponle un deadzone mayor, si no especificas deadzone, por defecto es 1000, para mi es demasiado bajo.

Suerte.

EDITO:

Una cosilla más, si tienes problemas para identificar los botones mando, puedes hacer un truquito como este:

```
   Option "MapButton1" "button=1"

   Option "MapButton2" "button=2"

   Option "MapButton3" "button=3"

   Option "MapButton4" "button=4"

   Option "MapButton5" "button=5"

   Option "MapButton6" "button=6"

   Option "MapButton7" "button=7"

   Option "MapButton8" "button=8"

   Option "MapButton9" "button=9"

   Option "MapButton10" "button=10"

   Option "MapButton11" "button=11"

   Option "MapButton12" "button=12"

   Option "MapButton13" "button=13"

   Option "MapButton14" "button=14"

   Option "MapButton15" "button=15"

   Option "MapButton16" "button=16"

   Option "MapButton17" "button=17"

   Option "MapButton18" "button=18"

   Option "MapButton19" "button=19"

   Option "MapButton20" "button=20"
```

Así, que sobren, luego reinicias X, y usas xev, pulsando cada botón podras ver en xev que numero le corresponde, y lo vas apuntando. De este modo yo saqué por ejemplo, que el triangulo de mi mando de Playstation es el botón 1 (MapButton1), el círculo el 2, la equis el 3, cuadrado el 4, L2 el 5, R2 el 6, start el 9 y así uno a uno hasta identificar qué número MapButton corresponde a cada botón del mando, con esta información ya puedo asignar más facilmente los botones.

----------

## josedb

Section "InputDevice"

   Driver "joystick"

   Identifier "saitekpro"

   Option "Device" "/dev/input/js1"

   Option "Buttons" "24"

   Option "MapButton1" "button=10"

   Option "MapButton2" "button=11"

   Option "MapButton3" "button=12"

   Option "MapButton4" "button=13"

   Option "MapButton5" "button=14"

   Option "MapButton6" "button=15"

   Option "MapButton7" "button=16"

   Option "MapButton8" "button=17"

   Option "MapButton9" "button=18"

   Option "MapButton10" "button=19"

   Option "MapButton11" "button=21"

   Option "MapButton12" "button=22"

   Option "MapButton13" "button=23"

   Option "MapButton14" "button=24"

   Option "MapButton15" "button=1"

   Option "MapButton16" "button=3"

   Option "MapButton17" "button=27"

   Option "MapButton18" "button=28"

   Option "MapButton19" "button=29"

   Option "MapButton20" "button=30"

   Option "MapButton21" "button=31"

#   Option "MapButton22" "button=32"

#   Option "MapButton23" "button=33"

#   Option "MapButton24" "button=34"

EndSection

los ultimos 3 botones los deje libre porque es una perilla de posicion, asi que lo detectaria como un boton apretado todo el tiempo, y eso traeria problemas.

Configurado asi sigo teniendo problemas, el boton 1 me lo mapea al 5 del mouse, el boton 2 al 6 del mouse, y asi sucesivamente.

este es el joystick http://zero-400.way-nifty.com/photos/uncategorized/dscf1436_1.jpg

de todas formas me conviene mapearlo a una tecla que no exista

----------

## Cereza

 *josedb wrote:*   

> Configurado asi sigo teniendo problemas, el boton 1 me lo mapea al 5 del mouse, el boton 2 al 6 del mouse, y asi sucesivamente.

 

Eso es muy raro, si le dices que tal botón del mando sea tal otro del ratón, no entiendo porque lo cambia. Solo se me ocurre que no hayas identificado bien que número MapButton corresponde a cada botón de tu mando, no siempre coinciden con el orden lógico ¿has probado el truco que comenté para identificar los botones?

 *Quote:*   

> Una cosilla más, si tienes problemas para identificar los botones mando, puedes hacer un truquito como este:
> 
> ```
>    Option "MapButton1" "button=1"
> 
> ...

 

Fíjate que el número MapButton coincide con el button del ratón que se le asocia, así los identificaras rápido.

Saludos.

----------

## josedb

si concide perfectamente, incluso con los del jstest, pero mapea cualquier cosa

----------

## Cereza

¿Tienes esta línea en la sección "ServerLayout"?

```
        InputDevice "saitekpro" "SendCoreEvents"
```

Yo puse "joystick0" en lugar de "saitekpro", porque lo que tienes que poner ahí es el valor que le das a Identifier en la sección del joystick, luego en la sección ServerLayout debes poner también saitekpro.

Suerte.

----------

## josedb

asi es, puse los dos con el mismo valor.

----------

## Cereza

¿Tienes compilado Xorg con el use flag joystick? perdona por la pregunta tan tonta, pero es que ya no se me ocurre nada más, no me ha pasado nada parecido con ninguno de mis mandos.

Saludos.

----------

## josedb

sep, tengo instalado con joystick. encima estube buscando en google y no encontre nada al respecto , algunas cosas se dificulta encontrarlas

----------

## josedb

Bueno, estos dias me la pase buscando sobre el tema, y no pude encontrar como ligarlo a una tecla del teclado que no exista, para que? para poder usar botones adicionales a los que ya tengo y no tener que usar convinaciones de teclas lo que complica bastante las cosas.

si alguien tiene una idea, bienvenida sea.

----------

