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

📄 communication.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
				}//消息查询
		}//是否有消息
}//函数

void	exttel_switch_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)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
										{//该挂机分机为内部通话主叫方 
											Writesoundway(telnum,HINTSOUND,ON);//切断450HZ可拨号提示音	
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);	//改变分机状态								
											
											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);//撤消通话组
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}	
									if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
										{//该挂机分机为外部通话
											Writesoundway(telnum,HINTSOUND,ON);//切断450HZ可拨号提示音
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);			//改变分机状态
											
											CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐
											HoldOutsideLine(extcomgroupID);//挂机
											WriteOutTelState(extcomgroupID,outtel_hold);//改变外线状态																																			
																						
											ClearAComGroup(extcomgroupID);//撤消通话组														
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}										
										
									extcomgroupID=findextcomgroupbyobject(telnum);
									if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
										{//该挂机分机为内部通话被叫方
											Writesoundway(telnum,HINTSOUND,ON);//切断450HZ可拨号提示音
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);	//改变分机状态
											
											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);//撤消通话组
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;																					
										}																																										
							  }	//挂机消息								
						
						  if(ReadMessageGroup(i,MessageGroup_type)==DECODE_DTMF_MESSAGETYPE)
							 {//DTMF解码消息					 	
									if(ReadMessageGroup(i,(MessageGroup_datastar+1))==1)
										{//收到1个拨号信息
											if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar)==0x0C)
												{//符合分机拨号标准
													Writesoundway(telnum,HINTSOUND,OFF);//切断450HZ可拨号提示音
													WriteExtTelState(telnum,exttel_switch_dialing);			//改变分机状态		
																								
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;													
												}
											else
												{//不符合分机拨号标准
													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);//撤消通话组
															RawMessageNum--;	//清楚已处理的消息
															ClearAMessage(i);												
															return;											
														}	
												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);//撤消通话组														
															RawMessageNum--;	//清楚已处理的消息
															ClearAMessage(i);												
															return;											
													}										
										
											 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);//撤消通话组
															RawMessageNum--;	//清楚已处理的消息
															ClearAMessage(i);												
															return;																					
												 }													
										 }		
									 }//解到第一个拨号信息										 						 															
								 }//解码消息							
							RawMessageNum--;	
							ClearAMessage(i);												
							return;	
						}//分机线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_switch_dialing_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)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
										{//该挂机分机为内部通话主叫方 		
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);	//改变分机状态								
											
											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);//撤消通话组
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}	
									if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
										{//该挂机分机为外部通话
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);			//改变分机状态
											
											CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐
											HoldOutsideLine(extcomgroupID);//挂机
											WriteOutTelState(extcomgroupID,outtel_hold);//改变外线状态																																			
																						
											ClearAComGroup(extcomgroupID);//撤消通话组														
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;											
										}										
										
									extcomgroupID=findextcomgroupbyobject(telnum);
									if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
										{//该挂机分机为内部通话被叫方
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
											WriteExtTelState(telnum,exttel_hold);	//改变分机状态
											
											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);//撤消通话组
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;																					
										}																																										
							  }	//挂机消息
							  
						  if(ReadMessageGroup(i,MessageGroup_type)==DECODE_DTMF_MESSAGETYPE)
							 {//DTMF解码消息	
									if(ReadMessageGroup(i,(MessageGroup_datastar+1))==2)
										{//收到2个拨号信息
											if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+1)==0x08)
												{//符合分机拨号标准
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;													
												}
											else
												{//不符合分机拨号标准
													exttel_switch_dialing_error_deal(telnum);	
													RawMessageNum--;	//清楚已处理的消息
													ClearAMessage(i);												
													return;											
												}	
										}		
										
									if(ReadMessageGroup(i,(MessageGroup_datastar+1))==3)
										{//收到3个拨号信息	
											if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+2)==0x00)
												{//符合分机拨号标准
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;													
												}
											else
												{//不符合分机拨号标准
													exttel_switch_dialing_error_deal(telnum);	
													RawMessageNum--;	//清楚已处理的消息
													ClearAMessage(i);												
													return;																																					
												}	
										}																																	
									
									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((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
														{//该挂机分机为内部通话主叫方 
															if(ReadExtTelState(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)-EXTTEL_ID)==exttel_hold)
																{//分机空闲状态																			
																	CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐																	
																	Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,OFF);//断开通道
																																												
																	WriteExtComGroup(extcomgroupID,ExtComGroup_origin,ReadExtComGroup(extcomgroupID,ExtComGroup_object));
																	WriteExtComGroup(extcomgroupID,ExtComGroup_object,ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3));
																	//修改通话组成员																	
																	
																	WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),exttel_receCID);//改变分机状态
																	WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_sendCID);	//改变分机状态																														
																	
																	ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
																	WriteExtTelState(telnum,exttel_hold);//改变分机状态	
																																		
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;																			
																}
															else
																{//分机非空闲状态
																	exttel_switch_dialing_error_deal(telnum);	
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;														
																}																
													}	
												if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
	 											  {//该挂机分机为外部通话
															if(ReadExtTelState(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)-EXTTEL_ID)==exttel_hold)
																{//分机空闲状态																			
																	//CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐																	
																	Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,OFF);//断开通道
																																												
																	WriteExtComGroup(extcomgroupID,ExtComGroup_origin,ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3));
																	//WriteExtComGroup(extcomgroupID,ExtComGroup_object,ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3));
																	//修改通话组成员																	
																	
																	//WriteOutTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-OUTSIDETEL_ID),outtel_ring);//改变外线状态
																	WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_sendCID);	//改变分机状态																														
																	
																	ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
																	WriteExtTelState(telnum,exttel_hold);//改变分机状态	
																																		
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;																			
																}
															else
																{//分机非空闲状态
																	exttel_switch_dialing_error_deal(telnum);	
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;														
																}																									
													}										
										
												extcomgroupID=findextcomgroupbyobject(telnum);
												if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
													{//该挂机分机为内部通话被叫方
															if(ReadExtTelState(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3)-EXTTEL_ID)==exttel_hold)
																{//分机空闲状态																			
																	CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100);		//断开音乐																	
																	Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,OFF);//断开通道
																																												
																	WriteExtComGroup(extcomgroupID,ExtComGroup_object,ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+3));
																	//修改通话组成员																	
																	
																	WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),exttel_receCID);//改变分机状态
																	WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_sendCID);	//改变分机状态																														
																	
																	ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	

⌨️ 快捷键说明

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