Es un placer comunicar que este proyecto ha conseguido una mención especial en el III Concurso Universitario de Software Libre [1]. Es un orguyo para mi recibir tal premio, ya que el trabajo es duro hasta llegar a tener algo sólido, algo que funciona y te creces cuando ves que tu esfuerzo es reconocido.
Quiero felicitar [...]
Para entender cómo funciona debemos comprender primero que es un modelo OSI (Open System Interconnection), es una abstracción propuesta por la Organización Internacional para la Estandarización (ISO), con el objetivo de normalizar internacionalmente los protocolos que se usan para comunicar distintos equipos en las redes telemáticas.
Las 7 capas de un modelo OSI,
Cuanto más alto nos encontremos mayor será el nivel de abstracción, pero claro, las capas superiores para “funcionar” hacen uso de las que están por debajo. Actualmente ArCan solo implementa los niveles 1 y 2, es decir “Nivel Físico” y “Nivel de Enlace de Datos” y es sobre está última capa en la que debemos basarnos para implementar el OBD.
Si no queda claro que es un modelo OSI o como funciona aconsejo dar un vistazo a los siguientes enlaces:
De cualquier forma si teneis alguna duda ya sabeis donde encontrarme
OBD define una capa de aplicación para la diagnosis del automovil, es decir, la capa 7 del modelo OSI.
Todo lo relacionado a la diagnosis del automovil sobre CAN, en Europa, lo podemos encontrar básicamente en un grupo de normas ISO:
Espero que el siguiente esquema-resumen pueda aclarar las dudas,
En este caso debemos tener en cuenta que para usar OBD no es necesario implementar todas las capas OSI, ya que solo usa la 1,2,3,7. El mcp2551 implementa la capa 1 “Nivel Físico”, el mcp2515 la 2 “Nivel de Enlace de Datos” y nosotros por software debemos implementar la 3 “Nivel de Red” que es donde se define como se estructuran los mensajes, y la 7 “Nivel de Aplicación” que recoge los distintos comandos disponibles.
La SAE, Sociedad de Ingenieros Automotrices, define normas con los mismos objetivos que las vistas hasta ahora, pero en este caso para Estados Unidos.
Si no encontrais las normas podeis escribirme un mail y os digo donde se “compran”.
Fallo del jurado del II Concurso Universitario de Software Libre de C-LM, celebrado en la Escuela Politécnica de Cuenca el martes 28 de abril de 2009.
PREMIO ESPECIAL: eOPSOA
PREMIO UTILIDAD
Primer premio: BlueHarvest
Segndo premio: Sapiens
PREMIO INNOVADOR
Primer premio: IcePick
Segundo premio: FAJAX
Las imágenes del evento están disponibles en www.ceslcam.com.
Muchas gracias a todos los que habéis hecho ésto posible.
Nos vemos en Sapiens.
Bueno desde RedClover se da la enhorabuena a todos los finalistas y a los que tiene una mención especial. Que se lo han currado mucho muchisimo, espero que haya muchas fotos y que todo sea perfecto.
Proimamente , hare lo que sera el ultimo post y comentare las buenas y males experiencias y sobre todo el poso que me dejado el CUSLIII
Desde hace unas semanas, y sólo por curiosidad, decidimos buscar una clase de tipo Dialog del JFace o del SWT que implementara el clásico diálogo que:
Eclipse muestra este tipo de diálogos en múltiples ocasiones. Así por ejemplo, cuando se está ejecutando una tera de larga duración, se muestra un diálogo como el siguiente:
Cuando se pulsa el botón “Details >>”, el diálogo se expande, mostrando el área de detalles en cuestión:
Por desgracia, tras diversas búsquedas, no pudimos dar con un código fuente que lo implementara. Con el deseo de ayudar a aquellos que, como nosotros, no encontraron este tipo de diálogo implementado, hemos decidido crear una clase propia que lo implemente.
Actualmente esta clase permite definir un área de detalles que está formada sólo por texto no editable. Esto, por supuesto, es una limitación, pero también es cierto que es trivial abstraer esta clase para que, en el área de detalles, se pueda mostrar cualquier tipo de contenido. Por falta de tiempo, sólo hemos implementado la clase que define un diálogo con un área de detalles de tipo textual. Esta clase, además, permite definir el tipo de icono mostrado en el diálogo. La clase, DialogoDetalles, puede ser accedida desde este link. Su aspecto es el que se muestra a continuación:
Por cierto, si alguien sabe cómo insertar código fuente preformateado en WordPress, sería de agradecer que nos lo dijera. Así podríamos colocar directamente el código fuente de la clase aquí.
Desde hace unas semanas, y sólo por curiosidad, decidimos buscar una clase de tipo Dialog del JFace o del SWT que implementara el clásico diálogo que:
Eclipse muestra este tipo de diálogos en múltiples ocasiones. Así por ejemplo, cuando se está ejecutando una tera de larga duración, se muestra un diálogo como el siguiente:
Cuando se pulsa el botón “Details >>”, el diálogo se expande, mostrando el área de detalles en cuestión:
Por desgracia, tras diversas búsquedas, no pudimos dar con un código fuente que lo implementara. Con el deseo de ayudar a aquellos que, como nosotros, no encontraron este tipo de diálogo implementado, hemos decidido crear una clase propia que lo implemente.
Actualmente esta clase permite definir un área de detalles que está formada sólo por texto no editable. Esto, por supuesto, es una limitación, pero también es cierto que es trivial abstraer esta clase para que, en el área de detalles, se pueda mostrar cualquier tipo de contenido. Por falta de tiempo, sólo hemos implementado la clase que define un diálogo con un área de detalles de tipo textual. Esta clase, además, permite definir el tipo de icono mostrado en el diálogo. La clase, DialogoDetalles, puede ser accedida desde este link. Su aspecto es el que se muestra a continuación:
El código fuente de la clase es el siguiente:
[sourcecode language='java']
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IconAndMessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
*
* La clase DialogoDetalles representa un diálogo emergente que muestra un
* icono, un mensaje, y un área de detalles donde se puede mostrar texto plano.
*
* Está clase está pensada para mostrar al usuario el clásico diálogo en el que
* puede pulsar un botón de “detalles” para así visualizar un informe detallado
* del mensaje transmitido por el diálogo.
*
* Este diálogo consta de dos botones, uno de “cerrar” y otro de “detalles”. El
* botón de detalles permite hacer visible u ocultar el área de detalles del
* diálogo. El icono visualizado en el diálogo también puede ser especificado
* por el usuario.
*
* @author L.A González Jaime
* @author R.J Palma Durán
*/
public class DialogoDetalles extends IconAndMessageDialog{
/*
* Tipo de icono a usar. Es una de las constantes ERROR,
* WARNING,INFORMATIO,QUESTION.
*/
protected int tipoIcono;
/*
* Detalles del diálogo. Este texto es el mostrado en el área de detalles.
*/
protected String detalles;
/*
* Área de texto donde se muestran los detalles.
*/
protected Text textoDetalles;
/*
* Booleano que indica si el área de texto de los detalles (textoDetalles)
* está creada o no. La visualización y el ocultamiento del área de detalles
* se gestiona creando y destrullendo el textoDetalles. Este flag nos indica
* si, en efecto, el textoDetalles está o no creado.
*/
protected boolean textoDetallesCreado = false;
/**
* Constante que indica que el icono visualizado en el diálogo es de error.
*/
public static final int ERROR = 0;
/**
* Constante que indica que el icono visualizado en el diálogo es de
* advertencia.
*/
public static final int WARNING = 1;
/**
* Constante que indica que el icono visualizado en el diálogo es de
* información.
*/
public static final int INFORMATION = 2;
/**
* Constante que indica que el icono visualizado en el diálogo es de
* pregunta.
*/
public static final int QUESTION = 3;
/*
* Botón que permite mostrar y ocultar los detalles del diálogo.
*/
protected Button botonDetalles;
/*
* Título del diálogo.
*/
protected String titulo;
/**
* Cosntruye un DialogoDetalles. El estilo del diálogo creado (el estilo de
* la shell) es
* SWT.CLOSE | SWT.RESIZE | SWT.MAX | SWT.MODELESS
.
*
* @param titulo título del diálogo.
* @param mensaje mensaje principal mostrado en el diálogo.
* @param detalles texto que se muestra en el área de detalles.
* @param tipoIcono tipo de icono a mostrar en el diálogo. Puede ser alguna de las constantes
* DialogoDetalles.ERROR
, DialogoDetalles.WARNING
, DialogoDetalles.INFORMATION
* , DialogoDetalles.QUESTION
.
* @param parentShell la Shell padre de este diálogo. Si es null, se creará una shell de alto nivel.
*/
public DialogoDetalles(String titulo, String mensaje, String detalles, int tipoIcono, Shell parentShell){
this(titulo,mensaje,detalles,tipoIcono,parentShell,SWT.CLOSE | SWT.RESIZE | SWT.MAX | SWT.MODELESS);
}
/**
* Cosntruye un DialogoDetalles. Permite crear el estilo (estilo de la Shell) del
* diálogo creado.
*
* @param titulo título del diálogo.
* @param mensaje mensaje principal mostrado en el diálogo.
* @param detalles texto que se muestra en el área de detalles.
* @param tipoIcono tipo de icono a mostrar en el diálogo. Puede ser alguna de las constantes
* DialogoDetalles.ERROR
, DialogoDetalles.WARNING
, DialogoDetalles.INFORMATION
* , DialogoDetalles.QUESTION
.
* @param parentShell la Shell padre de este diálogo. Si es null, se creará una shell de alto nivel.
* @param estiloShell el estilo de la Shell del diálogo.
*/
public DialogoDetalles(String titulo, String mensaje, String detalles, int tipoIcono, Shell parentShell,
int estiloShell){
super(parentShell);
if(mensaje == null){
throw new IllegalArgumentException(”The input message cannot be null”);
}
this.message = mensaje;
if(tipoIcono < 0 || tipoIcono > 3){
throw new IllegalArgumentException(”Invalid image type”);
}
if(detalles == null){
throw new IllegalArgumentException(”Details cannot be null”);
}
if(titulo == null){
throw new IllegalArgumentException(”Title cannot be null”);
}
this.detalles = detalles;
this.tipoIcono = tipoIcono;
this.titulo = titulo;
this.setBlockOnOpen(false);
this.setShellStyle(estiloShell);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent){
return createMessageArea(parent);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse
* .swt.widgets.Composite)
*/
protected void createButtonsForButtonBar(Composite parent){
createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true);
this.botonDetalles = createButton(parent, IDialogConstants.DETAILS_ID, IDialogConstants.SHOW_DETAILS_LABEL,
false);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
*/
protected void buttonPressed(int buttonId){
if(buttonId == IDialogConstants.DETAILS_ID){
/*
* Si se ha pulsado el botón de “detalles”, se debe mostrar u ocultar el área de
* detalles, dependiendo de que estuviera o no oculta. Además, tras ocultar el
* área o visualizarla, se debe redimensionar el diálogo, para que así se ajuste
* al nuevo tamaño provocado por la aparición o desaparición del área de detalles.
*/
Point dimensionAnteriorDialogo = getShell().getSize();
if(this.textoDetallesCreado){
/*
* Si el área de texto está actualmente siendo mostrada, la eliminamos. Además,
* cambiamos la etiqueta del botón de “mostrar detalles”.
*/
this.botonDetalles.setText(IDialogConstants.SHOW_DETAILS_LABEL);
this.textoDetalles.dispose();
}
else{
/*
* Si el área de texto actualmente no está siendo visualizada, la mostramos. Para
* ello, iniciamos a this.textoDetalles. Además, debemos cambiar la etiqueta
* del botón de “mostrar detalles”.
*/
this.botonDetalles.setText(IDialogConstants.HIDE_DETAILS_LABEL);
this.textoDetalles = new Text((Composite)getContents(), SWT.BORDER | SWT.READ_ONLY | SWT.MULTI
| SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL);
this.textoDetalles.setText(this.detalles);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
this.textoDetalles.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
data.horizontalSpan = 2;
this.textoDetalles.setLayoutData(data);
}
getContents().getShell().layout();
this.textoDetallesCreado = !this.textoDetallesCreado;
/*
* Se redimensiona el diálogo.
*/
Point dimensionNuevaDialogo = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
int altoPantalla = Display.getCurrent().getClientArea().height;
getShell().setSize(new Point(dimensionAnteriorDialogo.x, Math.min(dimensionNuevaDialogo.y, altoPantalla)));
}
else{
/*
* Si se pulsa el botón de “cerrar”, cerramos la ventana.
*/
close();
}
setReturnCode(buttonId);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
*/
protected Image getImage(){
switch(this.tipoIcono){
case ERROR:
return getErrorImage();
case WARNING:
return getWarningImage();
case INFORMATION:
return getInfoImage();
case QUESTION:
return getQuestionImage();
default:
throw new RuntimeException(”Invalid image type”);
}
}
/*
* (non-Javadoc)
* @see
* org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets
* .Shell)
*/
protected void configureShell(Shell shell){
super.configureShell(shell);
// Título del diálogo
shell.setText(this.titulo);
}
}
[/sourcecode]
Quiero dar desde aquí mi enhorabuena a los finalistas del concurso:
Avbot, Cool Imagin, Tucan (que ya uso a diario), Geco, The Digital Coach y eOPSOA.
Me ha encantado estar en esta “Competición” en la que he aprendido un montón de metodología, control de versiones, colaboración y uso de un framework.
También dar mi enhorabuena a libgann, biblioteca de conexión de Arduinos X10, PIE y meshias, que ahn sido mención especial.
Me hubiera gustado que algunos proyectos que no están aquí estuvieran, ya no por su calidad técnica, que no he comprobado, sino por su componente social, que es parte de la base del software libre, como pueden ser Gestas, o intérprete de lengua de signos, y algún juego, ya que la industria española del videojuego es importante y se está potenciando por organismos oficiales.
A partir de aquí, y con el concurso terminado por mi parte, intentaré dedicar tiempo suficiente para que Gesport siga evolucionando a un sistema completo de entrenamientos. Los pasos se irán publicando en este blog, que seguiré manteniendo.
Lo dicho, enhorabuena a los “Competidores” y que disfruten de Sevilla, que se lo han “ganao”.
Los amigos del jurado del III Concurso Universitario de Software Libre han deliverado otorgándome una mención especial por el trabajo que llevo realizado hasta ahora.
Comprendo que no es fácil explicar cómo puede alguien como yo ...
Esta mañana he recibido una grata noticia. En la lista de correo del concurso ha salido la lista de artículos que se van publicar en la revista Linux Magazine, y entre ellos se encuentra Gesport.
Muchas gracias a los editores de Linux Magazine.
Hoy hemos recibido dos buenas noticias. Por un lado, se ha publicado el artículo que escribimos para Linux Magazine; y por otro, estamos tramitando la colaboración del Servicio de Traducción Universitario (STU) de la Universidad de Granada con Cool Imaging Project para la traducción de la aplicación a varios idiomas.
Si todo sale bien, daremos nuestra aplicación a conocer en las jornadas de traductores del próximo 15 de Mayo.