#ifndef EEP_H
#define	EEP_H

#include <xc.h>
#include <stdint.h>
#include "main.h"

#ifdef	__cplusplus
extern "C" {
#endif
    //Cuando usemos estas funcones debemos tener claro que tipo de dato vamos a guardar 
//en la memoria EE, entonces si queremos guardar una variable de (8,16,24 ó 32)bits
//con o sin signo tendremos que utilizar la funcion correspondiente y tener en cuenta que 
//cuando recuperemos el dato debemos tambien hacerlo con la funcion que corresponde
//las funciones son:
//WriteEE      escribe una dato de 8bits en EE
//ReadEE      lee de EE un dato de 8bits
//WriteEE16  escribe una dato de 16bits en EE
//ReadEE16   lee de EE un dato de 16bits
//WriteEE24  escribe una dato de 24bits en EE
//ReadEE24   lee de EE un dato de 24bits
//WriteEE32   escribe una dato de 32bits en EE
//ReadEE32    lee de EE un dato de 32bits
//WriteEEf      escribe una dato de 32bits en EE con el formato IEEE754
//ReadEEf      lee de EE un dato de 32bit con el formato IEE754

//--------------------------------------------------------------------------------------------------
//declaro una union para almacenar el dato que voy a leer y/o escribir en la EEprom
//despues se define dentro de la funcion ya que si no lo hubiera hecho de esta forma
//tendria que haber definido tantas uniones como funciones existiesen.
union   DATOS //datos enteros y flotantes
{
    float df; //dato flotante 32bits
    unsigned long d32; //dato long 32bits
    unsigned short long d24; //dato short long 24bits
    unsigned int d16; //dato entero 16bits
    unsigned char d8[4]; //dato byte 4vectores de 8 bits c/u
};
//decomentar lo que corresponda los numeros se refieren a la cantidad de memoria
//EE que tiene el dispositivo
//--------------------------------------------------------------------------------------------------
//#define EE128
//#define EE256
#define EE1024
/* FUNCTION PROTOTYPES */
#if defined (EE128) || defined (EE256) || defined (EE1024)

void BusyEE ( void );
unsigned char ReadEE( unsigned int badd );
void WriteEE( unsigned int badd, unsigned char bdat );

#endif

void WriteEE16(unsigned int dir,unsigned int n);
void WriteEE24(unsigned int dir,unsigned short long n);
void WriteEE32(unsigned int dir,unsigned long n);
void WriteEEf(unsigned int dir,float n);

unsigned int ReadEE16(unsigned int dir);
unsigned short long ReadEE24(unsigned int dir);
unsigned long ReadEE32(unsigned int dir);
float ReadEEf(unsigned int dir);

void EraseEE(int d, int h);
//=============================================================================
//WRITE AND READ EEPROM PIC16 Y PIC18
//Cuando usemos estas funciones debemos tener claro que tipo de dato vamos a
//guardar en la memoria EE, entonces si queremos guardar una variable de
//(8,16,24 ó 32)bits con o sin signo tendremos que utilizar la funcion
//correspondiente y tener en cuenta que cuando recuperemos el dato debemos
//tambien hacerlo con la funcion que corresponde
//las funciones son:
//WriteEE   --> escribe una dato de 8bits en EE
//ReadEE    --> lee de EE un dato de 8bits
//WriteEE16 --> escribe una dato de 16bits en EE
//ReadEE16  --> lee de EE un dato de 16bits
//WriteEE24 --> escribe una dato de 24bits en EE
//ReadEE24  --> lee de EE un dato de 24bits
//WriteEE32 --> escribe una dato de 32bits en EE
//ReadEE32  --> lee de EE un dato de 32bits
//WriteEEf  --> escribe una dato de 32bits en EE con el formato IEEE754
//ReadEEf   --> lee de EE un dato de 32bit con el formato IEE754
//=============================================================================
//decomentar lo que corresponda los numeros se refieren a la cantidad de
//memoria EE que tiene el dispositivo

//#define EE128 //*****
//#define EE256 //*****
#define EE1024 //*****
//=============================================================================   
//Enum que contiene los nombres de las direcciones de escritura y/o lectura
//en EE
typedef enum
{
    POSEE_APP1_FLAG = 0x0001,
    POSEE_APP2_FLAG = 0x0002,
    POSEE_APP3_FLAG = 0x0003,
    POSEE_APP4_FLAG = 0x0004,
    POSEE_APP5_FLAG = 0x0005,
    POSEE_APP6_FLAG = 0x0006,
    POSEE_APP7_FLAG = 0x0007,
    POSEE_APP8_FLAG = 0x0008,
    POSEE_APP9_FLAG = 0x0009,
    POSEE_APP10_FLAG = 0x000A,
};
//.....................................
//declaro una union para almacenar el dato que voy a leer y/o escribir en la
//EEprom.
typedef union
{ 
    float df; //dato flotante 32bits
    unsigned long d32; //dato long 32bits
    unsigned short long d24; //dato short long 24bits
    unsigned int d16; //dato entero 16bits
    unsigned char d8[4]; //dato byte 4vectores de 8 bits c/u
}EE_DATA;
EE_DATA eeData;
//=============================================================================
//PROTOTIPOS
#if defined (EE128)
/**
    @Function Name:    Write_EE
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint8_t dato a escribir
    @Description:      Ecribe dato de 1 byte en la memoria EE
*/
void Write_EE( uint16_t badd, uint8_t bdat );
//.....................................
#elif defined (EE256)
/**
    @Function Name:    Write_EE
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint8_t dato a escribir
    @Description:      Ecribe dato de 1 byte en la memoria EE
*/
void Write_EE( uint16_t badd, uint8_t bdat );
//.....................................
#elif defined (EE1024)
/**
    @Function Name:    Write_EE
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint8_t dato a escribir
    @Description:      Ecribe dato de 1 byte en la memoria EE
*/
void Write_EE( uint16_t badd, uint8_t bdat );
#endif
//.....................................
/**
    @Function Name:    WriteEE
    @Return Value:     None									
    @Parameters:       uint16_t posicion EE y uint8_t variable a escribir
    @Description:      Escribe un dato de 8bits en EEPROM y ocupa 1 posicion. 
                       Lee la posicion escrita y compara la lectura con el dato
                       que se desea guardar, si la comparacion es distinta
                       vuelve a grabar el dato hasta que la escritura sea
                       correcta.
*/
void  WriteEE(uint16_t pos, uint8_t var);
//.....................................
/**
    @Function Name:    WriteEE16
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint16_t variable a escribir
    @Description:      Escribe un dato de 16bits en EEPROM y ocupa dos 
                       posiciones consecutivas en formato Little Endian. Lee
                       la posicion escrita y compara la lectura con el dato que
                       se desea guardar, si la comparacion es distinta vuelve
                       a grabar el dato hasta que la escritura sea correcta.
*/
void  WriteEE16(uint16_t pos, uint16_t var);
//.....................................
/**
    @Function Name:    WriteEE24
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint24_t variable a escribir
    @Description:      Escribe un dato de 24bits en EEPROM y ocupa tres
                       posiciones consecutivas en formato Little Endian. Lee
                       la posicion escrita y compara la lectura con el dato que
                       se desea guardar, si la comparacion es distinta vuelve
                       a grabar el dato hasta que la escritura sea correcta.
 */
void  WriteEE24(uint16_t pos, uint24_t var);
//.....................................
/**
    @Function Name:    WriteEE32
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint32_t variable a escribir
    @Description:      Escribe un dato de 32bits en EEPROM y ocupa cuatro
                       posiciones consecutivas en formato Little Endian. Lee
                       la posicion escrita y compara la lectura con el dato que
                       se desea guardar, si la comparacion es distinta vuelve
                       a grabar el dato hasta que la escritura sea correcta.
 */
void  WriteEE32(uint16_t pos, uint32_t var);
//.....................................
/**
    @Function Name:    WriteEEf
    @Return Value:     None									
    @Parameters:       uint16_t direccion EE y uint32_t variable a escribir
    @Description:      Escribe un dato del tipo flotante (IEEE754) en EEPROM y
                       ocupa cuatro posiciones consecutivas en formato Little
                       Endian. Lee la posicion escrita y compara la lectura con
                       el dato que se desea guardar, si la comparacion es
                       distinta vuelve a grabar el dato hasta que la escritura
                       sea correcta.
 */
void  WriteEEf(uint16_t pos, float var);
//.....................................
/**
    @Function Name:    ReadEE
    @Return Value:     El contenido de  posicion de EE (8bits)								
    @Parameters:       uint16_t direccion EE
    @Description:      Lee EE en la posicion indicada.
 */
uint8_t ReadEE( uint16_t badd );
//.....................................
/**
    @Function Name:    ReadEE16
    @Return Value:     El contenido de 2 posiciones consecutivas de EE (16bits)								
    @Parameters:       uint16_t direccion EE
    @Description:      Lee dos posiciones consecutivas en memoria EE a partir
                       de la direccion indicada y retorna un dato de 16bits.
                       Tener en cuenta que los datos se recuperan de la forma
                       en la que fueron guardados(Little Endian).
 */
uint16_t ReadEE16(uint16_t dir);
//.....................................
/**
    @Function Name:    ReadEE24
    @Return Value:     El contenido de 3 posiciones consecutivas de EE (24bits)								
    @Parameters:       uint16_t direccion EE
    @Description:      Lee tres posiciones consecutivas en memoria EE a partir
                       de la direccion indicada y retorna un dato de 24bits.
                       Tener en cuenta que los datos se recuperan de la forma
                       en la que fueron guardados(Little Endian).
 */
uint24_t ReadEE24(uint16_t dir);
//.....................................
/**
    @Function Name:    ReadEE32
    @Return Value:     El contenido de 4 posiciones consecutivas de EE (32bits)								
    @Parameters:       uint16_t direccion EE
    @Description:      Lee cuatro posiciones consecutivas en memoria EE a partir
                       de la direccion indicada y retorna un dato de 32bits.
                       Tener en cuenta que los datos se recuperan de la forma
                       en la que fueron guardados(Little Endian).
 */
uint32_t ReadEE32(uint16_t dir);
//.....................................
/**
    @Function Name:    ReadEEf
    @Return Value:     El contenido de 4 posiciones consecutivas de EE (32bits)								
    @Parameters:       uint16_t direccion EE
    @Description:      Lee cuatro posiciones consecutivas en memoria EE a partir
                       de la direccion indicada y retorna un dato flotante de 
                       32bits (IEEE754). Tener en cuenta que los datos se 
                       recuperan de la forma en la que fueron guardados
                       (Little Endian).
 */
float ReadEEf(uint16_t dir);
//.....................................
/**
    @Function Name:    EraseEE
    @Return Value:     None								
    @Parameters:       uint16_t direccion de comienzo y direccion de final
    @Description:      Borra el contenido de la memoria EE desde una direccion
                       de comienzo hasta una direccion de final
                       @Note: si el valor de d es mayor que el de h entonces 
                       solo se borrara la primer direccion.
 */
//void EraseEE(uint16_t d, uint16_t h);
//=============================================================================
#ifdef	__cplusplus
}
#endif

#endif	/* EEP_H */

/**
 End of File
*/

