⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extsystem.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -