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

📄 communication.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
									if(ReadMessageGroup(i,(MessageGroup_datastar+1))==4)
										{//收到4个拨号信息	
											if((ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)<=4)
												 &(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)>=1))
												{//达到分机拨号长度 且符合拨号规定	
													extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号	
													if(ReadExtTelState(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)-EXTTEL_ID)==exttel_hold)
														{//分机空闲状态												
															WriteExtComGroup(extcomgroupID,ExtComGroup_object,ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3));
																//修改通话组成员
															ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
															WriteExtTelState((ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)-EXTTEL_ID),exttel_receCID);//改变分机状态
															WriteExtTelState(telnum,exttel_sendCID);	//改变分机状态																														
														}
													else
														{//分机非空闲状态
															ClearAComGroup(extcomgroupID);//撤消通话组
															ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
															SetExtTelErrorSound(telnum);		//给出错误提示音	
															WriteExtTelState(telnum,exttel_error);//改变分机状态														
														}	
																														
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;												
												}
										 }											
								 }//解码消息
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数

void exttel_sendCID_deal(UCHAR telnum)
{
	idata UCHAR i,extcomgroupID;
		
	if(ReadCID(CID_state)==CID_STATE_ENWRITE)
		{//资源空闲状态		
			extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号	
			ConnectTowPoint_CD22100((extcomgroupID+1),SEND_DTMF_22100);	//连接CID信号源
			if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)	
				{
					Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,ON);
						//通道连接	
						//准备内容
					WriteCID(CID_length,0x00);//初始化指针	
					WriteCID(CID_ptr,(CID_ptr+1));//初始化指针	
			
					WriteCID(ReadCID(CID_ptr),0x0C);
					WriteCID(CID_ptr,(ReadCID(CID_ptr)+1));		//指针 指向下一个位置
					WriteCID(CID_length,(ReadCID(CID_length)+1)); //长度 加一	
			
					WriteCID(ReadCID(CID_ptr),0x08);
					WriteCID(CID_ptr,(ReadCID(CID_ptr)+1));		//指针 指向下一个位置
					WriteCID(CID_length,(ReadCID(CID_length)+1)); //长度 加一							
						
					WriteCID(ReadCID(CID_ptr),0x00);
					WriteCID(CID_ptr,(ReadCID(CID_ptr)+1));		//指针 指向下一个位置
					WriteCID(CID_length,(ReadCID(CID_length)+1)); //长度 加一			
			
					WriteCID(ReadCID(CID_ptr),MACHINE_ID[telnum]);
					WriteCID(CID_ptr,(ReadCID(CID_ptr)+1));		//指针 指向下一个位置
					WriteCID(CID_length,(ReadCID(CID_length)+1)); //长度 加一
			
					WriteCID(CID_ptr,(CID_ptr+1));//指针归位						
				}
			else
				{
					Writesoundway(telnum,extcomgroupID,ON);
						//通道连接
					WriteCID(CID_length,0x00);//初始化指针	
					WriteCID(CID_ptr,(CID_ptr+1));//初始化指针	
					
					for(i=0;i<3;i++)
						{
							WriteCID(ReadCID(CID_ptr),(extcomgroupID+1));
							WriteCID(CID_ptr,(ReadCID(CID_ptr)+1));		//指针 指向下一个位置
							WriteCID(CID_length,(ReadCID(CID_length)+1)); //长度 加一	
					  }	
					WriteCID(CID_ptr,(CID_ptr+1));//指针归位	 																
				}				
			WriteCID(CID_state,CID_STATE_ENREAD); //改变状态	
			return;	
		}		 	
		
	if(ReadCID(CID_state)==CID_STATE_ENREAD)
		{//发送过程中		
			return;
		}

	if(ReadCID(CID_state)==CID_STATE_SENDOVER)
		{//发送完毕
			extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
			CutTowPoint_CD22100((extcomgroupID+1),SEND_DTMF_22100);	//断开CID信号源		
				//通道断开				
			if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)	
				{
					Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,OFF);
						//通道断开	
					ExtTelRing(ReadExtComGroup(extcomgroupID,(ExtComGroup_object))-EXTTEL_ID);
						//被呼分机分机振铃			
					SetExtTelWaitSound(telnum);	
						//呼叫分机听等待提示音
					WriteExtTelState((ReadExtComGroup(extcomgroupID,(ExtComGroup_object))-EXTTEL_ID),exttel_ring);	
						//改变分机状态	
					WriteExtTelState(telnum,exttel_waiting);	
						//改变分机状态																								
				}
			else
				{//外线的来电显示
					Writesoundway(telnum,extcomgroupID,OFF);
						//通道断开	
					ExtTelRing(telnum);
						//被呼分机分机振铃	
					WriteExtTelState(telnum,exttel_ring);	
						//改变分机状态																																		
				}		
			WriteCID(CID_state,CID_STATE_ENWRITE);	//可以重新发送			
			return;
		}		
}
			
void	exttel_waiting_deal(UCHAR telnum)		
{
	idata UCHAR i,extcomgroupID;
	
	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)
								{	//挂机消息
									extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号																
									if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
										{//内部通话类型
											SetExtTelQuietSound(telnum);//停止主叫方的等待提示音	
											WriteExtTelState(telnum,exttel_hold);//改变主叫方分机状态																															
																							
											ExtTelStopRing(ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID);	//停止振铃																
											WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),exttel_hold);//改变被叫方分机状态
										}
									else
										{//外部通话类型
											
										}	
									ClearAComGroup(extcomgroupID);	//释放通话组资源												
										
									RawMessageNum--;	//释放消息资源
									ClearAMessage(i);				
									return;																																			
							 }									
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数
			
void	exttel_ring_deal(UCHAR telnum)
{
	idata UCHAR i,extcomgroupID;
	
	if(RawMessageNum!=0)
		{
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{				
					if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
						{	//为本分机消息	
							if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_UNHOLD_MESSAGETYPE)
								{//摘机消息																			
									extcomgroupID=findextcomgroupbyobject(telnum);//取得通话组编号								
									if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
										{//该挂机分机为内部通话主叫方 
											ExtTelStopRing(telnum);	//停止振铃
											Writesoundway(telnum,extcomgroupID,ON);	//建立通话
											WriteExtTelState(telnum,exttel_useing);		//改变分机状态
											
											SetExtTelQuietSound(ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID);//停止主叫方的等待提示音											
											Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,ON);//建立通话																																												
											WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_useing);//改变主叫方分机状态
											
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}		
																											
									extcomgroupID=findextcomgroupbyorigin(telnum);											
									if((extcomgroupID!=0xff)&( ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
										{//该挂机分机为外部通话
											ExtTelStopRing(telnum);	//停止振铃
											Writesoundway(telnum,extcomgroupID,ON);	//建立通话
											WriteExtTelState(telnum,exttel_useing);		//改变分机状态
											
											CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);	//断开音乐 主要用于转接过程
											ReleaseOutsideTelRingCheckRes(extcomgroupID);//释放外线振铃检测资源										
											TakeOutsideLine(extcomgroupID);//摘机																																																						
											WriteOutTelState(extcomgroupID,outtel_using);//改变主叫方(外线)分机状态
											
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}			
										
									//出错情况										
									RawMessageNum--;	//清楚已处理的消息
									ClearAMessage(i);												
									return;
								}
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//分机线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_useing_deal(UCHAR telnum)
{
	idata UCHAR i,extcomgroupID;
	
	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)
								{//挂机消息	
									extcomgroupID=findextcomgroupbyorigin(telnum);									
									if(extcomgroupID!=0xff)
										{//该挂机分机为内部通话主叫方 、外部通话被叫方			
											Writesoundway(telnum,extcomgroupID,OFF);//切断通话
											WriteExtTelState(telnum,exttel_flash);//改变分机状态
											WriteExtTelTime(telnum,EXTTELTIME_1S);//设置时间
																																		
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}									
										
									extcomgroupID=findextcomgroupbyobject(telnum);
									if(extcomgroupID!=0xff)
										{//该挂机分机为内部通话被叫方 			
											Writesoundway(telnum,extcomgroupID,OFF);//切断通话
											WriteExtTelState(telnum,exttel_flash);//改变分机状态
											WriteExtTelTime(telnum,EXTTELTIME_1S);//设置时间
																																		
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}
										
									//出错情况																							
									RawMessageNum--;	//清楚已处理的消息
									ClearAMessage(i);												
									return;
								}
							RawMessageNum--;	//本机异常消息
							ClearAMessage(i);												
							return;	
						}//分机线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_flash_deal(UCHAR telnum)
{
	idata UCHAR i,extcomgroupID;
	
	if(RawMessageNum!=0)
		{		
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{															
					if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
						{//为本分机消息
							if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_UNHOLD_MESSAGETYPE)
								{	//摘机消息	
									extcomgroupID=findextcomgroupbyorigin(telnum);									
									if(extcomgroupID!=0xff)
										{//该挂机分机为内部通话主叫方 			
											Writesoundway(telnum,HINTSOUND,ON);//给出450HZ可拨号提示音																			
											StarDecordDTMF(MACHINE_ID[telnum]);//开始检测DTMF				
											WriteExtTelState(telnum,exttel_switch);//改变分机状态																						
											WriteExtTelTime(telnum,0);//停止时间	
																						
											ConnectTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//连接音乐
									
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;													
										}									
									
									extcomgroupID=findextcomgroupbyobject(telnum);
									if(extcomgroupID!=0xff)
										{//该挂机分机为内部通话主叫方 			
											Writesoundway(telnum,HINTSOUND,ON);//给出450HZ可拨号提示音																			
											StarDecordDTMF(MACHINE_ID[telnum]);//开始检测DTMF				
											WriteExtTelState(telnum,exttel_switch);//改变分机状态																						
											WriteExtTelTime(telnum,0);//停止时间	
																						
											ConnectTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//连接音乐
									
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}
										
									//出错情况																							
									RawMessageNum--;	//清楚已处理的消息
									ClearAMessage(i);												
									return;																																																
								}									
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//分机线消息

⌨️ 快捷键说明

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