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

📄 extsystem.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 5 页
字号:
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他撤消振铃							
										}
										else if(Ext_Param[SExt_No].Ext_State == state7_TalkFrom)
										{
											Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他成员听忙音						
										}
									}
								}
							}
						}
					}
					break;
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state8_MeetTalk:
			switch(Event_matter)
			{
				case event2_ExtHookOff://用户挂机
					group = Ext_Param[Ext_No].Num_MeetGroup;	//取被叫用户会议组
					SExt_No = Temp_MeetGroup[group].Manager_Ext;	//取主叫用户
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
					Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
					Ext_Timer_Reset(Ext_No);
						
					/*if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果会议成员是中继,就直接取消会议关闭中继
					{
						CLOSE_Trk(Ext_No);
						Release_Trk(Ext_No);
					}
					else
					{
						Scan_NextManager(group, Ext_No);
					}*/
					Scan_NextManager(group, Ext_No);
					Ext_Param_Reset(Ext_No);
					break;
				case event7_SExtHookOff:		//会员挂机,进入判断听忙音态
					group = Ext_Param[Ext_No].Num_MeetGroup;
					if( Temp_MeetGroup[group].Num_Member <= 1 )
					{
						Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
						if( Ext_Param[Host_Ext].Ext_State )
						{
							for(temp=1;temp<MAX_Ext;temp++)
							{
								if((HostExt_Called_List[temp] >0)||(HostExt_Calling_List[temp] >0))
								{
									break;
								}
							}
							if(temp==MAX_Ext)
								Release_Cable(Channel);
						}
						else
						{
							Release_Cable(Channel);
						}
						Release_MeetGroup(group);
						Ext_Timer_Reset(Ext_No);
						Ext_Param_Reset(Ext_No);
						OPEN_EXT_Signal(Ext_No, 2);		//听忙音
						Ext_Param[Ext_No].Ext_State = state22_OppHookOff;	//改变用户状态
					}
					else
					{
						temp = 0;//num_member是所有会议成员,但是包含主席
						for(member=0;member<Temp_MeetGroup[group].Num_Member;member++)
						{
							SExt_No = Temp_MeetGroup[group].Meet_Member[member];
							if(Ext_Param[SExt_No].Ext_State==state6_Ring)
							{
								temp++;
							}
						}
						temp++;
						if(temp>=Temp_MeetGroup[group].Num_Member)
						{
							Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
							Ext_Param[Ext_No].Ext_State = state4_DailOk;
							Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
							OPEN_EXT_Signal(Ext_No, 5);		//听回铃音						
						}
					}
					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 if(HostExt_Calling_List[temp]==0xff)
						{
							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;
				case event18_MangerRelease:
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
					Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
					STOP_EXT_Signal(Ext_No);				//关音
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位
					if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果中继是主叫,需要直接释放
					{
						CLOSE_Trk(Ext_No);
						Release_Trk(Ext_No);
					}
					else
					{
						OPEN_EXT_Signal(Ext_No, 2);		//听忙音
						Ext_Param[Ext_No].Ext_State = state22_OppHookOff;	//改变用户状态
					}
					break;
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state9_CommandExt:						//总机呼叫用户,使用调度状态

			break;
		case state10_TroopRing:
			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;
						if( Troop_Param[temp].Troopstate )
						{
							Troop_Param[temp].Troopstate--;
						}
						if(FlagSystemType)
						{
							for(member = 0;member<MAX_Ext;member++)
							{
								SExt_No = Troop_Param[temp].Troop_Member[member];
								if(SExt_No<TAL_EXT_PORT)
								{
									if(SExt_No == Ext_No)
										continue;
									if(Ext_Param[SExt_No].Temp_Troop_Call ==
											Ext_Param[Ext_No].Temp_Troop_Call )
									{
										if(Ext_Param[SExt_No].Ext_State == state6_Ring)
										{
											Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他撤消振铃							
										}
										else if(Ext_Param[SExt_No].Ext_State == state7_TalkFrom)
										{
											Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他成员听忙音						
										}
									}
								}
							}
						}
					}
					else
					{
						SExt_No =  Ext_Param[Ext_No].Num_Call_Other;
						Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);		//用户对方挂机
					}
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
					Release_Cable(Channel);
					STOP_EXT_Signal(Ext_No);				//关音
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位
					break;
				case event7_SExtHookOff:		//对方挂机,进入忙音态
					if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
					{
						temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
						if( Troop_Param[temp].Troopstate )
						{
							Troop_Param[temp].Troopstate--;
						}
						if(FlagSystemType)
						{
							for(member = 0;member<MAX_Ext;member++)
							{
								SExt_No = Troop_Param[temp].Troop_Member[member];
								if(SExt_No<TAL_EXT_PORT)
								{
									if(SExt_No == Ext_No)
									{
										Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
										Ext_Param[SExt_No].Ext_State= event5_ExtReleaseRing;
										MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
											WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他成员听忙音						
										continue;
									}
									if(Ext_Param[SExt_No].Temp_Troop_Call ==
											Ext_Param[Ext_No].Temp_Troop_Call )
									{
										if(Ext_Param[SExt_No].Ext_State == state6_Ring)
										{
											Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他撤消振铃							
										}
										else if(Ext_Param[SExt_No].Ext_State == state7_TalkFrom)
										{
											Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
											MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
												WP_EVENT, TAL_EVENT, BufSize);				//组呼用户有摘机,其他成员听忙音						
										}
									}
								}
							}
						}
					}
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
					STOP_EXT_Signal(Ext_No);				//关音
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位
					if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果中继是主叫,需要直接释放
					{
						CLOSE_Trk(Ext_No);
						Release_Trk(Ext_No);
					}
					else
					{
						OPEN_EXT_Signal(Ext_No, 2);		//听忙音
						Ext_Param[Ext_No].Ext_State = state22_OppHookOff;	//改变用户状态
					}
					break;
					
				default:
					break;
					
			}
			break;
		case state12_:						//总机调度状态

			break;
		case state20_DailOver:
			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;
						if( Troop_Param[temp].Troopstate )
						{
							Troop_Param[temp].Troopstate--;
						}
					}
					STOP_EXT_Signal(Ext_No);				//关拨号音
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位
					if( Ext_No == Host_Ext )
					{	
						for(temp=1;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;	//写用户绳路
								Use_Cable(Ext_Param[Ext_No].Num_Switch_Cable&0x0f);
								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 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 state30_:
			switch(Event_matter)		//用户挂机,恢复原态
			{
				case event2_ExtHookOff:
					STOP_EXT_Signal(Ext_No);				//关拨号音
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位
					if( ring )
					{
						Ext_Param[Ext_No].Ext_EVENT = event4_ExtRing;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
							WP_EVENT, TAL_EVENT, BufSize);
						break;
						//用户测试振铃
					}
					if( Ext_No == Host_Ext )
					{	
						for(temp=1;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;	//写用户绳路
								Use_Cable(Ext_Param[Ext_No].Num_Switch_Cable&0x0f);
								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 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;					//非法状态,报告错误,恢复原态
		default:
			STOP_EXT_Signal(Ext_No);				//关拨号音
			Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
			Ext_Param_Reset(Ext_No);				//用户参数复位
			OPEN_EXT_Signal(Ext_No, 2);		//听忙音
			break;
	}
	
}
/*********************************
name:Ext_Timer_Judge(unchar Ext_No)
input: 	Ext_No
output:	SExt_No
description:
通过对用户的收号表计算出被叫的逻辑号码
如果被叫号码是0xff,表示号码不存在
***********************************/
unchar Scan_EXT_LogicList(unchar Ext_No)
{
unchar SExt_No;
unint EXT_Nomber_Logic;

	EXT_Nomber_Logic = 0;
	if( EXT_Len == 3 )
	{
		EXT_Nomber_Logic+= Ext_Param[Ext_No].Ext_RecDtmf_List[2]*1;
		EXT_Nomber_Logic +=Ext_Param[Ext_No].Ext_RecDtmf_List[1]*10;
	}
	else
	{
		EXT_Nomber_Logic += Ext_Param[Ext_No].Ext_RecDtmf_List[3]*1;

⌨️ 快捷键说明

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