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

📄 d160aunpbxdlg.cpp

📁 VC交换机例程,东进
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	
	for(i=0;i<=channel-1;i++)
	{
		TelLine[i].ChType=CheckChType(i);
		if(TelLine[i].ChType==CHTYPE_EMPTY) 
			continue;	// 空置通道(未插模块)
		TelLine[i].Status=LINE_INIT;
		TelLine[i].DisStatusMessage="空 闲";
		m_listctrl.SetItemText(i,COL_OF_LINE_STATUS,"空 闲 ");				// 显示初始化时的线路状态

		m_listctrl.SetItemText(i,COL_OF_REMARK," *");
		if(TelLine[i].ChType==CHTYPE_USER)					
		{	// 内线处理
			tempstr.Format (" 内线 %d",interline);			// 显示线路号码
			tempstr1.Format ("%d",interline);				// 保存线路号码
			strcpy(TelLine[i].LineNum,tempstr1);

			if(interline<9)
			{
				tempstr1.Format("0%d",interline);
				strcpy(TelLine[i].LineNum,tempstr1);
				tempstr.Format (" 内线 0%d",interline);
			}
			m_listctrl.SetItemText(i,COL_OF_LINE_NUMBER,tempstr);
			interline++;
		}
		if(TelLine[i].ChType==CHTYPE_TRUNK)
		{	// 外线处理
			tempstr.Format (" 外线 %d",outline);
			if(outline<9)
				tempstr.Format (" 外线 0%d",outline);
			m_listctrl.SetItemText(i,COL_OF_LINE_NUMBER,tempstr);
			outline++;
		}
	

	}
	
}

void CD160AUNPBXDlg::RefreshDisp()
{	// 更新显示
	for(channel=0;channel<TotalLine-1;channel++)
	{

		char tempstr1[50];
		m_listctrl.GetItemText(channel,2,tempstr1,50);
		if(strcmp((CString)tempstr1,TelLine[channel].DisStatusMessage)!=0)
		{
			m_listctrl.SetItemText(channel,2,TelLine[channel].DisStatusMessage);
	;		
		}
	}		


}

void CD160AUNPBXDlg::DoWork()
{
	//********* 
//	int GetCallerIDMode=DTMF_MODE;

	int GetCallerIDMode=FSK_MODE;

	PUSH_PLAY();												// 维持文件录放音的持续进行
	FeedSigFunc();												// 维持持续振铃及信号音的函数
	RefreshDisp();												// 刷新显示
	for(channel=0;channel<TotalLine-1;channel++)
	//for(channel=0;channel<15;channel++)
	{
		switch(TelLine[channel].Status)
		{  // start of switch
			case	LINE_INIT:									// 初始化及适当的冗余措施
				
				StopPlayFile(channel);
				StartPlaySignal(channel,SIG_STOP);

				TelLine[channel].CallCh=-1;						// 主叫通道设为空
				TelLine[channel].ConnectCh=-1;					// 被叫(和它连接的)通道设为空
				TelLine[channel].HoldCh=-1;						// 呼叫转接和代接时的保持通道,由主叫保持社为空
				TelLine[channel].SaveSubmiteCh=-1;				// 呼叫转移通道设为空,本程序暂未做这一功能
																// 用户可做一小型数据库,每次初始化后读入呼叫转移号码信息
				
				InitDtmfBuf(channel);							// 初始化 DTMF码缓冲区
				TelLine[channel].DtmfPos=0;						// 初始化 DTMF码的缓冲区的指针
				TelLine[channel].CallerID="";
				TelLine[channel].ListenFlag=false;

				if(TelLine[channel].ChType ==CHTYPE_USER)
				{
					TelLine[channel].WaiConnectCh=-1;
					TelLine[channel].PRESSFLAG=FALSE;			// 拍叉簧标志
					FeedPower(channel);							// 停止馈零流
				}
				if(TelLine[channel].ChType ==CHTYPE_TRUNK)
				{
					HangUp(channel);
					ResetCallerIDBuffer(channel);					// 初始化某路的主叫号码缓冲区
				}
				
				m_listctrl.SetItemText (channel,3," ");
				m_listctrl.SetItemText (channel,4," ");
				TelLine[channel].BusyFlag=FALSE;				// 线路忙标志置为否
				TelLine[channel].DisStatusMessage ="空 闲";
				TelLine[channel].Status=LINE_IDLE;				// 初始化完成转空闲等待状态
				break;
				// End of State of LINE_INIT
							////////////////////////////////////////////////////////////
							////////////////////////////////////////////////////////////
				

			case	LINE_IDLE:									// 空闲等待状态
				if(RingDetect(channel))							// 检测外线是否振铃或内线是否摘机
				{
					TelLine[channel].BusyFlag=TRUE;
					// 检测用户是否摘机			
					if(TelLine[channel].ChType == CHTYPE_TRUNK) 
					{
						OffHook(channel);						// 外线摘机
						StartSigCheck (channel);				// 开始外线的信号音检测
						TelLine[channel].DisStatusMessage ="外线用户振铃";
						TelLine[channel].Status=LINE_WELCOME;
						break;
						// 受主叫时,……
						if(GetCallerIDMode==DTMF_MODE)			// 以DTMF方式收CallIerD
							TelLine[channel].Status= LINE_GET_DTMF_CALLERID;
						if(GetCallerIDMode==FSK_MODE)			// 以FSK方式收CallerID						
						{
							TelLine[channel].Status= LINE_GET_FSK_CALLERID;	
							StartTimer(channel,TIMER_NO);
						}
						break;
																
					}
				
					if (TelLine[channel].ChType == CHTYPE_USER)
					{
						StartHangUpDetect (channel);			// 开始内线的挂机检测
						StartPlaySignal(channel,SIG_DIALTONE);		
						TelLine[channel].DisStatusMessage ="内线用户摘机 …";
						TelLine[channel].Status =LINE_GET_DTMF;	// 转收 DTMF 码状态
					}
				}
				break;
				// End of state of LINE_IDLE
							////////////////////////////////////////////////////////////
							////////////////////////////////////////////////////////////
				

			case	LINE_GET_DTMF_CALLERID:						// 收DTMF方式的主叫号码
				if(!DtmfHit(channel))					
				{	//没有收到主叫号码
					TelLine[channel].Status=LINE_WELCOME;
					OffHook(channel);
					break;
				}
				i=0;
				code=GetDtmfCode(channel);

				do
				{
					TelLine[channel].CallerID[i]=code;
					i++;
					code=GetDtmfCode(channel);
				} while(code!=-1);

				strcpy(TelLine[channel].DisStatusMessage,TelLine[channel].CallerID);
				m_listctrl.SetItemText(channel,2,TelLine[channel].CallerID);
				break;
				
			case	LINE_GET_FSK_CALLERID:						// 收FSK方式的主叫号码
				if(ElapseTime(channel,TIMER_NO)<3*ONE_SECOND)
				{
					TelLine[channel].DisStatusMessage ="外线用户振铃,FSK方式收主叫号码 …";
					break;
				}

				OffHook(channel);								// 3秒后自动摘机
				TelLine[channel].Status =LINE_WELCOME;
			
				
				//if(GetCallerIDStr(channel,TelLine[channel].CallerID)!=ID_STEP_OK)
				{	LPTSTR IDStr=" ";
					WORD nn=GetCallerIDStr(channel,IDStr);
				
				if(GetCallerIDStr(channel,IDStr)!=ID_STEP_OK)
						break;
				}
				m_listctrl.SetItemText(channel,2,TelLine[channel].CallerID);
				break;

			case	LINE_WELCOME:
				InitDtmfBuf(channel);
				TelLine[channel].DtmfPos=0;
				TelLine[channel].DisStatusMessage =" 对外线用户放提示音 …";
				strcpy(FileName,VoicePath);
				strcat(FileName,"voc\\welcome.voc");
				StartPlayFile(channel,FileName,0L);
				StartTimer(channel,TIMER_NO);
				TelLine[channel].Status =LINE_WELCOME1;
				break;
							////////////////////////////////////////////////////////////
							////////////////////////////////////////////////////////////
			
			case	LINE_WELCOME1:
				// 是否收到第一个DTMF码
				code=GetDtmfCode(channel);
				if(code!=-1)	
					goto VALID_DTMF;							// 收到DTMF打断语音
		
				// 放语音时外线挂机的处理
				if(Sig_CheckBusy(channel))
				{
					HangUp(channel);
					TelLine[channel].Status =LINE_INIT;
					break;
				}

				// 处理外线放音是否完成?
				if(CheckPlayEnd(channel))
				{
					StopPlayFile(channel);
					StartTimer(channel,TIMER_NO);
					TelLine[channel].DisStatusMessage =" 外线呼入,收分机号码(DTMF) …";
					TelLine[channel].Status =LINE_GET_DTMF;
					StartTimer(channel,TIMER_NO);			// 对某一通道进行计时
				}
				break;
							////////////////////////////////////////////////////////////
							////////////////////////////////////////////////////////////
				
			case	LINE_GET_DTMF:		//  一般从此处开始收号
				code=GetDtmfCode(channel);
				if(code!=-1)
				{// 收码部分
		
		VALID_DTMF:////*************************
					StopPlayFile(channel);
					StartPlaySignal(channel,SIG_STOP);
					if(TelLine[channel].ChType==CHTYPE_USER)
						TelLine[channel].DisStatusMessage =" 内线收 DTMF 码 …";

					TelLine[channel].DtmfArray [TelLine[channel].DtmfPos]=code;
				
					TelLine[channel].DtmfPos +=1;
					StartTimer(channel,TIMER_NO);
				}

				// 收DTMF码时的挂机处理
				if(TelLine[channel].ChType==CHTYPE_USER &&HangUpDetect(channel)!=HANG_UP_FLAG_FALSE)
				{	// 内线收号时的挂机处理
					TelLine[channel].Status=LINE_INIT;
					break;
				}

				if(TelLine[channel].ChType==CHTYPE_TRUNK && Sig_CheckBusy(channel))
				{// 收DTMF码时外线挂机处理
					HangUp(channel);
					TelLine[channel].Status =LINE_INIT;
					break;
				}

				
				//*******************
				// DTMF码的分析和处理
				//*******************
				
				if(TelLine[channel].DtmfPos!=0 && TelLine[channel].ChType==CHTYPE_USER)
				{// 内线的收码处理
					
					if(TelLine[channel].DtmfArray [0]>=11)
					{// 内线呼叫内线或特殊服务
						if(TelLine[channel].DtmfPos==3)
						{
							TelLine[channel].ConnectCh=-1;
							
							TelLine[channel].DtmfArray[3]=TelLine[channel].DtmfArray[0];
							for(i=1;i<=2;i++)
								TelLine[channel].DtmfArray[i-1]=(char)(TelLine[channel].DtmfArray[i]%10+48);
				INTERCALL:		
							TelLine[channel].DtmfArray[2]='\0';
							TelLine[channel].LineNum[2]='\0';

							// 判断是语音信箱、自动声讯服务台或特殊服务号码
							{
								if(int n=strcmp(TelLine[7].LineNum,(char *)TelLine[channel].DtmfArray)==0)
								{	// 拨打自动声讯服务台
									InitDtmfBuf(channel);
									if(TelLine[channel].ChType==CHTYPE_TRUNK)
										StartSigCheck(channel);
									else
										StartHangUpDetect(channel);
									strcpy(FileName,VoicePath);
									strcat(FileName,"voc\\freecallwel.voc");
									StartPlayFile(channel,FileName,0);
									TelLine[channel].DisStatusMessage =" 自动声讯服务 …";
									TelLine[channel].Status=LINE_FREE_CALL;
									break;
								}

								// 语音信箱功能演示
								if(int n=strcmp("88",(char *)TelLine[channel].DtmfArray)==0)
								{	// 拨打语音信箱
									InitDtmfBuf(channel);
									if(TelLine[channel].ChType==CHTYPE_TRUNK)
										StartSigCheck(channel);
									else
										StartHangUpDetect(channel);

									TelLine[channel].DisStatusMessage =" 语音信箱服务 …";
									strcpy(FileName,VoicePath);
									strcat(FileName,"voc\\voicebox.voc");
									StartPlayFile(channel,FileName,0);
									TelLine[channel].Status=LINE_VOICE_BOX;
									break;
								}

							}

							for(i=0;i<=TotalLine;i++)
							{	
								if(TelLine[i].ChType!=CHTYPE_USER) continue;
								if(int n=strcmp(TelLine[i].LineNum,(char *)TelLine[channel].DtmfArray)!=0)
									continue;
								// 找到了对应的分机号码 
								if(i==channel) goto ErrorProc;			// 呼叫的号码为本机号码
								

								if(TelLine[channel].ChType==CHTYPE_TRUNK)
									StartSigCheck(channel);
								else
									StartHangUpDetect(channel);

								if(TelLine[i].CallCh!=-1)
								{	// 处理用户代接
										
									TelLine[i].Status=LINE_INIT;
									
									FeedPower(i);
									StartPlaySignal(TelLine[i].CallCh,SIG_STOP);

									SetLink(channel,TelLine[i].CallCh);

									if(TelLine[TelLine[i].CallCh].ChType==CHTYPE_TRUNK)
									{
										TelLine[TelLine[i].CallCh].CallCh=channel;
										TelLine[TelLine[i].CallCh].ConnectCh=-1;
										TelLine[channel].ConnectCh=TelLine[i].CallCh;
										TelLine[TelLine[i].CallCh].Status=LINE_JUST_WAIT;
										TelLine[TelLine[i].CallCh].DisStatusMessage="等待用户转接…";
										TelLine[channel].Status=LINE_INTER_CALL;
										goto default0;
									}
									else
									{
										
										TelLine[channel].CallCh=TelLine[i].CallCh;
										TelLine[TelLine[channel].CallCh].ConnectCh=channel;
										TelLine[channel].Status=LINE_INTER_CALL;
										TelLine[TelLine[i].CallCh].Status=LINE_INTER_CALL;
										goto default0;

										;
									}
								}   //  用户代接处理结束

								if(TelLine[i].BusyFlag==TRUE)			// 所拨打的分机占线
									goto ErrorProc;

								TelLine[i].BusyFlag=TRUE;
								TelLine[channel].ConnectCh=i;
								TelLine[channel].CallCh=-1;
								TelLine[i].CallCh=channel;
								TelLine[i].ConnectCh=-1;			//***********************

	
								//StartPlayFile(channel,FileName,0);
								StartPlaySignal(channel,SIG_RINGBACK);

								//TelLine[i].Status=LINE_WAIT_AND_JUDGE;
								TelLine[i].Status=LINE_JUST_WAIT;
								TelLine[i].DisStatusMessage="有呼叫接入…";
								TelLine[channel].Status=LINE_WAIT_INTER_OFFHOOK;
								// 正常呼叫,准备接通电话
								FeedRealRing(i);
								OffHookDetect(i);
															
								break;		
							}// End of search coordinary channel
						
							if(TelLine[channel].ConnectCh==-1)
								goto ErrorProc;		// 拨了不存在的分机号
						}
						break;
					
					}// End of 内线呼叫内线或特殊服务

					
					if(TelLine[channel].DtmfArray [0]<10 )
					{// 内线呼叫外线(市话)
						if(code==12 ||ElapseTime(channel,TIMER_NO)>6*ONE_SECOND)
						{	// 以“#”结束或延迟6秒钟不拨号,则自动拨出
							if(code==12) TelLine[channel].DtmfPos--;
							for(i=0;i<=TotalLine-1;i++)
							{
								if(TelLine[i].ChType==CHTYPE_USER) continue;
								if(TelLine[i].BusyFlag==FALSE)
								{	// 找到了空闲的外线通道
									TelLine[i].BusyFlag=TRUE;
									TelLine[channel].WaiConnectCh=i;
									TelLine[i].CallCh=channel;
									break;
								}
								goto ErrorProc;// 没有空闲的
							}
					
						//DTMF码的转换和存储
							for(i=0;i<=TelLine[channel].DtmfPos-1;i++)
									TelLine[channel].DtmfArray [i]=(TelLine[channel].DtmfArray [i])%10+48;
							TelLine[channel].DtmfArray [TelLine[channel].DtmfPos]='\0';
							
							// 通过外线向外拨号
							OffHook(TelLine[channel].WaiConnectCh);
							StartSigCheck(TelLine[channel].WaiConnectCh);

							m_listctrl.SetItemText (TelLine[channel].WaiConnectCh,3,TelLine[channel].LineNum);
							m_listctrl.SetItemText (TelLine[channel].WaiConnectCh,4,(char*)(TelLine[channel].DtmfArray));
							m_listctrl.SetItemText (channel,4,(char*)(TelLine[channel].DtmfArray));
							Sig_StartDial(TelLine[channel].WaiConnectCh,(char*)(TelLine[channel].DtmfArray),"9",0);
							TelLine[channel].DisStatusMessage="市话呼叫中…";
							TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="正在进行市话呼出…";
							TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
							StartTimer(channel,TIMER_NO);
							TelLine[channel].Status=LINE_SHIHUA_CALL;
						}
						break;
					}

				
					if(TelLine[channel].DtmfArray [0]==10 && TelLine[channel].DtmfPos==1 )
					{// 内线呼叫长途,转IP呼出**********************************

						for(i=0;i<=TotalLine-1;i++)
						{
							if(TelLine[i].ChType==CHTYPE_USER) continue;

⌨️ 快捷键说明

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