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

📄 d300.cpp

📁 170话费查询系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	switch(EventType){
        	
		case DTEV_SIG: //DTI 信号事件
					check_commu_status(cn, evt_handle);
					break; // break  case DTEV_SIG
		case TDX_CST: //Vocie上的状态事件
					if(myDEBUG) SysPrintf("%s: EVENT TYPE: TDX_CST\n",Channel[cn-1].voxname);
					cstp=(DX_CST*)sr_getevtdatap(evt_handle);
					switch (cstp->cst_event){
					case DE_TONEON:
									break;
					case DE_TONEOFF:
									break;
									
					case tm_systmout:	//系统超时
									put_event_to_board(cn,play_systmout);
									strcpy(Channel[cn-1].ServerLog.result, "整理资料");
									ChnPrintf(cn, "_USER", "系统超时");
									break;
					case tm_usertmout:	//用户超时
					case tm_alwayserr:	//多次出错
									put_event_to_board(cn,play_usertmout);
									strcpy(Channel[cn-1].ServerLog.result, "用户超时");
									ChnPrintf(cn, "_USER", "操作超时");
									break;
					case tm_anirefuse:	//主叫拒绝
									put_event_to_board(cn,tm_voc_hangup);
									break;
					case play_systmout:
									Channel[cn -1].TimeOut.cur_st = play_systmout;
									play_voc(cn,"系统超时");
									break;
					case play_usertmout:
									Channel[cn -1].TimeOut.cur_st = play_usertmout;
									play_voc(cn,"用户超时");
									break;
					case tm_voc_hangup:
									Channel[cn -1].TimeOut.cur_st = tm_idle;
									dti_hangup(cn);
									break;
									
					} // end switch (cstp->cst_event)
					break; //  break case TDX_CST

		case TDX_GETDIG:
					break; // break case TDX_GETDIG
		case TDX_PLAY: 
					switch (Channel[cn -1].TimeOut.cur_st) {
						case play_usertmout:
						case play_systmout:
										put_event_to_board(cn,tm_voc_hangup);
						break;
					}
					break;  // break case TDX_PLAY
		case TDX_PLAYTONE:
					break; // break case TDX_PLAYTONE;

		default:
					break;

		}  // end switch(EventType)

   return 1; 
   
}  //end of timeout_thread_func()



/*************************************************************************
*   FUNC:	dit_onhook(int dti) 
*   
*	说明:	挂机等待拨入
*	
*
************************************************************************/
int dti_onhook (int dti)
{
   int retval ;
 
   if ((retval = dt_setsigmod(dti, DTM_SIGINS)) != 0) {
      SysPrintf("dti_onhook() :dt_setsigmod() error") ;
      return (retval) ;
   }

   if ((retval = dt_settssig (dti, DTB_ABIT|DTB_CBIT|DTB_DBIT, DTA_SETMSK)) != 0) {
      SysPrintf("dti_onhook() :dt_settssig() error") ;
      return (retval) ;
   }

   if ((retval = dt_settssig (dti, DTB_BBIT, DTA_SUBMSK)) != 0) {
      SysPrintf("dti_onhook() :dt_settssig() error") ;
      return (retval) ;
   }

   return (retval) ;
}

/******************************************************************************
* Name: dti_offhook(int cn)
* Function: Call begins from here. CO set seize signal, 
*				CPE gives acknowlage
* 通话开始,交换机设置占线忙,然后(用户)语音卡发出确认信号,建立通话
* 及demo中 dt_fwaoff()
******************************************************************************/
int dti_offhook(int cn)
{
	int retval;
	
	ChnPrintf(cn, "_STATE", "通话建立中 ....");
	//Seize_acknowledge
	//BW:10-->11 after FW:10-->00
	//设置BBIT= ON, 这将触发语音卡端口的 DE_TONEON 事件。
	if((retval=dt_settssig(Channel[cn-1].dti,DTB_BBIT,DTA_ADDMSK))!=0){
		SysPrintf("dti_offhook() error: dt_setssig\n");
		return -1;
	}
	
	return 0;//successful
}

/*************************************************************************
*   FUNC:	get_chn_next_state(int cn, EVT ev) 
*  
*	说明:	取通道的下一状态
*
************************************************************************/

/*************************************************************************
*   FUNC:	get_next_state(int cn, EVT ev) 
*  
*	说明:	取通道的下一状态
*
************************************************************************/
STATE get_next_state(int cn, EVT ev)
{
	int count=0;
	STATE  current_state;

	switch (Channel[cn-1].thread_id) {
		case _main :
					current_state = Channel[cn-1].Main.cur_st;
					break;

		case _singleinput :
					current_state = Channel[cn-1].SingleInput.cur_st;
					break;

		case _monthinput :
					current_state = Channel[cn-1].MonthInput.cur_st;
					break;

		case _multiplay :
					current_state = Channel[cn-1].MultiPlay.cur_st;
					break;

		case _timeout :
					current_state = Channel[cn-1].TimeOut.cur_st;
					break;
		default:
					WinPrintf("get_next_state():错误的当前线程号 %d",Channel[cn-1].thread_id);
					break;
	}

	while (MST[count].no != _nodefine)
	{
		if ((Channel[cn-1].thread_id == MST[count].curr_th)	&&
		   (current_state			 == MST[count].curr_st)	&&
		   (ev                       == MST[count].event)	)
		{			
			return MST[count].next_st;
		}
		count++;
	}
	return 0;
}

/*************************************************************************
*   FUNC:	get_next_thread(int cn, EVT ev) 
*  
*	说明:	取通道的下一线程
*
************************************************************************/
THREAD get_next_thread(int cn, EVT ev)
{
	int count=0;

	while (MST[count].no != _nodefine)
	{
		if ((Channel[cn-1].thread_id == MST[count].curr_th)	&&
		   (Channel[cn-1].curr_st    == MST[count].curr_st)	&&
		   (ev                       == MST[count].event)	)
		{			
			return MST[count].next_th;
		}
		count++;
	}
	return 0;
}

/*************************************************************************
*   FUNC:	get_timeout_value(int cn, EVT ev) 
*  
*	说明:	取通道的下一状态
*
************************************************************************/
int get_timeout_value(int cn, EVT ev)
{
	int count=0;

	while (MST[count].no != _nodefine)
	{
		if ((Channel[cn-1].thread_id == MST[count].curr_th)	&&
		   (Channel[cn-1].curr_st    == MST[count].curr_st)	&&
		   (ev                       == MST[count].event)	)
		{			
			return MST[count].timeout;
		}
		count++;
	}
	return _nodefine;
}

/******************************************************************************
* Name: dti_read_ani(int cn)
* Function: 读主叫(ANI),建立通话
* aysin.cpp - mfc()
******************************************************************************/
int dti_read_ani(int cn)
{
	bool myDEBUG = false;
	int bksig,fwsig;
    
	DX_CST *cstp;
	char dig;
	
    cstp = (DX_CST *)sr_getevtdatap(Channel[cn-1].evt_handle);	
	switch (Channel[cn-1].number) {
		case DNIS_LEN-1:			bksig=SIGA_6;  /* Address Complete; Charge; Set-Up Speech */
									break;
		case DNIS_LEN+ANI_LEN+1:	bksig=SIGA_3;  // change to GROUP B
									break;
		case DNIS_LEN+ANI_LEN+2:	bksig=SIGB_1; /* Spare for National Use */
									break;
		default: bksig = SIGA_1 ;				/* Send next Digit (n+1) */
			break;
	}
	fwsig=cstp->cst_data;
	
	if((fwsig>115)||(fwsig<101)) {
		SysPrintf("%s: Bad ToneID=%d,Number=%d\n",Channel[cn-1].voxname,fwsig,Channel[cn-1].number);
	}
	
	dig=(fwsig==SIGI_10)?'0':(char)(fwsig-SIGI_1+0x31);

	if(Channel[cn-1].number<DNIS_LEN){
		if((dig>'9')||(dig<'0')){
			SysPrintf("%s: DNIS=%s ToneID=%d\n",Channel[cn-1].voxname,Channel[cn-1].dnis,fwsig);
			return -2;
		} 
		else 
		{
		   Channel[cn-1].dnis[Channel[cn-1].number]=dig;
		}
	}

	if(Channel[cn-1].number==DNIS_LEN)	{
		Channel[cn-1].dnis[DNIS_LEN]='\0';
	}

	if((Channel[cn-1].number>DNIS_LEN)&&(Channel[cn-1].number<DNIS_LEN+ANI_LEN+1)) 
	{
		if((dig>'9')||(dig<'0'))
		{
			SysPrintf("%s: ANI=%s ToneID=%d\n",Channel[cn-1].voxname,Channel[cn-1].ani,fwsig);
			return -2;
		} 
		else 
		{
			Channel[cn-1].ani[Channel[cn-1].number-DNIS_LEN-1]=dig;
		}
	}

	if(Channel[cn-1].number==DNIS_LEN+ANI_LEN+1)
	{
		Channel[cn-1].ani[ANI_LEN]='\0';
	}
	
	//是想vox发backward signal 
    if(r2_playbsig(Channel[cn-1].voc,bksig,fwsig,EV_ASYNC)==-1) 
	{
		SysPrintf("%s: r2_playbsig(),because %s\n",Channel[cn-1].voxname,ATDV_ERRMSGP(Channel[cn-1].voc)) ;
		return -1;
	}
	// if  bksig = SIGA_1, 表明请求交换机发送下一个数字,交换机确认这个请求
	// ,则回送一个TDX_PLAYTONE事件
	ChnPrintf(cn, "_TELE", "(%s)ANI=%s",Channel[cn-1].dnis,Channel[cn-1].ani);
   return 0;
}

/******************************************************************************
* Name: dti_play_tone(int cn)
* Function: Call setup complete.
*			呼叫建立完成
*
******************************************************************************/
int dti_play_tone(int cn)
{


	//SysPrintf("通道%d: In dt_pltone()",cn);
   	if (Channel[cn-1].number==DNIS_LEN+ANI_LEN+2) {      	
		//set offhook BW:11-->01
      	if(dt_settssig(Channel[cn-1].dti,DTB_ABIT,DTA_SUBMSK)!=0){
			SysPrintf("%s: dt_settssig()\n",Channel[cn-1].dtiname) ;
			return -1;
		}
		Channel[cn-1].number=0;		
		//主叫收到		
		return 1;
	}
	Channel[cn-1].number++;
	return 0;
}

/******************************************************************************
* 函数:	int	dti_hangup(int cn)
* 
* 调用:但 ABIT 跳 1 时,调用此函数。
* 来源: Asyin.cpp - dt_fwaon()
*
*   Abit跳1,表明有一方挂断,如果当前状态是TimeOut线程
*   的 tm_voc_hangup, 表明是语音卡主动挂机, 结束通话的
*   工作交给交换机自动完成,语音卡直接回到初始状态。否
*   则,表明是用户先挂机(交换机先挂),那么需要返回一
*   个backward signal,才能回到初始状态。
******************************************************************************/
int dti_hangup(int cn)
{
	int retval;
	char sdatetime[128];
	
	

	get_system_datetime(sdatetime);
	strcpy(Channel[cn-1].ServerLog.end_time,sdatetime);
	ChnPrintf(cn,"_END", sdatetime);

	//向主控程序发送写日志消息
	if (Channel[cn-1].ServerLog.WriteLog == true) {
		ChnPrintf(cn,"_STATE", "日志记录中...");
		WriteSystemLog(cn);
		Channel[cn-1].ServerLog.WriteLog = false;
	}

	// 先终止语音通道的工作,它将向语音卡发送一个用户终止事件。
	// 如果用户挂机前正在播放语音,这个终止事件 = TDX_PLAY.TM_USRSTOP
	retval =0;
   	dx_stopch(Channel[cn-1].voc,EV_ASYNC);
	
	 //语音卡挂先
	if (Channel[cn-1].TimeOut.cur_st == tm_voc_hangup)
	{
		init01(cn);
	}	
	else	//用户挂机先 
	{	
		//(FW:00->10  BW:01-->11) —— 确认交换机挂机信号
		if((retval=dt_settssig(Channel[cn-1].dti,DTB_ABIT,DTA_ADDMSK))!=0){
			//ChnPrintf(cn, "_STATE","dti_hangup error 1");
			SysPrintf("dti_hangup error 1");
			return -1;
		}
		//(BW:11-->10)—— 告诉交换机“语音卡也挂机了”
		if((retval=dt_settssig(Channel[cn-1].dti,DTB_BBIT,DTA_SUBMSK))!=0){
			//ChnPrintf(cn, "_STATE","dti_hangup error 1");
			SysPrintf("dti_hangup error 2");
			return -1;
		}	
		init01(cn);
	}
	//SysPrintf("通道%d dti=%d, Hangup!",cn,Channel[cn-1].dti);
	ChnPrintf(cn, "_USER", " ");
	ChnPrintf(cn, "_BEGIN", " ");
	ChnPrintf(cn, "_END",	" ");
	ChnPrintf(cn, "_TELE",	" ");
	//printts(cn);
	ChnPrintf(cn, "_STATE",	"空闲");
	return 0;
}


/******************************************************************************
* 函数:	put_event_to_board(int cn, int evt)
*  cn:	通道号
*  evt: 事件代号
*  往通道上写事件
******************************************************************************/
bool put_event_to_board(int cn, int evt)
{
	DX_CST  cst;
    
	cst.cst_event = evt;
	cst.cst_data  = 0;
    if(sr_putevt(Channel[cn-1].voc, TDX_CST, sizeof(DX_CST), &cst, 0) != 0)
	{
	   SysPrintf("put_event_to_board:失败!");
	   return false;
	}    

	return true;
}

/***************************************************************************
 * 函数:   int get_voc_descr(char * voc_index, int * fhandle, int * offset, int *length)
 * 
 * Des :   获取VFIT中保存的语音文件描叙

⌨️ 快捷键说明

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