Saltar a contenido
← Volver a OPRobots.org

Sistema de Menú

El módulo principal implementa una navegación por pantallas controlada por 2 botones físicos y complementada con control remoto RC5.

stateDiagram-v2
    [*] --> SPLASH
    SPLASH --> MENU: 2s timeout
    MENU --> WIFI_INIT: Botón sup. (opción 0)
    MENU --> TIMER: Botón inf. (opción 1)
    WIFI_INIT --> WIFI_INFO: web_setup() OK
    WIFI_INIT --> WIFI_FAIL: web_setup() falla
    WIFI_INFO --> MENU: Botón inf.
    WIFI_FAIL --> MENU: Botón inf.
    TIMER --> MENU: Botón inf.
    TIMER --> TIMER: Botón sup. (reset cronómetro)

Opciones del Menú

Opción Pantalla destino Descripción
Iniciar WiFi WIFI_INIT Conecta a la red WiFi y monta el servidor web
Cronómetro TIMER Entra al cronómetro (detección IR + display)

La selección se navega con un side selector en el borde de la pantalla. El side selector soporta 2 elementos (código hardcodeado para count == 2 en screen.cpp:212).

Botones

Botón Pin Acción por pantalla
Superior 6 (BTN_TOP_PIN) MENU: opción 0 → WiFi; TIMER: reset cronómetro
Inferior 5 (BTN_BOTTOM_PIN) MENU: opción 1 → Cronómetro; otros: volver a MENU

Ambos botones usan INPUT_PULLDOWN. La lectura se hace con digitalRead() y debounce vía espera activa (while (digitalRead(...))).

⚠️ Advertencia: Los bucles de debounce no tienen timeout. Si un botón se queda atascado, el sistema se congela. Ver MN-01.

Sistema de Interacción

Componente Función
Botón superior Navegar opción 0 / resetear cronómetro
Botón inferior Navegar opción 1 / volver al menú
LED Power Indicador de batería (verde normal, rojo parpadeante baja)
LED Connection Indicador de estado WiFi (azul conectado, rojo fallo)
Control remoto RC5 STOP y RESET del cronómetro a distancia

Control Remoto RC5

El mando IR puede enviar dos comandos que la máquina de estados procesa como eventos pendientes:

Comando RC5 Dirección Evento Efecto
Program 0x0B EVENT_RESET Reinicia el cronómetro
Computer 0x07 EVENT_STOP Para el cronómetro

Los eventos se almacenan en pending_event y se procesan en la siguiente iteración de loop() vía control_manage_pending_event().

Pantalla del Cronómetro

screen.cpp:221-326

La pantalla SCREEN_TIMER muestra:

Elemento Descripción
Tiempo actual Formato MM:SS.mmm (o MMM:SS:MM si > 99 min)
Última vuelta Tiempo de la vuelta anterior
Mejor vuelta Marcada como BEST si coincide con la última
Historial 5 últimas vueltas con número y delta
Botón sup. Label "RESET"
Botón inf. Label "MENU"

Formato de Tiempos

utils.cpp:36-48

Rango Formato Ejemplo
< 100 minutos MM:SS.mmm 01:23.456
≥ 100 minutos MMM:SS:MM 123:45:67

Deltas de Vuelta

utils.cpp:13-34

Los deltas se muestran respecto a la mejor vuelta, con signo y precisión de 3 decimales:

Signo Color Significado
(negativo) Verde Más rápido que la mejor vuelta
+ (positivo) Ámbar Más lento que la mejor vuelta

Documento generado el 2026-06-29. Ver también Arquitectura Software, Debug, Comunicaciones.