📄 extsystem.c
字号:
EXT_Nomber_Logic += Ext_Param[Ext_No].Ext_RecDtmf_List[2]*10;
EXT_Nomber_Logic += Ext_Param[Ext_No].Ext_RecDtmf_List[1]*100;
}
SExt_No = EXT_Number_List[EXT_Nomber_Logic];
return SExt_No;
}
/*********************************
name:Ext_Timer_Judge()
input: /
output: /
description:
用户的信号音时间判断使用了20ms为基准,通过在
20ms处的判断来决定用户信号音的处理
Signal_Type说明
听信号音 1
听忙音 2
听空音 3
听催挂音 4
用户听回铃 5
用户听振铃 6
用户听总机振铃 7
信号指示标志的构造是前后个4位表示,注意处理
***********************************/
void Ext_Timer_Judge(void)
{
unchar data Signal_Type,index;
for(index=0;index<TAL_EXT_PORT;index++)
{
Read_8870ST();
Signal_Type = Ext_Param[index].Flag_Signal;
Signal_Type &= 0xf0;
Signal_Type >>= 4;
switch(Signal_Type)
{
case 1:
if( Ext_Timer[index].Counter_Signal >= dailsignal)//800*24/1000=19.2s等待
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event8_DailOver;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为拨号超时进入听忙音事件
}
else
{
if(Ext_Param[index].Num_Hot_Call < TAL_EXT_PORT )
{
if( Ext_Param[index].Bit_Param & 0x20 )
{
if( Ext_Timer[index].Counter_Signal >= (dailsignal/20*Hot_Len))
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event8_DailOver;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为拨号超时进入热线事件
}
else
{
Ext_Timer[index].Counter_Signal++;
}
}
}
else
{
Ext_Timer[index].Counter_Signal++;
}
}
break;
case 2:
if( Ext_Timer[index].Counter_Signal >= busysignal)//13*24=312ms等待
{
Ext_Timer[index].Counter_Signal = 0;
TURN_EXT_Signal(index);
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
case 3:
if( Ext_Timer[index].Counter_Signal >= dailsignal)//800*24/1000=19.2s等待
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event8_DailOver;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为拨号超时进入听忙音事件
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
case 4:
if( Ext_Timer[index].Counter_Signal >= hooksignal)//10*24=240ms等待
{
Ext_Timer[index].Counter_Signal = 0;
TURN_EXT_Signal(index);
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
case 5:
if( Ext_Timer[index].Counter_Signal >= ressignal) //
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event9_ExtCallWaitOver;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为回铃超时进入听忙音事件
}
else if( (Ext_Timer[index].Counter_Signal%closeoffset) == openoffset)
{
TURN_EXT_Signal(index);
Ext_Timer[index].Counter_Signal++;
}
else if( Ext_Timer[index].Counter_Signal == 0 )
{
Ext_Timer[index].Counter_Signal++;
}
else if( (Ext_Timer[index].Counter_Signal%closeoffset) == 0 )
{
TURN_EXT_Signal(index);
Ext_Timer[index].Counter_Signal++;
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
case 6:
if( Ext_Timer[index].Counter_Signal>= ressignal )
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为振铃超时进入消铃事件
}
else if( (Ext_Timer[index].Counter_Signal%closeoffset) == openoffset)
{
TURN_EXT_Ring(index);
Ext_Timer[index].Counter_Signal++;
}
else if( Ext_Timer[index].Counter_Signal == 0 )
{
Ext_Timer[index].Counter_Signal++;
}
else if( (Ext_Timer[index].Counter_Signal%closeoffset) == 0 )
{
TURN_EXT_Ring(index);
Ext_Timer[index].Counter_Signal++;
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
case 7:
if( Ext_Timer[index].Counter_Signal>= ressignal )
{
Ext_Timer[index].Counter_Signal = 0;
Ext_Param[index].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], index,
WP_EVENT, TAL_EVENT, BufSize);
//用户因为振铃超时进入消铃事件
}
else if( (Ext_Timer[index].Counter_Signal%openoffset) == 0 )
{
TURN_EXT_Ring(index);
Ext_Timer[index].Counter_Signal++;
}
else
{
Ext_Timer[index].Counter_Signal++;
}
break;
default:
break;
}
}
}
/**********************************
name:Head_Analyse(unchar Ext_No)
input: Ext_No
output: /
description:
如果有中继组,查询中继字头
如果有会议组,查询会议字头
如果是分机组,查询分机字头
如果是总机组,查询总机字头
如果是功能组,查询功能字头
中继处理方式说明
如果是呼叫中继,主叫进入7态,接续用户
中继用户进入4态,起用7 事件,事件处理中
打开中继并接续
*********************************/
void Head_Analyse(unchar Ext_No)
{
if(NoFreeCounter>=NoFreeFlag)
goto NOFREE;
if( Ext_Param[Ext_No].RecDTMF_Data == EXT_Head )//判断用户字头
{
OPEN_EXT_Signal(Ext_No, 3); //用户呼叫后听空音
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态为3
return;//用户呼叫内部用户
}
if(Meet_Call_Analyse(Ext_No,1))//判断是否第一个号码是会议字头
{
OPEN_EXT_Signal(Ext_No, 3);
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态为3
return;
}
if(Troop_Call_Analyse(Ext_No,1))//判断是否第一个号码是组呼会议字头
{
OPEN_EXT_Signal(Ext_No, 3);
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态为3
return;
}
NOFREE:
if(SFR_Call_Analyse(Ext_No))//判断是否第一个号码是中继字头
{
OPEN_EXT_Signal(Ext_No, 3);
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态为3
}
else
{
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态
Ext_Param[Ext_No].Ext_EVENT = event10_NoRightCall; //用户事件为呼叫不存在号码
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
}//用户呼叫其他不存在号码
}
/***********************************
name:Ext_Call_Analyse(unchar Ext_No)
input:Ext_No
output:/
description:
用户收到一个字头后就开始分析,每次收到一个拨号都这样
先判断是否为分机字头,在判断功能字头
如果是分机字头再判断分机长度,如果没有到达长度就退出
如果到达长度就寻找被叫
如果被叫不存在就退出
如果被叫存在就查询被叫状态
如果被叫不是空闲0,则退出
如果被叫是空闲0,就查询绳路
如果绳路值为15,表示无空闲,就退出
如果有绳路空闲,就占用绳路,写入标记
进入等待接续状态,修改主被叫状态和事件
如果用户呼叫功能字头,每次都查询是否是功能字头长度
如果达到规定长度,开始判断功能呼叫
***********************************/
void Ext_Call_Analyse(unchar Ext_No)
{
unchar data SExt_No;
if(NoFreeCounter>=NoFreeFlag)
goto NOFREE;
if( Ext_Param[Ext_No].Ext_RecDtmf_List[0] == EXT_Head )
{
if( Ext_Timer[Ext_No].Counter_Rec_DTMF >= EXT_Len )
{
SExt_No = Scan_EXT_LogicList(Ext_No);
Connect_Analyse(Ext_No, SExt_No);//进行用户的连接分析
}
else
{
OPEN_EXT_Signal(Ext_No,3); //听忙音
Ext_Timer[Ext_No].Counter_HK = 0; //所有计数器归0
Ext_Timer[Ext_No].Counter_Signal = 0;
Ext_Timer[Ext_No].Counter_Pause = 0;
}
//用户呼叫内部用户
return;
}
/* if(Trk_Call_Analyse(Ext_No,2))
{
return;//如果在比较中继的时候有一个可以满足就跳过
}*/
if(Meet_Call_Analyse(Ext_No,2))
{
return;//如果在比较会议的时候有一个可以满足就跳过
}
if(Troop_Call_Analyse(Ext_No,2))
{
return;//如果在比较群呼的时候有一个可以满足就跳过
}
NOFREE:
if(SFR_Call_Analyse(Ext_No))
{
return;//如果在比较特殊功能的时候有一个可以满足就跳过
}
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态
Ext_Param[Ext_No].Ext_EVENT = event10_NoRightCall; //用户事件为呼叫不存在号码
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
}
/*************************
name:SFR_Call_Analyse(unchar Ext_No)
input:Ext_No
output:/
description:
每个用户默认具有以下测试功能
用户测试拨号音 *01*
用户测试忙音 *02*
用户测试空音 *03*
用户测试催挂音 *04*
用户测试回铃 *05*
用户测试振铃 *06*
用户取得设置权利后,具有以下功能
设置用户启动参数设置*90*
设置用户关闭参数设置*91*,同时保存数据
设置用户系统参数重起*98*
设置恢复默认参数设置*99*
用户确定系统类型*10*0/*10*1(电话/指令)
设置系统字头 *11*x(x表示字头)
设置群呼字头 *12*x(x表示字头)
设置会议字头 *13*x(x表示字头)
查询系统用户状态 *20*xxx(xxx分机的号码)
设置系统发送数据 *21*x(x发送类型)
查询系统会议参数 *22*D(D组号)
查询系统群呼参数 *23*D(D组号)
查询系统基本参数 *24*D(D组号)
***********************************************
1 3 9 send working data
2 3 9 send extsta data
4 9 send set head mode
***********************************************
设置会议组成员 *61*xxxD(D组号,xxx分机的号码)
消除会议组成员 *62*xxxD(D组号,xxx会议组头的号码)
设置会议组关闭 *63*
设置会议组开启 *64*
设置会议组全空 *65*D(D组号)
设置会议组全有 *66*D(D组号)
设置群呼组成员 *71*xxxD(D组号,xxx分机的号码)
消除群呼组成员 *72*xxxD(D组号,xxx分机的号码)
设置群呼组关闭 *73*
设置群呼组开启 *74*
设置群呼组全空 *75*D(D组号)
设置群呼组全有 *76*D(D组号)
设置转移用户 *81*xxxx(xxxx分机的号码)
设置热线用户 *82*xxxx(xxxx分机的号码)
启动用户热线 *83*
关闭所有用户热线 *84*
启动用户转移 *85*
启动用户无条件转移 *86*
关闭所有用户转移 *87*
*************************/
bool SFR_Call_Analyse(unchar Ext_No)
{
unchar data Function,Num,SExt_No,group,list,member,i;
bool flag,end;
flag = TRUE;
end = FLAUSE;
if( Ext_Param[Ext_No].Ext_RecDtmf_List[0] == Fun_Head)
{
if( Ext_Timer[Ext_No].Counter_Rec_DTMF >= Fun_Len )
{
Function = Ext_Param[Ext_No].Ext_RecDtmf_List[1]&0x0f;
if(Ext_Param[Ext_No].Ext_RecDtmf_List[3]== Fun_Head)
{
end = TRUE;
Num = Ext_Param[Ext_No].Ext_RecDtmf_List[2]&0x0f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -