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)