/* 
 * File:   menu_LCD.h
 * Author: Christian
 *
 * Created on 23 de mayo de 2019, 11:49
 */

#ifndef MENU_LCD_H
#define	MENU_LCD_H

typedef enum menu_LCD_estados{
    mainMenu = -10,                  
            M_controles     	= 0,    
                C_controlEq    	= 1,      
//                C_SP_pid    	= 2,     
                C_controlVel 	= 3,     
                C_RecPos       	= 4, 
                C_UART_DM   	= 5,    
                C_UART_Activar 	= 6,     
                C_UART_Grabar  	= 7,    // Las decenas representan la opcion del
            M_Calib_PID      	= 10,   // menu principal.
                TG_Balance  	= 11,   // Las unidades el submenu.
                TG_Speed    	= 12,
                TG_Auto_B   	= 13,
                TG_Auto_S   	= 14,
//                TG_pGain    	= 11,   
//                TG_iGain    	= 12,   
//                TG_dGain    	= 13,   
            M_displayVar    	= 20,   
                DV_PIDcomps 	= 21,
                DV_CPUper   	= 22,
                DV_MainSP   	= 23,
                DV_Velocim  	= 24,
                DV_Distancia	= 25,
            M_clrOLled      	= 30,
            M_listaAcciones 	= 40,
            M_Calib_PWM       	= 50,
                PTm_BackLeft    = 51,
                PTm_BackRight   = 52,
                PTm_ForwLeft    = 53,
                PTm_ForwRight   = 54,
                PTM_BackLeft    = 55,
                PTM_BackRight   = 56,
                PTM_ForwLeft    = 57,
                PTM_ForwRight   = 58,
            M_Ajustar_SP      	= 60,
                ST_BalanceSP	= 61,
                ST_SpeedSP  	= 62,
}menu_LCD_estados;

/* Cursor del menu.                                             */
/* Seņala la opcion del menu sobre la que se encuentra el foco.
 * Almacena el enumerador del estado y un puntero al texto de la 
 * opcion actual.                                               */
typedef struct menu_LCD_cursor_obj_struct
{
    char** string; // Puntero que seņala al foco del menu
    menu_LCD_estados estado;// Estado que representa el foco del menu   
} menu_LCD_cursor_obj;

extern menu_LCD_cursor_obj mLCD_cursor;
extern char *menu_LCD_main[15];
    
/* Inicializacion */
/**
  @Summary
    Inicializacion del menu LCD.
  @Description
    Inicializa los textos y valores booleanos de los menus y el cursor a su 
    posicion inicial. Ademas ofrece la opcion de imprimir el estado actual del
    menu por pantalla cuando termina la inicializacion.
  @Param
    bool first_print = true -> Imprime estado del menu.
*/
void Init_menu_LCD(bool first_print);
/**
  @Summary
    Inicializaliza el vector de booleanos del menu controles.
  @Description
    Asigna la direccion de memoria de las respectivas variables booleanas que 
    destriben el estado de cada opcion del menu de controles.
*/
void init_LCD_controls_BOOLs(void);

/* Metodos */
/**
  @Summary
    Selecciona la siguiente posicion de un array de strings.
  @Description
    Dado el puntero del array de strings al que apunta actualmente el cursor y 
    su longitud, avanza el puntero del cursor al siguiente string del array. 
    Cuando alzanza el final regresa a la primera posicion.
    Si en el primer argumento no se pasa la direccion de la posicion 0 del mismo 
    array al que apunta el cursor el resultado es impredecible. Si la direccion 
    del array del cursor es mas alta que la del argumento, puede que se avance 
    una posicion como se espera. Si es mas baja puede que se asigne el nuevo 
    array en la posicion 0.
  @Param
    char** menu = Puntero del array de strings.
    int L = Longitud del array.
*/
void menu_LCD_siguiente(char** menu,int L);
/**
  @Summary
    Selecciona la anterior posicion de un array de strings.
  @Description
    Dado el puntero del array de strings al que apunta actualmente el cursor y 
    su longitud, avanza el puntero del cursor al anterior string del array. 
    Cuando alzanza el final regresa a la primera posicion.
    Si en el primer argumento no se pasa la direccion de la posicion 0 del mismo 
    array al que apunta el cursor el resultado es impredecible. Si la direccion 
    del array del cursor es mas alta que la del argumento, puede que se avance 
    una posicion como se espera. Si es mas baja puede que se asigne el nuevo 
    array en la posicion 0.
  @Param
    char** menu = Puntero del array de strings.
    int L = Longitud del array.
*/
void menu_LCD_anterior(char** menu,int L);
/**
  @Summary
    Actualizar menu LCD.
  @Description
    Actualiza el estado del menu LCD en consecuencia de las acciones tomadas. El
    flujo del funcionamiento del menu es definido por los pulsadores que han 
    sido activados entre una llamada a esta funcion y la anterior. Si, por 
    ejemplo, se pulsa S4, la proxima vez que se llame a esta funcion se entrara 
    en el menu o se ejecutara el comando sobre el que se en cuentre el cursor.
*/
void menu_LCD(void);

/**
  @Summary
    Refrescar estado de las variables en tiempo real en el display LCD.
  @Description
    Actualiza el valor mostrado para la variable en tiempo real seleccionada en 
    el LCD.
*/
void mLCD_realTimeDisplay(void);

#endif	/* MENU_LCD_H */

