state = GetEndptStateFromVHD( pstnEvt->vhdHdl ); //获取线路对象
switch ( pstnEvt->pEventInfo->event )
case PSTN_CTL_EVT_CPTONE_TIMEOUT : //摘机后等待播号音超时
//给用户上报等待进展音超时事件
(*endptConfig.notify)( state->endptArchive, -1, EPEVT_CPTONETIMEOUT, NULL, 0, -1 );
case PSTN_CTL_EVT_CALL_SETUP_COMPLETE : //呼叫完成
if( state->offHook == VRG_TRUE) //已经摘机
//还未与FXS口关联
if( (state->isFxsFxoCnxEstablished == VRG_FALSE) && (state->routedFxsLineId !=
state->lineId) )
//将PSTN线路VHD与FXS线路VHD相连
ConnectSB( state->lineId, state->routedFxsLineId );
state->isFxsFxoCnxEstablished = VRG_TRUE; //标记已经关联FXS口
//设置摘机来显检测
classRxConfigure( state->pstnVhdHdl, CLASS_MSG_OFFHOOK_CLID,
endptConfig.country )
xdrvLedCtrl(state->lineId, 1); //开启PSTN线路LED显示
//上报呼叫完成
(*endptConfig.notify)( state->endptArchive, -1, EPEVT_OPCOMPLETE, NULL, 0 , -1);
case PSTN_CTL_EVT_VALID_DTMFCLID: //检测到有效来显
case PSTN_CTL_EVT_PARTIAL_DTMFCLID: //检测到部分来显
dtmfClidInfo = (PSTN_CTL_CLID_EVENT_INFO *)pstnEvt->pEventInfo->pInfo;
//COPY来显号码
strncpy( vrgClidRxData.number, dtmfClidInfo->clidData.callingNumber,
sizeof(vrgClidRxData.number) );
//匿名或出错来显
if( dtmfClidInfo->clidData.infoRecieved == DTMFCLIDRX_INFO_PRIVATE )
vrgClidRxData.reasonNoNumber = 'P';
strncpy( vrgClidRxData.number, "Private", sizeof(vrgClidRxData.number) );
else if( dtmfClidInfo->clidData.infoRecieved == DTMFCLIDRX_INFO_UNAVAILABLE )
vrgClidRxData.reasonNoNumber = 'O';
strncpy( vrgClidRxData.number, "Unavailable", sizeof(vrgClidRxData.number) );
else if( dtmfClidInfo->clidData.infoRecieved == DTMFCLIDRX_INFO_ERROR )
vrgClidRxData.reasonNoNumber = 'E';
strncpy( vrgClidRxData.number, "Error", sizeof(vrgClidRxData.number) );
else if( dtmfClidInfo->clidData.infoRecieved == DTMFCLIDRX_INFO_NONE )
if( strlen(dtmfClidInfo->clidData.callingNumber) == 0 )
vrgClidRxData.reasonNoNumber = 'O';
strncpy( vrgClidRxData.number, "Unavailable", sizeof(vrgClidRxData.number) );
//上报检测到DTMF来显事件
(*endptConfig.notify)( state->endptArchive, -1, EPEVT_DTMF_CLIDRX,
(void *)&vrgClidRxData, sizeof(vrgClidRxData), 0 );
case PSTN_CTL_EVT_INVALID_DTMFCLID: //检测到无效的来显
//仅一条打印信息
VRG_LOG_NOTICE(( VRG_LOG_MOD_EPT, "PstnEventCallback:
PSTN_CTL_EVT_INVALID_DTMFCLID"));
//释放信号量,用于应答
bosSemGive( &vrgPstnSem );
ENDPT_410_PstnEventProcess
最新推荐文章于 2014-11-05 13:30:40 发布