Diseño y Programación Orientados a Objetos
1er. Sem 2019
Tarea 2: Aplicación Gráfica para Semáforos en Intersección

Lea detenidamente la tarea. Si algo no lo entiende, consulte en clases. Si es preciso, se incorporarán aclaraciones al final.
Objetivos de la tarea:
* Manejar proyectos vía GIT.
* Crear Interfaces gráficas en Java.
* Manejar eventos de software.
* Ejercitar la creación y extensión de clases para satisfacer nuevos requerimientos.
* Ejercitar el patrón de diseño "Modelo-Vista-Controlador".
* Generar documentación usando Javadoc.

Descripción General

  En esta tarea se pide crear una interfaz gráfica para la simulación de los semáforos de la intersección de las Avenidas Manuel Antonio Matta y Los Placeres. Si bien no se simulan todos los semáforos (en la realidad algunos de ellos están duplicados), se incorpora botones para solicitar verde en los dos cruces peatonales y se simula un sensor inductivo para otorgar el derecho a girar a la izquierda desde Avda. Placeres hacia Avenida Matta. Ver figura 1.

Figura 1: Esquema general como idea para organizar interfaz usuario

La interfaz se divide en dos zonas. La superior incluye el bosquejo de la intersección y los semáforos señalados en Figura1. Cada semáforo puede ser representado visualmente como su grupo estime. Más abajo se acompaña un programa ejemplo y ayuda que puede usar como referencia. La parte inferior de la interfaz contiene tres botones que representarán los botones de los cruces peatonales y el del medio el sensor inductivo para giro. Cada botón debe incluir una imagen que reflejará el requerimiento de cruce o giro.

Mientras un controlador otorgará secuencialmente autorización de avanzar a cada semáforo de manera similar a como ocurre en aquella intersección, el usuario podrá presionar los botones para solicitar cruce o giro. Así se simulará la llegada de peatones y autos a girar. Ante esto el controlador pondrá en verde el semáforo de cruce o giro cuando corresponda el turno para ese semáforo dentro de la secuencia.

Desarrollo en Etapas

Para llegar al resultado final de esta tarea usted aplicará la metodología "Iterativa e Incremental" para desarrollo de software. Su grupo irá desarrollando etapas que irán abordando los requerimientos gradualmente. En cada etapa usted obtendrá una solución que funciona para un subconjunto de los requerimientos finales. Su grupo deberá entregar una solución para cada una de las etapas aún cuando la última integre las primeras. El readme y archivo de documentación deben ser preparados solo para la última etapa. Prepare un makefile para cada una de las etapas. Esto tiene por finalidad, educar en la metodología iterativa e incremental.

Primera Etapa: Dos semáforos de calle y uno de cruce peatonal

Revise con detención el código proporcionado para dos semáforos. Analice cada archivo y compare esta solución parcial con lo que usted preparó en tarea 1. Extienda la aplicación proporcionada para incorporar un tercer semáforo. Su vista debe corresponder a un semáforo de calle (StreetTrafficLight). Elija usted la secuencia en que el controlador les dará el paso.

Segunda Etapa: Paso peatonal con botón de solicitud de paso

Separe la ventana principal en dos zonas, una sobre la otra dentro del JFrame. El layout por omisión (default) de JFrame es el Border Layout. Considere poner la intersección de calles en el centro y un botón en la parte inferior. Al presionar el botón debe cambiar su vista de manera similar al ejercicio hecho en la clase del 17.04.19. Haga los cambios necesarios para que el paso peatonal pase a verde dentro de la secuencia solo si su botón ha sido requerido. Mientras no haya requerimiento, la autorización de paso se turna entre los otros dos semáforos.

Tercera Etapa: Vista para semáforo de giro

Cree la clase TurnTrafficLight. Se sugiere revisar nuevamente la clase CrosswalkTrafficLight antes de crear esta vista nueva para un semáforo. Agregue una instancia de semáforo de giro a los tres semáforos previos. Incluya un botón acorde para solicitar paso en el semáforo de giro. Use dos imágenes de una bobina, una de ellas que denote detección de auto.  En esta etapa usted debe ver los cuatro semáforos operando de manera secuencial y otorgando verde al paso peatonal y al semáforo de giro solo si el botón correspondiente ha sido accionado. En cualquier caso el paso sólo se otorga cuando corresponda para ese semáforo dentro de la secuencia.

Cuarta Etapa: Simulación de intersección Avenida los Placeres con Avenida Manuel Antonio Matta

En esta última etapa el programa debe mostrar una interfaz similar a la Figura 1. Revise las clases Line2D.Double y clase Path2D.Double (notar uso de clases estáticas anidadas). Instancias de estas clases pueden dibujarse al igual que se hace con instancias de Ecllipse2D. Use una secuencia semejante a la usada en la intersección real.

Resultados Esperados de su Grupo

Usted deberá documentar, usando notación "JavaDoc" las clases TrafficLight y TurnTrafficLight de su última etapa.
Prepare un archivo makefile para compilar y ejecutar su tarea en aragorn. Además incluya rótulos "clean" para borrar todos los .class generados, y "doc" para generar la documentación en directorio "documentation".
Entregue todo lo indicado en Normas de Entrega de Tareas. Su documentación automática con javadoc debe ser generable con:
$ make doc
Para que esto funcione usted debe incluir el rótulo doc en su archivo makefile.
(OJO no incluya las páginas html generadas por javadoc, éstas serán generadas por este comando cuando el ayudante revise su trabajo)
En su archivo de documentación (pdf o html) incorpore el diagrama de clases de la aplicación (etapa 4). Éste lo puede generar con jgrasp u otro programa.

Extra créditos

Su grupo puede aspirar a 5 puntos adicionales (la nota igualmente se satura en 100%) si incorpora un menú para cambiar la duración del parpadeo a usar en ambos semáforos peatonales (mismo valor para ambos) y otra opción para cambiar la duración del parpadeo verde para el semáforo de giro. En archivo Readme indique si abordó este requerimiento.

Ayudas
* Revise las instrucciones para la realización de tareas.
* No dude en consultar al profesor o ayudantes sobre dudas de esta tarea.

Sobre la arquitectura Modelo Vista Controlador
Para organizar interfaces gráficas una "solución de software general recomendada" (éstas son conocidas como patrones de diseño) es el patrón "modelo-vista-controlador". El modelo es la clase que caracteriza a un objeto y almacena los datos significativos de éste. Por ejemplo, en este caso la clase TrafficLight maneja el modelo de un semáforo. Por otro lado tenemos las vistas, estas clases indican cómo un objeto se muestra visualmente. En nuestro caso StreetTrafficLight y PedestrianTrafficLight son vistas para la clase TrafficLight. En esta tarea, todos los semáforos se simularán de manera similar; sin embargo, varios difieren en su representación visual. En otros problemas puede ocurrir que un mismo modelo tenga varias vistas. Por ejemplo un objeto termómetro tiene un modelo y podría mostrarse como columna de mercurio, como número digital, como un color, etc. Finalmente tenemos el controlador. Las clases controladoras son aquellas que modifican los datos, por ejemplo a través de las acciones del usuario en la interfaz. Generalmente las clases controladoras son los "listeners" o manejadores de los eventos que usted estima de interés. En este caso la clase Controlador genera cambios en el estado de los semáforos. Una clase puede cumplir dos roles, por ejemplo modelo y vista, como ocurre en las clases hijas StreetTrafficLight y PedestrianTrafficLight. Así como podemos tener varias vistas, es posible tener varias clases controladoras de un modelo. Otras clases controladoras son el listener que responde a al presionar un botón.