UD03T03_DashboardIoT
Completion requirements
04_Controlador
🎛️ DESARROLLO DEL CONTROLADOR (DashboardController.java)
📋 PASO 4: CONTROLADOR MVC
5.1. Método initialize() - Ciclo de Vida
Diagrama de Flujo - initialize():
╔══════════════════════════════════════╗
║ PASO 1: cargarInformacionSensor() ║
╚══════════════╦═══════════════════════╝
│
↓
┌──────────────────────────────────┐
│ Muestra en la vista el nombre, |
| modelo y ubicación del sensor |
└──────────┬───────────────────────┘
│
↓
╔══════════════════════════════════════╗
║ PASO 2: configurarEstadoInicial() ║
╚══════════════╦═══════════════════════╝
│
↓
┌────────────────────────────────┐
│ Desmarca los checkbox │
│ Actualiza gráfico = vacío │
└──────────┬─────────────────────┘
│
↓
╔══════════════════════════════════════════╗
║ PASO 3: iniciarActualizacionAutomatica() ║
╚══════════════╦═══════════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ timeline = new Timeline( │
│ new KeyFrame( │
│ Duration.millis(500), │
│ event -> cicloActualizacion() │
│ ) │
│ ) │
└──────────┬───────────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ timeline.setCycleCount( │
│ Animation.INDEFINITE) │
│ (Repetir infinitamente) │
└──────────┬───────────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ timeline.play() │
│ (Iniciar temporizador) │
└──────────┬───────────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Aplicación LISTA │
│ Timeline ejecuta cicloActualizacion()|
| cada 0.5s │
└──────────────────────────────────────┘
5.2. CICLO PRINCIPAL - Método cicloActualizacion()
Diagrama de Flujo Completo del Ciclo:
╔═════════════════════════════════════════════════════╗
║ Timeline ejecuta cicloActualizacion() cada 500ms ║
╚═════════════════════════════════════════════════════╝
│
↓
┌─────────────────────────────────────┐
│ cicloActualizacion() │
│ (Orquestador del ciclo) │
└──────────┬──────────────────────────┘
│
↓
╔════════════════════════════════════╗
║ FASE 1: generarNuevaLectura() ║
╚══════════════╦═════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ modelo.generarLectura() │
│ ┌──────────────────────────────────┐ │
│ │ • Variaciones aleatorias │ │
│ │ • Picos ocasionales │ │
│ │ • Actualizar timestamp │ │
│ └──────────────────────────────────┘ │
└──────────┬───────────────────────────┘
│
↓
╔══════════════════════════════════════════╗
║ FASE 2: actualizarValoresMostrados() ║
╚══════════════╦═══════════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ actualiza en el card de los valores |
| actuales los nuevos valores leido y |
| la hora de la lectura |
└──────────┬───────────────────────────┘
│
↓
╔═════════════════════════════════════╗
║ FASE 3: agregarPuntosAlGrafico() ║
╚══════════════╦══════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ ┌──────────────────────────────────┐ │
│ │ Añade puntos a series habilitadas│ │
│ │ Recorta si >200 puntos │ │
│ └──────────────────────────────────┘ │
└──────────┬───────────────────────────┘
│
↓
╔══════════════════════════════════════════╗
║ FASE 4: actualizarEjeX() ║
╚══════════════╦═══════════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ Establece los limites superior e |
| inferior del gráfico |
| (Ventana deslizante) │
└──────────┬───────────────────────────┘
│
↓
╔══════════════════════════════════════════╗
║ FASE 5: actualizarAvisos() ║
╚══════════════╦═══════════════════════════╝
│
↓
┌──────────────────────────────────────┐
│ Usuario ve interfaz actualizada: │
│ ✓ Nuevos valores numéricos │
│ ✓ Gráfico con nuevo punto │
│ ✓ Ejes ajustados │
│ ✓ Avisos actualizados │
└──────────┬───────────────────────────┘
│
│ (Esperar 500ms)
│
└──────→ (volver a cicloActualizacion())
5.2.1. Fase 1: Generar Nueva Lectura
/**
* Solicita al modelo generar una nueva lectura del sensor.
* Delega completamente la lógica al modelo.
*/
5.2.2. Fase 2: Actualizar Valores Mostrados
/**
* Actualiza los valores numéricos mostrados en la card de valores actuales.
* Obtiene valores formateados del modelo y los asigna a los labels.
*/
5.2.3. Fase 3: Agregar Puntos al Gráfico
/**
* Agrega nuevos puntos a las series del gráfico.
* Solo añade a series cuyo checkbox está marcado.
*/
5.2.4. Fase 4: Actualizar Eje X
/**
* Actualiza los límites del eje X para crear efecto ventana deslizante.
* Delega cálculos al modelo.
*/
5.3. Fase 5: Actualizar Avisos - DETALLADO
Diagrama de Flujo Completo:
┌───────────────────────────┐
│ actualizarAvisos() │
└─────────┬─────────────────┘
│
↓
┌─────────────────────────────┐
│ Eliminar avisos antiguos │
└─────────┬───────────────────┘
│
↓
╔═══════════════════════════════════════╗
║ VALIDACIÓN TEMPERATURA ║
╚═══════════════╦═══════════════════════╝
│
↓
┌──────────────────────────────┐
│ ¿hayAlertaTemperatura()? │
└──────┬──────┬────────────────┘
SÍ┤ │ NO
│ |
↓ └─────────────┐
┌──────────────────────────────┐ │
│ ┌──────────────────────────┐ │ │
│ │ Crea Label con: │ │ │
│ │ • Icono ⚠ │ │ │
│ │ • Texto formateado │ │ │
│ │ • StyleClass "warn-pill" │ │ │
│ └──────────────────────────┘ │ │
└──────────┬───────────────────┘ │
│ │
↓ │
┌──────────────────────────────┐ │
│ añadir alerta a la card │ │
| de avisos │ │
└──────────┬───────────────────┘ │
│ │
└────→ ┌ ← ← ← ← ← ← ┘
│
↓
╔═══════════════════════════════════════╗
║ VALIDACIÓN RESTO DE SENSORES ║
╚═══════════════╦═══════════════════════╝
│
↓
╔═══════════════════════════════════════╗
║ VERIFICACIÓN FINAL ║
╚═══════════════╦═══════════════════════╝
│
↓
┌─────────────────────────────────────┐
│ ¿Hay al menos UNA alerta? │
└──────┬──────┬───────────────────────┘
NO┤ │ SI
│ |
↓ └─────────────┐
┌──────────────────────────────┐ │
│ ┌──────────────────────────┐ │ │
│ │ Crea Label con: │ │ │
│ │ • Texto "Sin avisos" │ │ │
│ │ • StyleClass "ok-pill" │ │ │
│ └──────────────────────────┘ │ │
└──────────┬───────────────────┘ │
│ │
└─────→ ┌ ← ← ← ← ← ← ┘
│
↓
(FIN)