ENDPT_410_HapiEndptEventProcess

state = GetEndptStateFromVHD( hapiEvt->handle );	//获取线路对象

switch( hapiEvt->eventId )
case HAPI_PTE_TONE_ON_EVT:	//DTMF按键ON事件
	VRG_UINT8    tone = hapiEvt->op2.val & 0xFF;	//获取按键音
	
	//如果按键音大于正常按键,则为长按键,这里上报上按键,但后面事件处理对长按
//键忽略
	if ( tone >= HAPI_PTE_DTMFDMAXDGT )
		(*endptConfig.notify)( state->endptArchive, -1, EPEVT_DTMFL, NULL, 0, -1 );
	else
		//查找按键映射
		const EPZPTEDIGIT2EPEVTMAP *digitMap = digit2epevtMap;
		while(( digitMap->digit != tone ) &&( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ))
			digitMap++;
		
		//如果找到合法的按键映射
		if(( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ) && (digitMap->epEvent != 
		EPEVT_NULL))
			//已经在相关联的line vhd上到了按键事件,所以pstn vhd需要过滤
			if( state->endptType == EPTYPE_PSTN && state->pstnVhdHdl == hapiEvt->handle )
				; //NULL代码
			else
				if( state->endptType == EPTYPE_PSTN )	//如果是FXO口线路
                	pstnEvt.hsxdevhdl = state->pstnVhdHdl;
                    pstnEvt.hsxevt = PSTN_CTL_EVT_DTMF_DIGIT;
                    pstnEvt.hsxop1 = digitMap->digit;
                    pstnEvt.hsxop2.ref = NULL;
					pstnCtlSendEvent( &pstnEvt );	//给PSTN控制块任务发送按键事件
			
			//上报DTMF ON按键事件
			(*endptConfig.notify)( state->endptArchive, -1, digitMap->epEvent, NULL, 0, 
			EPDTMFACT_TONEON);
			
			if( state->endptType != EPTYPE_PSTN )	//非FXO口类型
				//如果检测到是A或D,来给来显状态机触发ACK事件
				ClassEvent( state, hapiEvt );
					if (( tone == DTMFDDGTD ) || ( tone == DTMFDDGTA ))
						classStmEventProcess( &state->classState, 
						CLASSSTM_CLID_ACK_RCVD, state->lineId );
			
case HAPI_PTE_TONE_OFF_EVT:	//DTMF按键OFF事件
	VRG_UINT8    tone = hapiEvt->op2.val & 0xFF;	//获取按键音
	
	//查找按键映射
	const EPZPTEDIGIT2EPEVTMAP *digitMap = digit2epevtMap;
	while(( digitMap->digit != tone ) &&( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ))
		digitMap++;
	
	//上报DTMF OFF按键事件
	if(( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ) && (digitMap->epEvent != 
	EPEVT_NULL))
		(*endptConfig.notify)( state->endptArchive, -1, digitMap->epEvent, NULL, 0, 
		EPDTMFACT_TONEOFF );
	if( state->endptType != EPTYPE_PSTN )	//非FXO口类型
		ClassEvent( state, hapiEvt );	//没处理动作
	
case HAPI_PTE_TONE_GEN_EVT:	//声音生成事件
	ClassEvent( state, hapiEvt );
		//给来显状态机触发声音完成事件
		if (( toneGenEvtp->slotNum == HAPI_PKT_TC_TONE_NOCODE ) 
												||( toneGenEvtp->slotNum == 0 ))
			classStmEventProcess( &state->classState, CLASSSTM_TONE_GEN_EVT, 
			state->lineId );
	
	//如果是FXO口,则PSTN控制任务上报拨号完成事件
	if( vrgEndptGetNumFxoEndpoints() > 0 )
		evt.hsxdevhdl = state->pstnVhdHdl;
		evt.hsxevt = PSTN_CTL_EVT_DIAL_COMPLETE;
		evt.hsxop1 = state->lineId;
		evt.hsxop2.ref = NULL;
		pstnCtlSendEvent( &evt )
	
case HAPI_CLIDTX_MSG_ERROR_EVT:	//来显发送错误事件
	ClassEvent( state, hapiEvt );	//仅仅打印一个错误信息

case HAPI_CLIDTX_DONE:	//来显发送完成事件
	ClassEvent( state, hapiEvt );
		//给来显状态机触发来显发送完成事件
		classStmEventProcess( &state->classState, CLASSSTM_CLID_TX_END, state->lineId );
		
		//如果是摘机来显,则上报来显发送结束事件,以让上面放等待提示音
		if( state->offhookciding )
			state->offhookciding = VRG_FALSE;
			(*endptConfig.notify)( state->endptArchive, -1, EPEVT_CID_TX_END, NULL, 0, -1 );
		
case HAPI_CLIDRX_PKT_EVT:		//FXO口检测到来显事件
	ClassEvent( state, hapiEvt );
		//解析收到的来显
		hdspClidRxParse( endptConfig.country, ( HSZCLIDRXPACKET * )evtp->op2.ref,
&state->clidRxState )
		
		//COPY来显相关信息
		strncpy( vrgClidRxData.name, state->clidRxState.clidRxData.name, 
		sizeof(vrgClidRxData.name) );
		strncpy( vrgClidRxData.number, state->clidRxState.clidRxData.number, 
		sizeof(vrgClidRxData.number) );
		strncpy( vrgClidRxData.date, state->clidRxState.clidRxData.date, 
		sizeof(vrgClidRxData.date) );
		
		vrgClidRxData.reasonNoName = state->clidRxState.clidRxData.reasonNoName;
		vrgClidRxData.reasonNoNumber = state->clidRxState.clidRxData.reasonNoNumber;
		
		//给上层上报接收到FSK来显事件
		(*endptConfig.notify)( state->endptArchive, -1, EPEVT_FSK_CLIDRX, 
(void *)&vrgClidRxData, sizeof(vrgClidRxData), 0 );
		
case HAPI_DTAS_DETECT_EVT:	//不懂
	//仅一条打印

case HAPI_CMTD_TONE_DET_EVT:	//检测到声音事件,这里主要是拨号音
	char hsxop1CharArray[] = { (char)( hapiEvt->op1 & 0x00FF ), '\0' };
	
//如果有FXO口,则标记检测到进展音,否则标记检测到声音
	if ( vrgEndptGetNumFxoEndpoints() > 0 )
		evt.hsxdevhdl = state->pstnVhdHdl;
		evt.hsxevt = PSTN_CTL_EVT_CPTONE_DETECT;
	else
		evt.hsxdevhdl = state->lineVhdHdl;
		evt.hsxevt = HAPI_CMTD_TONE_DET_EVT;
	
	evt.hsxop1 = state->lineId;
	evt.hsxop2.ref = hsxop1CharArray;
	
	if ( vrgEndptGetNumFxoEndpoints() > 0 )	//如果有FXO口芯片
		pstnCtlSendEvent( &evt );	//给PSTN控制任务发送检测到进展音事件
	else
		CallProgressToneDetect(state, &evt);
			//获取过滤索引
			if ( pEvt->hsxop2.ref != NULL )
				filterIndex = ( CMTD_FILTER_INDEX )( *( char* )pEvt->hsxop2.ref );
		
			//如果检测到拨号音,则上报拨号音事件,简单看了一下代码,这里是做PBDT
			//诊断使用
			detectedTone = cmtdCtlGetConfigTone( filterIndex );
			if (detectedTone == CMTD_TONE_TYPE_DIAL)
			 (*endptConfig.notify)( pState->endptArchive, -1, EPEVT_DIALTONE, NULL, 0, -1 );
		
case HAPI_CMTD_TONE_END_EVT:	//检测到声音结束事件
	//上报拨号音完成事件
	(*endptConfig.notify)( state->endptArchive, -1, EPEVT_DIALTONE_END, NULL, 0, -1 );

case HAPINET_EXCEPTION:	//异常事件???
case HAPI_HEC_STATE_EVT:	//不懂
	logEvent = VRG_TRUE;	//仅仅标个标记,用于下面日志信息显示

case HAPI_HEC_GETSTATE_EVT:	//获取状态事件
	//打印一些信息,看不懂什么信息
    VRG_LOG_INFO(( VRG_LOG_MOD_EPT, "--- ECAN state --- 
(converged=%d,send=%d,receive=%d,stationary=%d,high mips=%d,zone=%d)",
        (ptr[0]&HAPI_HEC_STATE_CONVERGED)?1:0,
        (ptr[0]&HAPI_HEC_MODE_SEND)?1:0,
        (ptr[0]&HAPI_HEC_MODE_RECEIVE)?1:0,
        (ptr[0]&HAPI_HEC_STATE_RXSTATIONARY)?1:0,
        (ptr[0]&HAPI_HEC_STATE_HIGH_COMPLEXITY)?1:0,
        (ptr[0]&HAPI_HEC_STATE_ZONEMASK)>>HAPI_HEC_STATE_ZONESHIFT));
	
	……

//根据前面特定事件会对logEvent设置为TRUE,该值默认为FALSE
if ( logEvent )
	//日志信息显示,及对个别信号PTE_TONE_GEN_EVT、CLIDTX_DONE进行监控事件的去
//激活处理
	HapiEndptEventPostProcess( hapiEvt );

//内存资源释放
if ( hapiEvt->reqId == HSEVTEXTDATA &&hapiEvt->op2.ref != NULL && hapiEvt->op1 != 0 )
	free(hapiEvt->op2.ref);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值