/*
 * File:   Display.h
 * Author: Christian
 *
 * Created on 27 de febrero de 2018, 15:56
 */

#ifndef DISPLAY_H
#define DISPLAY_H

//====== Textos ======
#define VENTANA_WIDTH 26
#define VENTANA_HEIGHT 26

#define MESSAGE_LineAmount 6

//Sin comentar ninguna son 16 lineas
#define HOME_Line           HOME_Line
#define CLRSCR_Line         CLRSCR_Line
#define RESETTERM_Line      RESETTERM_Line
#define TITLE_Line          TITLE_Line
//#define CPU_Line            CPU_Line
//#define CRONO_Line          CRONO_Line
//#define INCL_Line           INCL_Line
#define POUT_Line           POUT_Line
#define PID_Line            PID_Line
#define PWM1_Line           PWM1_Line
#define PWM2_Line           PWM2_Line
#define PWM3_Line           PWM3_Line
#define PWM4_Line           PWM4_Line
#define Rueda_D_line        Rueda_D_line
#define Rueda_I_line        Rueda_I_line
//#define AJUSTE_Line         AJUSTE_Line
#define CMD_Line            CMD_Line
#define CDATA_Line          CDATA_Line
#define EMPTY_Line          EMPTY_Line
#define MENSAJES_Line       MENSAJES_Line
#if MESSAGE_LineAmount>=1
#define MESSAGE1_Line       MESSAGE1_Line
#endif
#if MESSAGE_LineAmount>=2
#define MESSAGE2_Line       MESSAGE2_Line
#endif
#if MESSAGE_LineAmount>=3
#define MESSAGE3_Line       MESSAGE3_Line
#endif
#if MESSAGE_LineAmount>=4
#define MESSAGE4_Line       MESSAGE4_Line
#endif
#if MESSAGE_LineAmount>=5
#define MESSAGE5_Line       MESSAGE5_Line
#endif
#if MESSAGE_LineAmount>=6
#define MESSAGE6_Line       MESSAGE6_Line
#endif
#if MESSAGE_LineAmount>=7
#define MESSAGE7_Line       MESSAGE7_Line
#endif
#if MESSAGE_LineAmount>=8
#define MESSAGE8_Line       MESSAGE8_Line
#endif
#if MESSAGE_LineAmount>=9
#define MESSAGE9_Line       MESSAGE9_Line
#endif
#define THEEND_Line         THEEND_Line

typedef enum WindowLines{
    #ifdef HOME_Line 
        HOME_Line,
    #endif
    #ifdef CLRSCR_Line
        CLRSCR_Line,
    #endif
    #ifdef RESETTERM_Line
        RESETTERM_Line,
    #endif
    #ifdef TITLE_Line
        TITLE_Line,
    #endif
    #ifdef CPU_Line
        CPU_Line,
    #endif
    #ifdef CRONO_Line
        CRONO_Line,
    #endif
    #ifdef INCL_Line
        INCL_Line,
    #endif
    #ifdef POUT_Line
        POUT_Line,
    #endif
    #ifdef PID_Line
        PID_Line,
    #endif
    #ifdef PWM1_Line
        PWM1_Line,
    #endif
    #ifdef PWM2_Line
        PWM2_Line,
    #endif
    #ifdef PWM3_Line
        PWM3_Line,
    #endif
    #ifdef PWM4_Line
        PWM4_Line,
    #endif
    #ifdef Rueda_D_line
        Rueda_D_line,
    #endif
    #ifdef Rueda_I_line
        Rueda_I_line,
    #endif
    #ifdef AJUSTE_Line
        AJUSTE_Line,
    #endif
    #ifdef CMD_Line
        CMD_Line,
    #endif
    #ifdef CDATA_Line
        CDATA_Line,
    #endif
    #ifdef EMPTY_Line
        EMPTY_Line,
    #endif
    #ifdef MENSAJES_Line
        MENSAJES_Line,
    #endif
    #ifdef MESSAGE1_Line
        MESSAGE1_Line,
    #endif
    #ifdef MESSAGE2_Line
        MESSAGE2_Line,
    #endif
    #ifdef MESSAGE3_Line
        MESSAGE3_Line,
    #endif
    #ifdef MESSAGE4_Line
        MESSAGE4_Line,
    #endif
    #ifdef MESSAGE5_Line
        MESSAGE5_Line,
    #endif
    #ifdef MESSAGE6_Line
        MESSAGE6_Line,
    #endif
    #ifdef MESSAGE7_Line
        MESSAGE7_Line,
    #endif
    #ifdef MESSAGE8_Line
        MESSAGE8_Line,
    #endif
    #ifdef MESSAGE9_Line
        MESSAGE9_Line,
    #endif
    #ifdef THEEND_Line
        THEEND_Line
    #endif
}WLines;

extern char VENTANA_UART[VENTANA_HEIGHT][VENTANA_WIDTH];

extern unsigned char W_UART_X; //Linea
extern unsigned char W_UART_Y; //Columna

#define CURSOR_HOME     W_UART_X=HOME_Line;     W_UART_Y=0;
#define CLEAR_SCREEN    W_UART_X=CLRSCR_Line;   W_UART_Y=0;
#define RESET_TERM      W_UART_X=RESETTERM_Line;W_UART_Y=0;
#define TEXT_START      W_UART_X=TITLE_Line;    W_UART_Y=0;
#define NEXT_LINE       W_UART_X++;             W_UART_Y=0;
#define NEXT_CHARACTER  W_UART_Y++;

#define NEWLINE_CHAR LF

/**
  @Summary
    Inicializar ventada de datos.
  @Description
    Copia la ventana de datos del FLASH a RAM.
*/
void Inic_Display(void);
/**
  @Summary
    Copiar plantilla de la ventana de informacion de memoria FLASH a RAM.
  @Description
    Pasa la base de la ventana de informacion de l memoria del programa a un 
    vector de strings modificable para la posterior adicion de la informacion.
*/
void DISPLAY_Copiar_FLASH_RAM_IO(void);

/**
  @Summary
    Enviar string por UART.
  @Description
    Envia un buffer de cualquier longitud a la ventana de informacion o al 
    buffer del modo directo.
  @Param
    char* buffer = string a enviar.
*/
int DISPLAY_enviarString(char* buffer);

/**
  @Summary
    Enviar un caracter a la ventana de informacion.
  @Description
    Aņade un caracter en la posicion indicada dentro de la ventana de informacion.
  @Param
    char c = Caracter para aņadir.
    int linea = Linea en la que aņadir.
    int pos = Columna en la que aņadir.
*/
void DISPLAY_cambiar_VENTANA_c(char c,int linea, int pos);
/**
  @Summary
    Enviar un string a la ventana de informacion.
  @Description
    Aņade un string en la posicion indicada dentro de la ventana de informacion.
  @Param
    char* string = Caracter para aņadir.
    char linea = Linea en la que aņadir.
    int pos = Columna en la que aņadir.
    int flsuh = true para limpiar el resto de la linea.
*/
void DISPLAY_cambiar_VENTANA_s(char* string, int linea, int pos, char flush);
/**
  @Summary
    Borra una linea de la ventana de informacion.
  @Description
    Sustituye la cantidad de caracteres indicada, a partir de la columna 
    indicadan y de la linea indicada por saltos de linea.
  @Param
    int linea = Linea en la que aņadir.
    int pos = Columna en la que aņadir.
    int len = Columna en la que aņadir.
*/
void DISPLAY_borrar_VENTANA(int linea, int pos, int len);
/**
  @Summary
    Enviar un caracter a las lineas de mensaje de la ventana de informacion.
  @Description
    Aņade un caracter en la posicion indicada dentro de las lineas de mensaje.
  @Param
    char* s = String para aņadir.
  @Return
    Numero de caracteres escritos.
*/
int DISPLAY_cambiar_VENTANA_m(char*);
/**
  @Summary
    Borrar lineas de mensaje de la ventana de informacion.
  @Description
    Sustiruye todos los caracteres de las lineas de mensaje por saltos de linea.
*/
void DISPLAY_borrar_VENTANA_m(void);



/** MODO DIRECTO **/

extern volatile bool RECORDING;
/**
  @Summary
    Iniciar grabacion.
  @Description
    Activa la transmision de datos, el modo directo y otras funciones del robot 
    previamente seleccionadas y comienza la transmision de las variables 
    seleccionadas a un ritmo constante.
  @Param
    bool force_DirectM = Forzar activacion del modo directo.
*/
void record(bool force_DirectM);
    /**
      @Summary
        Imprime el las variables escogidas para el modo directo.
    */
    void directModeOutput(void);
/**
  @Summary
    Detener grabacion.
  @Description
    Detiene la transmision de las variables seleccionadas.
  @Param
    bool stop_PID = True: detener PIDs y ruedas.
*/
void stop(bool stop_PID);

#endif /*DISPLAY_H*/