DSP

数图处理主流程

2019-07-13 18:35发布

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