数图处理主流程

当前用户每按一个按键,DSP会上报on/off两次事件,MTF对应的两次事件包为“kp/kd”、“kp/ku”。

//处理数图事件
processDigitMapEvent(term,&item,media,args);
	//这里仅处理dx事件id,当前传入的事件id为kx,所以返回RV_MDMEVENT_NOTFOUND
	newDigit = rvMdmDigitMapTranslateDDEvent(rvMdmPackageItemGetItem(name), args);
	
	if (newDigit == RV_MDMEVENT_NOTFOUND)
		//当事件id为kd时,返回对接的按键,如果事件id为ku则返回忽略,因为这里
		//仅处理按键的on
		newDigit = rvMdmKpDigitMapTranslateKeypadEv(……);
	
	//如果当前按键映射为无效的按键,则执行匹配失败的流程,一般按键不会出现无效,
	//暂不关心此分支流程。
	if (newDigit == RV_MDMEVENT_NOTFOUND)
		x->digitMapStat=lastStat;
		processDigitMapUnmatch(x,name,media,args);
		return
	
	//处理按键的on事件
	if (newDigit != RV_MDMEVENT_IGNORE)
		//将当前按键追加的号码池中
		rvStringPushBack(&x->dialString, (char)newDigit);
		
		//进行数图算法匹配,并保存最后数图处理结果。rvMdmTermMatchDialString_
		//函数为数图核心算法,单独放在一个文档中进行分析。
		x->digitMapStat = rvMdmTermMatchDialString_(&x->mdmTerm,
 		rvStringGetData(&x->dialString), &timerDuration);
		
		//这里又进行一次停止播号音的判断处理。
		if (rvStringGetSize(&x->dialString)==1)
			rvMdmTermEventStopSignals(x);
		
		switch (x->digitMapStat)
		//匹配失败
		case RV_MDMDIGITMAP_NOMATCH:
			//号码池复位
			rvStringResize(&x->dialString,rvStringGetSize(&x->dialString)-1);
			
//存储最后状态
			x->digitMapStat = lastStat;
			
			//进行匹配失败的处理
			processDigitMapUnmatch(x, name, media, args);
				//当前事件id为“kd”,不执行此流程
				if(!strcmp("ce",rvMdmPackageItemGetItem(name)))
					//xxx
				else
					//处理数图完成事件
					generateDMEventCompletion(x,media);
		
		//部分匹配或有匹配成功的,但还有其它规则可以匹配
		case RV_MDMDIGITMAP_PARTIALMATCH:
		case RV_MDMDIGITMAP_FULLMATCH:
			x->digitMapMedia = media;
			
			if (timerDuration != 0)
				//重新启动数图定时器
				rvMdmTermDigitMapTimerRestart(x, timerDuration*1000);
					//停止之前的定时器
					IppTimerStop(x->digitMapCurTimer);
					
					//反转定时器对象,当前终端对象有两个定时器digitMapTimer[0]和
					//digitMapTimer[1],由digitMapCurTimer指向当前使用哪个定时器
					//对象,通过分析代码发现这两个定时器其实一模一样,该定时器
					//超时后,最后触发 generateDMEventCompletion 执行数图完成事件
					flipCurrentTimer(x);
					
					//重新启动定时器
					IppTimerStart(……)
		
		//精确匹配成功
		case RV_MDMDIGITMAP_UNAMBIGUOUSMATCH:
			//处理数图完成事件
			generateDMEventCompletion(x, media);

-------------------------------------------------------------------------------------------------------------------------------
//生成数图完成事件
generateDMEventCompletion
	//停止digitMapCurTimer数图定时器
	// digitMapActive = false
	rvMdmTermDeactivateDigitMap(x);
	
	//调用数图的事件完成回调来构造处理参数,这里的回调函数为
	// rvMdmDigitMapBuildDDEvComplete,在后面单独分析
	x->digitMapEC->evCompleteF(¶meters, rvStringGetData(&x->dialString),
        x->digitMapStat, x->digitMapEC->userData);
	
	//向MTF发送数图处理完成事件,rvCCTerminalMdmGetCompEventPkg函数从
	//终端compEventPkg参数中取出事件包名为“dd”
	rvMdmTermQueueObsEvent(rvCCTerminalMdmGetMdmTerm(x), 
	rvCCTerminalMdmGetCompEventPkg(x), "ce", media, ¶meters);
		//构造请求事件,事件包为“dd/ce”
		queueBlockedObsEvent(term, &item, media, args);
		
		//向MTF发送数据,触始MTF处理该dd/ce事件包。
		rvMdmTermPostEvent(t);

------------------------------------------------------------------------------------------------------------------------------
//构造数图完成事件参数
rvMdmDigitMapBuildDDEvComplete
	//如果当前号码池已经有号码,则构造参数“ds=号码池号码”
	if (digitString[0])
		rvMdmParameterListSet2(parameters, "ds", &value);
	
	//如果处理结果不是匹配失败,则构造匹配结果的参数“Meth=PM或FM或UM”,
	//PM指部分匹配
	//FM指有匹配成功的,但还有可以继续匹配的
	//UM指已经精确匹配
	if (matchType != RV_MDMDIGITMAP_NOMATCH)
		const RvChar* paramValue[] = {"PM", "FM", "UM"};
		rvMdmParameterValueConstructA(&value, paramValue[(int)matchType-1], alloc);
		rvMdmParameterListSet2(parameters, "Meth", &value);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值