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);
ENDPT_410_HapiEndptEventProcess
最新推荐文章于 2018-06-07 14:36:14 发布