数图处理算法

//调用x->termClass->matchDialStringF回调进行数图匹配处理,matchDialStringF回调函数
//为rvMatchDialStringToPatternCB
rvMdmTermMatchDialString_
	//如果应用层设置了mtfMgr->mdmClbks.matchDialStringToPatternCB回调,则使用用户
	//的数图接口进行处理,当前应用层没有设置,则使用MTF默认的函数
	//terminalMdmMatchDigitMap进行数图处理
	rvMatchDialStringToPatternCB
		terminalMdmMatchDigitMap
			rvMdmDigitMapMatch(&term->digitMap, dialString, timeDuration);
				//遍历当前每个数图规则
				for(i=0; i<rvMdmDigitMapGetSize(x); ++i)
					//使用rvMdmDigitMapGetElem获取每个数据规则,并调用
					// rvMdmDigitStringMatch函数进行规则匹配,
					//rvMdmDigitStringMatch下面单独分析。
					switch(rvMdmDigitStringMatch(rvMdmDigitMapGetElem(x, i), 
dialString, &mode))

//完全匹配,则完全匹配计数递增
case RV_MDMDIGITSTRING_MATCHED:
	numMatched++;

//完全匹配,但有定时器指示符,则等待计数递增
case RV_MDMDIGITSTRING_MATCHEDANDWAITING:
	numWaiting++;
	if(mode != RV_MDMDIGITPOSITION_NOCHANGE)
		timerToUse = mode;

//部分匹配,则部分匹配计数递增
case RV_MDMDIGITSTRING_MATCHPOSSIBLE:
	numPossible++;
	if(mode != RV_MDMDIGITPOSITION_NOCHANGE)
		timerToUse = mode;

//不匹配
case RV_MDMDIGITSTRING_UNMATCHED:
	//no thing
				
				//所有数图规则处理完成后,根据统计结果得到最终数图处理结果
				switch(numMatched)
				//没有一个完整无定时器匹配
				//如果有完整等待匹配则返回FULLMATCH
				//否则如果有部分匹配则返回 PARTIALMATCH
				//否则返回 NOMATCH
				case 0:
					matchType = numWaiting ? RV_MDMDIGITMAP_FULLMATCH :
					numPossible ? RV_MDMDIGITMAP_PARTIALMATCH : 
					RV_MDMDIGITMAP_NOMATCH;
				
				//有一个完整无定时器匹配
				//如果还有其它完整等待匹配或部分匹配则返回 FULLMATCH,
				//否则返回 UNAMBIGUOUSMATCH
				case 1:
					matchType = (numWaiting || numPossible) 
? RV_MDMDIGITMAP_FULLMATCH :
RV_MDMDIGITMAP_UNAMBIGUOUSMATCH;
				
				//出现多个完整匹配,直接返回 FULLMATCH
				default:
					matchType = RV_MDMDIGITMAP_FULLMATCH;
				
				//根据最终匹配结果,处理是否进行定时器处理
				switch(matchType)
				//部分匹配则检查数图规则中是否有短定时器指示符,如果没有则优先使
				//用长定时器
				case RV_MDMDIGITMAP_PARTIALMATCH:
					*timerDuration = timerToUse == RV_MDMDIGITPOSITION_SHORTTIMER 
? x->shortTimeout : x->longTimeout;
				
				//完整匹配检查数图规则中是否有长定时器指示符,如果没有则优先使用
				//短定时器
				case RV_MDMDIGITMAP_FULLMATCH:
					*timerDuration = timerToUse == RV_MDMDIGITPOSITION_LONGTIMER 
? x->longTimeout : x->shortTimeout;
				
				//匹配失败和精确匹配都不用启用定时器,直接处理。
				case RV_MDMDIGITMAP_NOMATCH:
				case RV_MDMDIGITMAP_UNAMBIGUOUSMATCH:
					*timerDuration = 0;
				
				return matchType;

--------------------------------------------------------------------------------------------------------------------------------
rvMdmDigitStringMatch
	//该函数是一个递归函数,处理每个规则的数图匹配
	rvMdmDigitStringMatchSection
		//如果用户按键字符串已经处理到未尾
		if(strIt == strEnd)
			//如果当前数图规则也已经没有可处理,则返回匹配成功
			if(patIt == patEnd)
				return RV_MDMDIGITSTRING_MATCHED;
			
			//如果当前规则最后是点,则返回匹配成功但需要等待。
			if(rvMdmDigitPositionIsMultiple(patIt) && patIt + 1 == patEnd)
				return RV_MDMDIGITSTRING_MATCHEDANDWAITING;
			
			//否则返回部分匹配
			return RV_MDMDIGITSTRING_MATCHPOSSIBLE;
		
		//如果用户按键字符串没有处理完,但数图规则已经没有可处理,则返回匹配失败
		if(patIt == patEnd)
			return RV_MDMDIGITSTRING_UNMATCHED;
		
		//如果数图规则中有定时器指示符,则返回给上层函数调用,使得数图定时器使用
		//该值进行定时器超时时间设置。
		if (patIt->timerMode != RV_MDMDIGITPOSITION_NOCHANGE)
			*timerToUse = patIt->timerMode;
		
		//如果当前规则的子元素没有按键匹配,则跳过该无效元素,递归调用该函数重新
		//进行处理。比如当前规则为“.123”,这里第一个点元素就是无效的。
		if(!patIt->events)
			return rvMdmDigitStringMatchSection(patIt + 1, patEnd, strIt, strEnd, 
			timerToUse);
		
		//如果当前规则元素为点
		if(rvMdmDigitPositionIsMultiple(patIt))
			//如果当前按键和点之后的规则完全匹配,则返回匹配成功
			m0 = rvMdmDigitStringMatchSection(patIt + 1, patEnd, strIt, strEnd, timerToUse);
			if(m0 == RV_MDMDIGITSTRING_MATCHED)
				return RV_MDMDIGITSTRING_MATCHED;
			
			//如果当前按键和点之前的元素匹配失败,则标记结果为匹配失败,否则
			//将用户按键检测点向后移一位,然后与当前点规则进行匹配
			m1 = rvMdmDigitPositionMatchEvent(patIt, *strIt) ? 
			rvMdmDigitStringMatchSection(patIt, patEnd, strIt + 1, strEnd, timerToUse)
			: RV_MDMDIGITSTRING_UNMATCHED;
			
			//获取点元素处理结果
			return m0 > m1 ? m0 : m1;
		
		//如果非点元素规则,则执行进行有效元素匹配,如果匹配成功,则按键检测点递
		//增,同时规则元素也递增,调用递归函数继续处理。
		if(rvMdmDigitPositionMatchEvent(patIt, *strIt))
			return rvMdmDigitStringMatchSection(patIt + 1, patEnd, strIt + 1, strEnd, 
			timerToUse);
		
		//以上条件都没有达到,则匹配失败。
		return RV_MDMDIGITSTRING_UNMATCHED;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值