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

📄 drive.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(i<7)
		Meet_Group[i].Meetstate = 0;
	Temp_MeetGroup[group].Manager_Ext  = 0xff;
	Temp_MeetGroup[group].Num_Member = 0;
	Temp_MeetGroup[group].Meetstate = 0;
}
/******************************
Name:HostCreat_MeetGroup(unchar Ext_No)
input:	group
output:	/
description:
计算当前的总机的会议组
******************************/
void HostCreat_MeetGroup(unchar Ext_No,unchar SExt_No)
{
unchar data group,channal;

	for(group=0;group<TAL_CABLE;group++)
	{
		if(Temp_MeetGroup[group].Meetstate)
			continue;
		else
		{
			if((Ext_Param[SExt_No].Ext_State>3)&&(Ext_Param[SExt_No].Ext_State<9))
			{//如果用户已经有了绳路,不需要再申请
				channal = Ext_Param[SExt_No].Num_Switch_Cable&0x0f;
				Use_Cable(channal);
			}
			else if(Ext_Param[SExt_No].Ext_State>0)
			{//如果用户没有绳路,需要再申请
				channal = Ext_Param[SExt_No].Num_Switch_Cable&0x0f;
				if(channal>=TAL_CABLE)
				{
					channal = Scan_Ext_Cable();
					Ext_Param[SExt_No].Num_Switch_Cable = channal;
				}
				else
				{
					Use_Cable(channal);
				}
			}
			else
			{
				channal = Scan_Ext_Cable();
			}
			
			if( channal >= TAL_CABLE )//用户不具有空闲绳路
			{
				Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf;	//改变用户状态
				Ext_Param[Ext_No].Ext_EVENT = event12_CableBusy;	//用户进入绳路忙事件
				MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
					WP_EVENT, TAL_EVENT, BufSize);
				return;
			}
			Temp_MeetGroup[group].MeetGroup = 0xff;
			Temp_MeetGroup[group].Meetstate = 0xf0;//如果空闲就占用,得到会议号									
			Temp_MeetGroup[group].Num_Member = 2;//给出临时会议组的初始用户数

			Temp_MeetGroup[group].Manager_Ext = Host_Ext;
			Temp_MeetGroup[group].Num_Member = 0;
			if( Temp_MeetGroup[group].Manager_Ext == Ext_No )
				Temp_MeetGroup[group].Meet_Member[0] = SExt_No;
			else	
				Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
			Temp_MeetGroup[group].Num_Member+=2;
			Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec;	//用户不可收号
			Ext_Param[Ext_No].Num_MeetGroup = group;		//写入会议组号
			Ext_Param[Ext_No].Num_Call_Me= 0XFE;		//写入会议组号
			Ext_Param[Ext_No].Num_Switch_Cable = channal;	//写用户绳路
			Ext_Param[Ext_No].Ext_State= state4_DailOk;	//用户进入会议听回铃状态
			OPEN_EXT_Signal(Ext_No, 5);
			if( Ext_Param[SExt_No].Ext_State )
			{//如果对方处于忙状态,需要区分对方是总机还是分机
				HostExt_Called_List[Ext_No] = 0x0f;//表示该用户正在呼叫总机	等待中
				return;
			}
			else
			{
				Ext_Param[SExt_No].Num_Call_Other = Ext_No;//写入对方标志号码
				Ext_Param[SExt_No].Num_MeetGroup = group;		//写入会议组号
				Ext_Param[SExt_No].Num_Call_Me= 0XFE;			//写入会议组号
				Ext_Param[SExt_No].Num_Switch_Cable = channal;	//写用户绳路
				Ext_Param[SExt_No].Ext_EVENT= event4_ExtRing;	//用户进入会议振铃状态	
				MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
					WP_EVENT, TAL_EVENT, BufSize);
			}
			
			return;
		}
	}
	if( group>=TAL_CABLE )
	{
		Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf;	//改变用户状态
		Ext_Param[Ext_No].Ext_EVENT = event12_CableBusy;	//用户进入绳路忙事件
		MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No, 
			WP_EVENT, TAL_EVENT, BufSize);
	}
}
/******************************
Name:HostHangup_MeetGroup(unchar group)
input:	group
output:	/
description:
挂起当前计算的总机的会议组
******************************/
void HostHangup_MeetGroup(unchar group)
{
unchar data Ext_No,channel,Num_Member,member;

	Num_Member = Temp_MeetGroup[group].Num_Member;
	channel = Ext_Param[Host_Ext].Num_Switch_Cable & 0xf0;
	if( Num_Member > 2 )
	{
		Temp_MeetGroup[group].Num_Member--;
		for(member=0;member<Num_Member;member++)
		{
			Ext_No= Temp_MeetGroup[group].Meet_Member[member];
			if(Ext_No<MAX_Ext)
			{
				Micro_Switch_8816(Ext_No, channel, 0);
			}
		}
	}
	else if( Num_Member == 2 )
	{
		Ext_No= Temp_MeetGroup[group].Meet_Member[0];
		Micro_Switch_8816(Ext_No,channel, 0);
		Temp_MeetGroup[group].Num_Member--;
		if( Ext_Param[Ext_No].Ext_State == state8_MeetTalk )
		{
			OPEN_EXT_Signal(Ext_No, 5);//主叫用户换被叫用户,其他用户等待
		}
	}
	else
	{
		Release_MeetGroup(group);
	}
}
/******************************
Name:HostConnet_MeetGroup(unchar group)
input:	group
output:	/
description:
连接当前计算的总机的会议组
******************************/
void HostConnet_MeetGroup(unchar group)
{
unchar data Ext_No;

	if( Temp_MeetGroup[group].Num_Member > 2 )
	{
		Ext_No = Temp_MeetGroup[group].Manager_Ext;
		Micro_Switch_8816(Host_Ext, 
			Ext_Param[Ext_No].Num_Switch_Cable & 0xf0, 1);	
		Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
		Temp_MeetGroup[group].Manager_Ext = Host_Ext;
		Temp_MeetGroup[group].Num_Member++;
	}
	else if( Temp_MeetGroup[group].Num_Member == 2 )
	{
		Ext_No = Temp_MeetGroup[group].Manager_Ext;
		Micro_Switch_8816(Host_Ext, 
			Ext_Param[Ext_No].Num_Switch_Cable & 0xf0, 1);	
		Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
		Temp_MeetGroup[group].Manager_Ext = Host_Ext;
		Temp_MeetGroup[group].Num_Member++;
		if( Ext_Param[Ext_No].Ext_State == state8_MeetTalk )
		{
			STOP_EXT_Signal(Ext_No);//主叫用户换被叫用户,其他用户等待
		}
	}
	else
	{
		Release_MeetGroup(group);
	}
}
/******************************
Name:Scan_NextManager(unchar group,unchar Ext_No)
input:	group
output:	/
description:
释放当前计算的会议组
注意:
会议组织者放在会议管理位置上
如果当前用户是会议成员,则直接挂机
如果当前用户是会议组织者,则要取消会议
******************************/
void Scan_NextManager(unchar group,unchar Ext_No)
{
unchar data i,allmember,manager,SExt_No;

	allmember = Temp_MeetGroup[group].Num_Member;
	manager = Temp_MeetGroup[group].Manager_Ext;
	if( Ext_No == manager )//挂机用户是会议主席
	{
		if(FlagSystemType)//如果系统应用在指令上就主机挂就直接挂
		{
			i = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路			
			Release_Cable(i);
			Ext_Timer_Reset(Ext_No);
			Ext_Param_Reset(Ext_No);
			Release_MeetGroup(group);
		}
		else//如果系统应用在普通电话上就循环主机占用
		{
			for(i=0;i<allmember;i++)
			{
				SExt_No = Temp_MeetGroup[group].Meet_Member[i];
				if( Ext_Param[SExt_No].Ext_State == state8_MeetTalk)
				{
					if(Temp_MeetGroup[group].Num_Member)
					{
						Temp_MeetGroup[group].Num_Member--;
						for(i=0;i<Temp_MeetGroup[group].Num_Member;i++)
						{
							HostExt_Called_List[Temp_MeetGroup[group].Meet_Member[i]] = 0;
							HostExt_Calling_List[Temp_MeetGroup[group].Meet_Member[i]] = 0;
						}
					}
					
					if( Ext_Param[SExt_No].Bit_Param >= 0x80 )
					{
						Ext_Param[SExt_No].Ext_EVENT = event2_ExtHookOff;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);//启动主席挂机,中继是主动挂机事件
					}
					else
					{
						if( Ext_No == Host_Ext )
						{	
							for(i=0;i<MAX_Ext;i++)
							{
								if(HostExt_Called_List[i] == 0xf0 )
								{
									Ext_Param[Ext_No].Num_Call_Other = i;//写入对方标志号码
									Ext_Param[Ext_No].Num_MeetGroup = Ext_Param[i].Num_MeetGroup;		//写入会议组号
									Ext_Param[Ext_No].Num_Call_Me= 0XFE;			//写入会议组号
									Ext_Param[Ext_No].Num_Switch_Cable = Ext_Param[i].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;
								}
							}
						}
						Temp_MeetGroup[group].Manager_Ext = SExt_No;
						Ext_Param[SExt_No].Num_Call_Other = Ext_No;
						Ext_Param[SExt_No].Ext_EVENT =event7_SExtHookOff;
						MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
							WP_EVENT, TAL_EVENT, BufSize);//启动主席挂机,用户是对方挂机事件
						Ext_No = SExt_No;
						for(i=0;i<allmember;i++)//撤销在队列里的管理者
						{
							SExt_No = Temp_MeetGroup[group].Meet_Member[i];
							if( Ext_No == SExt_No )
							{
								if(allmember==1)
								{
									Temp_MeetGroup[group].Meet_Member[0] = 0xff;
								}
								else
								{
									SExt_No = Temp_MeetGroup[group].Meet_Member[allmember-2];
									Temp_MeetGroup[group].Meet_Member[i] = SExt_No;
									Temp_MeetGroup[group].Meet_Member[allmember-2] = 0xff;
								}
								break;
							}
						}//分析完普通的用户会议
						
					}
					
					return;
				}
			}	
		}
	}
	else
	{
		for(i=0;i<allmember;i++)
		{//撤销在队列里的挂机用户
			SExt_No = Temp_MeetGroup[group].Meet_Member[i];
			HostExt_Called_List[SExt_No] = 0;
			HostExt_Calling_List[SExt_No] = 0;

			if( Ext_No == SExt_No )
			{
				SExt_No = Temp_MeetGroup[group].Meet_Member[allmember-2];
				Temp_MeetGroup[group].Meet_Member[i] = SExt_No;
				Temp_MeetGroup[group].Meet_Member[allmember-2] = 0xff;
				Temp_MeetGroup[group].Num_Member--;
				SExt_No = Temp_MeetGroup[group].Manager_Ext;
				Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
				MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
					WP_EVENT, TAL_EVENT, BufSize);//会议成员挂机,主席判断是否结束会议
				return;
			}
		}
	}
}


/************************************
Name:Save_System
Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void Save_System(unchar restart)
{
unchar i,m;
unint j;


	Write_FlashPage();
	Read_FlashSecter(0x0000);

	FlashRamTemp[0] = 0x55;				//首次启动计数为0开始
	FlashRamTemp[1] = EXT_Head;			//修改变量
	FlashRamTemp[2] = EXT_Len;			//修改变量
	FlashRamTemp[3] = Host_Head;			//修改变量
	FlashRamTemp[4] = TAL_EXT_PORT;		//修改变量
	FlashRamTemp[5] = TAL_MeetGroup;		//修改变量
	FlashRamTemp[6] = TAL_TrkGroup;		//修改变量
	FlashRamTemp[7] = TAL_TroopGroup;		//修改变量
	FlashRamTemp[8] = Hot_Len;			//修改变量
	FlashRamTemp[9] = Host_Ext;			//修改变量
	FlashRamTemp[10] = First_Meet_Head;			//修改变量
	FlashRamTemp[11] = First_Troop_Head;			//修改变量
	FlashRamTemp[12] = FlagSystemType;			//修改变量
	
	FlashRamTemp[20] = restart;			//修改复位重起变量
	FlashRamTemp[21] = FlagHeartSkip;			//修改变量
	FlashRamTemp[24] = Password1;
	FlashRamTemp[25] = Password2;
	FlashRamTemp[26] = Password3;

	
	Write_FlashPage();
	Write_FlashSecter(0x0000);				//向Flash写变量
	
/**********************************************************/
/*系统组参数表,地址从0100h开始*/
/**********************************************************/

	for(i=0;i<7;i++)//7组会议组
	{
		j = i*36; 
		FlashRamTemp[j++] = Meet_Group[i].MeetLen;	
		FlashRamTemp[j++] = Meet_Group[i].MeetHead;
		FlashRamTemp[j++] = Meet_Group[i].Meetstate;
		FlashRamTemp[j++] = Meet_Group[i].Num_Member;
		for(m=0;m<MAX_Ext;m++)
		{
			FlashRamTemp[j++] = Meet_Group[i].Meet_Member[m];	
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0100);
/*
	for(i=0;i<7;i++)//7组中继组
	{
		j = i*36; 
		FlashRamTemp[j++]= Trk_Group[i].TrkLen;		
		FlashRamTemp[j++]= Trk_Group[i].TrkHead;
		FlashRamTemp[j++] = Trk_Group[i].Num_Member;
		FlashRamTemp[j++] = Trk_Group[i].Num_Use;
		for(m=0;m<MAX_Ext;m++)
		{
			FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];	
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0200);
*/
	for(i=0;i<7;i++)//群呼组最大7组
	{
		j = i*37; 
		FlashRamTemp[j++] = Troop_Param[i].TroopLen;
		FlashRamTemp[j++] = Troop_Param[i].TroopHead;
		FlashRamTemp[j++] = Troop_Param[i].Num_Member;
		FlashRamTemp[j++] = Troop_Param[i].TroopType;
		FlashRamTemp[j++] = Troop_Param[i].Troopstate;
		for(m=0;m<MAX_Ext;m++)
		{
			FlashRamTemp[j++]= Troop_Param[i].Troop_Member[m];
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0300);
	
}

/************************************
Name:Restart_System

Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void ReLoad_System(void)
{
	Write_FlashPage();
	Read_FlashSecter(0x0000);

	FlashRamTemp[0] = 0x55;			//首次启动计数为0开始
	FlashRamTemp[20] = 0xaa;			//修改复位重起变量
	FlashRamTemp[22] = NoFreeFlag;
	FlashRamTemp[23] = NoFreeCounter;
	
	Write_FlashPage();
	Write_FlashSecter(0x0000);				//向Flash写变量
	systemreload = 1;
}

/************************************
Name:Read_8870ST

Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void Read_8870ST(void)
{
	if( (Counter5MS ==2)||(Counter5MS ==3) )
	{
		Ext_Group[(SLEC_Point+1)&0X03].DTMF_ST |= XBYTE[(Addr_DTMF_State)];
	}
	else if( Counter5MS ==0 )
	{
		Ext_Group[SLEC_Point&0X03].DTMF_ST |= XBYTE[(Addr_DTMF_State)];
	}
}

⌨️ 快捷键说明

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