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

📄 extsystem.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 5 页
字号:
/***************************
Name:Extsystem.c
author:RPJ
version:V0.1
description:
用户交换系统模块
***************************/
#include "reg52.h"
#include "absacc.h"
#include "clock.h"
#include "define.h"
#include "uartmodule.h"
#include "extsystem.h"
#include "drive.h"

#define GLOBALS
#include "variable.h"


/***************************
Name:EXT_Event_Analy
input:none
output:none
description:
**************************/
void Ext_Event_Analyse(void)
{
unchar Ext_No,SExt_No;
unchar Event_State,Event_matter,Channel,group;
bool ring;
unchar member,temp;
	if( TAL_EVENT == 0 )
	{
		return;//如果用户事件未发生退出分析
	}
	MICRO_GetFromBuf(EXT_EVENT_QUEUE[RP_EVENT], 
		Ext_No, RP_EVENT, TAL_EVENT, BufSize);
			//取发生事件变化的用户号
	Event_State = Ext_Param[Ext_No].Ext_State;
	Event_matter = Ext_Param[Ext_No].Ext_EVENT;

	if((FlagHeartSkip==2)||(FlagHeartSkip==3)||(FlagHeartSkip==9))
	{
		BaseDataComm(RepState, Ext_No);
	}

			//取用户的事件
	ring = 0;	//给出测试标志位复位
	if( (Event_State >= 20)&&(Event_State <= 29))
	{
		Event_State = 20;	//忙音事件进行统一处理
	}
	if( (Event_State >= 30)&&(Event_State <= 39))
	{
		if( Event_State == 36 )
			ring = 1;		//测试事件统一处理,排除测试铃流
		Event_State = 30;
	}
	switch(Event_State)				//根据用户状态分析用户事件
	{
		case state0_Free:
			switch(Event_matter)		//用户主动摘机事件
			{
				case event1_ExtHookOn:
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					if( Ext_Param[Ext_No].Bit_Param >= 0x80 )
					{//得到模拟中继振铃,然后直接打开中继,占用,找寻绳路
						OPEN_Trk(Ext_No);
						Reign_Trk(Ext_No);
						Channel = Scan_Ext_Cable();
						if( Channel >= 0x0f )
						{
							Release_Trk(Ext_No);
							CLOSE_Trk(Ext_No);
							break;
						}

						Channel |= 0xf0;			//启动绳路占用,但是未接续
						OPEN_EXT_Signal(Ext_No,5);					//听回铃
						Ext_Timer_Reset(Ext_No);					//计数器清空
						SExt_No = Ext_Param[Ext_No].Num_Hot_Call;
						
						if( SExt_No >= TAL_EXT_PORT )
						{
							SExt_No = 0;
						}
						else
						{
							if(Ext_Param[SExt_No].Bit_Param >= 0x80 )
							{
								SExt_No = 0;
							}
						}
						
						if((Ext_Param[SExt_No].Bit_Param & 0x02)==0)	//如果热线不是总机
						{
							if( Ext_Param[SExt_No].Ext_State > state0_Free)		//如果热线忙
							{
								Ext_Param[Ext_No].Ext_State = state4_DailOk;				//改变用户状态为4
								Ext_Param[Ext_No].Ext_EVENT = event7_SExtHookOff;				//用户进入被叫挂机
								MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
									WP_EVENT, TAL_EVENT, BufSize);	
								break;
							}
						}
						Ext_Param[Ext_No].Num_Call_Other = SExt_No;		//填写被叫(从热线中取被叫)
						Ext_Param[Ext_No].Num_Call_Me = 0xff;			//主叫浮空
						Ext_Param[Ext_No].Num_Switch_Cable = Channel;	//填写绳路
						Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//收号器不可用
						Ext_Param[Ext_No].Ext_State = state4_DailOk;		//改变用户状态为4
						Ext_Param[Ext_No].Num_MeetGroup = 0xff;		//用户会议组浮空
						Ext_Param[SExt_No].Num_Call_Me = Ext_No;		//填写被叫的主叫						
						Ext_Param[SExt_No].Num_Switch_Cable = Channel;	//填写被叫绳路
						Ext_Param[SExt_No].Ext_EVENT = event4_ExtRing;	//被叫用户进入被呼叫事件
						Ext_Param[SExt_No].Num_MeetGroup = 0xff;		//改变用户状态
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);						
					}
					else
					{
						#if ExtSameTrk
						if((Ext_No>=20)&&(Ext_No<MAX_Ext))
						{
							Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec;	//收号器可用
							Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf;	//改变用户状态为1
							Ext_Param[Ext_No].Ext_EVENT= event3_ExtRecDtmf;	//改变用户状态为1
							Ext_Param[Ext_No].Ext_RecDtmf_List[0]= First_Troop_Head>>4;	//改变用户状态为1
							Ext_Param[Ext_No].Ext_RecDtmf_List[1] = 0;
							Ext_Timer[Ext_No].Counter_Rec_DTMF = 2;
								MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
									WP_EVENT, TAL_EVENT, BufSize);
							break;
						}
						#endif
						if((Ext_Param[Ext_No].Bit_Param & 0x20)==0)
						{
							OPEN_EXT_Signal(Ext_No, 1);		//听拨号音
							Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec;	//收号器可用
							Ext_Param[Ext_No].Ext_State = state1_DailNo;	//改变用户状态为1
						}
						else
						{
							OPEN_EXT_Signal(Ext_No, 1);		//听拨号音
							Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec;	//收号器可用
							Ext_Param[Ext_No].Ext_State = state1_DailNo;	//改变用户状态为1
						}
					}
					break;
				case event4_ExtRing:		//用户作为被叫,听振铃
					OPEN_EXT_Ring(Ext_No);			//听振铃
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param[Ext_No].RecDTMF_Data = 0xff;			//接收的数据浮空
					Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//收号器不可用
					Ext_Param[Ext_No].Ext_EVENT = 0xff;			//用户事件浮空
					Ext_Param[Ext_No].Ext_State = state6_Ring;				//改变用户状态
					break;
				case event15_HostCalledExt:		//用户呼叫总机
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Called_List[temp]==0x0f)
						{
							HostCreat_MeetGroup(temp, Host_Ext);
							HostExt_Called_List[temp] = 0xf0;
							break;
						}
					}
					break;	
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state1_DailNo:
			switch(Event_matter)		//用户放弃拨号,恢复原态0
			{
				case event2_ExtHookOff:
					STOP_EXT_Signal(Ext_No);			//关信号音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					if( Ext_No == Host_Ext )
					{	
						for(temp=0;temp<MAX_Ext;temp++)
						{
							if(HostExt_Called_List[temp] == 0xf0 )
							{
								Ext_Param[Ext_No].Num_Call_Other = temp;//写入对方标志号码
								Ext_Param[Ext_No].Num_MeetGroup = Ext_Param[temp].Num_MeetGroup;		//写入会议组号
								Ext_Param[Ext_No].Num_Call_Me= 0XFE;			//写入会议组号
								Ext_Param[Ext_No].Num_Switch_Cable = Ext_Param[temp].Num_Switch_Cable;	//写用户绳路
								Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing;	//用户进入会议振铃状态	
								MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
									WP_EVENT, TAL_EVENT, BufSize);
								break;
							}
						}
					}

					break;
				case event3_ExtRecDtmf:		//用户收到号码,关信号音,进入字头分析
										//如果分析正常进入2态或者3态或者4态
					STOP_EXT_Signal(Ext_No);
					Head_Analyse(Ext_No);	
					break;
				case event8_DailOver:		//用户拨号超时,恢复原态
				
					SExt_No = Ext_Param[Ext_No].Num_Hot_Call;
					if((SExt_No<TAL_EXT_PORT)&&( Ext_Param[Ext_No].Bit_Param & 0x20))
					{
						STOP_EXT_Signal(Ext_No);
						Connect_Analyse(Ext_No, SExt_No);
						break;
					}
					
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state20_DailOver;	//改变用户状态
					break;
				case event14_HostCallingExt:		//总机会议中,再次被呼叫进入
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Calling_List[temp]==0x0f)
						{
							Ext_Timer_Reset(Ext_No);
							Ext_Param_Reset(Ext_No);
							HostCreat_MeetGroup(Host_Ext,temp);
							HostExt_Calling_List[temp] = 0xf0;
							break;
						}
						else if(HostExt_Calling_List[temp]==0xf0)
						{
							break;
						}
						else
						{
							continue;
						}
					}
					break;	
				case event15_HostCalledExt:		//普通用户呼叫总机
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Called_List[temp]==0x0f)
						{
							HostCreat_MeetGroup(temp,Host_Ext );
							HostExt_Called_List[temp] = 0xf0;
							break;
						}
					}
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state2_RecOneDtmf:
		case state3_RecTwoDtmf:
			switch(Event_matter)		//用户放弃拨号,恢复原态
			{
				case event2_ExtHookOff:
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					if( Ext_No == Host_Ext )
					{	
						for(temp=0;temp<MAX_Ext;temp++)
						{
							if(HostExt_Called_List[temp] == 0xf0 )
							{
								Ext_Param[Ext_No].Num_Call_Other = temp;//写入对方标志号码
								Ext_Param[Ext_No].Num_MeetGroup = Ext_Param[temp].Num_MeetGroup;		//写入会议组号
								Ext_Param[Ext_No].Num_Call_Me= 0XFE;			//写入会议组号
								Ext_Param[Ext_No].Num_Switch_Cable = Ext_Param[temp].Num_Switch_Cable;	//写用户绳路
								Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing;	//用户进入会议振铃状态	
								MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
									WP_EVENT, TAL_EVENT, BufSize);
								break;
							}
						}
					}
					break;
				case event3_ExtRecDtmf:		//用户收到号码,进入字段分析
					STOP_EXT_Signal(Ext_No);
					Ext_Call_Analyse(Ext_No);
					break;//用户在该字段分析是正常后,需要直接修改状态,修改事件,进入4态处理
				case event8_DailOver:		//用户拨号超时,恢复原态
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state20_DailOver;	//改变用户状态
					break;
				case event10_NoRightCall:		//用户无权呼叫号码听忙音
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state24_NoRightCall;	//改变用户状态
					break;
				case event11_CallFreeNo:		//用户呼叫空号码听忙音
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state23_CallFreeNo;	//改变用户状态
					break;
				case event12_CableBusy:		//系统绳路忙听忙音
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state26_CableBusy;	//改变用户状态
					break;
				case event13_SExtBusy:		//用户对方忙听忙音
					STOP_EXT_Signal(Ext_No);			//关音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state25_OppBusy;	//改变用户状态
					break;
				case event14_HostCallingExt:		//总机会议中,再次被呼叫进入
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Calling_List[temp]==0x0f)
						{
							Ext_Timer_Reset(Ext_No);
							Ext_Param_Reset(Ext_No);
							HostCreat_MeetGroup(Host_Ext,temp);
							HostExt_Calling_List[temp] = 0xf0;
							break;
						}
						else if(HostExt_Calling_List[temp]==0xf0)
						{
							break;
						}
						else
						{
							continue;
						}
					}
					break;	
				case event15_HostCalledExt:		//普通用户呼叫总机
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Called_List[temp]==0x0f)
						{
							HostCreat_MeetGroup(temp,Host_Ext );
							HostExt_Called_List[temp] = 0xf0;
							break;
						}
					}
					break;	
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state4_DailOk:
			switch(Event_matter)		//用户放弃呼叫,恢复原态
			{
				case event2_ExtHookOff:
					if( Ext_Param[Ext_No].Temp_Troop_Call> 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
					{
						temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
						for(member = 0;member<MAX_Ext;member++)
						{
							SExt_No = Troop_Param[temp].Troop_Member[member];
							if(SExt_No<TAL_EXT_PORT)
							{
								if(Ext_Param[SExt_No].Ext_State == state6_Ring)
								{
									if(Ext_Param[SExt_No].Temp_Troop_Call ==
										Ext_Param[Ext_No].Temp_Troop_Call )
									{
										Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
										MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
											WP_EVENT, TAL_EVENT, BufSize);				//用户对方摘机								
									}
								}
							}
						}
						if(Troop_Param[temp].Troopstate)
						{
							Troop_Param[temp].Troopstate--;
						}
					}
					
					SExt_No = Ext_Param[Ext_No].Num_Call_Other;	//取被叫用户
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
					Release_Cable(Channel);
					STOP_EXT_Signal(Ext_No);			//关回铃音
					Ext_Timer_Reset(Ext_No);			//用户计时器参数复位
					if( Ext_Param[Ext_No].Num_MeetGroup < 7 )
					{
						group = Ext_Param[Ext_No].Num_MeetGroup;
						Release_MeetGroup(group);			//使用统一绳路,必须考虑是否释放了
						Ext_Param_Reset(Ext_No);			//用户参数复位
					}
					else
					{//判断被叫是否是会议呼叫,如果不是就用户处理
						Ext_Param_Reset(Ext_No);			//用户参数复位
						Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -