/***************************************************************************** Function Name : IMSA_ProcMmaMsgStartReq() Description : MMA开机消息处理函数 Input : VOS_VOID *pRcvMsg Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-06-21 Draft Enact *****************************************************************************/ VOS_VOID IMSA_ProcMmaMsgStartReq(VOS_VOID ) { IMSA_CONTROL_MANAGER_STRU *pstControlManager; static VOS_UINT8 ucD2ImsTaskStart = 0; pstControlManager = IMSA_GetControlManagerAddress(); if(ucD2ImsTaskStart == 0) { /*初始化D2协议栈*/ (VOS_VOID)IMSA_ImsInit(); ucD2ImsTaskStart ++; } /*判断开机状态,如果已开机,则回复开机成功*/ if(pstControlManager->enImsaStatus == IMSA_STATUS_STARTED) { IMSA_SndMmaMsgStartCnf(); return; } /*已处于开机过程状态,则丢弃*/ if(pstControlManager->enImsaStatus == IMSA_STATUS_STARTING) { IMSA_WARN_LOG("IMSA_ProcMmaMsgStartReq: Status is Starting!"); return; } IMSA_StopTimer(&pstControlManager->stProtectTimer); /*初始化*/ /*读取NV*/ IMSA_ReadImsaNV(); /*通知IMS开机,转状态*/ pstControlManager->enImsaStatus = IMSA_STATUS_STARTING; IMSA_SndImsMsgStartReq(); IMSA_StartTimer(&pstControlManager->stProtectTimer); /*卡在位,则读取卡信息*/ if(pstControlManager->enImsaIsimStatus == IMSA_ISIM_STATUS_AVAILABLE) { IMSA_INFO_LOG("IMSA_ProcMmaMsgStartReq: ISIM is available!"); IMSA_ReadIsimFile(); } }
VOS_VOID IMSA_ProcImsMsgUssdReasonNotify(const IMSA_IMS_OUTPUT_USSD_EVENT_STRU *pstOutUssdEvt) { IMSA_USSD_MANAGER_STRU *pstUssdManager; TAF_SS_USSD_STRING_STRU stUssdString = {0}; IMSA_INFO_LOG("IMSA_ProcImsMsgUssdReasonNotify is entered"); pstUssdManager = IMSA_USSD_GetEntityAddress(); if (IMSA_USSD_MT_CONN_STATE == pstUssdManager->enUssdState) { IMSA_INFO_LOG("IMSA_ProcImsMsgUssdReasonNotify:state is err"); return; } stUssdString.usCnt = pstOutUssdEvt->usMessageLen; IMSA_MEM_CPY( stUssdString.aucUssdStr, pstOutUssdEvt->aucMessage, pstOutUssdEvt->usMessageLen); if (IMSA_USSD_MO_CONN_STATE == pstUssdManager->enUssdState) { /*停止等待网侧响应定时器*/ IMSA_StopTimer(&(pstUssdManager->stUssdWaitNetRspTimer)); (VOS_VOID)IMSA_SendSpmUssdNotifyIndEvt( pstUssdManager->usClientId, pstUssdManager->ucOpId, pstOutUssdEvt->encType, &stUssdString); } else { /*USSD在状态IMSA_USSD_IDLE_STATE的处理*/ /*网侧主动触发流程*/ (VOS_VOID)IMSA_SendSpmUssdNotifyIndEvt( 0x3fff, 0, pstOutUssdEvt->encType, &stUssdString); } /*启动等待APP响应定时器*/ IMSA_StartTimer(&(pstUssdManager->stUssdWaitAppRspTimer)); pstUssdManager->enUssdState = IMSA_USSD_MT_CONN_STATE; return; }
/***************************************************************************** Function Name : IMSA_ProcMmaMsgStopReq() Description : MMA关机消息处理函数 Input : VOS_VOID Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-06-21 Draft Enact *****************************************************************************/ VOS_VOID IMSA_ProcMmaMsgStopReq(VOS_VOID ) { IMSA_CONTROL_MANAGER_STRU *pstControlManager; IMSA_INFO_LOG("IMSA_ProcMmaMsgStopReq: enter!"); pstControlManager = IMSA_GetControlManagerAddress(); /* SRVCC异常(例如关机,DEREG REQ,状态迁离CONN+REG),清缓存 */ IMSA_SrvccAbormalClearBuff(IMSA_SRVCC_ABNORMAL_STOP_REQ); /*判断状态,如果已关机,则回复关机成功*/ if(pstControlManager->enImsaStatus == IMSA_STATUS_NULL) { IMSA_SndMmaMsgStopCnf(); return; } /*已处于关机状态,则丢弃*/ if(pstControlManager->enImsaStatus == IMSA_STATUS_STOPING) { IMSA_WARN_LOG("IMSA_ProcMmaMsgStopReq: Status is Stoping!"); return; } /*停止开关机保护定时器*/ IMSA_StopTimer(&pstControlManager->stProtectTimer); /*通知IMS关机,转状态*/ pstControlManager->enImsaStatus = IMSA_STATUS_STOPING; /*关机后,卡在位时,需要将卡状态置为有效,因为可能有卡无效的场景,需要关机后清除状态*/ if(pstControlManager->enImsaIsimStatus != IMSA_ISIM_STATUS_ABSENT) { pstControlManager->enImsaIsimStatus = IMSA_ISIM_STATUS_AVAILABLE; } IMSA_SndImsMsgStopReq(); /*启动开关机保护定时器*/ IMSA_StartTimer(&pstControlManager->stProtectTimer); }
/***************************************************************************** Function Name : IMSA_SMS_ProcNwSmsReceived() Description : 收到网络的短信内容的处理函数 Input : HICSM_OutputSms *pstOutSms Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-08-10 Draft Enact *****************************************************************************/ VOS_VOID IMSA_SMS_ProcNwSmsReceived(const IMSA_IMS_OUTPUT_SMS_EVENT_STRU *pstOutSms) { IMSA_SMS_SMR_MO_STRU *pstSmrMoEntity; IMSA_SMS_SMR_MT_STRU *pstSmrMtEntity; /*根据消息类型处理*/ switch(pstOutSms->aucMessage[0]) { /*MT RP Data*/ case IMSA_SMS_NTM_DATA_TYPE_RP_DATA: pstSmrMtEntity = IMSA_SMS_GetSmrMtEntityAddress(); if(pstSmrMtEntity->enState != IMSA_SMS_SMR_STATE_IDLE) { IMSA_WARN_LOG("IMSA_SMS_ProcNwSmsReceived: Mt entity is not idle!"); break; } /*MT短信,MT实体转状态,保存MR,启动TI_IMSA_SMS_TR2M定时器*/ pstSmrMtEntity->enState = IMSA_SMS_SMR_STATE_WAIT_TO_SND_RP_ACK; pstSmrMtEntity->ucMessageReference = (VOS_UINT8)pstOutSms->aucMessage[1]; IMSA_StartTimer(&pstSmrMtEntity->stTimerInfo); /*短信数据发给MSG*/ IMSA_SMS_SndMsgDataInd((VOS_UINT8*)pstOutSms->aucMessage,\ pstOutSms->ucMessageLen); break; /*MO RP ACK*/ case IMSA_SMS_NTM_DATA_TYPE_RP_ACK: pstSmrMoEntity = IMSA_SMS_GetSmrMoEntityAddress(); if(IMSA_SMS_SMR_STATE_WAIT_FOR_RP_ACK != pstSmrMoEntity->enState) { IMSA_WARN_LOG("IMSA_SMS_ProcNwSmsReceived: Mo entity is not WAIT_FOR_RP_ACK!"); break; } if(pstOutSms->aucMessage[1] != pstSmrMoEntity->ucMessageReference) { IMSA_WARN_LOG("IMSA_SMS_ProcNwReportReceived: MR is not equel."); break; } /*MO实体状态进行空闲态,停止TI_IMSA_SMS_TR1M保护定时器*/ pstSmrMoEntity->enState = IMSA_SMS_SMR_STATE_IDLE; IMSA_StopTimer(&pstSmrMoEntity->stTR1MTimer); if (IMSA_SMS_TRUE == pstSmrMoEntity->ucMemAvailFlg) { /* 此过程是mem avail过程 */ pstSmrMoEntity->ucMemAvailFlg = IMSA_SMS_FALSE; /* 清除mem avail标志 */ pstSmrMoEntity->ucRetransFlg = IMSA_SMR_RETRANS_PERMIT; /* 复位重发标志 */ } IMSA_SMS_SndMsgReportInd(SMR_SMT_ERROR_NO_ERROR, (VOS_UINT8*)pstOutSms->aucMessage,\ pstOutSms->ucMessageLen); IMSA_CMCCDeregProc(); break; case IMSA_SMS_NTM_DATA_TYPE_RP_ERR: IMSA_SMS_ProcNwSmsRpError(pstOutSms); break; default: IMSA_WARN_LOG("IMSA_SMS_ProcNwReportReceived: Msg Type ERR."); break; } }