VOS_VOID TAF_SSA_RetryIntervalTimerExpired(VOS_UINT8 ucTi)
{
    TAF_SSA_MSG_BUFF_STRU              *pstBufferdMsg = VOS_NULL_PTR;

    pstBufferdMsg  = TAF_SSA_GetBufferedMsg(ucTi);


    if (TAF_SSA_STATE_CONN_PENDING != gastSsaStatetable[ucTi].enSsaState)
    {
        SSA_LOG(INFO_PRINT, "TAF_SSA_RetryIntervalTimerExpired: ssa state is invalid.");
        TAF_SSA_ClearBufferedMsg(ucTi);
        TAF_SSA_StopTimer(TI_TAF_SSA_RETRY_PERIOD_TIMER, ucTi);
        return;
    }

    /* 取缓存消息 */
    if (VOS_TRUE == pstBufferdMsg->bitOpBufferedBeginReqMsg)
    {
        Taf_SSA_ProcBufferedBeginReqMsg(&pstBufferdMsg->stBufferedBeginReqMsg);
        return;
    }

    SSA_LOG(INFO_PRINT, "TAF_SSA_RetryIntervalTimerExpired: buffered begin req msg is null!");
    TAF_SSA_StopTimer(TI_TAF_SSA_RETRY_PERIOD_TIMER, ucTi);

    return;

}
VOS_VOID SSA_ReportUssdDataSndEvent(VOS_UINT8 ucTi)
{
    TAF_SS_CALL_INDEPENDENT_EVENT_STRU *pstSsEvent;

    pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS,
                                                                    sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU));
    if (VOS_NULL_PTR == pstSsEvent)
    {
        SSA_LOG(ERROR_PRINT, "SSA_ReportUssdDataSndEvent:ERROR: Alloc Mem Fail");
        SSA_TiFree(ucTi);
        return;
    }

    /*对事件上报的内容赋初值*/
    PS_MEM_SET(pstSsEvent, 0 , 4);
    pstSsEvent->SsEvent               =  TAF_SS_EVT_USSD_DATA_SND;
    pstSsEvent->OpId                  = gastSsaStatetable[ucTi].OpId;
    pstSsEvent->ClientId              = gastSsaStatetable[ucTi].ClientId;

    MN_SendClientEvent(pstSsEvent->ClientId,
                       MN_CALLBACK_SS,
                       pstSsEvent->SsEvent,
                       pstSsEvent);

    PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent);

    return;

}
VOS_VOID SSA_ReportErrorEvent(
    VOS_UINT16                          ClientId,
    VOS_UINT8                           OpId,
    TAF_SS_ERROR                        ErrorCode
)
{
    TAF_SS_CALL_INDEPENDENT_EVENT_STRU *pstSsEvent = VOS_NULL_PTR;

    pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS,
                            sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU));
    if (VOS_NULL_PTR == pstSsEvent)
    {
        SSA_LOG( ERROR_PRINT, "TAF_SSA_ReportEvtError: Alloc Mem Fail");
        return;
    }

    /* 出错事件的OP项初始化 */
    PS_MEM_SET(pstSsEvent, 0, sizeof(VOS_UINT32));
    pstSsEvent->OP_Error = VOS_TRUE;

    pstSsEvent->SsEvent  = TAF_SS_EVT_ERROR;

    pstSsEvent->ClientId = ClientId;
    pstSsEvent->OpId     = OpId;

    pstSsEvent->ErrorCode = ErrorCode;

    TAF_SsEventReport(pstSsEvent);

    PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent);

    return;
}
TAF_SSA_TIMER_STATUS_ENUM_UINT8  TAF_SSA_GetTimerStatus(
    TAF_SSA_TIMER_ID_ENUM_UINT8         enTimerId,
    VOS_UINT8                           ucTi
)
{
    TAF_SSA_TIMER_CXT_STRU             *pstSsaTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;

    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_GetTimerStatus: Ti invalid!");
        return TAF_SSA_TIMER_STATUS_STOP;
    }

    pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx;

    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( ( TAF_SSA_TIMER_STATUS_RUNING  == pstSsaTimerCtx[i].enTimerStatus )
          && ( enTimerId                    == pstSsaTimerCtx[i].enTimerId))
        {
            break;
        }
    }

    if ( i >= TAF_SSA_MAX_TIMER_NUM)
    {
        return TAF_SSA_TIMER_STATUS_STOP;
    }

    return TAF_SSA_TIMER_STATUS_RUNING;

}
VOS_VOID  TAF_SSA_StopAllTimer(VOS_UINT8 ucTi)
{

    TAF_SSA_TIMER_CXT_STRU             *pstSsaTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;

    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!");
        return;
    }

    pstSsaTimerCtx =  gastSsaStatetable[ucTi].astSsaTimerCtx;

    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( TAF_SSA_TIMER_STATUS_RUNING  == pstSsaTimerCtx[i].enTimerStatus )
        {
            TAF_SSA_StopTimer(pstSsaTimerCtx[i].enTimerId, ucTi);

            pstSsaTimerCtx[i].hTimer        = VOS_NULL_PTR;
            pstSsaTimerCtx[i].enTimerId     = TI_TAF_SSA_TIMER_BUTT;
            pstSsaTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_STOP;
        }
    }
}
VOS_VOID TAF_SSA_WaitAppRspTimerExpired(VOS_UINT8  ucTi)
{
    TAF_SS_CALL_INDEPENDENT_EVENT_STRU      *pstSsEvent;

    pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU));
    if (VOS_NULL_PTR == pstSsEvent)
    {
        SSA_LOG( ERROR_PRINT, "TAF_SSA_WaitAppRspTimerExpired:ERROR: Alloc Mem Fail");
        return;
    }


    /*察看状态表中当前Ti的相关参数,确定Ti的参数是否有误*/
    if (SSA_IDLE == gastSsaStatetable[ucTi].ucState)
    {
        /*打印异常信息*/
        SSA_LOG(WARNING_PRINT, "TAF_SSA_WaitAppRspTimerExpired:WARNING: Timer out,but Ti not exist");
        PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent);
        return;
    }

    /*向网络侧发送Release Complete消息,并告知原因,与UE 1.5的超时
    处理类似, 向APP进行事件上报*/
    PS_MEM_SET(pstSsEvent, 0, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU));
    pstSsEvent->SsEvent = TAF_SS_EVT_ERROR;
    pstSsEvent->OP_Error = 1;
    pstSsEvent->ClientId = gastSsaStatetable[ucTi].ClientId;
    pstSsEvent->OpId = gastSsaStatetable[ucTi].OpId;

    /* 填写ErrorCode,如果当前有UE主动发起的连接,并且网络超时,ErrorCode需要填成特殊的原因值
        AT上报+CUSD: 5时会用到;其他情况下ErrorCode为TAF_ERR_TIME_OUT */
    if (TAF_SSA_USSD_MT_CONN_STATE == gastSsaStatetable[ucTi].ucUssdFlag)
    {
        pstSsEvent->ErrorCode = TAF_ERR_USSD_USER_TIMEOUT;
    }
    else
    {
        pstSsEvent->ErrorCode = TAF_ERR_TIME_OUT;
    }


    TAF_SsEventReport(pstSsEvent);
    PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent);

    SSA_ReturnError(0, ucTi, TAF_SS_MSG_TYPE_RLCOMPLETE,SS_CAUSE_RECOVERY_TIMER_EXPIRY);
}
VOS_VOID  TAF_SSA_RcvTimerExpired(
    TAF_SSA_TIMER_ID_ENUM_UINT8         enTimerId,
    VOS_UINT8                           ucTi
)
{
    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_RcvTimerExpired: Ti invalid!");
        return;
    }

    TAF_SSA_StopTimer(enTimerId, ucTi);

    switch (enTimerId)
    {
        case TI_TAF_SSA_WAIT_NETWORK_RSP_TIMER:
            TAF_SSA_WaitNetworkRspTimerExpired(ucTi);
            break;

        case TI_TAF_SSA_WAIT_APP_RSP_TIMER:
            TAF_SSA_WaitAppRspTimerExpired(ucTi);
            break;

        case TI_TAF_SSA_RETRY_PERIOD_TIMER:
            /*lint -e522*/
            TAF_SSA_RetryPeriodTimerExpired(ucTi);
            /*lint +e522*/
            break;

        case TI_TAF_SSA_RETRY_INTERVAL_TIMER:
            TAF_SSA_RetryIntervalTimerExpired(ucTi);
            break;

        default:
            SSA_LOG(WARNING_PRINT, "TAF_SSA_RcvTimerExpired: timer id is invalid!");
            break;
    }

    return;
}
VOS_UINT16  SSA_GetUssdTransMode(VOS_VOID)
{
    /* 若g_usTafSsaUssdTransMode非法,则返回AT_USSD_TRAN_MODE */
    if ((AT_USSD_NON_TRAN_MODE != g_usTafSsaUssdTransMode)
     && (AT_USSD_TRAN_MODE != g_usTafSsaUssdTransMode))
    {
        SSA_LOG(WARNING_PRINT, "SSA_GetUssdTransMode: usUssdTransMode is Abnormal!");

        return AT_USSD_TRAN_MODE;
    }

    /* g_usTafSsaUssdTransMode值合法 */
    return g_usTafSsaUssdTransMode;
}
VOS_UINT32  TAF_SSA_GetTimerRemainLen(
    TAF_SSA_TIMER_ID_ENUM_UINT8         enTimerId,
    VOS_UINT8                           ucTi
)
{
    VOS_UINT32                          ulTick;
    TAF_SSA_TIMER_CXT_STRU             *pstSsaTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;

    ulTick         = 0;

    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_GetTimerRemainLen: Ti invalid!");
        return ulTick;
    }

    pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx;

    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( ( TAF_SSA_TIMER_STATUS_RUNING  == pstSsaTimerCtx[i].enTimerStatus )
          && ( enTimerId                    == pstSsaTimerCtx[i].enTimerId))
        {
            break;
        }
    }

    if (i >= TAF_SSA_MAX_TIMER_NUM)
    {
        /* 不存在说明此定时器已超时或停止 */
        ulTick = 0;
        return ulTick;
    }

    /* 句柄为空时,说明此定时器已超时或停止 */
    if (VOS_NULL_PTR != pstSsaTimerCtx[i].hTimer)
    {
        if (VOS_OK != VOS_GetRelTmRemainTime(&(pstSsaTimerCtx[i].hTimer), &ulTick))
        {
            ulTick = 0;
        }
    }

    /* tick值乘以10转换为毫秒 */
    return ulTick * TAF_SSA_TIMER_TICK;
}
VOS_VOID  TAF_SSA_StopTimer(
    TAF_SSA_TIMER_ID_ENUM_UINT8         enTimerId,
    VOS_UINT8                           ucTi
)
{
    TAF_SSA_TIMER_CXT_STRU             *pstSsTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;

    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!");
        return;
    }

    pstSsTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx;

    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( (TAF_SSA_TIMER_STATUS_RUNING  == pstSsTimerCtx[i].enTimerStatus )
          && (enTimerId                    == pstSsTimerCtx[i].enTimerId))
        {
            break;
        }
    }

    if ( i >= TAF_SSA_MAX_TIMER_NUM)
    {
        SSA_LOG1(WARNING_PRINT, "TAF_SSA_StopTimer:too many timer", enTimerId);
        return;
    }

    /* 停止VOS定时器: 当定时器的指针已经为空的时候, 说明其已经停止或者超时 */
    if (VOS_NULL_PTR != pstSsTimerCtx[i].hTimer)
    {
        (VOS_VOID)NAS_StopRelTimer(WUEPS_PID_SS, enTimerId, &pstSsTimerCtx[i].hTimer);
    }

    pstSsTimerCtx[i].hTimer        = VOS_NULL_PTR;
    pstSsTimerCtx[i].enTimerId     = TI_TAF_SSA_TIMER_BUTT;
    pstSsTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_STOP;

    return;
}
VOS_UINT32  TAF_SSA_StartTimer(
    TAF_SSA_TIMER_ID_ENUM_UINT8         enTimerId,
    VOS_UINT32                          ulLen,
    VOS_UINT8                           ucTi
)
{
    TAF_SSA_TIMER_CXT_STRU             *pstSsaTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;
    VOS_UINT32                          ulRet;
    VOS_TIMER_PRECISION_ENUM_UINT32     ulPrecision;
    NAS_TIMER_OPERATION_STRU            stTimer;

    /*TI有效范围是0-6,8-14*/
    if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi))
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!");
        return VOS_FALSE;
    }

    pstSsaTimerCtx   =  gastSsaStatetable[ucTi].astSsaTimerCtx;

    if (0 == ulLen)
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_StartTimer: timer len is zero!");
        return VOS_FALSE;
    }

    /* 如果该定时器已经启动则直接返回 */
    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( ( TAF_SSA_TIMER_STATUS_RUNING == pstSsaTimerCtx[i].enTimerStatus )
          && ( enTimerId                   == pstSsaTimerCtx[i].enTimerId))
        {
            SSA_LOG1(WARNING_PRINT, "TAF_SSA_StartTimer:timer is running", enTimerId);
            return VOS_FALSE;
        }
    }

    for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ )
    {
        if ( TAF_SSA_TIMER_STATUS_STOP == pstSsaTimerCtx[i].enTimerStatus )
        {
            break;
        }
    }

    if ( i >= TAF_SSA_MAX_TIMER_NUM)
    {
        SSA_LOG1(WARNING_PRINT, "TAF_SSA_StartTimer:too many timer", enTimerId);

        return VOS_FALSE;
    }

    if ( ulLen >= VOS_TIMER_MAX_LENGTH )
    {
        ulLen = VOS_TIMER_MAX_LENGTH - 1;
    }

    ulPrecision = NAS_GetTimerPrecision(WUEPS_PID_SS, enTimerId);

    ulRet = VOS_StartRelTimer(&(pstSsaTimerCtx[i].hTimer),
                              WUEPS_PID_SS,
                              ulLen,
                              enTimerId,
                              ucTi,
                              VOS_RELTIMER_NOLOOP,
                              ulPrecision);

    if ( VOS_OK != ulRet)
    {
        SSA_LOG(WARNING_PRINT, "TAF_SSA_StartTimer: start timer failed!");

        return VOS_FALSE;
    }

    pstSsaTimerCtx[i].enTimerId     = enTimerId;
    pstSsaTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_RUNING;


    /* 定时器状态勾包出来 */
    stTimer.MsgHeader.ulSenderCpuId    = VOS_LOCAL_CPUID;
    stTimer.MsgHeader.ulSenderPid      = WUEPS_PID_SS;
    stTimer.MsgHeader.ulReceiverCpuId  = VOS_LOCAL_CPUID;
    stTimer.MsgHeader.ulReceiverPid    = VOS_PID_TIMER;
    stTimer.MsgHeader.ulLength         = sizeof(NAS_TIMER_OPERATION_STRU) - VOS_MSG_HEAD_LENGTH;
    stTimer.MsgHeader.ulMsgName        = enTimerId;
    stTimer.ulTimeAction               = NAS_TIMER_OPERATION_START;
    stTimer.ulTimeLen                  = ulLen;

    DIAG_TraceReport(&stTimer);

    NAS_TIMER_EventReport(stTimer.MsgHeader.ulMsgName, WUEPS_PID_SS, NAS_OM_EVENT_TIMER_OPERATION_START);

    return VOS_TRUE;
}