DÍA 025 DE 365

Fase 1: Fundamentos de C y Lógica de Software[cite: 1, 3]

📖 Teoría Explícita: Enums de Tipado Estricto

1. `#define` vs `enum` en Debugging

Si usas #define REPOSO 0, durante una sesión de Debugging (con J-Link o ST-Link), el depurador solo te mostrará un 0 en la variable. Tendrás que recordar de memoria qué significa ese 0. Al usar typedef enum, el compilador conserva el nombre simbólico. El depurador te mostrará literalmente la palabra REPOSO, ahorrándote horas de frustración al analizar fallos.

2. Asignación Explícita de Valores (Firmas)

Por defecto, un enum asigna los valores 0, 1, 2, 3... secuencialmente. Pero en sistemas críticos, el valor 0x00 es el valor de un cable de datos en cortocircuito a tierra. Debemos forzar firmas hexadecimales claras (ej. 0x10, 0x20) para que si el ESP32 recibe un byte de estado, sepamos matemáticamente que es auténtico y no ruido eléctrico.

3. Seguridad de Tipos (Type Safety)

En C puro, un enum se compila internamente como un entero (usualmente 1 byte o 4 bytes, dependiendo del nivel de optimización y arquitectura ARM). Sin embargo, al crear un nuevo tipo de dato con typedef, obligamos al compilador a advertirnos si intentamos pasar un valor sin sentido (como 99) a una función que espera un estado válido de la máquina.

ASIGNACIÓN HEXADECIMAL EN LA FSM ESTADO_REPOSO 0x10 (16) ESTADO_DESPACHO 0x20 (32) ESTADO_FALLA 0xFF (255) Botón START Error Sensor Falla en Despacho -> 0xFF Evita el 0x00!

⚙️ Ejercicios Prácticos: Implementación en C Puro

Ejercicio 1: Crea la arquitectura base de la FSM de tu Despachador de Gas. Asigna valores hexadecimales específicos a cada estado para que puedan ser mapeados directamente al protocolo UART que va hacia el ESP32, garantizando integridad en las tramas.


#include <stdint.h>

// --- 1. DEFINICIÓN DEL TIPO ESTRICTO Y FIRMAS HEX ---
// El compilador sabrá que cualquier variable de tipo 'EstadoFSM_e' 
// solo debe contener uno de estos valores.
typedef enum {
    FSM_INICIALIZACION  = 0x05, // 0x00 evitado intencionalmente
    FSM_REPOSO          = 0x10,
    FSM_AUTENTICANDO    = 0x15, // Esperando token del ESP32
    FSM_DESPACHANDO     = 0x20, // Válvulas abiertas
    FSM_CORTE_FLUJO     = 0x30, // Cierre de válvulas, calculando
    FSM_FALLA_CRITICA   = 0xFF  // 255: Código universal de error
} EstadoFSM_e;

// Declaración global del estado de la máquina
EstadoFSM_e estado_actual_lp = FSM_INICIALIZACION;


// --- 2. FUNCIÓN DE CAMBIO DE ESTADO (Manejador Seguro) ---
// Al recibir 'EstadoFSM_e' en lugar de 'uint8_t', el compilador GCC te lanzará
// un 'Warning' si intentas pasarle un número al azar como "cambiar_estado(99);".
void FSM_Cambiar_Estado(EstadoFSM_e nuevo_estado) {
    
    // Aquí podrías agregar lógica para ignorar cambios si estamos en falla
    if (estado_actual_lp == FSM_FALLA_CRITICA && nuevo_estado != FSM_INICIALIZACION) {
        return; // Una falla crítica solo se sale con un reset o inicio
    }
    
    estado_actual_lp = nuevo_estado;
}


// --- 3. EXTRACCIÓN PARA TELEMETRÍA UART ---
// Retornamos el valor numérico (Hex/Byte) para enviarlo crudo por UART al ESP32
uint8_t FSM_Obtener_Estado_Para_UART(void) {
    // Un simple casting explícito a 8-bits extrae la firma hexadecimal
    return (uint8_t)estado_actual_lp; 
}


int main(void) {
    // Simulación del Súper Bucle de la Máquina
    
    // Autodiagnóstico superado
    FSM_Cambiar_Estado(FSM_REPOSO);
    
    // ... Evento de Botón de Start ...
    FSM_Cambiar_Estado(FSM_AUTENTICANDO);
    
    // El puerto UART ahora enviará exactamente '0x15' al ESP32.
    // El ESP32 sabrá con certeza matemática que la máquina espera autorización.
    
    while(1) {
        // Ejecución de tareas...
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Sincronización Determinista de Estados con Telemetría.

En un ecosistema industrial compuesto por dos cerebros (el microcontrolador STM32 que maneja el hardware duro y el módulo ESP32 que maneja el Wi-Fi/Nube), la sincronización es el eslabón más débil. Al forzar firmas hexadecimales exactas mediante enums de tipado estricto, evitas crear arreglos de mapeo complejos. Cuando el ESP32 reciba el byte 0x20, su código fuente (que compartirá este mismo archivo .h de Enums) sabrá instantáneamente que el despachador está en FSM_DESPACHANDO, sin parsear cadenas de texto ni arriesgar desbordamientos de memoria.

📝 Resumen del Día