Simulin 3.9
Programado por Jorge Albaladejo Pomares. 2 Ing. Telecom. Sistemas Electrnicos.

0.La Prctica.
=============

	Esta prctica ha sido realizada siguiendo el esquema propuesto por puntos (hasta el 3.8), si bien el funcionamiento de cada parte opcional ha sido elegido sin tener en cuenta la documentacin de Simulin que acompaa al cdigo fuente origen para la prctica. El motivo ha sido realizar el programa de un modo mucho ms personalizado, sin tener que reparar en pequeos detalles de funcionamiento que pudieran complicar el cdigo del programa. He querido realizar todos los puntos propuestos, pero del modo ms simple posible, por lo cual gran cantidad de detalles no concordarn con los mtodos explicados en la documentacin.
	De antemano pido disculpas por no haber podido terminar con todo detalle la documentacin del cdigo fuente; me ha podido el inters por cubrir todos los puntos posibles de la programacin en java, que el trabajo mecnico de explicar al detalle cada mtodo que he usado. De cualquier modo, he intentado usar una programacin lo ms legible posible para facilitar al profesor corrector el entendimiento del cdigo fuente.

1.Por Partes.
============

	2.1 La barra de mens recoge las funciones ms bsicas del programa. Respecto al programa original, se ha incluido una clase (Mensajes) para definir dentro del programa compilado los mensaje de 'ayuda' y de 'acerca de' que se mostrarn en sus respectivos mens. Tambin se ha aadido un men 'Debug' que no es ms que una lista de elementos del circuito, til para tareas de depuracin y comprobacin de conexiones. 

	2.2 Leer y grabar circuitos, implementando la interfaz serializable en las clases fundamentales del programa:  circuito, elemento y conexion. Se ha comprobado que, una vez serializado un circuito, si se produce alguna modificacin en los mtodos o propiedades de la clase, ste no se puede volver a cargar.

	2.3 Dilogos: excepto los de configuracin (Configuracion y ConfiguradorElementos), y los de confirmacin de salida de programa (ConfirmarSalir) y prdida de cambios realizados (ConfirmarNuevo) todos los dilogos usan plantilla comn. Aquellos que no necesitan introduccin de datos usan la clase Dialogo, a la cual tan slo hay que pasarle el contenido del mensaje a mostrar, y los que piden introduccin de datos (en concreto para establecer conexiones) usan la clase DialogoConexion, que determina que mensaje mostrar en funcin del dato necesario para la conexin (origen, destino, n de puerta de entrada). En pos del aprovechamiento de cdigo, por supuesto.

	2.4 Visualizacin de circuitos: se ha reprogramado la funcin paint() de la clase FrameSimulin para que llame al mtodo dibujar() de la clase Circuito. ste, a su vez, llama al mtodo dibujar() de cada uno de los elementos del circuito, y despus determina la posicin de la patilla de entrada y de salida para dibujar una recta que represente la conexin entre los elementos. Cabe destacar que no se ha definido la forma de todas las puertas lgicas, puesto que he preferido dedicar ms energas a otras funciones del programa, que a la del dibujado 'vectorial'. Sin embargo, la etiqueta de cada tipo de puerta las define perfectamente y hace el programa operativo.

	3.1 Barra de herramientas. Aunque con slo tres botones, usa la clase adaptadora Boton para intentar simular el comportamiento de los componentes SWING con AWT. Esta clase carga una imagen de la carpeta del programa y la muestra como icono del botn. Por tanto, al instanciar un objeto tipo Boton slo hay que pasarle una cadena de texto con el nombre de la imagen que usar. En cuanto a la carga de imgenes, he observado que es necesario un objeto que adapte la interfaz ImageObserver (intuyo que esta interfaz define opciones de carga de imgenes, "observador de imagen" literalmente hablando). A pesar de que el efecto es apreciable, hay un problema con la actualizacin de estos botones, y es que hasta que no se refresta la ventana del programa (ocultndola detrs de otra), stos botones no muestran su icono. De igual modo, he podido definir la imagen que 'decora' los botones, pero no la posibilidad de que haya un icono distinto para cada estado del botn (reposo, con el cursor encima, pulsado). La barra de herrramientas se ha aadido usando el layout de borde, en la parte superior (north).

	3.2 Barra de estado. Es un campo de texto no editable aadido en el borde sur de la ventana. muestra continuamente la posicin del ratn, adems de otros mensajes de texto segn las opciones del programa. Gracias a la funcin actualizarStatus de la clase FrameSimulin, los mensajes que normalmente se mostraran por consola pueden ser mostrados al pie de la ventana.

	3.3 Dilogo para configuracin: permite cambiar simplemente los colores de fondo, de dibujado bsico, y de seleccin de componentes. (cabe destacar que con el ratn podemos seleccionar componentes, de modo que se mostrarn de un color distinto, y tambin mostrarn mens deplegables con opciones distintas). Las opciones elegidas se guardan en el archivo Simulin.ini, de modo que podemos cerrar el programa y observar que al arrancarlo de nuevo se conservan los colores elegidos. Debido a la interfaz serializable, estos colores tambin se quedan grabados en el circuito, si ste es serializado.

	3.4 Insercin de elementos con el ratn: el botn derecho sobre la ventana del programa muestra un men de insercin de elementos. stos se insertarn en la posicin original en que se pinch con el ratn.

	3.5 Insercin de interconexiones. Una de las opciones del men insertar es 'conexin'. La propuesta original de interconectar elementos por proximidad supona una elaboracin de cdigo para la cual no habra podido tener tiempo, aunque me parece interesante el disponer de un mtodo que, al arrastrar un elemento, determine en tiempo real si se est acercando al espacio ocupado por algn otro elemento y, en caso de que la cercana sea mnima, entonces realice una conexin. En esta versin de Simuln aparecen 3 dilogos uno detrs de otro, pidiendo el elemento origen, destino, y el nmero de entrada en el destino. Esta parte no est completamente depurada, de modo que el resultado en caso de elegir el mismo elemento como origen y destino, o un modulo de salida como origen y una puerta como destino, etc, no est contemplado, puede ser incierto. El 'bug' que s he observado consiste en el primer elemento aadido al programa: no se pueden realizar conexiones entre el elemento '0' del circuito y el resto de elementos, ya que en alguna parte del cdigo se pierde la referencia a este objeto. Por otro lado, al eliminar ciertas conexiones de algunas puertas, el resto de conexiones dejan de ser seleccionables (posiblemente el cdigo se queda bloqueado al realizar comprobaciones sobre las conexiones disponibles en determinado elemento). Tambin se ha observado que, al eliminar elementos, ciertas conexiones quedan 'al aire', no siendo seleccionables (puesto que el proceso de seleccin de una conexin pasa por determinar origen y destino y, si uno de stos no existe, entonces no hay seleccin).

	3.6 Movimiento de elementos: en la interfaz MouseMotion, en el mtodo mouseDragged, se hace una llamada al mtodo moverElemento() de la clase circuito. Puesto que esta interfaz se activa con cada ligero moviemiento del ratn, el desplazamiento del elemento es continuo mientras se est arrastrando. Se ha implementado un cambio en el cursor del ratn al producirse el desplazamiento, si bien en principio pueden elegirse cursores del sistema gracias a la clase toolkit, con la misma facilidad se pueden crear cursores a partir de imgenes externas. 

	3.7 Eliminacin de elementos: puesto que se eliminan mediante un men popup que slo se muestra al pinchar sobre un elemento, el elemento es seleccionado antes de mostrarse el men. La eliminacin es sencilla, basta con borrar dicho elemento de la matriz de elementos del circuito. En teora, puesto que los elementos cercanos contienen conexiones que hacen referencia al objeto eliminado, con esta accin no sera suficiente (habra que, adems, borrar todas sus conexiones), pero en la prctica s lo es. Es decir, el elemento no se dibuja puesto que parece no existir, pero las conexiones guardan informacin suficiente para que la funcin lgica no se vea alterada.

	3.8 Edicin de propiedades de elementos: en concreto el nmero de puertas, y el tamao relativo. ste ultimo permite modificar en porcentaje respecto al ltimo tamao mostrado, el tamao de cada elemento en particular, para poder disponer de elementos ms grandes que otros.

	3.9 Algunas particularizaciones de mi versin de Simulin.
		- Todos los dilogos se muestran inicialmente centrados sobre la ventana del programa. El programa, arranca centrado en la pantalla del usuario (esto ltimo se consigue cargando las dimensiones del escritorio mediante Toolkit).
		- Adems de usar clases como Dialogo para reducir al mximo el cdigo del programa, he intentado simplificarlo y clarificarlo al mximo, usando nombres de variables evidentes, y tambin definiendo algunas clases (como Punteros, SelectorColor, Mensajes) que definen constantes o trozos de cdigo reutilizables en cualquier parte del programa. Adems, al usar constantes el programa se vuelve ms fcilmente actualizable, y ms claro de leer.
		- Ya que se puede modificar la cantidad de entradas de los elementos, era conveniente modificar tanto los mtodos originales toString() como actualizarValorLogico() para que, en caso de haber entradas sin conexin definida, tales conexiones se trataran como ceros, con valor lgico 'false'. De este modo, aunque una puerta tenga conexiones al aire, la funcin lgica sigue siendo funcional, y tambin la tabla de verdad.
		- Cuando un circuito es modificado (al mover elementos, al cambiar las propiedades, al aadir, etc) se marca un flag en FrameSimulin, que produce un mensaje de confirmacin antes de cerrar el programa, abrir un circuito, o crear uno nuevo, para advertirnos de que se perdern los cambios introducidos en el circuito. Al grabarlo, se desactiva este flag.
		- Tanto un Elemento como una conexin pueden ser seleccionados. En tal caso, se muestran con color distinto al resto del circuito, y al pulsar el botn secundario del ratn muestran mens de opciones distintos a si pinchramos sobre la pantalla en blanco. El algoritmo de seleccin de conexiones funciona por determinacin de la recta a partir de los puntos origen y destino (contenidos en los elementos para mayor facilidad en el dibujado). Sin embargo, con pendientes tanto verticales como horizontales se hace particularmente difcil seleccionar las conexiones. Con una ligera inclinacin, el algoritmo funciona correctamente para un intervalo (establecido por defecto) de 10 pixeles de distancia mxima a la lnea.
		- Puede haber varias funciones lgicas simultneas (con tablas de verdad mltiples) de modo que se pueda trabajar al mismo tiempo con varias entradas y salidas (como en un circuito digital de aplicacin real).
		- Se ha redefinido el mtodo paint() y update() de FrameSimulin para controlar fcilmente cmo se gestiona el pintado, y repintado (con previo borrado de pantalla) del programa.


2. 'Bichitos' (Bugs).
===================
	Adems de los fallos comentados en la seccin anterior, he encontrado los siguiente errores en la ejecucin del programa:
		- Se intent probar la tcnica del doble bfer para mejorar el movimiento de los elementos. El resultado, en un equipo con WinXP, 512 Mb Ram y 800 Mhz fue bastante bastante muy poco aconsejable. La ralentizacin era tal que el efecto era an peor que sin el doble bfer.
		- Debido al funcionamiento actual de la insercin de conexiones (una buena opcin sera limitar los elementos del desplegable de origen y destino para que no se puedan elegir el mismo, ni modulos de entrada como destino, por ejemplo), cuando se inserta una nueva conexin, si se hace sobre otra que ya est creada, de cara a los elementos implicados es la ltima la que pervive, machacando la anterior. Sin embargo, la anterior conexin puede permanecer 'activa' al estar registrada en un tercer elemento, de modo que se produzcan errores en la seleccin de conexiones del circuito, e incluso en las salidas de la funcin lgica. Hay que eliminar primero conexiones, y despus aadir, para asegurar el efecto deseado.
		- No est contemplado el dibujado para mdulos de salida que enlazan directamente con mdulos de entrada (el dibujado est implementado slo para las puertas, mirando hacia atrs en sus conexiones, y hacia adelante nicamente las que conectan con salidas; sin puertas, no hay dibujado de conexiones).

3. Mejoras.
===========
	Respecto a la versin actual, propongo ciertas mejoras: 
		- Un men de ltimos circuitos abiertos (cuyos nombres pueden estar grabados en el archivo .ini)
		- imgenes que representen las puertas lgicas
		- implementacin de las conexiones entre elementos por proximidad (drag&drop)
		- depuracin de la eliminacin de elementos (actualmente no se borran las conexiones, simplemente dejan de dibujarse al no estar el elemento activo.)
		- estudio de las modificaciones necesarias para llevar a cabo una versin Web de Simulin.
		- implementacin de un bfer de acciones que permita deshacer y rehacer las ultimas acciones realizadas en el programa.