/*◄■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ eeMemory.c ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■►*/

// <editor-fold defaultstate="collapsed" desc="Title">
/*════════════════════════════════════════════════════════════════════════════*/
/*                        © John William Darsow                               */
/* Created on Monday, March 6, 2017                                           */
/* Current Version Date: (see File Date)                                      */
/* Internal EEPROM routines                                                   */
/* Based on:  MPLAB(c) Code Configurator - 4.15  For PIC18F26K80              */
/*                                                                            */
/*  Compiled using:     MPLAB X IDE v3.45                                     */
/*                      XC8 v1.38                                             */
/*                                                                            */
/* Modifications,UpDates and ToDo:                                            */
/*                                                                            */
/*════════════════════════════════════════════════════════════════════════════*/
// </editor-fold>

/*═════════════════════════════════ INCLUDEs ═════════════════════════════════*/
#include "eeMemory.h"

/*═══════════════════════════ FUNCTION  DEFINITIONS ══════════════════════════*/
// <editor-fold defaultstate="collapsed" desc="Functions Definitions">

/*──────────────────────── Internal EEPROM Write Byte ────────────────────────*/
void eeprom_wr_byte(uint16_t bAdd, uint8_t bData)
{
    uint8_t GIEBitValue = INTCONbits.GIE;

    EEADRH = ((bAdd >> 8) & 0x03);
    EEADR = (bAdd & 0xFF);
    EEDATA = bData;
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EECON1bits.WREN = 1;
    INTCONbits.GIE = 0;     // Disable interrupts
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;
    // Wait for write to complete
    while (EECON1bits.WR)
    {
    }

    EECON1bits.WREN = 0;
    INTCONbits.GIE = GIEBitValue;   // restore interrupt enable
}

/*──────────────────────── Internal EEPROM Read Byte ─────────────────────────*/
Byte eeprom_rd_byte(uint16_t bAdd)
{
    EEADRH = ((bAdd >> 8) & 0x03);
    EEADR = (bAdd & 0xFF);
    EECON1bits.CFGS = 0;
    EECON1bits.EEPGD = 0;
    EECON1bits.RD = 1;
    NOP();  // NOPs may be required for latency at high frequencies
    NOP();

    return (EEDATA);
}

/*─────────────────────────── Write Bytes to EEPROM ──────────────────────────*/
void eeprom_wr_page(uInt16 addr,Byte *data, uInt8 length)
{
uInt8 i = 0;

   for ( i = 0; i < length ; i++)
   {
      eeprom_wr_byte(addr, data[i]);         // save the string to EEPROM
      addr++;
   }
}

/*──────────────────────── Internal EEPROM Read Bytes ────────────────────────*/
Byte *  eeprom_rd_page(uInt16 addr,Byte *data, uInt8 length)
{
uInt8 i = 0;

for ( i = 0; i < length ; i++)
      data[i] = eeprom_rd_byte(addr + i);         // save the string to EEPROM
return data;
}

/*────────────────────────── Put String in EEPROM ────────────────────────────*/
void putEEPROMstr(uInt16 addr, const Char * str)
{
   for (uInt16 i = 0; i <  strlen(str); i++)
   {
      eeprom_wr_byte(addr, str[i]);         // save the string to EEPROM
      addr++;
   }
   eeprom_wr_byte(addr, NULL);              // Terminate string
}

/*───────────────────────── Get String from EEPROM ───────────────────────────*/
Byte * getEEPROMstr(uInt16 addr, Char * str)
{
uInt16 i = -1;

   do
   {
      i++;
      str[i] = eeprom_rd_byte(addr + i);
   }while (str[i] != NULL);
   return str;
}

// </editor-fold>// Functions Definitions
