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

📄 communication.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
																	WriteExtTelState(telnum,exttel_hold);//改变分机状态	
																																		
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;																			
																}
															else
																{//分机非空闲状态
																	exttel_switch_dialing_error_deal(telnum);	
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;														
																}														
										   		}	
										   } 		
									  } 												
								 }//解码消息							  								
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//分机线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_switch_dialing_error_deal(UCHAR telnum)
{
	idata UCHAR extcomgroupID;	
	
	extcomgroupID=findextcomgroupbyorigin(telnum);									
	if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
		{//该挂机分机为内部通话主叫方 
			ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
			SetExtTelErrorSound(telnum);		//给出错误提示音	
			WriteExtTelState(telnum,exttel_error);//改变分机状态								
															
			CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐
			Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,OFF);//切断通话	
			SetExtTelErrorSound(ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID);		//给出错误提示音	
			WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),exttel_error);//改变分机状态																																			
																																		
			ClearAComGroup(extcomgroupID);//撤消通话组									
		}	
	if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
	  {//该挂机分机为外部通话
			ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
			SetExtTelErrorSound(telnum);		//给出错误提示音	
	  	WriteExtTelState(telnum,exttel_error);//改变分机状态	
															
			CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐
			HoldOutsideLine(extcomgroupID);//挂机
			WriteOutTelState(extcomgroupID,outtel_hold);//改变外线状态																																			
																						
			ClearAComGroup(extcomgroupID);//撤消通话组																								
		}										
										
	extcomgroupID=findextcomgroupbyobject(telnum);
	if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
		{//该挂机分机为内部通话被叫方
			ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
			SetExtTelErrorSound(telnum);		//给出错误提示音	
			WriteExtTelState(telnum,exttel_error);//改变分机状态	
															
			CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐											
			Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,OFF);//切断通话	
			SetExtTelErrorSound(ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID);		//给出错误提示音	
			WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_error);//改变分机状态																																			
																																												
			ClearAComGroup(extcomgroupID);//撤消通话组																				
	 }	
}

void	exttel_error_deal(UCHAR telnum)
{
	idata UCHAR i;
	
	if(RawMessageNum!=0)
		{		
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{															
					if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
						{//为本分机消息
							if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_HOLD_MESSAGETYPE)
								{	//挂机消息
									WriteExtTelState(telnum,exttel_hold);		//改变分机状态
									SetExtTelQuietSound(telnum);				//停止错误提示音		
										
									RawMessageNum--;	//释放消息资源
									ClearAMessage(i);				
									return;																																			
								}									
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//分机线消息
				}//消息查询
		}//是否有消息
}//函数

void	ClearAMessage(UCHAR messageID)
{
	idata UCHAR i;
	for(i=0;i<MessageGroup_length;i++)
		{
			WriteMessageGroup(messageID,i,0);
		}
}

void	ClearAComGroup(UCHAR comgroupID)
{
	idata	UCHAR i;
	for(i=0;i<ExtComGroup_length;i++)
		{
			WriteExtComGroup(comgroupID,i,0);
		}
}

void	SendUnholdMessage(UCHAR	exttelnum)
{//发送摘机检测消息
	idata	UCHAR i;
	
	for(i=0;i<MESSAGEGROUPNUMBER;i++)
		{
			if(ReadMessageGroup(i,MessageGroup_type)==0)
				{
					WriteMessageGroup(i,MessageGroup_type,EXTTEL_UNHOLD_MESSAGETYPE);
					WriteMessageGroup(i,MessageGroup_origin,MACHINE_ID[exttelnum]);
					RawMessageNum++;			
					return;
				}
		}
	//暂时没有消息资源		
	
}
void	SendHoldMessage(UCHAR exttelnum)
{//发送挂机检测消息
	idata	UCHAR i;
	
	for(i=0;i<MESSAGEGROUPNUMBER;i++)
		{
			if(ReadMessageGroup(i,MessageGroup_type)==0)
				{
					WriteMessageGroup(i,MessageGroup_type,(EXTTEL_HOLD_MESSAGETYPE));
					WriteMessageGroup(i,MessageGroup_origin,(MACHINE_ID[exttelnum]));
					RawMessageNum++;
					return;
				}
		}
	//暂时没有消息资源		
	
}

UCHAR	findextcomgroupbyorigin(UCHAR telnum)
{
	idata UCHAR i;
	for(i=0;i<COMMUNICATIONGROUPNUM;i++)
		{		//查找通话组资源
			if(ReadExtComGroup(i,ExtComGroup_origin)==MACHINE_ID[telnum])
				{
					return i;
				}
		}
	return 0xff;	
}

UCHAR	findextcomgroupbyobject(UCHAR telnum)
{
	idata UCHAR i;
	for(i=0;i<COMMUNICATIONGROUPNUM;i++)
		{		//查找通话组资源
			if(ReadExtComGroup(i,ExtComGroup_object)==MACHINE_ID[telnum])
				{
					return i;
				}
		}
	return 0xff;	
}

UCHAR	testextcomgroup_inside()
{
	idata UCHAR i;
	for(i=OUTSIDETELNUM;i<4;i++)
		{
			if(ReadExtComGroup(i,ExtComGroup_state)==0)
				{return i;}
		}	
	return 0xff;
}

UCHAR	testoutline(UCHAR outtelnum)
{
	if(ReadExtComGroup(outtelnum,ExtComGroup_state)==0)
		{
			return outtelnum;
		}
	else
		{
			return 0xff;	
		}	
}

void	CreatExtComGroupByID(UCHAR extcomgroupID,UCHAR origin, UCHAR object, UCHAR type)
{
	WriteExtComGroup(extcomgroupID,ExtComGroup_state,1);	//通话组开始启动
	WriteExtComGroup(extcomgroupID,ExtComGroup_origin,origin);
	WriteExtComGroup(extcomgroupID,ExtComGroup_object,object);
	WriteExtComGroup(extcomgroupID,ExtComGroup_type,type);
}

UCHAR	CreateExtComGroup(UCHAR origin_call)		//origin_call 为分机号码 0,1,2,3,4,5,6,7
{
	idata	UCHAR i;

	for(i=0;i<COMMUNICATIONGROUPNUM;i++)
		{		//查找通话组资源						
			if(ReadExtComGroup(i,ExtComGroup_state)==0)
				{														
					WriteExtComGroup(i,ExtComGroup_state,1);	//通话组开始启动
					WriteExtComGroup(i,ExtComGroup_origin,MACHINE_ID[origin_call]);	//源分机	
																
					if(i>=OUTSIDETELNUM)
						{//外线已使用完毕,只能进行内部通话 通话类型位内部通话
							WriteExtComGroup(i,ExtComGroup_type,INSIDECOMTYPE);	//初始化为内部通话																		
						}
					else
						{//先定义为外部通话类型																									
							WriteExtComGroup(i,ExtComGroup_type,OUTSIDECOMTYPE);//初始化为外部通话类型																									
						}																																										
					return	i;						
				}	
		}	
	//暂时没有可用资源时的处理方法
	return 0xFF;	//出错标志
}

void	SendDecodeMessage(UCHAR exttelnum,UCHAR decode_data_length, UCHAR dtmfnum)	//
{//发送解得DTMF码消息
	idata UCHAR i;
	for(i=0;i<MESSAGEGROUPNUMBER;i++)
		{
			if(ReadMessageGroup(i,MessageGroup_type)==0)
				{
					WriteMessageGroup(i,MessageGroup_type,DECODE_DTMF_MESSAGETYPE);
					WriteMessageGroup(i,MessageGroup_origin,(exttelnum));
					WriteMessageGroup(i,MessageGroup_datastar,(dtmfnum));
					WriteMessageGroup(i,(MessageGroup_datastar+1),decode_data_length);
							
					RawMessageNum++;	
									
					return;
				}
		}	
	//暂时没有消息资源
}

void	SendOutsideCallInMessage(UCHAR linenum, UCHAR ringnum)
{//发送外线振铃消息
	idata	UCHAR i;

	for(i=0;i<MESSAGEGROUPNUMBER;i++)
		{
			if(ReadMessageGroup(i,MessageGroup_type)==0)
				{
					WriteMessageGroup(i,MessageGroup_type,(OUTSIDE_CALL_IN_MESSAGETYPE));
					WriteMessageGroup(i,MessageGroup_origin,OUTSIDELINE_ID[linenum]);
					WriteMessageGroup(i,MessageGroup_datastar,ringnum);
								
					RawMessageNum++;
					return;
				}
		}
	//暂时没有消息资源		
}

void	TakeTheRingPhone(UCHAR telnum)
{
	idata UCHAR i,temp,extcomgroupID;
	
	for(i=0;i<ExtTelNum;i++)
		{//查找是否有正在振铃的电话
			if(ReadExtTelState(i)==exttel_ring)
				{//存在正在振铃的分机
						temp=i;	//保存此分机号
						break;
				}
		  else{temp=0xff;}	
		}	

	extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
	ClearAComGroup(extcomgroupID);//撤消通话组		
	
	if(temp==0xff)
		{//无振铃分机			
			SetExtTelErrorSound(telnum);		//给出错误提示音	
			WriteExtTelState(telnum,exttel_error);//改变分机状态	
			
			return;					
		}
	else
		{//存在振铃分机,进行代街动作
			extcomgroupID=findextcomgroupbyobject(temp);									
			if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
				{//该挂机分机为内部通话	
					ExtTelStopRing(temp);//停止原振铃分机振铃													
					WriteExtTelState(temp,exttel_hold);//改变分机状态		
																		
					WriteExtComGroup(extcomgroupID,ExtComGroup_object,MACHINE_ID[telnum]);//改变通话组通话成员																	
					SetExtTelQuietSound(ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID);//停止主叫方的等待提示音											
					Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,ON);//建立通话连接通路
					Writesoundway(telnum,extcomgroupID,ON);//建立通话连接通路
										
					WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_useing);//改变分机状态													
					WriteExtTelState(telnum,exttel_useing);//改变分机状态		
					
					return;												
				}										
										
			extcomgroupID=findextcomgroupbyorigin(temp);
			if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
				{//该挂机分

⌨️ 快捷键说明

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