/*
 * File:   LCD.h
 * Author: Christian Mares
 *
 * Created on 13 de diciembre de 2017, 20:47
 */

#ifndef LCD_H
#define LCD_H

// access data register
#define LCDDATA 1
// access command register
#define LCDCMD  0
// PMP data buffer
#define PMDATA  PMDIN1

// define some macros that make life a bit easier

// check if LCD busy
#define busyLCD() readLCD( LCDCMD) & 0x80
// check address of LCD position
#define addrLCD() readLCD( LCDCMD) & 0x7F
// read what is on the LCD
#define getLCD()  readLCD( LCDDATA)
// set cursor position
#define setLCDC( a) writeLCD( LCDCMD, (a & 0x7F) | 0x80) //0b0111 1111  0b1000 0000¡

extern bool LCD_IS_ON;


/**
  @Summary
    Inicializar LCD.
  @Description
    Inicializa el LCD a traves del modulo PMP.
*/
void Inic_LCD();
char readLCD(int);
/**
  @Summary
    Enviar comando al LCD.
*/
void writeLCD( int, unsigned char);
/**
  @Summary
    Enviar caracter segun formato.
  @Description
    Evia el caracter pasado al LCD, a no ser que sea especial, en cuyo caso se 
    toman acciones especiales.
  @Param
    char d = caracter a enviar.
*/
void LCD_Send_Char(char);

/**
  @Summary
    Enviar string al LCD.
  @Description
    Murestra el buffer por pantalla a partir de la posicion actual del cursor.
  @Param
    char* buffer = String a enviar.
*/
int LCD_Send_String(char*);

/**
  @Summary
    Enviar string al LCD.
  @Description
    Murestra el buffer de la longitud indicada por pantalla a partir de la 
    posicion actual del cursor.
  @Param
    char* buffer = String a enviar.
    unsigned shot length = Longitud del string.
*/
void LCD_Send_String_L (char* , unsigned short);

/**
  @Summary
    Despejar pantalla LCD.
  @Description
    Borrar todos los caracteres de la pantalla y enviar cursor al principio.
*/
void LCD_ClearScreen(void);
/**
  @Summary
    Poner el cursor en la posicion 0x0.
  @Description
    Envia el cursor del LCD al principio.
*/
void LCD_Home(void);

/**
  @Summary
    Despejar pantalla LCD durante la interrupcion de un trap.
  @Description
    Cuando un trap salta, los timers dejan de funcionar. Esta funcion es igual 
    LCD_ClearScreen, pero no emplea timers.
*/
void LCD_TrapSafe_ClearScreen(void);
/**
  @Summary
    Poner el cursor en la posicion 0x0 durante la interrupcion de un trap.
  @Description
    Cuando un trap salta, los timers dejan de funcionar. Esta funcion es igual 
    LCD_Home, pero no emplea timers.
*/
void LCD_TrapSafe_Home(void);

#endif