/*
* File: Eventos.java
*
*
* This file is a part of MICE, a program designed for
* people with severe motor disabilities to whom it is impossible
* to use a traditional mouse. This application gives these people
* the control of the physical mouse via another type of device.
*
* Authors: Isabel Gonzalez
* Date: 2008/ 2009
*
* Company: Colegio Publico de Educacion Especial Alborada, Zaragoza
* DIIS, Universidad de Zaragoza
*
* License: Copyright (C) 2008
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*
*
*/
package DriverTeclado;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
// Clase que me proporciona los metodos para que a partir de una tecla, ver qué elementos puedo enviar
// y ademas gestiona la configuracion de los eventos
public class Eventos {
native boolean teclaLibre(String tecla);
native void capturaTecla(String tecla);
// static Logger log;
public static String[] teclas= {"Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","�",
"Z","X","C","V","B","N","M","SPACE","ENTER","ESC","flecha derecha","flecha izquierda",
"flecha arriba","flecha abajo","0","1","2","3","4","5","6","7","8","9"};
// Almacenara las teclas disponibles
List<String> disponibles= new ArrayList<String>();
public static boolean arrastrando=false;
// Parametros a enviar al nucleo
public static final int MOVIMIENTO = 0;
public static final int PARADA = 1;
public static final int CLIC = 2;
public static final int ARRASTRAR = 3;
public static final int VELOCIDAD = 4;
public static final int TIPO = 5;
public static final int RELACION = 6;
public static final int FIN = 7;
public static final int NOMBRE = 8;
public static final int MENSAJERATON = 9;
public static final int FRENAR = 10;
// Estos son los dos parametros que recibimos
public static int tipoCod;
public static int parametro;
public static int speedCursor = 50;
public static int relacionVel = 0;
// public String[] disponibles= new String[50];
//listas finales que guardan los eventos una vez que la configuracion ha sido validada
private static java.util.List <String> listaArriba = new ArrayList <String>();
private static java.util.List <String> listaAbajo = new ArrayList <String>();
private static java.util.List <String> listaDerecha = new ArrayList <String>();
private static java.util.List <String> listaIzquierda = new ArrayList <String>();
private static java.util.List <String> listaArrIzq = new ArrayList <String>();
private static java.util.List <String> listaArrDch = new ArrayList <String>();
private static java.util.List <String> listaAbjIzq = new ArrayList <String>();
private static java.util.List <String> listaAbjDch = new ArrayList <String>();
private static java.util.List <String> listaParar = new ArrayList <String>();
private static java.util.List <String> listaClcIzq = new ArrayList <String>();
private static java.util.List <String> listaClcDch = new ArrayList <String>();
private static java.util.List <String> listaClcMed = new ArrayList <String>();
private static java.util.List <String> listaDblClcIzq = new ArrayList <String>();
private static java.util.List <String> listaArrastrar = new ArrayList <String>();
public static java.util.List <java.util.List> conjuntoListas = new ArrayList <java.util.List>();
public static boolean alPulsar;
public Object[] d;
public static Locale Idiomas;
public Eventos() {
// Introduzco en el conjunto de las listas, las listas.
conjuntoListas.add(0, listaArriba);
conjuntoListas.add(1, listaAbajo);
conjuntoListas.add(2, listaDerecha);
conjuntoListas.add(3, listaIzquierda);
conjuntoListas.add(4, listaArrIzq);
conjuntoListas.add(5, listaArrDch);
conjuntoListas.add(6, listaAbjIzq);
conjuntoListas.add(7, listaAbjDch);
conjuntoListas.add(8, listaParar);
conjuntoListas.add(9, listaClcIzq);
conjuntoListas.add(10, listaClcDch);
conjuntoListas.add(11, listaClcMed);
conjuntoListas.add(12, listaDblClcIzq);
conjuntoListas.add(13, listaArrastrar);
}
static {
try {
System.loadLibrary("libs/prueba");
} catch (UnsatisfiedLinkError e) {
System.out.println("No se puede cargar la libreria dinamica");
}
}
/////////////////////////////////////////////////////
// METODOS PARA LA CONFIGURACION DE DRIVER TECLADO //
/////////////////////////////////////////////////////
public void almacenarLibres(){
for (int i=0; i< teclas.length; i++){
if (teclaLibre(teclas[i])){
this.disponibles.add(teclas[i]);
}
}
d=disponibles.toArray();
}
// Carga una configuracion de un XML almacenada previamente en el computador
// y la asigna a las lista
public void cargarConfiguracion(){
}
// Devuelve true si el elemento se encuentra en la lista
public boolean estaEnLista(java.util.List <String> lista, String elemento){
Iterator it = lista.iterator();
String elem;
boolean encontrado=false;
while( it.hasNext() && encontrado==false) {
elem= (String) it.next();
encontrado= (elem.equals(elemento));
}
return(encontrado);
}
// Almacenara en las listas la configuracion elegida y ademas en el XML.
public void guardarConfiguracionActual(){
}
// almacenara en las listas la configuracion elegida
public void llenarListasDeInterfaz(){
}
// Almacenara en las listas lo almacenado en un fichero XML
public void llenarListasDeXML(){
}
public void limpiar(){
ArrayList <String> l;
for(int i=0; i<conjuntoListas.size();i++){
l= (ArrayList)conjuntoListas.get(i);
l.clear();
}
}
public void eliminar(){
conjuntoListas.clear();
}
///////////////////
// Model--> List //
///////////////////
// Almacena todas las listas desde todas las listas Model
public void almacenarEventosDesdeModel(ArrayList <SortedListModel> aModel){
java.util.List <String> lList;
SortedListModel lModel;
for (int i=0; i<conjuntoListas.size(); i++){
lList= devolverLista(i);
lModel= aModel.get(i);
copiarDeModelaList(lModel, lList);
}
}
private void copiarDeModelaList(SortedListModel lModel, List lList) {
if (lModel.getSize()>0){
Iterator it = lModel.iterator();
String elem;
while( it.hasNext()) {
elem= (String) it.next();
lList.add((String)elem);
}
}
}
// Devuelve la lista del indice indicado
// Null si el indice no es correcto
public java.util.List <String> devolverLista(int indice){
java.util.List <String> lista;
try{
lista= conjuntoListas.get(indice);
return(lista);
}
catch(IndexOutOfBoundsException e){
return(null);
}
}
// Devuelve todas las listas
public java.util.List <java.util.List> devolverListas(){
return(conjuntoListas);
}
// Metodo que muestra por pantalla una lista
public void mostrarlista(java.util.List <String> lista){
Iterator it = lista.iterator();
String elem;
while( it.hasNext()) {
elem= (String) it.next();
System.out.println(elem);
}
}
// Asigna una configuracion por defecto
public void configuracionDefecto(){
alPulsar=true;
//arriba
listaArriba.add("Q");listaArriba.add("W");listaArriba.add("E");
listaArriba.add("R");listaArriba.add("T");listaArriba.add("Y");
listaArriba.add("U");listaArriba.add("I");listaArriba.add("O");
listaArriba.add("P");
//abajo
listaAbajo.add("Z");listaAbajo.add("X");listaAbajo.add("C");
listaAbajo.add("V");listaAbajo.add("B");listaAbajo.add("N");
listaAbajo.add("M");
//izquierda
listaIzquierda.add("A");listaIzquierda.add("S");listaIzquierda.add("D");
listaIzquierda.add("F");listaIzquierda.add("G");
//derecha
listaDerecha.add("H");listaDerecha.add("J");listaDerecha.add("K");
listaDerecha.add("L");listaDerecha.add("�");
//clickIzquierdo
listaClcIzq.add("SPACE");
}
//////////////////////////////////////////////////
// METODOS PARA CODIFICAR EL QUE ENVIAR AL NUCLEO//
//////////////////////////////////////////////////
// A partir de una tecla integer me crea un evento con el string a enviar a nucleo
// 81--> m0 (arriba)
public static IntBuffer crearEvento(int tecla){
ByteBuffer buffer = ByteBuffer.allocate(8);
IntBuffer intBuffer = buffer.asIntBuffer();
String cod= decodificar(tecla);
buffer.flip();
buffer.clear();
// cambiado para comprobar, volver a poner cuaksndo sea la conexion
if (!cod.equals(" ")){
if (listaArriba.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 0);
return(intBuffer);
}
else if (listaAbajo.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 1);
return(intBuffer);
}
else if (listaDerecha.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 2);
return(intBuffer);
}
else if (listaIzquierda.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 3);
return(intBuffer);
}
else if (listaArrIzq.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 4);
return(intBuffer);
}
else if (listaArrDch.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 5);
return(intBuffer);
}
else if (listaAbjIzq.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 6);
return(intBuffer);
}
else if (listaAbjDch.contains(cod)){
intBuffer.put(0,MOVIMIENTO);
intBuffer.put(1, 7);
return(intBuffer);
}
else if (listaParar.contains(cod)){
intBuffer.put(0,PARADA);
intBuffer.put(1, 8);
return(intBuffer);
}
else if (listaClcIzq.contains(cod)){
intBuffer.put(0,CLIC);
intBuffer.put(1, 9);
return(intBuffer);
}
else if (listaClcDch.contains(cod)){
intBuffer.put(0,CLIC);
intBuffer.put(1, 10);
return(intBuffer);
}
else if (listaClcMed.contains(cod)){
intBuffer.put(0,CLIC);
intBuffer.put(1, 11);
return(intBuffer);
}
else if (listaDblClcIzq.contains(cod)){
intBuffer.put(0,CLIC);
intBuffer.put(1, 12);
return(intBuffer);
}
else if (listaArrastrar.contains(cod)){
if (!arrastrando){
intBuffer.put(0,ARRASTRAR);
intBuffer.put(1, 13);
arrastrando=true;
return(intBuffer);
}
else{
intBuffer.put(0,ARRASTRAR);
intBuffer.put(1, 14);
arrastrando=false;
return(intBuffer);
}
}
else return (null);
}
else return (null);
}
// Realiza la conversion entre el numero de tecla y el string de la tecla correspondiente
// 65--> "A"
public static String decodificar (int tecla){
if (tecla==65) return "A";
else if (tecla==66) return "B";
else if (tecla==67) return "C";
else if (tecla==68) return "D";
else if (tecla==69) return "E";
else if (tecla==70) return "F";
else if (tecla==71) return "G";
else if (tecla==72) return "H";
else if (tecla==73) return "I";
else if (tecla==74) return "J";
else if (tecla==75) return "K";
else if (tecla==76) return "L";
else if (tecla==77) return "M";
else if (tecla==78) return "N";
else if (tecla==192) return "�";
else if (tecla==79) return "O";
else if (tecla==80) return "P";
else if (tecla==81) return "Q";
else if (tecla==82) return "R";
else if (tecla==83) return "S";
else if (tecla==84) return "T";
else if (tecla==85) return "U";
else if (tecla==86) return "V";
else if (tecla==87) return "W";
else if (tecla==88) return "X";
else if (tecla==89) return "Y";
else if (tecla==90) return "Z";
else if (tecla==32) return "SPACE";
else if (tecla==48) return "0";
else if (tecla==49) return "1";
else if (tecla==50) return "2";
else if (tecla==51) return "3";
else if (tecla==52) return "4";
else if (tecla==53) return "5";
else if (tecla==54) return "6";
else if (tecla==55) return "7";
else if (tecla==56) return "8";
else if (tecla==57) return "9";
else if (tecla==27) return "ESC";
else if (tecla==13) return "ENTER";
else if (tecla==39) return "flecha derecha";
else if (tecla==37) return "flecha izquierda";
else if (tecla==38) return "flecha arriba";
else if (tecla==40) return "flecha abajo";
else return(" ");
}
void capturarTeclas() {
System.out.println("Capturar teclas");
for (int i=0; i<conjuntoListas.size(); i++){
List al= conjuntoListas.get(i);
if (al.size()!=0){
for (int j=0; j<al.size();j++){
capturaTecla((String)al.get(j));
}
}
}
}
static void enviarConfiguracionANucleo() {
// Envio la velocidad del cursor
Conexion.enviar(1);
// Envio el tipo de movimiento (simple o doble)
Conexion.enviar (2);
// Envio la relacion de la velocidad
Conexion.enviar(3);
}
}