lunes, 16 de abril de 2007

Manejo analógico de vehículo mediante GamePad

En esta entrada voy a comentar como realicé la conexión del mando Logitech Dual Action, para poder usarlo en simulaciones con PlayerStage.

La API que utilicé fue la Light Weight Java Game Library, que descargué y añadí en eclipse como biblioteca de usuario mediante Build Path (vía de acceso de construcción)

Para hacer uso de la biblioteca es necesario decirle a la JVM donde se encuentran los binarios (.dll en Windows o .so en linux). Están en el directorio native del paquete lwjgl que descargamos en el paso anterior. Es decir, que en eclipse nos vamos a "Ejecutar...", y en los argumentos de la VM ponemos (en mi caso):
-Djava.library.path=/home/diego/JavaLibraries/lwjgl-1.0beta4/native/linux

Dependiendo de la instalación ponermos el directorio correspondiente. En MS Windows podría ser:
-Djava.library.path=C:\JavaLibraries\lwjgl-1.0beta4\native\windows

Y el código de mi GamePad.java sería:


import org.lwjgl.LWJGLException;
import org.lwjgl.input.Controller;
import org.lwjgl.input.Controllers;


public class GamePad {

public static final int START = 4;
public static final int END = 6;
private Controller controller = null;
private int buttonCount;
private int axisCount;
private int SO = -1; /* 0 GNU/Linux || 1 MS Windows */

public GamePad() {


try {
Controllers.create();
} catch (LWJGLException e) {
e.printStackTrace();
}

int numberOfControllers = Controllers.getControllerCount();

if (numberOfControllers==0)
{
System.out.println("No se han encontrado controladores");
}

for(int i=0;i<numberofcontrollers;i++)
{
controller = Controllers.getController(i);
System.out.println(controller.getName());
}

buttonCount = controller.getButtonCount();
axisCount = controller.getAxisCount();

System.out.println("El controlador tiene " +
buttonCount + " botones y " +
axisCount + " ejes");

//Configuración de mando para sistemas MS y Linux
System.out.println("El sistema operativo es " + System.getProperty("os.name"));
if (System.getProperty("os.name").equalsIgnoreCase("Linux"))
this.SO = 0;
else
this.SO = 1;

}

public float[] getRightAxisValues(){
float[] values = new float[2];
Controllers.poll();
if (this.SO == 1){ //MS Windows
//Valor vertical (aceleracion)
values[0] = controller.getAxisValue(0)*(-1.0f);
//Valor horizontal (direccion)
values[1] = controller.getAxisValue(1)*(-1.0f);
}
else if (this.SO == 0){ //Linux
//Valor vertical (aceleracion)
values[0] = controller.getAxisValue(3)*(-1.0f);
//Valor horizontal (direccion)
values[1] = controller.getAxisValue(2)*(-1.0f);
//System.out.println(values[0] +" "+ values[1]);

}
else
System.exit(-1);

return values;
}

public boolean getButton(int n){
try{
Controllers.poll();
return controller.isButtonPressed(n);
}catch(Exception e){
return false;
}
}

}

En la caso de ejecución en GNU/Linux tuve un problema con un mensaje:
/dev/input/event0 cannot open device event0

La solución fue alterar los permisos de los dispositivos que eran 660 para el usuario root. Haciendo sudo chmod 666 /dev/input/event* se soluciona el problema.

Espero le sea útil a alguien.

No hay comentarios: