Dependencies:   ADBMS2950

program/src/print_result.cpp

Committer:
dpandit1988
Date:
2020-07-24
Revision:
3:3f1a94897050
Parent:
2:4a10c825f860
Child:
4:0e99350684aa

File content as of revision 3:3f1a94897050:

/**
********************************************************************************
*
* @file:    print_result.c
*
* @brief:   This file contains the print result function implementation.
*
* @details:
*
*******************************************************************************
Copyright(c) 2020 Analog Devices, Inc. All Rights Reserved. This software is
proprietary & confidential to Analog Devices, Inc. and its licensors. By using
this software you agree to the terms of the associated Analog Devices License
Agreement.
*******************************************************************************
*/
/*! \addtogroup Main
*  @{
*/

/*! \addtogroup Print_Result
*  @{
*/

#include "application.h"
#ifdef MBED
extern Serial pc;
/**
*******************************************************************************
* Function: printWriteConfig
* @brief Print write config A/B result.
*
* @details This function Print write config result into terminal.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *IC      cell_asic stucture pointer
*
* @param [in]  type     Enum type of resistor
*
* @param [in]  grp      Enum type of resistor group
*
* @return None
*
*******************************************************************************
*/
void printWriteConfig(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    if(type == Config)
    {
      if(grp == A)
      {
        pc.printf("Write Config A:\n");
        pc.printf("0x%X, ", IC[ic].configa.tx_data[0]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[1]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[2]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[3]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[4]);
        pc.printf("0x%X\n\n", IC[ic].configa.tx_data[5]);
      }
      else if(grp == B)
      {
        pc.printf("Write Config B:\n");
        pc.printf("0x%X, ", IC[ic].configb.tx_data[0]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[1]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[2]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[3]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[4]);
        pc.printf("0x%X\n\n", IC[ic].configb.tx_data[5]);
      }
      else if(grp == ALL_GRP)
      {
        pc.printf("Write Config A:\n");
        pc.printf("0x%X, ", IC[ic].configa.tx_data[0]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[1]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[2]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[3]);
        pc.printf("0x%X, ", IC[ic].configa.tx_data[4]);
        pc.printf("0x%X\n\n", IC[ic].configa.tx_data[5]);

        pc.printf("Write Config B:\n");
        pc.printf("0x%X, ", IC[ic].configb.tx_data[0]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[1]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[2]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[3]);
        pc.printf("0x%X, ", IC[ic].configb.tx_data[4]);
        pc.printf("0x%X\n\n", IC[ic].configb.tx_data[5]);
      }
      else{ pc.printf("Wrong Register Group Select\n"); }
    }
  }
}

/**
*******************************************************************************
* Function: printReadConfig
* @brief Print Read config A/B result.
*
* @details This function Print read config result into IAR I/O terminal.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *ic      cell_asic stucture pointer
*
* @param [in]  TYPE     Enum type of resistor
*
* @param [in]  GRP      Enum type of resistor group
*
* @return None
*
*******************************************************************************
*/
void printReadConfig(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    if(type == Config)
    {
      if(grp == A)
      {
        pc.printf("Read Config A:\n");
        pc.printf("0x%X, ", IC[ic].configa.rx_data[0]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[1]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[2]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[3]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[4]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[5]);
        pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        pc.printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
      }
      else if(grp == B)
      {
        pc.printf("Read Config B:\n");
        pc.printf("0x%X, ", IC[ic].configb.rx_data[0]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[1]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[2]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[3]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[4]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[5]);
        pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        pc.printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
      }
      else if(grp == ALL_GRP)
      {
        pc.printf("Read Config A:\n");
        pc.printf("0x%X, ", IC[ic].configa.rx_data[0]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[1]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[2]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[3]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[4]);
        pc.printf("0x%X, ", IC[ic].configa.rx_data[5]);
        pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        pc.printf("PECError:%d\n",IC[ic].cccrc.cfgr_pec);

        pc.printf("Read Config B:\n");
        pc.printf("0x%X, ", IC[ic].configb.rx_data[0]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[1]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[2]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[3]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[4]);
        pc.printf("0x%X, ", IC[ic].configb.rx_data[5]);
        pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        pc.printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
      }
      else{ pc.printf("Wrong Register Group Select\n"); }
    }
  }
}

/**
*******************************************************************************
* Function: PrintDeviceSID
* @brief Print Device SID.
*
* @details This function Print Device SID into IAR I/O terminal.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *IC      cell_asic stucture pointer
*
* @param [in]  type     Enum type of resistor
*
* @return None
*
*******************************************************************************
*/
void printDeviceSID(uint8_t tIC, cell_asic *IC, TYPE type)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    if(type == SID)
    {
      pc.printf("Read Device SID:\n");
      pc.printf("0x%X, ", IC[ic].sid.sid[0]);
      pc.printf("0x%X, ", IC[ic].sid.sid[1]);
      pc.printf("0x%X, ", IC[ic].sid.sid[2]);
      pc.printf("0x%X, ", IC[ic].sid.sid[3]);
      pc.printf("0x%X, ", IC[ic].sid.sid[4]);
      pc.printf("0x%X, ", IC[ic].sid.sid[5]);
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.sid_pec);
    }
    else{ pc.printf("Wrong Register Type Select\n"); }
  }
}

/**
*******************************************************************************
* Function: printWriteCommData
* @brief Print Write Comm data.
*
* @details This function Print write comm data.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *IC      cell_asic stucture pointer
*
* @param [in]  type     Enum type of resistor
*
* @return None
*
*******************************************************************************
*/
void printWriteCommData(uint8_t tIC, cell_asic *IC, TYPE type)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    if(type == Comm)
    {
      pc.printf("Write Comm Data:\n");
      pc.printf("0x%X, ", IC[ic].com.tx_data[0]);
      pc.printf("0x%X, ", IC[ic].com.tx_data[1]);
      pc.printf("0x%X, ", IC[ic].com.tx_data[2]);
      pc.printf("0x%X, ", IC[ic].com.tx_data[3]);
      pc.printf("0x%X, ", IC[ic].com.tx_data[4]);
      pc.printf("0x%X\n\n", IC[ic].com.tx_data[5]);
    }
    else{ pc.printf("Wrong Register Group Select\n"); }
  }
}

/**
*******************************************************************************
* Function: printReadCommData
* @brief Print Read Comm Data.
*
* @details This function print read comm data.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *IC      cell_asic stucture pointer
*
* @param [in]  type     Enum type of resistor
*
* @return None
*
*******************************************************************************
*/
void printReadCommData(uint8_t tIC, cell_asic *IC, TYPE type)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    if(type == Comm)
    {
      pc.printf("Read Comm Data:\n");
      pc.printf("ICOM0:0x%X, ", IC[ic].rx_comm.icomm[0]);
      pc.printf("ICOM1:0x%X, ", IC[ic].rx_comm.icomm[1]);
      pc.printf("ICOM2:0x%X\n", IC[ic].rx_comm.icomm[2]);
      pc.printf("FCOM0:0x%X, ", IC[ic].rx_comm.fcomm[0]);
      pc.printf("FCOM1:0x%X, ", IC[ic].rx_comm.fcomm[1]);
      pc.printf("FCOM2:0x%X\n", IC[ic].rx_comm.fcomm[2]);
      pc.printf("DATA0:0x%X, ", IC[ic].rx_comm.data[0]);
      pc.printf("DATA1:0x%X, ", IC[ic].rx_comm.data[1]);
      pc.printf("DATA2:0x%X\n", IC[ic].rx_comm.data[2]);
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.comm_pec);
    }
    else{ pc.printf("Wrong Register Type Select\n"); }
  }
}

/**
*******************************************************************************
* Function: printCr
* @brief Print Current Result.
*
* @details This function Print current result into terminal.
*
* Parameters:
* @param [in]   tIC      Total IC
*
* @param [in]  *ic      cell_asic stucture pointer
*
* @return None
*
*******************************************************************************
*/
void printCr(uint8_t tIC, cell_asic *IC)
{
  for(uint8_t ic = 0; ic < tIC; ic++)
  {
    pc.printf("IC%d:\n",(ic+1));
    pc.printf("Read Current:\n");
    pc.printf("I1:%f, ", getCurrent(IC[ic].i.i1));
    pc.printf("I2:%f\n", getCurrent(IC[ic].i.i2));
    pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
    pc.printf("PECError:%d\n\n",IC[ic].cccrc.cr_pec);
  }
}

  /**
  *******************************************************************************
  * Function: printVoltages
  * @brief Print Voltages.
  *
  * @details This function Print Voltages into terminal.
  *
  * Parameters:
  * @param [in] tIC    Total IC
  *
  * @param [in]  *IC    cell_asic stucture pointer
  *
  * @param [in]  type    Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */
  void printVoltage(uint8_t tIC, cell_asic *IC, TYPE type)
  {
    float voltage;
    uint16_t temp;
    uint8_t channel;
    uint8_t flag = 0;
    if((type == Vr)){channel = VR_SIZE;}
    else if((type == Vrx)){channel = VRX_SIZE;}
    else if (type == Rvr){ channel = RVR_SIZE;}
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d: \n",(ic+1));
      for(uint8_t index = 0; index < channel; index++)
      {
        if(type == Vr){ temp = IC[ic].vr.v_codes[index];}
        else if(type == Vrx){ temp = IC[ic].vrx.vx_codes[index]; }
        else if(type == Rvr){ temp = IC[ic].rvr.redv_codes[index]; }
        voltage = getVoltage(temp);
        if(type == Vr)
        {
          if(index == 8)
          {
            pc.printf("VREF2A = %7.4fV \n", voltage);
            flag = 1;
          }
          else if(index == (channel-1))
          {
            pc.printf("VREF2B = %7.4fV \n", voltage);
            pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            pc.printf("PECError:%d",IC[ic].cccrc.vr_pec);
          }
         else
         {
           if(flag == 1)
           {
             pc.printf("V%2d = %7.4fV \n", index, voltage);
           }
           else{pc.printf("V%2d = %7.4fV \n",(index+1), voltage);}
         }
        }
        else if(type == Vrx)
        {
          if(index == 4){pc.printf("VREF2A = %7.4fV \n", voltage);}
          else if(index == (channel-1))
          {
            pc.printf("VREF2B = %7.4fV \n", voltage);
            pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            pc.printf("PECError:%d",IC[ic].cccrc.vrx_pec);
          }
          else{pc.printf("V%2d = %7.4fV \n",(index+7), voltage);}
        }
        else if(type == Rvr)
        {
          pc.printf("V%dR=%fV \n",(index+1), voltage);
          if(index == (channel-1))
          {
            pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            pc.printf("PECError:%d",IC[ic].cccrc.rvr_pec);
          }
        }
        else{pc.printf("Wrong Register Group Select\n");}
      }
      pc.printf("\n\n");
    }
  }

  /**
  *******************************************************************************
  * Function: printVbat
  * @brief Print VBAT Result.
  *
  * @details This function Print the VBAT result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      pc.printf("Read VBAT:\n");
      pc.printf("VBAT1: %f, ", getVoltage(IC[ic].vbat.vbat1));
      pc.printf("VBAT2: %f, ", getVoltage(IC[ic].vbat.vbat2));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.vbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printIvbat
  * @brief Print IVBAT result.
  *
  * @details This function Print the IVBAT result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printIvbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      pc.printf("Read IVBAT:\n");
      pc.printf("I1:%f, ", getCurrent(IC[ic].ivbat.i1));
      pc.printf("VBAT1%f, ", getVoltage(IC[ic].ivbat.vbat1));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.ivbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgVbat
  * @brief Print AVGVBAT result.
  *
  * @details This function Print the avgvbat result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      pc.printf("Read AvgVbat:\n");
      pc.printf("VB1AVG:%f, ", getVoltage(IC[ic].vbavg.vb1avg));
      pc.printf("VB2AVG:%f, ", getVoltage(IC[ic].vbavg.vb2avg));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.avgvbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgIVbat
  * @brief Print AVGIVBAT result.
  *
  * @details This function Print the avgivbat result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgIVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      pc.printf("Read AvgIVbat:\n");
      pc.printf("I1AVG:%f, ", getCurrent(IC[ic].i_vbavg.i1avg));
      pc.printf("VB1AVG%f, ", getVoltage(IC[ic].i_vbavg.vb1avg));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.avgivbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgCr
  * @brief Print IAVG result.
  *
  * @details This function Print the iavg result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgCr(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      pc.printf("Read AvgCr:\n");
      pc.printf("I1AVG:%f, ", getCurrent(IC[ic].iavg.i1avg));
      pc.printf("I2AVG:%f, ", getCurrent(IC[ic].iavg.i2avg));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.avgcr_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printOc
  * @brief Print OC result.
  *
  * @details This function Print the oc result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printOc(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("Read OC:\n");
      pc.printf("OC1R: %f, ", getOverCurrent(IC[ic].oc.oc1r));
      pc.printf("OC2R: %f, ", getOverCurrent(IC[ic].oc.oc2r));
      pc.printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      pc.printf("PECError:%d\n\n",IC[ic].cccrc.oc_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: PrintStatus
  * @brief Print status reg. result.
  *
  * @details This function Print status result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @param [in]  grp      Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */

  void printStatus(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
  {
    float voltage;
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      pc.printf("IC%d:\n",(ic+1));
      if(type == Status)
      {
        if(grp == A)
        {
          pc.printf("Status A:\n");
          voltage = getVoltage(IC[ic].stata.vref1p25);
          pc.printf("VREF1P25:%fV, ", voltage);
          pc.printf("ITMP:%f°C, ", (((IC[ic].stata.itmp * 150e-6 )+ 1.5)/0.0075)-273);
          voltage = getVoltage(IC[ic].stata.vreg2);
          pc.printf("VREG2:%fV\n", (voltage + 1.5));
          pc.printf("CCount:%d, ",IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n",IC[ic].cccrc.stat_pec);
        }
        else if(grp == B)
        {
          pc.printf("Status B:\n");
          pc.printf("OC1MIN:0x%X, ", IC[ic].statb.oc1min);
          pc.printf("OC1MAX:0x%X, ", IC[ic].statb.oc1max);
          pc.printf("OC2MIN:0x%X, ", IC[ic].statb.oc2min);
          pc.printf("OC2MAX:0x%X\n", IC[ic].statb.oc2max);
          pc.printf("CCount:%d, ",IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n",IC[ic].cccrc.stat_pec);
        }
        else if(grp == C)
        {
          pc.printf("Status C:\n");
          pc.printf("OC1A:0x%X, ", IC[ic].statc.oc1a);
          pc.printf("~OC1A:0x%X, ", IC[ic].statc.oc1a_inv);
          pc.printf("OC2A:0x%X, ", IC[ic].statc.oc2a);
          pc.printf("~OC2A:0x%X, ", IC[ic].statc.oc2a_inv);
          pc.printf("CT:0x%X, ", IC[ic].statc.ct);
          pc.printf("CTS:0x%X\n", IC[ic].statc.cts);

          pc.printf("VA_OV:0x%X, ", IC[ic].statc.va_ov);
          pc.printf("VA_UV:0x%X ", IC[ic].statc.va_uv);
          pc.printf("VD_OV:0x%X, ", IC[ic].statc.vd_ov);
          pc.printf("VD_UV:0x%X, ", IC[ic].statc.vd_uv);
          pc.printf("OTP1_ED:0x%X, ", IC[ic].statc.otp1_ed);
          pc.printf("OTP1_MED:0x%X, ", IC[ic].statc.otp1_med);
          pc.printf("OTP2_ED:0x%X, ", IC[ic].statc.otp2_ed);
          pc.printf("OTP2_MED:0x%X\n", IC[ic].statc.otp2_med);

          pc.printf("VDE:0x%X, ", IC[ic].statc.vde);
          pc.printf("VDE1:0x%X, ", IC[ic].statc.vdel);
          pc.printf("INSYNC:0x%X, ", IC[ic].statc.insync);
          pc.printf("SPIFLT:0x%X, ", IC[ic].statc.spiflt);
          pc.printf("SLEEP:0x%X, ", IC[ic].statc.sleep);
          pc.printf("THSD:0x%X, ", IC[ic].statc.thsd);
          pc.printf("TMODCHK:0x%X, ", IC[ic].statc.tmodchk);
          pc.printf("OSCCHK:0x%X\n", IC[ic].statc.oscchk);

          pc.printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == D)
        {
          pc.printf("Status D:\n");
          pc.printf("OC_CNTR:0x%X, ", IC[ic].statd.oc_cntr);
          pc.printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == E)
        {
          pc.printf("Status E:\n");
          pc.printf("GPIO:0x%X, ", IC[ic].state.gpio);
          pc.printf("GPO:0x%X, ", IC[ic].state.gpo);
          pc.printf("REV_ID:0x%X\n", IC[ic].state.rev);
          pc.printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == ALL_GRP)
        {
          pc.printf("Status A:\n");
          voltage = getVoltage(IC[ic].stata.vref1p25);
          pc.printf("VREF1P25:%fV, ", voltage);
          pc.printf("ITMP:%f°C, ", (((IC[ic].stata.itmp * 150e-6 )+ 1.5)/0.0075)-273);
          voltage = getVoltage(IC[ic].stata.vreg2);
          pc.printf("VREG2:%fV\n", (voltage + 1.5));

          pc.printf("Status B:\n");
          pc.printf("OC1MIN:0x%X, ", IC[ic].statb.oc1min);
          pc.printf("OC1MAX:0x%X, ", IC[ic].statb.oc1max);
          pc.printf("OC2MIN:0x%X, ", IC[ic].statb.oc2min);
          pc.printf("OC2MAX:0x%X\n", IC[ic].statb.oc2max);

          pc.printf("Status C:\n");
          pc.printf("OC1A:0x%X, ", IC[ic].statc.oc1a);
          pc.printf("~OC1A:0x%X, ", IC[ic].statc.oc1a_inv);
          pc.printf("OC2A:0x%X, ", IC[ic].statc.oc2a);
          pc.printf("~OC2A:0x%X, ", IC[ic].statc.oc2a_inv);
          pc.printf("CT:0x%X, ", IC[ic].statc.ct);
          pc.printf("CTS:0x%X\n", IC[ic].statc.cts);
          pc.printf("VA_OV:0x%X, ", IC[ic].statc.va_ov);
          pc.printf("VA_UV:0x%X ", IC[ic].statc.va_uv);
          pc.printf("VD_OV:0x%X, ", IC[ic].statc.vd_ov);
          pc.printf("VD_UV:0x%X, ", IC[ic].statc.vd_uv);
          pc.printf("OTP1_ED:0x%X, ", IC[ic].statc.otp1_ed);
          pc.printf("OTP1_MED:0x%X, ", IC[ic].statc.otp1_med);
          pc.printf("OTP2_ED:0x%X, ", IC[ic].statc.otp2_ed);
          pc.printf("OTP2_MED:0x%X\n", IC[ic].statc.otp2_med);
          pc.printf("VDE:0x%X, ", IC[ic].statc.vde);
          pc.printf("VDE1:0x%X, ", IC[ic].statc.vdel);
          pc.printf("INSYNC:0x%X, ", IC[ic].statc.insync);
          pc.printf("SPIFLT:0x%X, ", IC[ic].statc.spiflt);
          pc.printf("SLEEP:0x%X, ", IC[ic].statc.sleep);
          pc.printf("THSD:0x%X, ", IC[ic].statc.thsd);
          pc.printf("TMODCHK:0x%X, ", IC[ic].statc.tmodchk);
          pc.printf("OSCCHK:0x%X\n", IC[ic].statc.oscchk);

          pc.printf("Status D:\n");
          pc.printf("OC_CNTR:0x%X\n", IC[ic].statd.oc_cntr);

          pc.printf("Status E:\n");
          pc.printf("GPIO:0x%X, ", IC[ic].state.gpio);
          pc.printf("GPO:0x%X, ", IC[ic].state.gpo);
          pc.printf("REV_ID:0x%X\n", IC[ic].state.rev);
          pc.printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          pc.printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else{ pc.printf("Wrong Register Group Select\n"); }
      }
    }
  }

  /**
  *******************************************************************************
  * Function: printMenu
  * @brief Print Command Menu.
  *
  * @details This function print all command menu.
  *
  * @return None
  *
  *******************************************************************************
  */
  void printMenu()
  {
    pc.printf("List of ADBMS2950 Command:\n");
    pc.printf("Write and Read Configuration: 1                            \n");
    pc.printf("Read Configuration: 2                                      \n");
    pc.printf("Start Adi1 Conversion: 3                                   \n");
    pc.printf("Start Adi2 Conversion: 4                                   \n");
    pc.printf("Read Current Registers: 5                                  \n");
    pc.printf("Read Battery Voltage Register: 6                           \n");
    pc.printf("Read Current and Battery Voltage Register: 7               \n");
    pc.printf("Read Overcurrent ADC Register: 8                           \n");
    pc.printf("Read Average Current Register: 9                           \n");
    pc.printf("Read Average Batter Voltage Register: 10                   \n");
    pc.printf("Read Average Battery Current and Voltage Register: 11      \n");
    pc.printf("Start Adv Conversion: 12                                   \n");
    pc.printf("Read Voltage Registers: 13                                 \n");
    pc.printf("Read Voltage X Registers: 14                               \n");
    pc.printf("Read Redundant Voltage Registers: 15                       \n");
    pc.printf("Start Adaux Conversion: 16                                 \n");
    pc.printf("Read Adaux Measurement: 17                                 \n");
    pc.printf("Read All Status Registers: 18                              \n");
    pc.printf("Read Device SID: 19                                        \n");
    pc.printf("Soft Reset: 20                                             \n");
    pc.printf("Reset cmd counter: 21                                      \n");
    pc.printf("Snapshot: 22                                               \n");
    pc.printf("Release Snapshot: 23                                       \n");
    pc.printf("Gpio spi communication: 24                                 \n");
    pc.printf("Gpio i2c write to slave: 25                                \n");
    pc.printf("Gpio i2c read from slave: 26                               \n");
    pc.printf("Set reset gpo pins: 27                                     \n");

    pc.printf("\n");
    pc.printf("Print '0' for menu\n");
    pc.printf("Please enter command: \n");
    pc.printf("\n\n");
  }

#else /* IAR */

  /**
  *******************************************************************************
  * Function: printWriteConfig
  * @brief Print write config A/B result.
  *
  * @details This function Print write config result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @param [in]  grp      Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */
  void printWriteConfig(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == Config)
      {
        if(grp == A)
        {
          printf("Write Config A:\n");
          printf("0x%X, ", IC[ic].configa.tx_data[0]);
          printf("0x%X, ", IC[ic].configa.tx_data[1]);
          printf("0x%X, ", IC[ic].configa.tx_data[2]);
          printf("0x%X, ", IC[ic].configa.tx_data[3]);
          printf("0x%X, ", IC[ic].configa.tx_data[4]);
          printf("0x%X\n\n", IC[ic].configa.tx_data[5]);
        }
        else if(grp == B)
        {
          printf("Write Config B:\n");
          printf("0x%X, ", IC[ic].configb.tx_data[0]);
          printf("0x%X, ", IC[ic].configb.tx_data[1]);
          printf("0x%X, ", IC[ic].configb.tx_data[2]);
          printf("0x%X, ", IC[ic].configb.tx_data[3]);
          printf("0x%X, ", IC[ic].configb.tx_data[4]);
          printf("0x%X\n\n", IC[ic].configb.tx_data[5]);
        }
        else if(grp == ALL_GRP)
        {
          printf("Write Config A:\n");
          printf("0x%X, ", IC[ic].configa.tx_data[0]);
          printf("0x%X, ", IC[ic].configa.tx_data[1]);
          printf("0x%X, ", IC[ic].configa.tx_data[2]);
          printf("0x%X, ", IC[ic].configa.tx_data[3]);
          printf("0x%X, ", IC[ic].configa.tx_data[4]);
          printf("0x%X\n\n", IC[ic].configa.tx_data[5]);

          printf("Write Config B:\n");
          printf("0x%X, ", IC[ic].configb.tx_data[0]);
          printf("0x%X, ", IC[ic].configb.tx_data[1]);
          printf("0x%X, ", IC[ic].configb.tx_data[2]);
          printf("0x%X, ", IC[ic].configb.tx_data[3]);
          printf("0x%X, ", IC[ic].configb.tx_data[4]);
          printf("0x%X\n\n", IC[ic].configb.tx_data[5]);
        }
        else{ printf("Wrong Register Group Select\n"); }
      }
    }
  }

  /**
  *******************************************************************************
  * Function: printReadConfig
  * @brief Print Read config A/B result.
  *
  * @details This function Print read config result into IAR I/O terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @param [in]  TYPE     Enum type of resistor
  *
  * @param [in]  GRP      Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */
  void printReadConfig(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == Config)
      {
        if(grp == A)
        {
          printf("Read Config A:\n");
          printf("0x%X, ", IC[ic].configa.rx_data[0]);
          printf("0x%X, ", IC[ic].configa.rx_data[1]);
          printf("0x%X, ", IC[ic].configa.rx_data[2]);
          printf("0x%X, ", IC[ic].configa.rx_data[3]);
          printf("0x%X, ", IC[ic].configa.rx_data[4]);
          printf("0x%X, ", IC[ic].configa.rx_data[5]);
          printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
        }
        else if(grp == B)
        {
          printf("Read Config B:\n");
          printf("0x%X, ", IC[ic].configb.rx_data[0]);
          printf("0x%X, ", IC[ic].configb.rx_data[1]);
          printf("0x%X, ", IC[ic].configb.rx_data[2]);
          printf("0x%X, ", IC[ic].configb.rx_data[3]);
          printf("0x%X, ", IC[ic].configb.rx_data[4]);
          printf("0x%X, ", IC[ic].configb.rx_data[5]);
          printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
        }
        else if(grp == ALL_GRP)
        {
          printf("Read Config A:\n");
          printf("0x%X, ", IC[ic].configa.rx_data[0]);
          printf("0x%X, ", IC[ic].configa.rx_data[1]);
          printf("0x%X, ", IC[ic].configa.rx_data[2]);
          printf("0x%X, ", IC[ic].configa.rx_data[3]);
          printf("0x%X, ", IC[ic].configa.rx_data[4]);
          printf("0x%X, ", IC[ic].configa.rx_data[5]);
          printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n",IC[ic].cccrc.cfgr_pec);

          printf("Read Config B:\n");
          printf("0x%X, ", IC[ic].configb.rx_data[0]);
          printf("0x%X, ", IC[ic].configb.rx_data[1]);
          printf("0x%X, ", IC[ic].configb.rx_data[2]);
          printf("0x%X, ", IC[ic].configb.rx_data[3]);
          printf("0x%X, ", IC[ic].configb.rx_data[4]);
          printf("0x%X, ", IC[ic].configb.rx_data[5]);
          printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n",IC[ic].cccrc.cfgr_pec);
        }
        else{ printf("Wrong Register Group Select\n"); }
      }
    }
  }

  /**
  *******************************************************************************
  * Function: PrintDeviceSID
  * @brief Print Device SID.
  *
  * @details This function Print Device SID into IAR I/O terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @return None
  *
  *******************************************************************************
  */
  void printDeviceSID(uint8_t tIC, cell_asic *IC, TYPE type)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == SID)
      {
        printf("Read Device SID:\n");
        printf("0x%X, ", IC[ic].sid.sid[0]);
        printf("0x%X, ", IC[ic].sid.sid[1]);
        printf("0x%X, ", IC[ic].sid.sid[2]);
        printf("0x%X, ", IC[ic].sid.sid[3]);
        printf("0x%X, ", IC[ic].sid.sid[4]);
        printf("0x%X, ", IC[ic].sid.sid[5]);
        printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        printf("PECError:%d\n\n",IC[ic].cccrc.sid_pec);
      }
      else{ printf("Wrong Register Type Select\n"); }
    }
  }

  /**
  *******************************************************************************
  * Function: printWriteCommData
  * @brief Print Write Comm data.
  *
  * @details This function Print write comm data.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @return None
  *
  *******************************************************************************
  */
  void printWriteCommData(uint8_t tIC, cell_asic *IC, TYPE type)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == Comm)
      {
        printf("Write Comm Data:\n");
        printf("0x%X, ", IC[ic].com.tx_data[0]);
        printf("0x%X, ", IC[ic].com.tx_data[1]);
        printf("0x%X, ", IC[ic].com.tx_data[2]);
        printf("0x%X, ", IC[ic].com.tx_data[3]);
        printf("0x%X, ", IC[ic].com.tx_data[4]);
        printf("0x%X\n\n", IC[ic].com.tx_data[5]);
      }
      else{ printf("Wrong Register Group Select\n"); }
    }
  }

  /**
  *******************************************************************************
  * Function: printReadCommData
  * @brief Print Read Comm Data.
  *
  * @details This function print read comm data.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @return None
  *
  *******************************************************************************
  */
  void printReadCommData(uint8_t tIC, cell_asic *IC, TYPE type)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == Comm)
      {
        printf("Read Comm Data:\n");
        printf("ICOM0:0x%X, ", IC[ic].rx_comm.icomm[0]);
        printf("ICOM1:0x%X, ", IC[ic].rx_comm.icomm[1]);
        printf("ICOM2:0x%X\n", IC[ic].rx_comm.icomm[2]);
        printf("FCOM0:0x%X, ", IC[ic].rx_comm.fcomm[0]);
        printf("FCOM1:0x%X, ", IC[ic].rx_comm.fcomm[1]);
        printf("FCOM2:0x%X\n", IC[ic].rx_comm.fcomm[2]);
        printf("DATA0:0x%X, ", IC[ic].rx_comm.data[0]);
        printf("DATA1:0x%X, ", IC[ic].rx_comm.data[1]);
        printf("DATA2:0x%X\n", IC[ic].rx_comm.data[2]);
        printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
        printf("PECError:%d\n\n",IC[ic].cccrc.comm_pec);
      }
      else{ printf("Wrong Register Type Select\n"); }
    }
  }

  /**
  *******************************************************************************
  * Function: printCr
  * @brief Print Current Result.
  *
  * @details This function Print current result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printCr(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read Current:\n");
      printf("I1:%f, ", getCurrent(IC[ic].i.i1));
      printf("I2:%f\n", getCurrent(IC[ic].i.i2));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.cr_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printVoltages
  * @brief Print Voltages.
  *
  * @details This function Print Voltages into terminal.
  *
  * Parameters:
  * @param [in] tIC    Total IC
  *
  * @param [in]  *IC    cell_asic stucture pointer
  *
  * @param [in]  type    Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */
  void printVoltage(uint8_t tIC, cell_asic *IC, TYPE type)
  {
    float voltage;
    uint16_t temp;
    uint8_t channel;
    uint8_t flag = 0;
    if((type == Vr)){channel = VR_SIZE;}
    else if((type == Vrx)){channel = VRX_SIZE;}
    else if (type == Rvr){ channel = RVR_SIZE;}
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d: \n",(ic+1));
      for(uint8_t index = 0; index < channel; index++)
      {
        if(type == Vr){ temp = IC[ic].vr.v_codes[index];}
        else if(type == Vrx){ temp = IC[ic].vrx.vx_codes[index]; }
        else if(type == Rvr){ temp = IC[ic].rvr.redv_codes[index]; }
        voltage = getVoltage(temp);
        if(type == Vr)
        {
          if(index == 8)
          {
            printf("VREF2A = %7.4fV \n", voltage);
            flag = 1;
          }
          else if(index == (channel-1))
          {
            printf("VREF2B = %7.4fV \n", voltage);
            printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            printf("PECError:%d",IC[ic].cccrc.vr_pec);
          }
         else
         {
           if(flag == 1)
           {
             printf("V%2d = %7.4fV \n", index, voltage);
           }
           else{printf("V%2d = %7.4fV \n",(index+1), voltage);}
         }
        }
        else if(type == Vrx)
        {
          if(index == 4){printf("VREF2A = %7.4fV \n", voltage);}
          else if(index == (channel-1))
          {
            printf("VREF2B = %7.4fV \n", voltage);
            printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            printf("PECError:%d",IC[ic].cccrc.vrx_pec);
          }
          else{printf("V%2d = %7.4fV \n",(index+7), voltage);}
        }
        else if(type == Rvr)
        {
          printf("V%dR=%fV \n",(index+1), voltage);
          if(index == (channel-1))
          {
            printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
            printf("PECError:%d",IC[ic].cccrc.rvr_pec);
          }
        }
        else{printf("Wrong Register Group Select\n");}
      }
      printf("\n\n");
    }
  }

  /**
  *******************************************************************************
  * Function: printVbat
  * @brief Print VBAT Result.
  *
  * @details This function Print the VBAT result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read VBAT:\n");
      printf("VBAT1: %f, ", getVoltage(IC[ic].vbat.vbat1));
      printf("VBAT2: %f, ", getVoltage(IC[ic].vbat.vbat2));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.vbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printIvbat
  * @brief Print IVBAT result.
  *
  * @details This function Print the IVBAT result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printIvbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read IVBAT:\n");
      printf("I1:%f, ", getCurrent(IC[ic].ivbat.i1));
      printf("VBAT1%f, ", getVoltage(IC[ic].ivbat.vbat1));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.ivbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgVbat
  * @brief Print AVGVBAT result.
  *
  * @details This function Print the avgvbat result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read AvgVbat:\n");
      printf("VB1AVG:%f, ", getVoltage(IC[ic].vbavg.vb1avg));
      printf("VB2AVG:%f, ", getVoltage(IC[ic].vbavg.vb2avg));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.avgvbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgIVbat
  * @brief Print AVGIVBAT result.
  *
  * @details This function Print the avgivbat result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgIVbat(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read AvgIVbat:\n");
      printf("I1AVG:%f, ", getCurrent(IC[ic].i_vbavg.i1avg));
      printf("VB1AVG%f, ", getVoltage(IC[ic].i_vbavg.vb1avg));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.avgivbat_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printAvgCr
  * @brief Print IAVG result.
  *
  * @details This function Print the iavg result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printAvgCr(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      printf("Read AvgCr:\n");
      printf("I1AVG:%f, ", getCurrent(IC[ic].iavg.i1avg));
      printf("I2AVG:%f, ", getCurrent(IC[ic].iavg.i2avg));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.avgcr_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: printOc
  * @brief Print OC result.
  *
  * @details This function Print the oc result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *ic      cell_asic stucture pointer
  *
  * @return None
  *
  *******************************************************************************
  */
  void printOc(uint8_t tIC, cell_asic *IC)
  {
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("Read OC:\n");
      printf("OC1R: %f, ", getOverCurrent(IC[ic].oc.oc1r));
      printf("OC2R: %f, ", getOverCurrent(IC[ic].oc.oc2r));
      printf("CCount:%d,",IC[ic].cccrc.cmd_cntr);
      printf("PECError:%d\n\n",IC[ic].cccrc.oc_pec);
    }
  }

  /**
  *******************************************************************************
  * Function: PrintStatus
  * @brief Print status reg. result.
  *
  * @details This function Print status result into terminal.
  *
  * Parameters:
  * @param [in] tIC      Total IC
  *
  * @param [in]  *IC      cell_asic stucture pointer
  *
  * @param [in]  type     Enum type of resistor
  *
  * @param [in]  grp      Enum type of resistor group
  *
  * @return None
  *
  *******************************************************************************
  */

  void printStatus(uint8_t tIC, cell_asic *IC, TYPE type, GRP grp)
  {
    float voltage;
    for(uint8_t ic = 0; ic < tIC; ic++)
    {
      printf("IC%d:\n",(ic+1));
      if(type == Status)
      {
        if(grp == A)
        {
          printf("Status A:\n");
          voltage = getVoltage(IC[ic].stata.vref1p25);
          printf("VREF1P25:%fV, ", voltage);
          printf("ITMP:%f°C, ", (((IC[ic].stata.itmp * 150e-6 )+ 1.5)/0.0075)-273);
          voltage = getVoltage(IC[ic].stata.vreg2);
          printf("VREG2:%fV\n", (voltage + 1.5));
          printf("CCount:%d, ",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n",IC[ic].cccrc.stat_pec);
        }
        else if(grp == B)
        {
          printf("Status B:\n");
          printf("OC1MIN:0x%X, ", IC[ic].statb.oc1min);
          printf("OC1MAX:0x%X, ", IC[ic].statb.oc1max);
          printf("OC2MIN:0x%X, ", IC[ic].statb.oc2min);
          printf("OC2MAX:0x%X\n", IC[ic].statb.oc2max);
          printf("CCount:%d, ",IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n",IC[ic].cccrc.stat_pec);
        }
        else if(grp == C)
        {
          printf("Status C:\n");
          printf("OC1A:0x%X, ", IC[ic].statc.oc1a);
          printf("~OC1A:0x%X, ", IC[ic].statc.oc1a_inv);
          printf("OC2A:0x%X, ", IC[ic].statc.oc2a);
          printf("~OC2A:0x%X, ", IC[ic].statc.oc2a_inv);
          printf("CT:0x%X, ", IC[ic].statc.ct);
          printf("CTS:0x%X\n", IC[ic].statc.cts);

          printf("VA_OV:0x%X, ", IC[ic].statc.va_ov);
          printf("VA_UV:0x%X ", IC[ic].statc.va_uv);
          printf("VD_OV:0x%X, ", IC[ic].statc.vd_ov);
          printf("VD_UV:0x%X, ", IC[ic].statc.vd_uv);
          printf("OTP1_ED:0x%X, ", IC[ic].statc.otp1_ed);
          printf("OTP1_MED:0x%X, ", IC[ic].statc.otp1_med);
          printf("OTP2_ED:0x%X, ", IC[ic].statc.otp2_ed);
          printf("OTP2_MED:0x%X\n", IC[ic].statc.otp2_med);

          printf("VDE:0x%X, ", IC[ic].statc.vde);
          printf("VDE1:0x%X, ", IC[ic].statc.vdel);
          printf("INSYNC:0x%X, ", IC[ic].statc.insync);
          printf("SPIFLT:0x%X, ", IC[ic].statc.spiflt);
          printf("SLEEP:0x%X, ", IC[ic].statc.sleep);
          printf("THSD:0x%X, ", IC[ic].statc.thsd);
          printf("TMODCHK:0x%X, ", IC[ic].statc.tmodchk);
          printf("OSCCHK:0x%X\n", IC[ic].statc.oscchk);

          printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == D)
        {
          printf("Status D:\n");
          printf("OC_CNTR:0x%X, ", IC[ic].statd.oc_cntr);
          printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == E)
        {
          printf("Status E:\n");
          printf("GPIO:0x%X, ", IC[ic].state.gpio);
          printf("GPO:0x%X, ", IC[ic].state.gpo);
          printf("REV_ID:0x%X\n", IC[ic].state.rev);
          printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else if(grp == ALL_GRP)
        {
          printf("Status A:\n");
          voltage = getVoltage(IC[ic].stata.vref1p25);
          printf("VREF1P25:%fV, ", voltage);
          printf("ITMP:%f°C, ", (((IC[ic].stata.itmp * 150e-6 )+ 1.5)/0.0075)-273);
          voltage = getVoltage(IC[ic].stata.vreg2);
          printf("VREG2:%fV\n", (voltage + 1.5));

          printf("Status B:\n");
          printf("OC1MIN:0x%X, ", IC[ic].statb.oc1min);
          printf("OC1MAX:0x%X, ", IC[ic].statb.oc1max);
          printf("OC2MIN:0x%X, ", IC[ic].statb.oc2min);
          printf("OC2MAX:0x%X\n", IC[ic].statb.oc2max);

          printf("Status C:\n");
          printf("OC1A:0x%X, ", IC[ic].statc.oc1a);
          printf("~OC1A:0x%X, ", IC[ic].statc.oc1a_inv);
          printf("OC2A:0x%X, ", IC[ic].statc.oc2a);
          printf("~OC2A:0x%X, ", IC[ic].statc.oc2a_inv);
          printf("CT:0x%X, ", IC[ic].statc.ct);
          printf("CTS:0x%X\n", IC[ic].statc.cts);
          printf("VA_OV:0x%X, ", IC[ic].statc.va_ov);
          printf("VA_UV:0x%X ", IC[ic].statc.va_uv);
          printf("VD_OV:0x%X, ", IC[ic].statc.vd_ov);
          printf("VD_UV:0x%X, ", IC[ic].statc.vd_uv);
          printf("OTP1_ED:0x%X, ", IC[ic].statc.otp1_ed);
          printf("OTP1_MED:0x%X, ", IC[ic].statc.otp1_med);
          printf("OTP2_ED:0x%X, ", IC[ic].statc.otp2_ed);
          printf("OTP2_MED:0x%X\n", IC[ic].statc.otp2_med);
          printf("VDE:0x%X, ", IC[ic].statc.vde);
          printf("VDE1:0x%X, ", IC[ic].statc.vdel);
          printf("INSYNC:0x%X, ", IC[ic].statc.insync);
          printf("SPIFLT:0x%X, ", IC[ic].statc.spiflt);
          printf("SLEEP:0x%X, ", IC[ic].statc.sleep);
          printf("THSD:0x%X, ", IC[ic].statc.thsd);
          printf("TMODCHK:0x%X, ", IC[ic].statc.tmodchk);
          printf("OSCCHK:0x%X\n", IC[ic].statc.oscchk);

          printf("Status D:\n");
          printf("OC_CNTR:0x%X\n", IC[ic].statd.oc_cntr);

          printf("Status E:\n");
          printf("GPIO:0x%X, ", IC[ic].state.gpio);
          printf("GPO:0x%X, ", IC[ic].state.gpo);
          printf("REV_ID:0x%X\n", IC[ic].state.rev);
          printf("CCount:%d, ", IC[ic].cccrc.cmd_cntr);
          printf("PECError:%d\n\n", IC[ic].cccrc.stat_pec);
        }
        else{ printf("Wrong Register Group Select\n"); }
      }
    }
  }

  /**
  *******************************************************************************
  * Function: printMenu
  * @brief Print Command Menu.
  *
  * @details This function print all command menu.
  *
  * @return None
  *
  *******************************************************************************
  */
  void printMenu()
  {
    printf("List of ADBMS2950 Command:\n");
    printf("Write and Read Configuration: 1                            \n");
    printf("Read Configuration: 2                                      \n");
    printf("Start Adi1 Conversion: 3                                   \n");
    printf("Start Adi2 Conversion: 4                                   \n");
    printf("Read Current Registers: 5                                  \n");
    printf("Read Battery Voltage Register: 6                           \n");
    printf("Read Current and Battery Voltage Register: 7               \n");
    printf("Read Overcurrent ADC Register: 8                           \n");
    printf("Read Average Current Register: 9                           \n");
    printf("Read Average Batter Voltage Register: 10                   \n");
    printf("Read Average Battery Current and Voltage Register: 11      \n");
    printf("Start Adv Conversion: 12                                   \n");
    printf("Read Voltage Registers: 13                                 \n");
    printf("Read Voltage X Registers: 14                               \n");
    printf("Read Redundant Voltage Registers: 15                       \n");
    printf("Start Adaux Conversion: 16                                 \n");
    printf("Read Adaux Measurement: 17                                 \n");
    printf("Read All Status Registers: 18                              \n");
    printf("Read Device SID: 19                                        \n");
    printf("Soft Reset: 20                                             \n");
    printf("Reset cmd counter: 21                                      \n");
    printf("Snapshot: 22                                               \n");
    printf("Release Snapshot: 23                                       \n");
    printf("Gpio spi communication: 24                                 \n");
    printf("Gpio i2c write to slave: 25                                \n");
    printf("Gpio i2c read from slave: 26                               \n");
    printf("Set reset gpo pins: 27                                     \n");

    printf("\n");
    printf("Print '0' for menu\n");
    printf("Please enter command: \n");
    printf("\n\n");
  }
#endif /* MBED */

  /**
  *******************************************************************************
  * Function: printMsg
  * @brief Print Message.
  *
  * @details This function print message into terminal.
  * Parameters:
  * @param [in] msg    Message string
  *
  * @return None
  *
  *******************************************************************************
  */
  void printMsg(char *msg)
  {
#ifdef MBED
    pc.printf("%s\n\n", msg);
#else /* IAR */
    printf("%s\n\n", msg);
#endif /* MBED */
  }

  /**
  *******************************************************************************
  * Function: printPollAdcConvTime
  * @brief Print Poll adc conversion Time.
  *
  * @details This function print poll adc conversion Time.
  *
  * @return None
  *
  *******************************************************************************
  */
  void printPollAdcConvTime(int count)
  {
#ifdef MBED
    pc.printf("Adc Conversion Time = %fms\n", (float)(count/1000.0));
#else /* IAR */
    printf("Adc Conversion Time = %fms\n", (float)(count/64000.0));
#endif /* MBED */
  }

  /**
  *******************************************************************************
  * Function: getVoltage
  * @brief Get Voltage with multiplication factor.
  *
  * @details This function calculates the voltage.
  *
  * Parameters:
  * @param [in] data    Register value(uint16_t)
  *
  * @return Voltage(float)
  *
  *******************************************************************************
  */
  float getVoltage(int data)
  {
    float voltage;
    voltage = 100e-6 * (int16_t)data; // interpreting as 16-bit to be sure of length so signed works
    return voltage;
  }

  /**
  *******************************************************************************
  * Function: getCurrent
  * @brief Get Current with multiplication factor.
  *
  * @details This function calculates the current.
  *
  * Parameters:
  * @param [in] data    Register value(uint32_t)
  *
  * @return Current(float)
  *
  *******************************************************************************
  */
  float getCurrent(uint32_t data)
  {
    float current;
    current = 1e-6 * ((int32_t)(data << (32-18)) >> (32-18));
    return current;
  }

  /**
  *******************************************************************************
  * Function: getAvgCurrent
  * @brief Get Average Current with multiplication factor.
  *
  * @details This function calculates the current.
  *
  * Parameters:
  * @param [in] data    Register value(uint32_t)
  *
  * @return Current(float)
  *
  *******************************************************************************
  */
  float getAvgCurrent(uint32_t data)
  {
    float current;
    current = 1e-6 * 0.125 * ((int32_t)(data << (32-18)) >> (32-18));
    return current;
  }

  /**
  *******************************************************************************
  * Function: getOverCurrent
  * @brief Get Over Current with multiplication factor.
  *
  * @details This function calculates the over current.
  *
  * Parameters:
  * @param [in] data    Register value(uint8_t)
  *
  * @return Current(float)
  *
  *******************************************************************************
  */
  float getOverCurrent(uint8_t data)
  {
    float over_current;
    over_current = 0.005 * ((int8_t)(data << (8-7)) >> (8-7));
    return over_current;
  }

/** @}*/
/** @}*/