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

📄 communication.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
												}
											else
												{
													for(j=0;j<ExtTelNum;j++)
														{	//查找振铃空闲分机
															if(ReadExtTelState(j)==exttel_hold)
																{	
																	CreatExtComGroupByID(outtelnum,MACHINE_ID[j],OUTSIDELINE_ID[outtelnum],OUTSIDECOMTYPE);
																		//建立通话组
																	WriteOutTelState(outtelnum,outtel_ring);//改变外线状态
																	WriteExtTelState(j,exttel_sendCID);//接受来电显示															
																	RawMessageNum--;	//清楚已处理的消息
																	ClearAMessage(i);												
																	return;																				
																}
														}	
												//不存在空闲分机
												RawMessageNum--;	//清楚已处理的消息
												ClearAMessage(i);												
												return;																							
											}										
										}//第一声振铃
								}//振铃消息
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数

void	outtel_ring_deal(UCHAR outtelnum)
{
	idata UCHAR i;
	
	if(RawMessageNum!=0)
		{
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{
					if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
						{	//为本外线消息	
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数

void	outtel_using_deal(UCHAR outtelnum)
{
	idata UCHAR i;
	
	if(RawMessageNum!=0)
		{
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{
					if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
						{	//为本外线消息	
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_hold_deal(UCHAR telnum)	//telnum 为分机号码 0,1,2,3,4,5,6,7
{
	idata UCHAR i,temp;
	
	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)
								{	//摘机消息										
									temp=CreateExtComGroup(telnum);
									if(temp==0xff)
										{//没有通话组资源出错
											SetExtTelErrorSound(telnum);	//给出出错提示
											WriteExtTelState(telnum,exttel_error);												
										}
									else if(ReadExtComGroup(temp,ExtComGroup_type)==INSIDECOMTYPE)
										{//内部通话
											SetExtTelQuietSound(telnum);//初始化提示音
											Writesoundway(telnum,HINTSOUND,ON);//给出450HZ可拨号提示音																			
											StarDecordDTMF(MACHINE_ID[telnum]);//开始检测DTMF																																																																			
										}	
									else	
										{//外部通话
											SetExtTelQuietSound(telnum);//初始化提示音
											WriteExtComGroup(temp,ExtComGroup_object,OUTSIDELINE_ID[temp]);//选择通道连接							
											TakeOutsideLine(temp);//拿线													
											StarDecordDTMF(MACHINE_ID[telnum]);	//开始检测DTMF															
											Writesoundway(telnum,temp,ON);//连接外线																																																										
										}
										
											WriteExtTelState(telnum,exttel_unhold);//改变分机状态									
											WriteExtTelTime(telnum,EXTTELTIME_30S);//启动时间功能		
															
											RawMessageNum--;	//清楚已处理的消息
											ClearAMessage(i);												
											return;
								}
							 else
								{//其它的消息类型不处理,进行防错动作
									WriteExtTelState(telnum,exttel_hold);
										
									RawMessageNum--;	//清楚已处理的消息
									ClearAMessage(i);												
									return;								
								}										
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本分机消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_unhold_deal(UCHAR	telnum)
{
	idata UCHAR i,extcomgroupID,temp;
	
	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)
										{//内部通话类型
											Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音														
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源											
										}
									else
										{//外部通话类型											
											Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接	
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源									
											HoldOutsideLine(extcomgroupID);//挂线																																																				
										}	
									WriteExtTelState(telnum,exttel_hold);	//改变分机状态	
									WriteExtTelTime(telnum,0);//关闭时间功能	
									ClearAComGroup(extcomgroupID);	//释放通话组资源										
										
									RawMessageNum--;	//释放消息资源
									ClearAMessage(i);				
									return;																																			
								}//挂机消息
																									
							if(ReadMessageGroup(i,MessageGroup_type)==DECODE_DTMF_MESSAGETYPE)
								{//DTMF解码消息
									if(ReadMessageGroup(i,(MessageGroup_datastar+1))==1)
											{//第一个拨号信息
												extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
												if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
													{//原定为内部通话组
														if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar)==0x0C)
															{//实为内线拨号
																Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音	
																WriteExtTelState(telnum,exttel_dialing);	//改变分机状态
																WriteExtTelTime(telnum,0);//关闭时间功能	
																
																RawMessageNum--;	//释放消息资源
																ClearAMessage(i);																	
																return;																
															}
														else
															{//实为外部通话组
																//因为外线已经被占用,无法开启外部通话 给出错提示音
																Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音														
																ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源													
																SetExtTelErrorSound(telnum);		//给出错误提示音		
																WriteExtTelState(telnum,exttel_error);//改变分机状态	
																WriteExtTelTime(telnum,0);//关闭时间功能	
																
																RawMessageNum--;	//释放消息资源
																ClearAMessage(i);																	
																return;																																								
															}																				
													}
												else
													{//原定为外部通话组
														if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar)==0x0C)
															{//实为内线拨号
																Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接								
																HoldOutsideLine(extcomgroupID);//挂断外线	
																temp=testextcomgroup_inside();//若还有空闲内部通话组,返回通话组编号
																if(temp!=0xff)
																	{//还存在空闲的内部通话时 将外部通话转移到内部通话组来
																		ClearAComGroup(extcomgroupID);//消除原有通话组
																		CreatExtComGroupByID(temp,MACHINE_ID[telnum],0,INSIDECOMTYPE);	//新建空闲通话组			
																	}
																else
																	{//仍然使用原通话组	
																		WriteExtComGroup(extcomgroupID,ExtComGroup_type,INSIDECOMTYPE);	//修改通话类型
																		WriteExtComGroup(extcomgroupID,ExtComGroup_object,0);	//修改通话目标														
																	}
																WriteExtTelState(telnum,exttel_dialing);	//改变分机状态
																WriteExtTelTime(telnum,0);//关闭时间功能	
																
																RawMessageNum--;	//释放消息资源
																ClearAMessage(i);																	
																return;																	
															}
														else
															{//实为外部通话组
																ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
																WriteExtTelState(telnum,exttel_dialing);	//改变分机状态
																WriteExtTelTime(telnum,0);//关闭时间功能	
																
																RawMessageNum--;	//释放消息资源
																ClearAMessage(i);																	
																return;																	
															}																
													}														
											}//第一个拨号信息
										else
											{//如果不是第一个拨号信息 给出出错提示
												RawMessageNum--;	//释放消息资源
												ClearAMessage(i);																	
												return;
											}																								
									}//解码消息														
							RawMessageNum--;	//清楚已处理的消息
							ClearAMessage(i);												
							return;	
						}//本外线消息
				}//消息查询
		}//是否有消息
}//函数

void	exttel_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(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
										{//内部通话类型																			
											ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源											
										}
									else
										{//外部通话类型
											Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接									
											HoldOutsideLine(extcomgroupID);//挂线																																																				
										}	
									ClearAComGroup(extcomgroupID);	//释放通话组资源			
									WriteExtTelState(telnum,exttel_hold);	//改变分机状态
										
									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)==0x01)
												{//戴接电话功能
													ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
													TakeTheRingPhone(telnum);
													
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;																
												}
											else if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+1)==0x08)
												{//符合分机拨号标准
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;													
												}
											else
												{//不符合分机拨号标准
													extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
													ClearAComGroup(extcomgroupID);//撤消通话组
													ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
													SetExtTelErrorSound(telnum);		//给出错误提示音	
													WriteExtTelState(telnum,exttel_error);//改变分机状态	
													
													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
												{//不符合分机拨号标准
													extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
													ClearAComGroup(extcomgroupID);//撤消通话组
													ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源	
													SetExtTelErrorSound(telnum);		//给出错误提示音	
													WriteExtTelState(telnum,exttel_error);//改变分机状态	
													
													RawMessageNum--;	//释放消息资源
													ClearAMessage(i);				
													return;																											
												}	
										}																																	
									

⌨️ 快捷键说明

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