This is a library for the MAX17055 Li+ Battery Fuel Gauge.

Dependents:   Low_Power_Long_Distance_IR_Vision_Robot MAX17055_EZconfig MAX17055_EZconfig_Sample Low_Power_Long_Distance_IR_Vision_Robot

Fork of max17055 by Maxim Integrated

Revision:
11:bdbd3104995b
Parent:
9:f29d5e49b190
Child:
12:519a18fc3b28
--- a/max17055.cpp	Tue Feb 06 21:14:08 2018 +0000
+++ b/max17055.cpp	Tue Feb 27 15:53:04 2018 +0000
@@ -3,12 +3,12 @@
 *
 * @author Felipe Neira - Maxim Integrated - TTS
 *
-* @version 1.2
+* @version 1.4
 *
-* Started: 9JAN18
+* Started: 6FEB18
 *
 * Updated: 
-* New functions improved for continious display. Change copyright notice for 2018.
+* Modifications to reflect applicable functions and .h file association
 * 
 * 
 *
@@ -48,15 +48,15 @@
 #include "mbed.h"
 #include "max17055.h"
 
-#define DRV_NAME "max17055"
+// #define DRV_NAME "max17055" ///not used
 
-/* CONFIG register bits */
-#define MAX17055_CONFIG_ALRT_EN         (1 << 2)
-#define MAX17055_CONFIG2_LDMDL          (1 << 5)
+// /* CONFIG register bits */
+// #define MAX17055_CONFIG_ALfRT_EN        (1 << 2) ///not used
+// #define MAX17055_CONFIG2_LDMDL          (1 << 5) ///not used
 
-/* STATUS register bits */
-#define MAX17055_STATUS_BST             (1 << 3)
-#define MAX17055_STATUS_POR             (1 << 1)
+// /* STATUS register bits */
+// #define MAX17055_STATUS_BST             (1 << 3) ///not used
+// #define MAX17055_STATUS_POR             (1 << 1)
 
 /* POR Mask */
 #define MAX17055_POR_MASK               (0xFFFD)
@@ -64,55 +64,65 @@
 /* MODELCFG register bits */
 #define MAX17055_MODELCFG_REFRESH       (1 << 15)
 
-/* TALRTTH register bits */
-#define MIN_TEMP_ALERT                  0
-#define MAX_TEMP_ALERT                  8
+// /* TALRTTH register bits */
+// #define MIN_TEMP_ALERT                  0 ///not used
+// #define MAX_TEMP_ALERT                  8 ///not used
 
 /* FSTAT register bits */
 #define MAX17055_FSTAT_DNR              (1)
 
-/* STATUS interrupt status bits */
-#define MAX17055_STATUS_ALRT_CLR_MASK   (0x88BB)
-#define MAX17055_STATUS_SOC_MAX_ALRT    (1 << 14)
-#define MAX17055_STATUS_TEMP_MAX_ALRT   (1 << 13)
-#define MAX17055_STATUS_VOLT_MAX_ALRT   (1 << 12)
-#define MAX17055_STATUS_SOC_MIN_ALRT    (1 << 10)
-#define MAX17055_STATUS_TEMP_MIN_ALRT   (1 << 9)
-#define MAX17055_STATUS_VOLT_MIN_ALRT   (1 << 8)
-#define MAX17055_STATUS_CURR_MAX_ALRT   (1 << 6)
-#define MAX17055_STATUS_CURR_MIN_ALRT   (1 << 2)
+// /* STATUS interrupt status bits */
+// #define MAX17055_STATUS_ALRT_CLR_MASK   (0x88BB)
+// #define MAX17055_STATUS_SOC_MAX_ALRT    (1 << 14)
+// #define MAX17055_STATUS_TEMP_MAX_ALRT   (1 << 13)
+// #define MAX17055_STATUS_VOLT_MAX_ALRT   (1 << 12)
+// #define MAX17055_STATUS_SOC_MIN_ALRT    (1 << 10)
+// #define MAX17055_STATUS_TEMP_MIN_ALRT   (1 << 9)
+// #define MAX17055_STATUS_VOLT_MIN_ALRT   (1 << 8)
+// #define MAX17055_STATUS_CURR_MAX_ALRT   (1 << 6)
+// #define MAX17055_STATUS_CURR_MIN_ALRT   (1 << 2)
 
-#define MAX17055_VMAX_TOLERANCE     50 /* 50 mV */
+// #define MAX17055_VMAX_TOLERANCE     50 /* 50 mV */
+
+/* LIBRARY FUNCTION SUCCESS*/
+#define F_SUCCESS_0  0
+
+/* LIBRARY FUNCTION ERROR CODES */  
+#define F_ERROR_1 -1    //-1 if read/write errors exist         
+#define F_ERROR_2 -2    //-2 if device is not present
+#define F_ERROR_3 -3    //-3 if function error
+#define F_ERROR_4 -4    //-4 if other error
+#define F_ERROR_5 -5    //-5 if POR not detected
 
 
-///////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @brief       max17055 Constructor
+ * @details     max17055 Constructor with battery and i2c as parameters
+ */
 MAX17055::MAX17055(I2C &i2c):
     m_i2cBus(i2c)
 {
     //empty block
 }
 
-///////////////////////////////////////////////////////////////////////////////
+/**
+ * @brief       Fuel Gauge Destructor
+ */
 MAX17055::~MAX17055()
 {
     //empty block
 }
 
-
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Write a value to a MAX17055 register
-* \par          Details
-*               This function writes a value to a MAX17055 register
-*
-* \param[in]    reg_addr - register address
-* \param[in]    reg_data - register data
-*
-* \retval       1 on success
-*/
-
+ * @brief      Writes a register.
+ *
+ * @param[in]  reg_addr  The register address
+ * @param[in]  reg_data  The register data
+ *
+ * @retval     0 on success
+ * @retval     non-0 for errors
+ */
 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
 {
 
@@ -125,25 +135,21 @@
 
     char addr_plus_data[3] = {reg_addr, dataLSB, dataMSB};
 
-    if ( m_i2cBus.write(I2C_W_ADRS, addr_plus_data, 3, false) == 0)
-        return 1;
+    if ( m_i2cBus.write(I2C_W_ADRS, addr_plus_data, 3, false) == F_SUCCESS_0)
+        return F_SUCCESS_0;
     else
-        return 0;
+        return F_ERROR_1;
+}
 
-}
-///////////////////////////////////////////////////////////////////////////////
 /**
-* \brief        Read a MAX17055 register
-* \par          Details
-*               This function reads a MAX17055 register
-*
-* \param[in]    reg_addr   - register address
-* \param[out]   &value   - pointer that stores the register data
-*
-* \retval       1 on success
-*/
-
-
+ * @brief      Reads from MAX17055 register.
+ *
+ * @param[in]  reg_addr  The register address
+ * @param      value     The value
+ *
+ * @retval     0 on success
+ * @retval     non-0 for errors
+ */
 int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
 {
     int32_t result;
@@ -153,32 +159,28 @@
     char read_data[2];
 
     result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
-    if(result == 0) {
+    if(result == F_SUCCESS_0) {
         result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
-        if (result == 0) {
+        if (result == F_SUCCESS_0) {
             value = ( ((read_data[1] & mask) << 8) + (read_data[0]));
-            result = 1;
+            result = F_SUCCESS_0;
         }
     }
-
     return result;
-
 }
 
-///////////////////////////////////////////////////////////////////////////////
 /**
-* \brief        Write and Verify a MAX17055 register
-* \par          Details
-*               This function wites and verifies if the writing process was successful
-*
-* \param[in]    reg_addr     - register address
-* \param[out]   reg_data     - the variable that contains the data to write
-*                                to the register address
-*
-* \retval       1 on success
-*/
-
-
+ * @brief        Write and Verify a MAX17055 register
+ * @par          Details
+ *               This function wites and verifies if the writing process was successful
+ *               
+ * @param[in]    reg_addr     - register address
+ * @param[out]   reg_data     - the variable that contains the data to write
+ *                               to the register address
+ *
+ * @retval       0 on success
+ * @retval      non-0 for errors
+ */
 int MAX17055::write_and_verify_reg(Registers_e reg_addr, uint16_t reg_data)
 {
     int retries = 8;
@@ -189,38 +191,33 @@
 
     do {
         statusWrite = writeReg(reg_addr, reg_data);
-        if (statusWrite != 1)
-            ret = -1;
+        if (statusWrite != F_SUCCESS_0)
+            ret = F_ERROR_1;
         wait_ms(3);
         statusRead = readReg(reg_addr, read_data);
-        if  (statusRead != 1)
-            ret = -2;
+        if  (statusRead != F_SUCCESS_0)
+            ret = F_ERROR_1;
         if (read_data != reg_data) {
-            ret = -3;
+            ret = F_ERROR_1;
             retries--;
         }
     } while (retries && read_data != reg_data);
 
-    if (ret<0)
+    if (ret!=F_SUCCESS_0)
         return ret;
     else
-        return 1;
+        return F_SUCCESS_0;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Initialise Function for MAX17055
-* \par          Details
-*               This function intitializes the MAX17055
-*
-* \retval       1 on success
-*               0 if device is not present
-*              -1 if errors exist
-*              -2 if POR is not set
-*/
-
-
+ * @brief       Initialization Function for MAX17055.
+ * @par         Details
+ *              This function intitializes the MAX17055 for the implementation of the EZconfig model.\n
+ *              The libraty needs to be customized for the implementation of customize model.\n  
+ *              
+ * @retval      0 on success 
+ * @retval      non-0 for errors
+ */
 int MAX17055::init(platform_data des_data)
 {
 
@@ -230,19 +227,19 @@
 
 
     status = readReg(VERSION_REG, read_data);
-    if (status == 0)
-        return status;  //Device is not present in the i2c Bus
+    if (status != F_SUCCESS_0)
+        return status;
 
     /* Step 0: Check for POR */
     /* Skip load model if POR bit is cleared */
 
-    if (check_POR_func() == -1)
-        return -2;  //POR is not set. Skip Initialization.
+    if (check_POR_func() == F_ERROR_5)
+        return F_ERROR_5;  //POR not detected. Skip Initialization.
 
     /* Step 1: Check if FStat.DNR == 0 */
     // Do not continue until FSTAT.DNR == 0
     ret = poll_flag_clear(FSTAT_REG, MAX17055_FSTAT_DNR, time_out);
-    if (ret < 0) {
+    if (ret < F_SUCCESS_0) {
         //printf("Unsuccessful init: Data Not Ready!\n");
         return ret;
     }
@@ -260,7 +257,7 @@
 
             /* Poll ModelCFG.ModelRefresh bit for clear */
             ret = poll_flag_clear(MODELCFG_REG, MAX17055_MODELCFG_REFRESH, time_out);
-            if(ret < 0) {
+            if(ret < F_SUCCESS_0) {
                 //dev_err(priv->dev, "Option1 model refresh not completed!\n");
                 return ret;
             }
@@ -277,21 +274,21 @@
 
     /* Clear Status.POR */
     ret = clear_POR_bit();
-    if (ret == -1)
-        return ret;    
-    return 1;
+    if (ret < F_SUCCESS_0)
+        return ret; //See errors   
+    return F_SUCCESS_0;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Check POR function
-* \par          Details
-*               This function check is there was a power on reset event for the MAX17055
-*
-* \retval       1 for no POR detected
-*              -1 for POR detected
-*/
+ * @brief      Check POR function
+ * @par Details
+ *     This function check is there was a power on reset event for the
+ *     MAX17055
+ *
+ * @retval    0 on success (POR detected)
+ * @retval    non-0 for errors (POR not detected)
+ * 
+ */
 int MAX17055::check_POR_func()
 {
     uint16_t read_data;
@@ -299,21 +296,19 @@
     readReg(STATUS_REG, read_data);
 
     if (!(read_data & MAX17055_STATUS_POR ) )
-        return -1;  //POR is not set.
+        return F_ERROR_5;  //POR not detected.
     else 
-        return 1;
+        return F_SUCCESS_0;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        clear POR bit function
-* \par          Details
-*               This function clear the idicating bit for POR - MAX17055
-*
-* \retval       1 for Success
-*              -1 for errors
-*/
+ * @brief        clear POR bit function
+ * @par          Details
+ *               This function clear the idicating bit for POR - MAX17055
+ *
+ * @retval       0 for Success
+ * @retval      non-0 for errors
+ */
 int MAX17055::clear_POR_bit()
 {
     int status, ret;
@@ -321,103 +316,89 @@
 
 
     status = readReg(STATUS_REG, read_data);
-    if (status != 1)
-        return -1;  //Device is not present in the i2c Bus
+    if (status != F_SUCCESS_0)
+        return F_ERROR_2;  //Device is not present in the i2c Bus
     status = write_and_verify_reg(STATUS_REG, (read_data & MAX17055_POR_MASK));
-    if (status != 1)
-        return -1;
+    if (status != F_SUCCESS_0)
+        return F_ERROR_1; //read or write error
     else 
-        return 1;
-
-
+        return F_SUCCESS_0;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Poll Flag clear
-* \par          Details
-*               This function clears status flags for the MAX17055
-*
-* \param[in]    reg_addr - register address
-* \param[in]    mask - register address
-* \param[in]    timeout - register data
-*
-* \retval       1 on success
-*              -1 on Failure
-*/
-
+ * @brief      Poll Flag clear Function. 
+ * @par Details
+ *     This function clears status flags for the MAX17055
+ *
+ * @param[in]  reg_addr  - register address
+ * @param[in]  mask      - register address
+ * @param[in]  timeout   - register data
+ *
+ * @retval     0 on success 
+ * @retval    non-0 negative for errors
+ */
 int MAX17055::poll_flag_clear (Registers_e reg_addr, int mask, int timeout)
 {
     uint16_t data;
     int ret;
 
-
     do {
         wait_ms(1);
         ret = readReg(reg_addr, data);
-        if(ret < 0)
-            return ret;
+        if(ret < F_SUCCESS_0)
+            return F_ERROR_1;
 
         if(!(data & mask))
-            return 1;
+            return F_SUCCESS_0;
 
         timeout -= 1;
     } while(timeout > 0);
 
-    return -1;
+    return F_ERROR_4;
 }
 
-
-
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get Internal Temperature Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal
-*               of the MAX17055
-*
-*
-* \retval      temperature value
-*              -1 if errors exist
-*/
-
-
+ * @brief        Get Temperature Function from the MAX17055 TEMP register.
+ * @par          Details
+ *               This function sends a request to access the TEMP register
+ *               of the MAX17055, which reflects the temperature measured for the fuel gauge. 
+ *               The temperature values will reflect the Config Register (0x1D) selections for Tsel bit (D15).
+ *               For this library the setting are for die temperature.
+ *               The MAX32620FTHR thermistor bias pin is not connected. The biasing of the thermistor is
+ *               done by the MAX77650. See MAX77650 library for how to enable the thermistor biasing.  
+ *
+ *   
+ * @retval      temp - Temperature value from TEMP register in &deg;C
+ * @retval      non-0 negative values check for errors
+ */
 int MAX17055::get_temperature()
 {
 
     int ret;
-    uint16_t data;
+    uint16_t temp;
 
-    ret = readReg(TEMP_REG, data);
-    if (ret < 0)
+    ret = readReg(TEMP_REG, temp);
+    if (ret < F_SUCCESS_0)
         return ret;
 
     /* The value is signed. */
-    if (data & 0x8000)
-        data |= 0xFFFF0000;
+    if (temp & 0x8000)
+        temp |= 0xFFFF0000;
 
     /* The value is converted into centigrade scale */
     /* Units of LSB = 1 / 256 degree Celsius */
-    data >>= 8;
+    temp >>= 8;
 
-    return data ;
+    return temp;
 }
 
-
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Forced Exit Hibernate Mode Function for MAX17055
-* \par          Details
-*               This function executes a force exit from hibernate mode.
-*
-* \retval       returns HibCFG original value before forced Exit Hybernate mode
-*
-*/
-
-
+ * @brief        Forced Exit Hibernate Mode Function for MAX17055
+ * @par          Details
+ *               This function executes a force exit from hibernate mode.
+ *
+ * @retval       HibCFG original value before forced Exit Hybernate mode *
+ */
 uint16_t MAX17055::forcedExitHyberMode()
 {
     uint16_t hibcfg;
@@ -438,21 +419,17 @@
     return hibcfg;
 }
 
-
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        EZ COnfing Init function
-* \par          Details
-*               This function implements the steps for the EZ confing m5 FuelGauge
-*
-* \retval       1 on success
-*
-*/
-
-
+ * @brief        EZ Confing Initialization function
+ * @par          Details
+ *               This function implements the steps for the EZ confing m5 FuelGauge
+ * @param[in]    des_data - Plataform_data struct with information about the deisgn.
+ * @retval       0 on success
+ * @retval       non-zero for errors
+ */
 uint16_t MAX17055::EZconfig_init(platform_data des_data)
 {
+    ///EZ config values
     const int charger_th = 4275;
     const int chg_V_high = 51200;
     const int chg_V_low = 44138;
@@ -460,161 +437,166 @@
     const int param_EZ_FG2 = 0x8000;
     uint16_t dpacc, ret;
 
-
     /* Step 2.1: Option 1 EZ Config */
     ret = writeReg(DESIGNCAP_REG, des_data.designcap);
-    ret = writeReg(DQACC_REG, des_data.designcap >> 5);  //DesignCap divide by 32
+    ret = writeReg(DQACC_REG, des_data.designcap >> 5);  ///DesignCap divide by 32
     ret = writeReg(ICHGTERM_REG, des_data.ichgterm);
     ret = writeReg(VEMPTY_REG, des_data.vempty);
 
     if (des_data.vcharge > charger_th) {
         dpacc = (des_data.designcap >> 5) * chg_V_high / des_data.designcap;
         ret = writeReg(DPACC_REG, dpacc);
-        ret = writeReg(MODELCFG_REG, param_EZ_FG1); //Why 0x8400??
+        ret = writeReg(MODELCFG_REG, param_EZ_FG1); ///Why 0x8400??
     } else {
         dpacc = (des_data.designcap >> 5) * chg_V_low / des_data.designcap;
         ret = writeReg(DPACC_REG, dpacc);
         ret = writeReg(MODELCFG_REG, param_EZ_FG2);
     }
-
-
     return ret;
-
 }
 
-
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get State Of Charge(SOC) Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal
-*               of the MAX17055
-*
-* \param[in]    reg_addr     - register address
-* \param[out]   reg_data     - SOC data from the REPSOC_REG register
-* \retval       1 on success
-*
-*              -1 if errors exist
-*/
-
-
+ * @brief        Get reported State Of Charge(SOC) Function from MAX17055 Fuel Gauge.
+ * @par          Details
+ *               This function sends a request to access the RepSOC register
+ *               of the MAX17055. RepSOC is the reported state-of-charge percentage output of the fuel gauge. 
+ *
+ * @retval      soc_data - Reported SOC data from the RepSOC register in % value.
+ * @retval      non-0 negative values check for errors 
+ */
 int MAX17055::get_SOC()
 {
 
     int ret;
-    uint16_t data;
+    uint16_t soc_data;
 
-    ret = readReg(REPSOC_REG, data);
-    if (ret < 0)
+    ret = readReg(REPSOC_REG, soc_data);
+    if (ret < F_SUCCESS_0)
         return ret;
 
-    data = data >> 8; /* RepSOC LSB: 1/256 % */
+    soc_data = soc_data >> 8; /* RepSOC LSB: 1/256 % */
 
-    return data;
+    return soc_data;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get Average State Of Charge(SOC) Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal
-*               of the MAX17055
-*
-* \param[in]    reg_addr     - register address
-* \param[out]   
-* \retval       data     - avSOC data from the AVSOC_REG register
-*              
-*/
-
-
+ * @brief        Get Average State Of Charge(SOC) Function from MAX17055 Fuel Gauge.
+ * @par          Details
+ *               This function sends a request to access the avSOC register of the MAX17055.
+ *               The AvSOC registers hold the calculated available capacity and percentage of the
+ *               battery based on all inputs from the ModelGauge m5 algorithm including empty 
+ *               compensation. These registers provide unfiltered results. Jumps in the reported 
+ *               values can be caused by abrupt changes in load current or temperature.
+ *
+ * @retval       avSOC_data - Average SOC data from the AVSOC register in % value. 
+ * @retval       non-0 negative values check for errors      
+ */
 int MAX17055::get_avSOC()
 {
 
     int ret;
-    uint16_t data;
-
-    ret = readReg(AVSOC_REG, data);
-    if (ret < 0)
-        return ret;
+    uint16_t avSOC_data;
 
-    data = data >> 8; /* avSOC LSB: 1/256 % */
+    ret = readReg(AVSOC_REG, avSOC_data);
+    if (ret < F_SUCCESS_0)
+        return ret; //Check errors if data is not correct
 
-    return data;
+    avSOC_data = avSOC_data >> 8; /* avSOC LSB: 1/256 % */
+
+    return avSOC_data;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get State Of Charge(SOC) Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal
-*               of the MAX17055
-*
-* \param[in]    reg_addr     - register address
-* \param[out]   reg_data     - SOC data from the REPSOC_REG register
-* \retval       1 on success
-*
-*              -1 if errors exist
-*/
+ * @brief        Get mix State Of Charge(SOC) Function for MAX17055 Fuel Gauge.
+ * @par          Details
+ *               This function sends a request to access mixSOC register
+ *               of the MAX17055. The MixSOC registers holds the calculated
+ *               remaining capacity and percentage of the cell before any empty compensation
+ *               adjustments are performed.
+ * 
+ * @retval       mixSOC_data - Mixed SOC register values from the mixSOC register in % value. 
+ * @retval       non-0 for errors
+ */
+int MAX17055::get_mixSOC()
+{
+    int ret;
+    uint16_t mixSOC_data;
+
+    ret = readReg(MIXSOC_REG, mixSOC_data);
+    if (ret < F_SUCCESS_0)
+        return ret;
 
+    mixSOC_data = mixSOC_data >> 8; /* RepSOC LSB: 1/256 % */
 
-int MAX17055::get_mixSOC()
+    return mixSOC_data;
+}
+
+/**
+ * @brief       Get the Time to Empty(TTE) Function form MAX17055 Fuel Gauge.
+ * @par         Details
+ *              This function sends a request to access the TTE register
+ *              of the MAX17055
+ *              The TTE register holds the estimated time to empty for the 
+ *              application under present temperature and load conditions. The TTE value is 
+ *              determined by relating AvCap with AvgCurrent. The corresponding AvgCurrent 
+ *              filtering gives a delay in TTE, but provides more stable results.
+ *
+ * @retval      tte_data - Time to Empty data from the TTE register in seconds.
+ * @retval      non-0 negative values check for errors
+ */
+int MAX17055::get_TTE()
 {
 
     int ret;
-    uint16_t data;
-
-    ret = readReg(MIXSOC_REG, data);
-    if (ret < 0)
-        return ret;
+    uint16_t tte_data;
 
-    data = data >> 8; /* RepSOC LSB: 1/256 % */
+    ret = readReg(TTE_REG, tte_data);
+    if (ret < F_SUCCESS_0)
+        return ret;
+    else
+        tte_data = (tte_data * 45) >> 3; /* TTE LSB: 5.625 sec */
 
-    return data;
+    return tte_data;
 }
-///////////////////////////////////////////////////////////////////////////////
 
 /**
-* \brief        Get the remaining Time to Empty(TTE) Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal register
-*               of the MAX17055
-*
-* \retval      tte_data  - Time to Empty data from the TTE_REG register
-*
-*              -1 if errors exist
-*/
-
+ * @brief       Get the at Time to Empty(atTTE) value Function for MAX17055 Fuel Gauge.
+ * @par         Details
+ *              This function sends a request to access the internal register
+ *              of the MAX17055
+ *
+ * @retval      atTTE_data - Time to Empty data from the atTTE register in seconds. 
+ * @retval      non-0 negative values check for errors
+ */
 int MAX17055::get_atTTE()
 {
 
     int ret;
-    uint16_t data;
+    uint16_t atTTE_data;
 
-    ret = readReg(ATTTE_REG, data);
-    if (ret < 0)
-        return ret;
+    ret = readReg(ATTTE_REG, atTTE_data);
+    if (ret < F_SUCCESS_0)
+        return ret; //Check for errors
     else
-        data = (data * 45) >> 3; /* TTE LSB: 5.625 sec */
+       atTTE_data = (atTTE_data * 45) >> 3; /* TTE LSB: 5.625 sec */
 
-    return data;
+    return atTTE_data;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get the remaining Time to Full(TTF) Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal register
-*               of the MAX17055
-*
-* \retval      ttf_data  - Time to Empty data from the TTF_REG register
-*
-*              -1 if errors exist
-*/
-
+ * @brief      Get the Time to Full(TTE) values Function for MAX17055 Fuel Gauge.
+ * @par        Details
+ *             This function sends a request to access the internal register of the MAX17055
+ *             The TTF register holds the estimated time to full for the application
+ *             under present conditions. The TTF value is determined by learning the
+ *             constant current and constant voltage portions of the charge cycle based
+ *             on experience of prior charge cycles. Time to full is then estimate 
+ *             by comparing present charge current to the charge termination current. 
+ *             Operation of the TTF register assumes all charge profiles are consistent in the application.
+ *
+ * @retval     ttf_data - Time to Full data from the TTF register in seconds. 
+ * @retval     non-0 negative values check for errors
+ */
 int MAX17055::get_TTF()
 {
 
@@ -622,7 +604,7 @@
     uint16_t ttf_data;
 
     ret = readReg(TTF_REG, ttf_data);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
         ttf_data = (ttf_data * 45) >> 3; /* TTF LSB: 5.625 sec */
@@ -630,20 +612,15 @@
     return ttf_data;
 }
 
-////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get voltage of the cell Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal register
-*               of the MAX17055 to read the voltage of the cell
-*
-* \retval      vcell_data  - vcell data from the VCELL_REG register
-*
-*              -1 if errors exist
-*/
-
-
+ * @brief       Get voltage of the cell Function for MAX17055 Fuel Gauge.
+ * @par         Details
+ *              This function sends a request to access the VCell Register
+ *              of the MAX17055 to read the measured voltage from the cell. 
+ *              
+ * @retval      vcell_data  - vcell data from the VCELL_REG register in uVolts.
+ * @retval      non-0 negative values check for errors
+ */
 int MAX17055::get_Vcell()
 {
 
@@ -651,114 +628,91 @@
     uint16_t vcell_data;
 
     ret = readReg(VCELL_REG, vcell_data);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
-        //printf("Vcell Reg= %d \r\n",vcell_data);
         ret = lsb_to_uvolts(vcell_data);
-    //printf("Vcell Conv= %d \r\n",ret);
     return ret;
-
 }
 
-
-////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get current Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal register
-*               of the MAX17055 to read the current register.
-*
-* \retval      curr_data  - vcell data from the VCELL_REG register
-*
-*              -1 if errors exist
-*/
-
-
+ * @brief       Get current Function for MAX17055 Fuel Gauge.
+ * @par         Details
+ *              This function sends a request to access the CURRENT register
+ *              of the MAX17055 to read the current redings. 
+ *
+ * @param[in]   des_data - Plataform_data struct with information about the deisgn.
+ * 
+ * @retval      curr_data  - current data from the CURRENT register in uAmps. 
+ * @retval      non-0 negative values check for errors.
+ */
 int MAX17055::get_Current( platform_data des_data )
 {
 
     int ret,design_rsense;
-    uint16_t data;
+    uint16_t curr_data;
 
-    ret = readReg(CURRENT_REG, data);
-    if (ret < 0)
+    ret = readReg(CURRENT_REG, curr_data);
+    if (ret < F_SUCCESS_0)
         return ret;
     else
     design_rsense = des_data.rsense;
-    ret = raw_current_to_uamps((uint32_t)data, design_rsense);
+    ret = raw_current_to_uamps((uint32_t)curr_data, design_rsense);
     return ret;
-
 }
 
-
-////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Get Average Current Function for MAX17055
-* \par          Details
-*               This function sends a request to access the internal register
-*               of the MAX17055 to read the average current register.
-*
-* \retval      curr_data  - vcell data from the AVGCURRENT_REG register
-*
-*              -1 if errors exist
-*/
-
-
+ * @brief       Get average current Function for MAX17055 Fuel Gauge.
+ * @par         Details
+ *              This function sends a request to access the aveCURRENT register
+ *              of the MAX17055 to read the average current redings. 
+ *
+ * @param[in]   des_data - Plataform_data struct with information about the deisgn.
+ * 
+ * @retval      aveCurr_data - current data from the AVGCURRENT register in uAmps. 
+ * @retval      non-0 negative values check for errors.
+ */
 int MAX17055::get_AvgCurrent( platform_data des_data )
 {
-
     int ret, design_rsense;
     uint16_t data;
     uint32_t aveCurr_data;
 
     ret = readReg(AVGCURRENT_REG, data);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
     aveCurr_data = data;
     design_rsense = des_data.rsense;
     aveCurr_data = raw_current_to_uamps(aveCurr_data, design_rsense);
     return aveCurr_data;
-
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        lsb_to_uvolts Converssion Function
-* \par          Details
-*               This function takes the lsb value of the register and convert it
-*               to uvolts
-*
-* \param[in]   lsb     - value of register lsb
-* \retval      lsb  - converted lsb to uvolts
-*
-*/
-
+ * @brief        lsb_to_uvolts Converssion Function 
+ * @par          Details
+ *               This function takes the lsb value of the register and convert it
+ *               to uvolts
+ *
+ * @param[in]   lsb - value of register lsb
+ * @retval      conv_2_uvolts - value converted lsb to uvolts        
+ */
 int MAX17055:: lsb_to_uvolts(uint16_t lsb)
 {
-    int store;
-    store = (lsb * 625) / 8; /* 78.125uV per bit */
-    return store;
+    int conv_2_uvolts;
+    conv_2_uvolts = (lsb * 625) / 8; /* 78.125uV per bit */
+    return conv_2_uvolts;
 }
 
-
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        raw_current_to_uamp Converssion Function
-* \par          Details
-*               This function takes the raw current value of the register and
-*               converts it to uamps
-*
-* \param[in]   curr - raw current value of register
-* \retval      res  - converted raw current to uamps - Signed 2's complement
-*
-*/
-
+ * @brief        raw_current_to_uamp Converssion Function 
+ * @par          Details
+ *               This function takes the raw current value of the register and 
+ *               converts it to uamps
+ *
+ * @param[in]   curr - raw current value of register 
+ * @retval      res  - converted raw current to uamps (Signed 2's complement)         
+ */
 int MAX17055::raw_current_to_uamps(uint32_t curr, int rsense_value)
 {
     int res = curr;
@@ -766,94 +720,95 @@
     if (res & 0x8000) {
         res |= 0xFFFF0000;
     } else {
-        res *= 1562500 /(rsense_value * 1000); //Change to interact with the rsense of customer
+        res *= 1562500 /(rsense_value * 1000); //Change to interact with the rsense implementen in the design
     }
     return res;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Save Learned Parameters Function
-* \par          Details
-*               It is recommended to save the learned capacity parameters every
-*               time bit 2 of the Cycles register toggles
-*               (so that it is saved every 64% change in the battery) 
-*               so that if power is lost the values can easily be restored.
-*
-* \retval      ret int -1 if fail
-*
-*/
-
+ * @brief        Save Learned Parameters Function for battery Fuel Gauge model.  
+ * @par          Details
+ *               It is recommended to save the learned capacity parameters every
+ *               time bit 2 of the Cycles register toggles
+ *               (so that it is saved every 64% change in the battery) 
+ *               so that if power is lost the values can easily be restored.
+ *
+ * @param[in]   FG_params Fuel Gauge Parameters based on design details. 
+ * 
+ * @retval      0 for success
+ * @retval      non-0 negative for errors
+ */
 int MAX17055::save_Params(saved_FG_params_t FG_params)
 {
-    int ret;
+    int ret, value;
     uint16_t data[5];
+    ///STEP 1. Checks if the cycel register bit 2 has changed.
+    ret = readReg(CYCLES_REG, data[3]);
+    if (ret < F_SUCCESS_0)
+        return ret;
+    else {
+        value = data[3];
+    }
+
+    ///STEP 2.Save the capacity parametes for the specific battery.
     ret = readReg(RCOMP0_REG, data[0]);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
         FG_params.rcomp0 = data[0];
 
     ret = readReg(TEMPCO_REG, data[1]);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
         FG_params.temp_co = data[1];
 
     ret = readReg(FULLCAPREP_REG, data[2]);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
         FG_params.full_cap_rep = data[2];
 
-    ret = readReg(CYCLES_REG, data[3]);
-    if (ret < 0)
-        return ret;
-    else
-        FG_params.cycles = data[3];
+    FG_params.cycles = data[3];
 
     ret = readReg(FULLCAPNOM_REG, data[4]);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     else
         FG_params.full_cap_nom = data[4];
     return ret;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
 /**
-* \brief        Resotore Parameters Function
-* \par          Details
-*               If power is lost, then the capacity information 
-*               can be easily restored with this function
-*
-* \param[in]   struct saved_FG_params_t 
-* \retval      void
-*
-*/
-
+ * @brief        Resotore Parameters Function for battery Fuel Gauge model.
+ * @par          Details
+ *               If power is lost, then the capacity information 
+ *               can be easily restored with this function. 
+ *
+ * @param[in]   FG_params Struct for Fuel Gauge Parameters 
+ * @retval      0 for success
+ * @retval      non-0 negative for errors
+ */
 int MAX17055::restore_Params(saved_FG_params_t FG_params)
 {
     int ret;
     uint16_t temp_data, fullcapnom_data, mixCap_calc, dQacc_calc;
     uint16_t dPacc_value = 0x0C80;//Why this vcalue?
 
-    //Restoring capacity parameters 
+    ///STEP 1. Restoring capacity parameters 
     write_and_verify_reg(RCOMP0_REG, FG_params.rcomp0);
     write_and_verify_reg(TEMPCO_REG, FG_params.temp_co);
     write_and_verify_reg(FULLCAPNOM_REG, FG_params.full_cap_nom);
     
-    wait_ms(350);
-    //Restore FullCap
-
+    wait_ms(350);//check the type of wait
+    
+    ///STEP 2. Restore FullCap
     ret = readReg(FULLCAPNOM_REG, fullcapnom_data);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
 
     ret = readReg(MIXSOC_REG, temp_data); //check if Error in sofware guide register incorrect
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
     
     mixCap_calc = (temp_data*fullcapnom_data)/25600;
@@ -861,7 +816,7 @@
     write_and_verify_reg(MIXCAP_REG, mixCap_calc);
     write_and_verify_reg(FULLCAPREP_REG, FG_params.full_cap_rep);
     
-    //Write DQACC to 200% of Capacity and DPACC to 200%
+    ///STEP 3. Write DQACC to 200% of Capacity and DPACC to 200%
     dQacc_calc = (FG_params.full_cap_nom/ 16) ;
 
     write_and_verify_reg(DPACC_REG, dPacc_value);
@@ -869,9 +824,36 @@
 
     wait_ms(350);
 
-    //Restore Cycles register
+    ///STEP 4. Restore Cycles register
     ret = write_and_verify_reg(CYCLES_REG, FG_params.cycles);
-    if (ret < 0)
+    if (ret < F_SUCCESS_0)
         return ret;
-return ret;
+    return ret;
+}
+
+/**
+ * @brief        Function to Save Average Current to At Rate register.
+ * @par          Details
+ *               For User frendliness display of TTE, avSOC, avCAP
+ *               write the average current to At Rate registers every 10sec 
+ *               when the battery is in use.
+ *               NOTE: do not use this function when the Battery is charging. 
+ *
+ * @retval      0 for success
+ * @retval      non-0 negative for errors
+ */
+int MAX17055::avCurr_2_atRate()
+{
+    int ret;
+    uint16_t avCurr_data;
+
+    ret = readReg(AVGCURRENT_REG, avCurr_data);
+    if (ret < F_SUCCESS_0)
+        return ret;
+
+    //Write avCurrent to atRate Register
+    ret = write_and_verify_reg(ATRATE_REG, avCurr_data);
+    if (ret < F_SUCCESS_0)
+        return ret;
+    return ret;
 }
\ No newline at end of file