当前用户每按一个按键,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);