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

📄 extsystem.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 5 页
字号:
							WP_EVENT, TAL_EVENT, BufSize);//用户主动挂机,被叫撤铃
					}
					break;
				case event6_SExtHookOn:		//被叫用户摘机,进入通话态
					STOP_EXT_Signal(Ext_No);						//关回铃音
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					Micro_Switch_8816(Ext_No, Channel, 1);			//接续
					Ext_Timer_Reset(Ext_No);						//用户计时器参数复位
					Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f;	//绳路占用
					Ext_Param[Ext_No].Num_Call_Me = 0xff;			//主叫浮空
					Ext_Param[Ext_No].RecDTMF_Data = 0xff;			//接收的数据浮空
					Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//收号器不可用
					Ext_Param[Ext_No].Ext_EVENT = 0xff;			//用户事件浮空
					if( Ext_Param[Ext_No].Num_MeetGroup < TAL_CABLE )
					{
						Ext_Param[Ext_No].Ext_State = state8_MeetTalk;				//改变用户状态
					}
					else
					{
						if(FlagSystemType)//如果是指令就进入指令呼叫状态
							Ext_Param[Ext_No].Ext_State = state10_TroopRing;
						else//如果普通电话就普通呼叫状态
							Ext_Param[Ext_No].Ext_State = state5_TalkTo;				//改变用户状态
					}
					break;
				case event9_ExtCallWaitOver:		//被叫用户无人接听,听忙音
					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);			//用户计时器参数复位
					if( Ext_Param[Ext_No].Num_MeetGroup < 7 )
					{
						Release_MeetGroup(Ext_Param[Ext_No].Num_MeetGroup);
					}
					Ext_Param_Reset(Ext_No);			//用户参数复位
					OPEN_EXT_Signal(Ext_No, 2);		//听忙音
					Ext_Param[Ext_No].Ext_State = state21_ResRingOver;	//改变用户状态
					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 state5_TalkTo:
			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--;
						}
					}
					SExt_No = Ext_Param[Ext_No].Num_Call_Other;		//取被叫用户
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					Micro_Switch_8816(Ext_No, Channel, 0);	//断开接续
					Release_Cable(Channel);				//释放绳路
					Ext_Timer_Reset(Ext_No);				//用户计时器参数复位
					Ext_Param_Reset(Ext_No);				//用户参数复位

					Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
					MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
						WP_EVENT, TAL_EVENT, BufSize);		//用户对方挂机
					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--;
						}
					}
					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;
				case event15_HostCalledExt:		//调度事件进入,双方直接进入会议中
					
					break;	
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state6_Ring:
			switch(Event_matter)		//用户摘机
			{
				case event1_ExtHookOn:
					if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
					{
						if(FlagSystemType)
						{
							Ext_Param[Ext_No].Ext_EVENT = event16_TroopRing;
							MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
								WP_EVENT, TAL_EVENT, BufSize);//组呼用户有摘机						
							break;
						}
						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(SExt_No == Ext_No)
									continue;
								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);				//组呼用户有摘机,其他撤消振铃							
									}
								}
							}
						}
						SExt_No = Ext_Param[Ext_No].Num_Call_Me;
						Ext_Param[SExt_No].Num_Call_Other = Ext_No;
					}
					
					STOP_EXT_Ring(Ext_No);						//关振铃
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					if( Channel >= TAL_CABLE )
					{
						SExt_No = Ext_Param[Ext_No].Num_Call_Me;
						Ext_Param[SExt_No].Ext_EVENT = event12_CableBusy;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);			//用户对方摘机								
						Ext_Timer_Reset(Ext_No);						//用户计时器参数复位
						Ext_Param_Reset(Ext_No);
						Ext_Param[Ext_No].Ext_State = state1_DailNo;		//改变用户状态					
					}
					else
					{
						Micro_Switch_8816(Ext_No, Channel, 1);			//接续
						Ext_Timer_Reset(Ext_No);						//用户计时器参数复位
						Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f;	//绳路占用
						Ext_Param[Ext_No].RecDTMF_Data = 0xff;			//接收的数据浮空
						Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//收号器不可用
						Ext_Param[Ext_No].Ext_EVENT = 0xff;			//用户事件浮空
						group = Ext_Param[Ext_No].Num_MeetGroup;
						if( group < TAL_CABLE )
						{
							if( Temp_MeetGroup[group].MeetGroup < TAL_CABLE )
							{
								SExt_No = Temp_MeetGroup[group].Manager_Ext;	//取主叫用户
							}
							else
							{
								if(Ext_Param[Ext_No].Num_Call_Other <MAX_Ext )
								{
									SExt_No = Ext_Param[Ext_No].Num_Call_Other;
									HostExt_Called_List[SExt_No] = 0xff;
								}
							}
							Ext_Param[Ext_No].Ext_State = state8_MeetTalk;				//改变用户状态
						}
						else
						{
							SExt_No = Ext_Param[Ext_No].Num_Call_Me;		//取主叫用户
							Ext_Param[Ext_No].Ext_State = state7_TalkFrom;				//改变用户状态
							Ext_Param[SExt_No].Num_Switch_Cable=Ext_Param[Ext_No].Num_Switch_Cable;
						}
						Ext_Param[SExt_No].Ext_EVENT = event6_SExtHookOn;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);				//用户对方摘机
					}
					break;
				case event5_ExtReleaseRing:		//用户撤消振铃
					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( Ext_Param[Ext_No].Num_Call_Me == 0xfe )
					{
						group = Ext_Param[Ext_No].Num_MeetGroup;	//取被叫用户会议组
						SExt_No = Temp_MeetGroup[group].Manager_Ext;	//取主叫用户
						Temp_MeetGroup[group].Num_Member--;
						if(SExt_No != Ext_No)
						{//如果被撤销的是总机,不需要告诉别人挂机处理
							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;
					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
					{
						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;
								}
							}							
						}
						else
						{
							STOP_EXT_Ring(Ext_No);				//关铃
						}
					}
					break;
				case event15_HostCalledExt:		//多次呼叫总机进入
					for(temp=1;temp<MAX_Ext;temp++)
					{
						if(HostExt_Called_List[temp]==0x0f)
						{//00,是空闲态,0f是呼叫态,f0是等待再次连接态,ff是连接中态
							HostCreat_MeetGroup(temp, Host_Ext);
							HostExt_Called_List[temp] = 0xf0;
							break;
						}
					}
					break;	
				case event16_TroopRing:
					STOP_EXT_Ring(Ext_No);//关振铃
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					group = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
					if( Channel >= TAL_CABLE )
					{
						SExt_No = Ext_Param[Ext_No].Num_Call_Me;
						Ext_Param[SExt_No].Ext_EVENT = event12_CableBusy;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);			//用户对方摘机								
						Ext_Timer_Reset(Ext_No);						//用户计时器参数复位
						Ext_Param_Reset(Ext_No);
						Ext_Param[Ext_No].Ext_State = state1_DailNo;		//改变用户状态					
					}
					else
					{
						Micro_Switch_8816(Ext_No, Channel, 1);			//接续
						Ext_Timer_Reset(Ext_No);						//用户计时器参数复位
						Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f;		//绳路占用
						Ext_Param[Ext_No].RecDTMF_Data = 0xff;			//接收的数据浮空
						Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//收号器不可用
						Ext_Param[Ext_No].Ext_EVENT = 0xff;			//用户事件浮空
						SExt_No = Ext_Param[Ext_No].Num_Call_Me;		//取主叫用户
						Ext_Param[Ext_No].Ext_State = state7_TalkFrom;	//改变用户状态
						Ext_Param[SExt_No].Num_Switch_Cable=Ext_Param[Ext_No].Num_Switch_Cable;
						Ext_Param[SExt_No].Ext_EVENT = event6_SExtHookOn;
						Ext_Param[SExt_No].Num_Call_Other = 0xa0+group;	//表示是呼叫指令群呼
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);			//用户对方摘机
					}
					break;
				default:
					break;
			}
			break;					//非法状态,报告错误,恢复原态
		case state7_TalkFrom:
			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--;
						}
					}
					SExt_No = Ext_Param[Ext_No].Num_Call_Me;		//取主叫用户
					Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
					Micro_Switch_8816(Ext_No, Channel, 0);			//断开接续
					Release_Cable(Channel);						//释放绳路
					Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
					MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
						WP_EVENT, TAL_EVENT, BufSize);
					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--;
						}
					}
					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;
				case event15_HostCalledExt:		//调度事件进入,双方直接进入会议中
					
					break;	
				case event17_ExtFlash:
					if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
					{
						temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
						Channel = Ext_Param[Ext_No].Num_Call_Me;
						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(Channel == SExt_No)
									{
										Ext_Param[SExt_No].Ext_State = state5_TalkTo;
										Ext_Param[SExt_No].Num_Call_Other = 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;

⌨️ 快捷键说明

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