/*
 * File:   UART.c
 * Author: Christian Mares
 *
 * Created on 15 de diciembre de 2017, 17:10
 */

#ifndef UART_H
#define UART_H

// timing y velocidad de transmision
#define Fosc 32000000 //Frecuencia reloj CPU
//#define Fosc 8000000 //Frecuencia reloj CPU
#define Fcy Fosc/2
#define BAUDRATE0 600 // baudios (bits/sg) de transmision
#define BAUDRATE1 9600 // baudios (bits/sg) de transmision
#define BAUDRATE2 19200 // baudios (bits/sg) de transmision
#define BAUDRATE3 57600 // baudios (bits/sg) de transmision
#define BAUDRATE  BAUDRATE2
#define BAUD_RATEREG_2_BRGH1 ((Fcy/BAUDRATE)/4)-1   // Para BRGH = 1
#define BAUD_RATEREG_2_BRGH0 ((Fcy/BAUDRATE)/16)-1 // Para BRGH = 0
// Reg/bits UART2 serial port
#define _STSEL_U2       U2MODEbits.STSEL
#define _PDSEL0_U2      U2MODEbits.PDSEL0
#define _PDSEL1_U2      U2MODEbits.PDSEL1
#define _BRGH_U2        U2MODEbits.BRGH
#define _RXINV_U2       U2MODEbits.RXINV
#define _ABAUD_U2       U2MODEbits.ABAUD
#define _LPBACK_U2      U2MODEbits.LPBACK
#define _WAKE_U2        U2MODEbits.WAKE
#define _UEN0_U2        U2MODEbits.UEN0
#define _UEN1_U2        U2MODEbits.UEN1
#define _RTSMD_U2       U2MODEbits.RTSMD
#define _IREN_U2        U2MODEbits.IREN
#define _USIDL_U2       U2MODEbits.USIDL
#define _UARTEN_U2      U2MODEbits.UARTEN
#define _PDSEL_U2       U2MODEbits.PDSEL
#define _UEN_U2         U2MODEbits.UEN
// U2STA
#define _URXDA_U2       U2STAbits.URXDA
#define _OERR_U2        U2STAbits.OERR
#define _FERR_U2        U2STAbits.FERR
#define _PERR_U2        U2STAbits.PERR
#define _RIDLE_U2       U2STAbits.RIDLE
#define _ADDEN_U2       U2STAbits.ADDEN
#define _URXISEL0_U2    U2STAbits.URXISEL0
#define _URXISEL1_U2    U2STAbits.URXISEL1
#define _TRMT_U2        U2STAbits.TRMT
#define _UTXBF_U2       U2STAbits.UTXBF
#define _UTXEN_U2       U2STAbits.UTXEN
#define _UTXBRK_U2      U2STAbits.UTXBRK
#define _UTXISEL0_U2    U2STAbits.UTXISEL0
#define _UTXINV_U2      U2STAbits.UTXINV
#define _UTXISEL1_U2    U2STAbits.UTXISEL1
#define _URXISEL_U2     U2STAbits.URXISEL
#define UART2_TX_TRIS   TRISFbits.TRISF5
#define UART2_RX_TRIS   TRISFbits.TRISF4
#define UART2_TX_LAT    LATFbits.LATF5
#define UART2_RX_LAT    LATFbits.LATF4
// I/O definitions
#define CR 0x0D // Salto de linea
#define LF 0x0A // Para poner cursor en la siguiente linea
#define BACKSPACE 0x8 // ASCII backspace character code
// useful macros
#define Clrscr "\x1b[2J" // Limpiar pantalla
#define Home "\x1b[H" // Vuelve a poner el cursor al principio
#define Pcr "\r" //


// ================ UART2 Serial Port ======================
extern volatile bool OUTPUT_ENABLED;
extern volatile bool DIRECT_MODE;

extern char PID_equation[50];
extern char* PID_e_max,PID_e_lp;

/**
  @Summary
    Comprobar si el buffer de recepcion esta vacio.
  @Description
    Devuelve true si el buffer de recepcion esta vacio.
*/
char RXBUF_Vacio(void);
/**
  @Summary
    Comprobar si el buffer de recepcion esta lleno.
  @Description
    Devuelve true si el buffer de recepcion esta lleno.
*/
char RXBUF_Lleno(void);
/**
  @Summary
    Aņadir un caracter al buffer de recepcion.
  @Description
    Aņade un caracter en la ultima posicion no ocupada del buffer de recepcion.
  @Param
    char rx = Caracter recibido, para aņadir a buffer.
*/
void RXBUF_Aniadir1(char rx);
/**
  @Summary
    Lee el primer caracter del buffer.
  @Description
    Lee, borra y devulve el primer caracter disponible del buffer. Seguidamente
    desplaza el resto de lementos una posicion hacia la primera.
*/
char RXBUF_LeerPrim(void);
/**
  @Summary
    Vaciar buffer de recepcion.
  @Description
    Vacia el buffer de recepcion.
*/
void RXBUF_Vaciar(void);


/**
  @Summary
    comprobar si el buffer de comando esta lleno.
  @Description
    Devuelve true si el buffer de comandos esta lleno.
*/
char CMDBUF_Lleno(void);
/**
  @Summary
    Aņadir un caracter al buffer de comandos.
  @Description
    Aņade un caracter en la ultima posicion no ocupada del buffer de comandos.
  @Param
    char rx = Caracter para aņadir a buffer.
*/
void CMDBUF_Aniadir1(char rx);
/**
  @Summary
    Borrar ultimo elemento.
  @Description
    Borra el ultimo elemento del buffer de comando.
*/
void CMDBUF_BorrUlt(void);
/**
  @Summary
    Vaciar buffer de comando.
  @Description
    Vacia el buffer de comandos de la UART.
*/
void CMDBUF_Vaciar(void);

/**
  @Summary
    comprobar si el buffer de datos esta lleno.
  @Description
    Devuelve true si el buffer de datos esta lleno.
*/
char CDATABUF_Lleno(void);
/**
  @Summary
    Aņadir un caracter al buffer de datos.
  @Description
    Aņade un caracter en la ultima posicion no ocupada del buffer de datos.
  @Param
    char rx = Caracter para aņadir a buffer.
*/
void CDATABUF_Aniadir1(char rx);
/**
  @Summary
    Borrar ultimo elemento.
  @Description
    Borra el ultimo elemento del buffer de datos.
*/
void CDATABUF_BorrUlt(void);
/**
  @Summary
    Vaciar buffer de datos.
  @Description
    Vacia el buffer de datos de la UART.
*/
void CDATABUF_Vaciar(void);
/**
  @Summary
    Converrtir contenido del buffer en integer.
  @Description
    Devuelve el valor integer del valor representado en el buffer.
*/
int CDATABUF_Parse(void);

/**
  @Summary
    Aņade un caracter al buffer del modo directo.
  @Description
    Aņade un buffer en la primera posicion no ocuparada del buffer.
  @Param
    char c = Caracter a aņadir.
*/
int DMB_Anadir1(char c);


/**
  @Summary
    Inicializar UART2.
*/
void Init_UART();

//Transmision y recepcion por encuesta
void UART_put(char);   //Transmision por encuesta
char UART_get( void); //Recepcion por encuesta

/**
  @Summary
    Enviar string por UART.
  @Description
    Envia un buffer de cualquier longitud al buffer del modo directo.
  @Param
    char* buffer = string a enviar.
*/
int UART_enviarString(char*);
/**
  @Summary
    Enviar string por UART.
  @Description
    Envia un buffer de la longitud indicada al buffer del modo directo. 
  @Param
    char* buffer = String a enviar.
    int len = Longitud del string
*/
int UART_enviarString_L(char*,int);

/**
  @Summary
    Comienza la transmision del buffer.
  @Description
    Envia un caracter nulo para comenzar el envio en cadena del contenido del 
    buffer del modo directo o el buffer de la ventana de informacion (Segun el
    modo) a traves de la interrupcion de envio.
*/
void UART_start_transmision(void);

/**
  @Summary
    Ejecutar comando de un caracter.
  @Description
    Lee la siguiente posicion del buffer de recepcion. Si no esta vacia ejecuta 
    la accion asociada caracter en cuestion.
*/
void CMD_exeChar(void);
/**
  @Summary
    Ejecutar comando de string de caracteres.
  @Description
    Ejecuta el comando almacenado en el buffer de comando. Si el comando 
    requiere leer un dato del buffer de datos, la funcion lo parsea
    automaticamente.
*/
void CMD_exeString(void);

/**
  @Summary
    Refrescar ventana de la UART.
  @Description
    Actualiza la informacion de la ventana de informacion. Solo se actualizan
    las variables que han sufrido cambios.
*/
void refrescar_Ventana_UART(void);

/**
  @Summary
    Alternar activacion del modo directo.
  @Description
    Alterna la activacion del modo directo.
*/
void toggle_DirectMode(void);
/**
  @Summary
    Desactivar el modo directo.
  @Description
    Desactiva el modo directo.
*/
void disable_DirectMode(void);
/**
  @Summary
    Activar el modo directo.
  @Description
    Activa el modo directo.
*/
void enable_DirectMode(void);

/**
  @Summary
    Alternar activacion del envio de datos.
  @Description
    Alterna la activacion de las interruciones de envio de datos de la UART, 
    deteniendo el envio de datos.
*/
void toggle_OutPut(void);
/**
  @Summary
    Desactivar el envio de datos.
  @Description
    Desactiva las interruciones de envio de datos de la UART, deteniendo el 
    envio de datos.
*/
void disable_OutPut(void);
/**
  @Summary
    Activar el envio de datos.
  @Description
    Activa las interruciones de envio de datos de la UART, deteniendo el envio 
    de datos.
*/
void enable_OutPut(void);

#endif /*UART_H*/