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

📄 d160aunpbxdlg.cpp

📁 VC交换机例程,东进
💻 CPP
📖 第 1 页 / 共 4 页
字号:
							if(TelLine[i].BusyFlag==FALSE)
							{	// 找到了空闲的外线通道
								TelLine[i].BusyFlag=TRUE;
								TelLine[channel].WaiConnectCh=i;
								TelLine[i].CallCh=channel;
								break;
							}
							goto ErrorProc;// 放忙音
						}
							
					//DTMF码的转换和存储
						OffHook(i);
						StartSigCheck(i);
						StartHangUpDetect(channel);
					
						//呼叫长途,通过IP
						Sig_StartDial(i,"17910,,,,,,1,,,1351700057311018#","9",0);
						TelLine[channel].DisStatusMessage="长话呼叫中…";
						TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="正在进行长话呼出…";
						TelLine[i].Status=LINE_JUST_WAIT;
						TelLine[channel].Status=LINE_IP_ISCONNECT;
						break;
					}
					break;
				}// End of 内线的状态处理	


				//*************************************************************************
				//*************************************************************************
				if(TelLine[channel].DtmfPos==0 && TelLine[channel].ChType==CHTYPE_TRUNK 
					&& ElapseTime(channel,TIMER_NO)>=ONE_SECOND*10)
				{	// 外线通道接通后5秒内不拨分机号,自动转自动声讯服

					//**********************我又要用GOTO 语句了,哈哈哈……!
					TelLine[channel].DtmfPos =3;
					TelLine[channel].DtmfArray [0]=10;
					TelLine[channel].DtmfArray [1]=8;					
					StartSigCheck(channel);
					TelLine[channel].DisStatusMessage =" 自动声讯服务 …";
					goto INTERCALL;
				}

				//*************************************************************************
				//*************************************************************************
				if(TelLine[channel].DtmfPos!=0 && TelLine[channel].ChType==CHTYPE_TRUNK)
				{// 外线的收码处理
					
					// 如果拨零查号,则转01
					if(TelLine[channel].DtmfArray[0]==9)
					{
						TelLine[channel].DtmfPos =3;
						TelLine[channel].DtmfArray [0]=10;
						TelLine[channel].DtmfArray [1]=1;					
						StartSigCheck(channel);
						TelLine[channel].DisStatusMessage =" 呼叫内线分机 …";
						goto INTERCALL;
					
						break;
					}
					// 延时6秒钟,不拨号,自动转01
					if(ElapseTime(channel,TIMER_NO)>=ONE_SECOND*3)
					{
						TelLine[channel].DtmfPos =3;
						TelLine[channel].DtmfArray [0]=10;
						TelLine[channel].DtmfArray [1]=1;;
					
						StartSigCheck(channel);
						TelLine[channel].DisStatusMessage =" 呼叫内线分机 …";
						goto INTERCALL;
					//	TelLine[channel].Status =INTERCALL;
						break;
				
					}
				

					// 外线直接拨内线的分机号,则转内线处理
					if(TelLine[channel].DtmfPos ==2)
					{
						//for(i=3;i>0;i--)
						//	TelLine[channel].DtmfArray [i]
						//	  =TelLine[channel].DtmfArray [i-1];
						for(i=0;i<=2;i++)
								TelLine[channel].DtmfArray[i]=(char)(TelLine[channel].DtmfArray[i]%10+48);
						StartSigCheck(channel);
						goto INTERCALL;
						
					}
					
					
					break;

				}// End of 外线的状态处理	
				break;// End of case LINE_GET_DTMF
	
			///*****************		
			ErrorProc:	//******				// 收码的出错处理部分
			///*****************
				if(TelLine[channel].ChType==CHTYPE_USER)
				{
					// 代接,转接的情况
					{

					}
					StartPlaySignal(channel,SIG_BUSY1);
					TelLine[channel].Status=LINE_WAIT_HANGUP;
					break;
				}
				if(TelLine[channel].ChType==CHTYPE_TRUNK)
				{
					InitDtmfBuf(channel);
					TelLine[channel].DtmfPos=0;
					StartPlayFile(channel,FileName,0);
					TelLine[channel].Status=LINE_WELCOME;
					break;
				}
				break;
							////////////////////////////////////////////////////////////
							////////////////////////////////////////////////////////////


			case	LINE_WAIT_INTER_OFFHOOK:
				TelLine[channel].DisStatusMessage="等待内线被叫用户摘机…";
				if(TelLine[channel].ChType==CHTYPE_TRUNK && Sig_CheckBusy(channel))
				{	// 外线主叫用户挂机
					HangUp(channel);
					TelLine[channel].Status=LINE_INIT;
					TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
					break;
				}
			
				if(OffHookDetect(TelLine[channel].ConnectCh))
				{	// 被叫摘机
					InitDtmfBuf(channel);
					InitDtmfBuf(TelLine[channel].ConnectCh);
					FeedPower(TelLine[channel].ConnectCh);					// 停被叫振铃
					StartHangUpDetect(TelLine[channel].ConnectCh);
					StartPlaySignal(channel,SIG_STOP);						// 停主叫回铃音
					StartPlaySignal(TelLine[channel].ConnectCh,SIG_STOP);
					StopPlayFile(channel);
					StopPlayFile(TelLine[channel].ConnectCh);
					SetLink(channel,TelLine[channel].ConnectCh);			// 连通主叫和被叫
			
					if(TelLine[channel].ChType==CHTYPE_TRUNK)
					{ // 外线呼叫内线,接通以后,主、被叫交换
						TelLine[channel].CallCh=TelLine[channel].ConnectCh;
						TelLine[TelLine[channel].ConnectCh].ConnectCh=channel;
						TelLine[TelLine[channel].ConnectCh].WaiConnectCh=channel;
						TelLine[TelLine[channel].ConnectCh].CallCh=-1;
						TelLine[channel].ConnectCh=-1;
						StartHangUpDetect(TelLine[channel].ConnectCh);
						StartSigCheck(channel);
						TelLine[channel].Status=LINE_JUST_WAIT;
						TelLine[channel].DisStatusMessage="和内线进行通话 …";
						TelLine[TelLine[channel].CallCh].Status=LINE_INTER_CALL;
						break;
					}
					
					TelLine[channel].DisStatusMessage="进行内线通话…";
					TelLine[TelLine[channel].ConnectCh].DisStatusMessage="接听内线来电…";
					
					// 所有内线均须进行挂机和拍叉簧处理
					TelLine[channel].Status=LINE_INTER_CALL;
					TelLine[TelLine[channel].ConnectCh].Status=LINE_INTER_CALL;
					break;
				}			

				if(TelLine[channel].ChType==CHTYPE_TRUNK)	break;
				// 内线的挂机及拍叉簧处理
				switch( HangUpDetect(channel))
				{
				
					case HANG_UP_FLAG_START:
						break;
					case HANG_UP_FLAG_FALSE:								// 
						break;
					case HANG_UP_FLAG_PRESS_R:								// 拍叉簧处理
						if(TelLine[channel].PRESSFLAG)
						{// 用户二次拍叉簧动作
							TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
							TelLine[channel].ConnectCh=TelLine[channel].HoldCh;
							TelLine[TelLine[channel].HoldCh].CallCh=channel;
							TelLine[TelLine[channel].HoldCh].ConnectCh=-1;
							TelLine[channel].CallCh=-1;
							if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_USER)
								TelLine[TelLine[channel].HoldCh].Status=LINE_INTER_CALL;
							if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
							{
								TelLine[TelLine[channel].HoldCh].Status=LINE_JUST_WAIT;
								TelLine[TelLine[i].CallCh].DisStatusMessage="和内线进行通话…";
							}
							break;
						}
						
						TelLine[channel].Status=LINE_INIT;
						TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;

						break;
					case HANG_UP_FLAG_TRUE:									// 挂机处理
						TelLine[channel].Status=LINE_INIT;
						TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
						if(TelLine[channel].PRESSFLAG)
						{// 用户一次拍叉簧然后挂机动作
							if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
							{	// 和外线通道相连
								HangUp(TelLine[channel].HoldCh);
								TelLine[TelLine[channel].HoldCh].Status=LINE_INIT;
								break;
							}
							StartPlaySignal(TelLine[channel].HoldCh,SIG_BUSY1);
							TelLine[TelLine[channel].HoldCh].Status=LINE_WAIT_HANGUP;
							break;
						}
						break;
					default: break;
				}

				break;

			case	LINE_INTER_CALL:	// 只要通话过程一建立,即将外线用户,作为被叫用户

				if(TelLine[channel].WaiConnectCh!=-1)
				{	// 被叫为外线
					if(Sig_CheckBusy(TelLine[channel].ConnectCh))
					{	// 外线被叫用户挂机
						ClearLink(channel,TelLine[channel].ConnectCh);
						HangUp(TelLine[channel].ConnectCh);
						TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
						StartPlaySignal(channel,SIG_BUSY1);
						TelLine[channel].Status=LINE_WAIT_HANGUP;
						break;
					}
				}
                 
				// 内线的挂机及拍叉簧处理
				switch(HangUpDetect(channel))
				{
					case HANG_UP_FLAG_PRESS_R:					// 拍叉簧处理
						TelLine[channel].PRESSFLAG=TRUE;
						StartHangUpDetect(channel);

						if(TelLine[channel].WaiConnectCh!=-1)
						{	// 内线呼叫外线用户时,拍叉簧
							//	if(TelLine[channel].ConnectCh
							ClearLink(channel,TelLine[channel].WaiConnectCh);
							TelLine[channel].HoldCh=TelLine[channel].WaiConnectCh;
							TelLine[channel].ConnectCh=-1;
							// 为外线通道放背景音乐
							//StartPlayFile(TelLine[channel].WaiConnectCh,FileName,0);
							StartPlaySignal(channel,SIG_DIALTONE);
							TelLine[channel].Status =LINE_GET_DTMF;
							break;
						}
						
						if(TelLine[channel].CallCh==-1)
							ClearLink(channel,TelLine[channel].ConnectCh);
						else 
							ClearLink(channel,TelLine[channel].CallCh);

						StartPlaySignal(channel,SIG_STOP);
						InitDtmfBuf(channel);
						TelLine[channel].DtmfPos =0;
						TelLine[channel].Status =LINE_GET_DTMF;
						// 内线用户通话,不管主叫被叫,拍叉簧的重新顶为主叫
						if(TelLine[channel].CallCh!=-1)
						{
							TelLine[channel].HoldCh=TelLine[channel].CallCh;
							TelLine[channel].ConnectCh=-1;
							TelLine[channel].CallCh=-1;

							TelLine[TelLine[channel].CallCh].CallCh=channel;
							TelLine[TelLine[channel].CallCh].ConnectCh=-1;
							TelLine[TelLine[channel].CallCh].HoldCh=-1;
							TelLine[TelLine[channel].CallCh].DisStatusMessage="等待用户转接 …";
							TelLine[TelLine[channel].CallCh].Status=LINE_JUST_WAIT;
							break;
						}


						//StartPlayFile(TelLine[channel].ConnectCh,FileName,0);// 放背景音乐
						TelLine[channel].HoldCh=TelLine[channel].ConnectCh;
						TelLine[TelLine[channel].ConnectCh].ConnectCh=-1;
						TelLine[TelLine[channel].ConnectCh].DisStatusMessage="等待用户转接 …";
						TelLine[TelLine[channel].ConnectCh].Status=	LINE_JUST_WAIT;
						break;
						
					case HANG_UP_FLAG_START:
						break;
					case HANG_UP_FLAG_FALSE:		// 
						break;
					case HANG_UP_FLAG_TRUE:			// 挂机处理
						TelLine[channel].Status=LINE_INIT;

						if(TelLine[channel].HoldCh!=-1)
						{	//为转接、代接或转叫
							TelLine[TelLine[channel].ConnectCh].PRESSFLAG=FALSE;
							TelLine[TelLine[channel].HoldCh].PRESSFLAG=FALSE;

							TelLine[TelLine[channel].ConnectCh].ConnectCh=TelLine[channel].HoldCh;
							TelLine[TelLine[channel].ConnectCh].CallCh=-1;
							TelLine[TelLine[channel].HoldCh].CallCh=TelLine[channel].ConnectCh;
							StopPlayFile(TelLine[channel].HoldCh);
							StartPlaySignal(TelLine[channel].HoldCh,SIG_STOP);
						
							
							//***
							StartHangUpDetect(TelLine[channel].HoldCh);
							StartHangUpDetect(channel);
							TelLine[TelLine[channel].ConnectCh].Status=LINE_INTER_CALL;
							TelLine[TelLine[channel].HoldCh].Status=LINE_INTER_CALL;
							TelLine[TelLine[channel].HoldCh].DisStatusMessage="内线通话中 …";

							if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
							{
								TelLine[TelLine[channel].HoldCh].Status=LINE_JUST_WAIT;
								TelLine[TelLine[channel].HoldCh].DisStatusMessage="和内线进行通话 …";
							}
							TelLine[TelLine[channel].ConnectCh].HoldCh=-1;
							TelLine[TelLine[channel].HoldCh].HoldCh=-1;
							ClearLink(channel,TelLine[channel].ConnectCh);
							SetLink(TelLine[channel].ConnectCh,TelLine[channel].HoldCh);
						
							break;
						}

						if(TelLine[channel].WaiConnectCh!=-1)
						{	// 内线呼出,外线呼入情况的内线正常挂机处理
							HangUp(TelLine[channel].WaiConnectCh);
							TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
							break;
						}
						
						if(TelLine[channel].ConnectCh!=-1)
						{	// 被叫正常挂机处理
							ClearLink(channel,TelLine[channel].ConnectCh);
							StartPlaySignal(TelLine[channel].ConnectCh,SIG_BUSY1);
							TelLine[TelLine[channel].ConnectCh].Status=LINE_WAIT_HANGUP;
							break;
						}
						else
						{	// 主叫正常挂机处理
							ClearLink(channel,TelLine[channel].CallCh);
							StartPlaySignal(TelLine[channel].CallCh,SIG_BUSY1);
							TelLine[TelLine[channel].CallCh].Status=LINE_WAIT_HANGUP;
							break;
						}

					default: break;
				}

				break;
		
	
			case	LINE_WAIT_HANGUP:		// 被叫挂机,等待主叫挂机
				TelLine[channel].DisStatusMessage="对方已挂机,等待挂机…";
				if(HangUpDetect(channel)==TRUE)
					TelLine[channel].Status=LINE_INIT;
				break;
		

			case	LINE_SHIHUA_CALL:
				if(ElapseTime(channel,TIMER_NO)>3*ONE_SECOND)
					SetLink(channel,TelLine[channel].WaiConnectCh);
	

				switch(Sig_CheckDial(TelLine[channel].WaiConnectCh))
				{
					case S_NORESULT:	//利用它来控制连通的时间
					
						break;
					case S_CONNECT:
						SetLink(channel,TelLine[channel].WaiConnectCh);
						TelLine[channel].ConnectCh=TelLine[channel].WaiConnectCh;
						TelLine[TelLine[channel].ConnectCh].CallCh=channel;
						TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="和内线进行通话 …";
						TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
						TelLine[channel].Status=LINE_INTER_CALL;
						
						InitDtmfBuf(channel);
						TelLine[channel].DisStatusMessage="线路已接通,市话通话…";
					
						break;
					case S_NOBODY:
						HangUp(TelLine[channel].WaiConnectCh);
						TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
						StartPlaySignal(channel,SIG_BUSY1);
						TelLine[channel].Status=LINE_WAIT_HANGUP;
						break;
					case S_BUSY:
						HangUp(TelLine[channel].WaiConnectCh);
						TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
						StartPlaySignal(channel,SIG_BUSY1);
						TelLine[channel].Status=LINE_WAIT_HANGUP;
						break;
						break;
					case S_NOSIGNAL:
					case S_NODIALTONE:
						HangUp(TelLine[channel].WaiConnectCh);
						TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
						StartPlaySignal(channel,SIG_BUSY1);
						TelLine[channel].Status=LINE_WAIT_HANGUP;
						
						break;
				}
				break;

			case	LINE_IP_ISCONNECT:
				if(HangUpDetect(channel)!=HANG_UP_FLAG_FALSE)
				{
					HangUpDetect(TelLine[channel].WaiConnectCh);
					TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
					TelLine[channel].Status=LINE_INIT;
					break;
				}
			
				switch(Sig_CheckDial(TelLine[channel].WaiConnectCh))
				{
				case S_NORESULT:
				
					break;
				case S_CONNECT:
					TelLine[channel].ConnectCh=TelLine[channel].WaiConnectCh;
					TelLine[TelLine[channel].WaiConnectCh].CallCh=channel;
					
					strcpy(FileName,VoicePath);
					strcat(FileName,"dtmf0");
					{int n=StartPlayFile(TelLine[channel].WaiConnectCh,FileName,0L);}
				//	Sleep(80);
				//	SetLink(channel,TelLine[channel].WaiConnectCh);
					StartTimer(channel,TIMER_NO);
					
					TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="和内线进行通话 …";
					TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
					TelLine[channel].Status=LINE_IP_CONNECTING;
					//	TelLine[channel].Status=LINE_JUST_WAIT;
					break;
				case S_NOBODY:
					i++;
					break;
				case S_BUSY:
					i++;
					break;
				case S_NOSIGNAL:
					i++;
					break;
				case S_NODIALTONE:

⌨️ 快捷键说明

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