/*****************************************************************************
 函 数 名  : FC_ACORE_CResetCallback
 功能描述  : FcACore需要注册到底软C核复位接口中的回调函数
 输入参数  : DRV_RESET_CALLCBFUN_MOMENT enParam 指示时复位处理前还是复位成功后
             int userdata                       用户自定义数据
 输出参数  : 无
 返 回 值  : VOS_OK/VOS_ERR
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2013年4月22日
    作    者   : caikai
    修改内容   : 新生成函数

*****************************************************************************/
VOS_INT FC_ACORE_CResetCallback(DRV_RESET_CALLCBFUN_MOMENT enParam, VOS_INT userdata)
{
    VOS_UINT32                   ulResult;


    if ( DRV_RESET_CALLCBFUN_RESET_BEFORE == enParam )      /* 复位处理时调用 */
    {
        FC_ACORE_CResetSendNotify(ID_FC_ACORE_CRESET_START_IND);

        ulResult = VOS_SmP(g_ulFcACoreCResetDoneSem, FC_ACORE_CRESET_TIMEOUT_LEN);
        if (VOS_OK != ulResult)
        {
            FC_LOG1(PS_PRINT_ERROR,
                          "FC_ACORE_CRESET_Callback, wait g_ulFcACoreResetDoneSem timeout! ulResult = %d\r\n", (VOS_INT32)ulResult);

            return VOS_ERR;
        }
    }
    else if ( DRV_RESET_CALLCBFUN_RESET_AFTER == enParam )   /* 复位成功后调用 */
    {
        FC_ACORE_CResetSendNotify(ID_FC_ACORE_CRESET_END_IND);
    }
    else
    {
        FC_LOG(PS_PRINT_ERROR,"FC_ACORE_CResetCallback, enParam invalid !\n");
        return VOS_ERR;
    }

    return VOS_OK;
}
/*****************************************************************************
 函 数 名  : FC_UL_UpRateLimit
 功能描述  : 加强HSUPA上行发送速率限制,降低发送速率
 输入参数  : ulSndRate    --  发送速率百分比
             ulPolicyMask --  流控策略掩码
 输出参数  : 无
 返 回 值  : 无
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2011年12月5日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
VOS_UINT32 FC_UL_UpRateLimit( VOS_UINT32 ulUlRate, VOS_UINT32 ulPolicyId )
{
    VOS_UINT32                          ulRateLimit;


    /* 前16位记录当前档位的流控百分比,用于启流控 */
    ulRateLimit = ulUlRate >> 16;

    if ( FC_POLICY_MASK_CPU_C == FC_POLICY_MASK(ulPolicyId))
    {
        g_ulFcUlRateCpu = ulRateLimit;
    }
    else if ( FC_POLICY_MASK_TMP == FC_POLICY_MASK(ulPolicyId))
    {
        g_ulFcUlRateTmp = ulRateLimit;
    }
    else
    {
        FC_LOG1(PS_PRINT_WARNING,
                "FC_UL_UpRateLimit, ERROR, Invalid ulPolicyId %d\n",
                (VOS_INT32)ulPolicyId);
        return VOS_ERR;
    }

    return VOS_OK;
}
/*****************************************************************************
 函 数 名  : FC_RecoverUlGradeProcess
 功能描述  : 恢复上行速率,不做限制
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2012年1月18日
    作    者   : FC_RecoverUlGradeProcess
    修改内容   : 新生成函数

*****************************************************************************/
VOS_VOID  FC_RecoverUlGradeProcess( VOS_VOID )
{
    FC_POLICY_STRU                     *pstFcPolicy;


    if ( FC_POLICY_MASK_TMP != (FC_POLICY_MASK_TMP & g_stFcCfg.ulFcEnbaleMask) )
    {
        /* 温控未使能 */
        FC_LOG1(PS_PRINT_INFO, "FC_RecoverUlGradeProcess, INFO, TMP FlowCtrl is disabled %d\n",
                (VOS_INT32)g_stFcCfg.ulFcEnbaleMask);
        return;
    }

    pstFcPolicy = FC_POLICY_Get(FC_PRIVATE_POLICY_ID_TMP_MODEM_0);

    if ( FC_PRI_NULL == pstFcPolicy->enDonePri )
    {
        /* 已经恢复,无须再处理 */
        return;
    }

    FC_TEMPERATURE_SndCtrlMsg(ID_FC_TEMPERATURE_RECOVER_IND);

    return;
}
/*****************************************************************************
 函 数 名  : FC_UL_DownRateLimit
 功能描述  : 减弱HSUPA上行发送速率限制,提高发送速率
 输入参数  : ulSndRate    --  发送速率百分比
             ulPolicyMask --  流控策略掩码
 输出参数  : 无
 返 回 值  : 无
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2011年12月5日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
VOS_UINT32 FC_UL_DownRateLimit( VOS_UINT32 ulUlRate, VOS_UINT32 ulPolicyId )
{
    VOS_UINT32                          ulRateLimit;


    /* 后16位记录下一个更低先级档位的流控百分比,用于解流控 */
    ulRateLimit = ulUlRate & FC_DOWN_RATE_LIMIT_MASK;

    if ( FC_POLICY_MASK_CPU_C == FC_POLICY_MASK(ulPolicyId))
    {
        g_ulFcUlRateCpu = ulRateLimit;
    }
    else if ( FC_POLICY_MASK_TMP == FC_POLICY_MASK(ulPolicyId))
    {
        g_ulFcUlRateTmp = ulRateLimit;
    }
    else
    {
        FC_LOG1(PS_PRINT_WARNING,
                "FC_UL_DownRateLimit, ERROR, Invalid ulPolicyId %d\n",
                (VOS_INT32)ulPolicyId);
        return VOS_ERR;
    }

    return VOS_OK;
}
/*****************************************************************************
 函 数 名  : FC_UpUlGradeProcess
 功能描述  : OM温控模块检测到温度恢复可以升速时,调用注册的升速处理API
 输入参数  : 无
 输出参数  : 无
 返 回 值  : OM_DATA_DOWMGRADE_CONTINUE --  可以继续控
             OM_DATA_DOWNGRADE_FINISH   --  不能继续控
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2011年12月5日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
SPY_DATA_UPGRADE_RESULT_ENUM_UINT32 FC_UpUlGradeProcess(VOS_VOID)
{
    FC_POLICY_STRU                     *pstFcPolicy;

    if ( FC_POLICY_MASK_TMP != (FC_POLICY_MASK_TMP & g_stFcCfg.ulFcEnbaleMask) )
    {
        /* 温控未使能 */
        FC_LOG1(PS_PRINT_INFO, "FC_UpUlGradeProcess, INFO, TMP FlowCtrl is disabled %d\n",
                (VOS_INT32)g_stFcCfg.ulFcEnbaleMask);
        return SPY_DATA_UPGRADE_FINISH;
    }

    pstFcPolicy = FC_POLICY_Get(FC_PRIVATE_POLICY_ID_TMP_MODEM_0);

    if ( FC_PRI_NULL == pstFcPolicy->enDonePri )
    {
        /* 已经达到流控最低级别,无法继续解流控 */
        return SPY_DATA_UPGRADE_FINISH;
    }

    FC_TEMPERATURE_SndCtrlMsg(ID_FC_TEMPERATURE_UNDERLOAD_IND);

    return SPY_DATA_UPGRADE_CONTINUE;
}
/*****************************************************************************
 函 数 名  : FC_UL_InitFcPoints
 功能描述  : 控制HSUPA上行发送速率
 输入参数  : ucPolicyId --  策略ID
             pstUlFcCfg --  策略流控配置
 输出参数  : 无
 返 回 值  : 无
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2011年12月5日
    作    者   :
    修改内容   : 新生成函数

*****************************************************************************/
VOS_UINT32 FC_UL_InitFcPoints
(
    FC_POLICY_ID_ENUM_UINT8             enPolicyId,
    FC_CFG_UM_UL_RATE_STRU             *pstUlFcCfg
)
{
    FC_REG_POINT_STRU                   stFcRegPoint;
    VOS_UINT32                          ulRateLoop;
    VOS_UINT16                          usCurrRate;
    VOS_UINT16                          usPrevRate = FC_HSUPA_RATE_MAX_KBPS;
    FC_ID_ENUM_UINT8                    enFcId;
    FC_PRI_ENUM_UINT8                   enPri = FC_PRI_LOWEST;

    if (FC_POLICY_ID_CPU_C == enPolicyId)
    {
        enFcId = FC_ID_UL_RATE_1_FOR_CPU;
    }
    else if (FC_POLICY_ID_TMP == enPolicyId)
    {
        enFcId = FC_ID_UL_RATE_1_FOR_TMP;
    }
    /* 目前,只针对CCPU和TMP提供了按档位控速率功能,其他函数不能使用 */
    else
    {
        FC_LOG1(PS_PRINT_WARNING,
                "FC_UL_InitFcPoints, ERROR, wrong ulPolicyId %d\n",
                (VOS_INT32)enPolicyId);

        return VOS_ERR;
    }

    /* NV项中CCPU和TMP的档位预留了最大11档,但是优先级最高为FC_PRI_9,所以使用档位时只有前9档生效 */
    for ( ulRateLoop = 0 ; ulRateLoop < pstUlFcCfg->ucRateCnt ; ulRateLoop++ )
    {
        usCurrRate = pstUlFcCfg->ausRate[ulRateLoop];

        stFcRegPoint.enPolicyId = enPolicyId;
        stFcRegPoint.enFcPri    = enPri;
        stFcRegPoint.enFcId     = enFcId;
        stFcRegPoint.enModemId  = MODEM_ID_0;

        /* 解流控时将数率限制设为上一档 */
        stFcRegPoint.ulParam1   = (((VOS_UINT32)usCurrRate) << 16) | (((VOS_UINT32)usPrevRate) & FC_DOWN_RATE_LIMIT_MASK);
        stFcRegPoint.ulParam2   = enPolicyId;
        stFcRegPoint.pSetFunc   = (FC_SET_FUNC)FC_UL_UpRateLimit;
        stFcRegPoint.pClrFunc   = (FC_CLR_FUNC)FC_UL_DownRateLimit;
        stFcRegPoint.pRstFunc   = VOS_NULL_PTR;

        FC_POINT_Reg(&stFcRegPoint);

        enFcId++;

        if ( FC_PRI_HIGHEST == enPri )
        {
            break;
        }

        enPri++;
        usPrevRate = usCurrRate;

    }

    return VOS_OK;
}