//调用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;
数图处理算法
最新推荐文章于 2024-03-14 09:29:42 发布