static void charge_core_sbatt_handler(int vbat, struct charge_segment_data segment_data[], struct charge_core_data *data)
{
    /*not fcp do not use segment charging strategy */
    if(FCP_STAGE_SUCESS != fcp_get_stage_status())
    {
        return ;
    }

    switch (data->segment_type) {
    case SEGMENT_TYPE_BY_VBAT_ICHG:
        hwlog_debug("case = SEGMENT_TYPE_BY_VBAT_ICHG. \n");
        charge_core_sbatt_by_vbat_ichg_handler(vbat, segment_data, data);
        break;
    case SEGMENT_TYPE_BY_VBAT:
        hwlog_debug("case = SEGMENT_TYPE_BY_VBAT. \n");
        charge_core_sbatt_by_vbat_handler(vbat, segment_data, data);
        break;
    default:
        break;
    }
}
/**********************************************************
*  Function:       charge_core_protect_inductance_handler
*  Discription:    update the charge parameters in different capacity to protect inductance
*  Parameters:   cbat:battery capacity
*                      inductance_data[]:the table for describe the inductance property
*                      data:charge parameters
*  return value:  NULL
**********************************************************/
static void charge_core_protect_inductance_handler(int cbat, struct charge_inductance_data inductance_data[], struct charge_core_data *data)
{

    int i;
    static int last_i = 0;
    static int last_iin = 0;
    static int last_cbat = 0;
    static int flag_running_first = 1;
    /*not fcp do not use segment charging strategy */
    if(FCP_STAGE_SUCESS != fcp_get_stage_status())
    {
        return ;
    }

    for (i = 0; i < INDUCTANCE_PARA_LEVEL; i++)
    {
        if ((cbat >= inductance_data[i].cap_min) && (cbat < inductance_data[i].cap_max))
        {
            if ((last_i - i <= 0) || (inductance_data[i].cap_max - cbat > inductance_data[i].cap_back)
                    || (abs(last_i - i) > 1) || (flag_running_first == 1))
            {
                data->iin = data->iin < inductance_data[i].iin_inductance ? data->iin : inductance_data[i].iin_inductance;
            }
            else
            {
                data->iin = data->iin < last_iin ? data->iin : last_iin;
            }
            break;
        }
    }

    last_i = i;
    flag_running_first = 0;
    last_cbat = cbat;
    last_iin = data->iin;

    hwlog_info("%s : battery capacity is %%%d, last_iin set to %d ma,i = %d \n",__func__, cbat, data->iin,i);
}
/**********************************************************
*  Function:       charge_core_sbatt_handler
*  Discription:    update the charge parameters in different segment charging
*  Parameters:   vbat:battery voltage
*                      segment_data[]:the table for describe the segment property
*                      data:charge parameters
*  return value:  NULL
**********************************************************/
static void charge_core_sbatt_handler(int vbat, struct charge_segment_data segment_data[], struct charge_core_data *data)
{
    int i,ichg;
    static int last_i = 0;
    static int last_vterm = 0;
    static int last_ichg = 0;
    static int last_vbat = 0;
    static int flag_running_first = 1;

    /*not fcp do not use segment charging strategy */
    if(FCP_STAGE_SUCESS != fcp_get_stage_status())
    {
        return ;
    }

    ichg =  -hisi_battery_current();

    /* choose index of segment_data */
    for (i = 0; i < SEGMENT_PARA_LEVEL; i++)
    {
        if ((vbat >= segment_data[i].vbat_min) && (vbat < segment_data[i].vbat_max) && ichg < segment_data[i].ichg_segment)
        {
            if ((last_i - i <= 0) || (segment_data[i].vbat_max - vbat > segment_data[i].volt_back)
                    || (abs(last_i - i) > 1) || (flag_running_first == 1))
            {
                /*do nothing,just get index "i" */
            }
            else
            {
                i = i+1;
            }
            break;
        }
    }

    /* if cannot choose right index ,keep last index  */
    if(i == SEGMENT_PARA_LEVEL)
    {
        i=last_i;
    }

    /* set ichg and vterm according to index  only when two consecutive index is the same ,or keep last ichg and vterm */
    if(last_i == i || flag_running_first == 1)
    {
        data->ichg = data->ichg < segment_data[i].ichg_segment ? data->ichg : segment_data[i].ichg_segment;
        data->vterm = data->vterm < segment_data[i].vterm_segment ? data->vterm : segment_data[i].vterm_segment;
    }
    else
    {
        data->ichg = data->ichg < last_ichg ? data->ichg :last_ichg;
        data->vterm = data->vterm < last_vterm ? data->vterm : last_vterm;
    }
    hwlog_info("%s :ichg = %d,vbat =%d , last_i =%d, i =%d,segment_data[i].ichg_segment =%d ,data->ichg =%d ,last_ichg = %d \n",
               __func__,ichg,vbat,last_i,i,segment_data[i].ichg_segment,data->ichg,last_ichg);

    last_i = i;
    flag_running_first = 0;
    last_vbat = vbat;
    last_ichg = data->ichg;
    last_vterm = data->vterm;

}