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

📄 datafunc.h

📁 170话费催交系统
💻 H
📖 第 1 页 / 共 5 页
字号:
				dxinfo[channel].ani_num++;
				break;
			}
			break;
		case 2: //Sending the left DNIS number if not complete
			if(dxinfo[channel].dnis_num < sizeof(teleinfo[channel].num)) {
				fwsig=(teleinfo[channel].num[dxinfo[channel].dnis_num]=='0')?SIGI_10:(teleinfo[channel].num[dxinfo[channel].dnis_num]-0x31+SIGI_1);
				dxinfo[channel].dnis_num++;
				break;
			}
			else { // = DNIS_LEN in case that no A6/A3 received
				//in fact this statement should not be run in correct A3 comes
				fwsig=SIGI_1; //send a more digit
				dxinfo[channel].Sending=3;
				break;
			}
			break;
		case 3: // no more digit to send, change to Group_II
		default:
			fwsig=SIGI_1; //send a more digit
			dxinfo[channel].Sending=3;
			break;
		}
		break;

	case SIGA_6:
		fwsig=SIGI_1; //send KA, local call
		dxinfo[channel].Sending=1;
		break;

	case SIGA_3:
		dxinfo[channel].ani_num=ani_len+1;
		dxinfo[channel].dnis_num=strlen(teleinfo[channel].num)+1;
		fwsig=SIGII_3;
		dxinfo[channel].Sending=END_R2MF;
		//end R2MF;
		break;

	case SIGA_4: // Congestion, hangup then
		TRACE("%s: SIGA_4: %s -- Network Congestion",dxinfo[channel].chdevname,teleinfo[channel].num);
		return yin_fwaon(channel);
		break;

	case SIGA_5: // Invalid number, hangup then
		TRACE("%s: SIGA_5: %s -- Invalid Number",dxinfo[channel].chdevname,teleinfo[channel].num);
		return yin_fwaon(channel);
		break;

	default: //hangup then
		// will not arrive here
		return yin_fwaon(channel);
		break;
	}

	TRACE("%s: State %2d, In yin_mfc(), ---- fwsig=%d",
		dxinfo[channel].chdevname,dxinfo[channel].chdevzt,fwsig);
	if(yin_r2_playfsig(channel,fwsig) == -1){
		TRACE("yin_r2_playfsig error");
		return(-1);
	}

	return 0;
}

/*************************************************************************
 *	FUNCTION NAME: int yin_r2_playfsig(int channel, int forwardsig)
 *	DESCRIPTION: to play a forward signal
 *	INPUT: voice device handle, forwardsig, and play mode
 *  RETURN: if in EV_SYNC mode the return the terminate backward ToneID
 *************************************************************************/
int yin_r2_playfsig(int channel, int forwardsig)
{
	int mode=EV_ASYNC;
	int i;
		
	i=forwardsig - SIGI_1;

	if(dx_playtone(dxinfo[channel].chdev,&tngen[i],r2_tpt,mode) == -1){
		TRACE("dx_playtone error");
		return(-1);
	}
	return(0);
}

/***************************************************************************
 *	FUNCTION NAME: playtone_init()
 *	DESCRIPTION: to initialize tonegen and r2_tpt
 *  RETURN: 
 **************************************************************************/
int playtone_init(void)
{
	int i;

	memset(tngen,0,sizeof(tngen));
	for(i=0;i<15;i++)
		dx_bldtngen(&tngen[i],fsig[i][0],fsig[i][1],R2_DEFAMPL,R2_DEFAMPL,200);

	memset(r2_tpt,0,sizeof(r2_tpt));

	r2_tpt[0].tp_type=IO_CONT;
	r2_tpt[0].tp_termno=DX_TONE;
	r2_tpt[0].tp_length=SIGA_1;
	r2_tpt[0].tp_flags=TF_TONE;
	r2_tpt[0].tp_data=DX_TONEON;

	r2_tpt[1].tp_type=IO_CONT;
	r2_tpt[1].tp_termno=DX_TONE;
	r2_tpt[1].tp_length=SIGA_6;
	r2_tpt[1].tp_flags=TF_TONE;
	r2_tpt[1].tp_data=DX_TONEON;

	r2_tpt[2].tp_type=IO_CONT;
	r2_tpt[2].tp_termno=DX_TONE;
	r2_tpt[2].tp_length=SIGA_3;
	r2_tpt[2].tp_flags=TF_TONE;
	r2_tpt[2].tp_data=DX_TONEON;

	r2_tpt[3].tp_type=IO_CONT;
	r2_tpt[3].tp_termno=DX_TONE;
	r2_tpt[3].tp_length=SIGB_1;
	r2_tpt[3].tp_flags=TF_TONE;
	r2_tpt[3].tp_data=DX_TONEON;

	r2_tpt[4].tp_type=IO_EOT;
	r2_tpt[4].tp_termno=DX_MAXTIME;
	r2_tpt[4].tp_length=300;
	r2_tpt[4].tp_flags=TF_10MS;

	return 0;
}

/*************************************************************************
*			Fuction    : int yin_bwboff(int channel)
*			Description: Backword hangup during MFC
**************************************************************************/
int yin_bwboff(int channel)
{
	int retval;

	dx_stopch(dxinfo[channel].chdev,EV_ASYNC);
	//backword signal hangs up first
	//BW:11-->10
	if((retval=dt_settssig(dxinfo[channel].dtdev,DTB_ABIT,DTA_ADDMSK))!=0){
		TRACE("%s: dt_settssig() in yin_bwboff() error",dxinfo[channel].dtdevname);
		return -1;
	}

	return chan_init(channel);
}

/*************************************************************************
*
*			Fuction    : yin_getbksig()
*			Description: Get backward signal
**************************************************************************/
int yin_getbksig(int channel,unsigned long evt_handle)
{
	DX_CST* cstp;

	cstp=(DX_CST*)sr_getevtdatap(evt_handle);
	dxinfo[channel].bksig=cstp->cst_data;

	if(dxinfo[channel].Sending==END_R2MF)
		switch (dxinfo[channel].bksig){
		case SIGB_1://The Called Party is Idle, free
		case SIGB_6://The Called Party is Idle, free
			dxinfo[channel].chdevzt=CHDEVZT_D;
			//ChnPrintf(channel+1,"_STATE","振铃");
			break;
		case SIGB_2://Local Call Busy
		case SIGB_3://Long Distance Call Busy
		case SIGB_4://Congestion
			TRACE("%s: %s -- Line is Busy",dxinfo[channel].chdevname,teleinfo[channel].num);
			strcpy(dxinfo[channel].chdevztmx,chdevztmx[9]);
			//ChnPrintf(channel+1,"_STATE","线路忙");
			Writeappdata(channel);
			yin_fwaon(channel);//hangup at this state
			break;
		case SIGB_5://There is no this number
			TRACE("%s: %s -- Invalid Telephone Number",dxinfo[channel].chdevname,teleinfo[channel].num);
			strcpy(dxinfo[channel].chdevztmx,chdevztmx[10]);
			//ChnPrintf(channel+1,"_STATE","无此号码");
			yin_fwaon(channel);
			break;
		};
	return 0;
}

/*************************************************************************
*			Fuction    : yin_fwaon()
*			Description: Forward hangup after end of play
**************************************************************************/
int  yin_fwaon(int channel)
{
	if(dt_settssig(dxinfo[channel].dtdev,DTB_ABIT,DTA_ADDMSK)!=0){
		TRACE("%s: dt_settssig() error",dxinfo[channel].dtdevname);
		return -1;
	}
	chan_init(channel);
	return 0;
}

/*************************************************************************
*
*			Fuction    : yin_playf()
*			Description: Set up IOTT and TPT's and Play-Back sample.vox
**************************************************************************/
int yin_playf(int channel)
{
	//play sample.vox file
	dx_clrdigbuf(dxinfo[channel].chdev);
	
    //索引语音串
	Index_sz(channel);
	/* Play VOX File on D/30PCI-E1 Channel, Normal Play Back */
	if (dx_playiottdata(dxinfo[channel].chdev,dxinfo[channel].iott_cjvalue,tptplay,&xpbVox,EV_ASYNC)==-1 ){
		TRACE("%s: %s in dx_playiottdata() error",dxinfo[channel].chdevname,ATDV_ERRMSGP(dxinfo[channel].chdev));
		return -1;
	}
	dxinfo[channel].playflag=1;
	TRACE("%s: %2d, %s -- Playing...",dxinfo[channel].chdevname,channel,teleinfo[channel].num);
	return 0;
}

/************************************************************************
*     名称:int clr_output(int channel)
*     功能:清除某通道屏显的函数
************************************************************************/
int clr_output(int channel)
{
	//清除某通道的屏显
	/*ChnPrintf(channel+1,"_USER"," ");
	ChnPrintf(channel+1,"_STATE"," ");
	ChnPrintf(channel+1,"_TELE"," ");
	ChnPrintf(channel+1,"_BEGIN","0");
	ChnPrintf(channel+1,"_END","0");*/
	//dxinfo[channel].chdevztmx[0]='\0';
	dxinfo[channel].chdevcjjg[0]='\0';
	teleinfo[channel].num[0]='\0';			//电话号码
	teleinfo[channel].cuijiao[0]='\0';	//催缴金额
	teleinfo[channel].qssj_time[0]='\0';	//催缴起始时间
	teleinfo[channel].zzsj_time[0]='\0';	//催缴结束时间
	return(0);
}

/*************************************************************************
*
*			Fuction    : int Reset_chdev(int channel)
*			Description: 重置通道的函数
**************************************************************************/
int Reset_chdev(int channel)
{
	//先关闭
	dx_stopch(dxinfo[channel].chdev,EV_ASYNC);
	yin_fwaon(channel);
	dx_close(dxinfo[channel].chdev);
	dt_close(dxinfo[channel].dtdev);
	strcpy(dxinfo[channel].chdevztmx,"关闭");
	clr_output(channel);
	//再打开
	if(strcmp(signlight[channel].app_id,cjappid)==0) {
		dxinfo[channel].chtime=0;				//通道处理超时计时器
		dxinfo[channel].resettime=0;			//通道重置计数器
		dxinfo[channel].playflag=0;				//播放语音标示
		init_count[channel]=0;					//各通道超时计数器
		
		if ((dxinfo[channel].chdev = dx_open(dxinfo[channel].chdevname, 0)) == -1) {
			strcpy(dxinfo[channel].chdevztmx,"打开语音通道失败");
			return(-1);
		}
		cjchdev[(channel-minchannel)*2]=dxinfo[channel].chdev;
		if ((dxinfo[channel].dtdev = dt_open(dxinfo[channel].dtdevname, 0)) == -1) {
			strcpy(dxinfo[channel].chdevztmx,"打开中继时序失败");
			return(-1);
		}
		cjchdev[(channel-minchannel)*2+1]=dxinfo[channel].dtdev;

		if(nr_scunroute(dxinfo[channel].dtdev,SC_DTI,dxinfo[channel].chdev,SC_VOX,SC_FULLDUP)==-1){
			strcpy(dxinfo[channel].chdevztmx,"解除全双工通讯失败");
			return(-1);
		}	
		
		if(nr_scroute(dxinfo[channel].dtdev,SC_DTI,dxinfo[channel].chdev,SC_VOX,SC_FULLDUP)==-1){
			strcpy(dxinfo[channel].chdevztmx,"建立全双工通讯失败");
			return(-1);
		}
		
		yin_r2_creatbsig(channel);
		
		if(dt_setevtmsk(dxinfo[channel].dtdev,DTG_SIGEVT,DTMM_AON|DTMM_AOFF|DTMM_BON|DTMM_BOFF,DTA_SETMSK)==-1){
			strcpy(dxinfo[channel].chdevztmx,"初始化中继时序失败");
			return(-1);
		}
		
		if(dt_settssig(dxinfo[channel].dtdev,DTB_ABIT|DTB_CBIT|DTB_DBIT,DTA_SETMSK)==-1){
			strcpy(dxinfo[channel].chdevztmx,"初始化中继时序失败");
			return(-1);
		}
		chan_init(channel);
		return(1);
	}
	return(0);
}

/*************************************************************************
*
*			Fuction    : void time_process(void)
*			Description: 超时处理函数
**************************************************************************/
void time_process(void)
{
	int channel;

	datajy_counts++;
	if(datajy_counts>=DATAJY_COUNTS) {
		 datajy_counts=0;
		 datacon.chdevno=-1;
		 //校验数据库连接的线程事件
		 JiaoYan.SetEvent();
	}
	
	for(channel=0;channel<MAXDEVS;channel++) {
		//init_count[channel]++;
		/*if(init_count[channel]>=INIT_COUNT) {
			init_count[channel]=0;
			clr_output(channel);
		}*/
		if(strcmp(signlight[channel].app_id,cjappid)!=0){
			continue;
		}
		if(atoi(signlight[channel].chn_value)==CHDEVIDLE) {
			continue;
		}
		
		if(dxinfo[channel].playflag==0) {
			dxinfo[channel].chtime++;
		}
		switch(dxinfo[channel].chdevzt){
		case CHDEVZT_A:
			dxinfo[channel].chtime=0;
			break;
		case CHDEVZT_B:
			if(dxinfo[channel].chtime>10){
				dxinfo[channel].chtime=0;
				chan_init(channel);
			}
			break;
		case CHDEVZT_C:
			if(dxinfo[channel].chtime>10){
				dxinfo[channel].chtime=0;
				Writeappdata(channel);
				chan_init(channel);
			}
			break;
		case CHDEVZT_D:
			if(dxinfo[channel].chtime>cjarg.ringtime){ //响铃超过最大秒数
				dxinfo[channel].chtime=0;
				Writeappdata(channel);
				chan_init(channel);
			}
			break;
		case CHDEVZT_E:
			if(dxinfo[channel].chtime>10){
				dxinfo[channel].chtime=0;
				yin_bwboff(channel);
			}
			break;
		case CHDEVZT_F:
			if(dxinfo[channel].chtime>WRITEDATATIME){
				dxinfo[channel].chtime=0;
				chan_init(channel);
			}
			break;
		case CHDEVZT_G:
		case CHDEVZT_H:
			if(dxinfo[channel].chtime>10){
				dxinfo[channel].chtime=0;
				chan_init(channel);
			}
			break;
		}
		//通道重置计数器
		dxinfo[channel].resettime++;
		if(dxinfo[channel].resettime>RESETTIME){
			Reset_chdev(channel);
		}
	}
}

/************************************************************************
*     名称:int Readdata(int channel)
*     功能:从缓冲区读一条数据
************************************************************************/
int Readdata(int channel)
{
	//清空原数据
	teleinfo[channel].hth[0]='\0';
	teleinfo[channel].num[0]='\0';
	teleinfo[channel].cuijiao[0]='\0';
	teleinfo[channel].qfmonth[0]='\0';
	teleinfo[channel].cjcount=0;
	teleinfo[channel].cjmonth[0]='\0';
	teleinfo[channel].cjyin_flag=1;
	teleinfo[channel].append_count=0;
	//写入新数据
	if(appendcounts > 0){
		strcpy(teleinfo[channel].hth,appendcjdata[readappend].hth);
		strcpy(teleinfo[channel].num,appendcjdata[readappend].num);
		strcpy(teleinfo[channel].cuijiao,appendcjdata[readappend].cuijiao);
		strcpy(teleinfo[channel].qfmonth,appendcjdata[readappend].qfmonth);
		teleinfo[channel].cjcount=appendcjdata[readappend].cjcount;
		strcpy(teleinfo[channel].cjmonth,appendcjdata[readappend].cjmonth);
		teleinfo[channel].cjyin_flag=appendcjdata[readappend].cjyin_flag;
		teleinfo[channel].append_count=appendcjdata[readappend].append_count;	//进辅缓冲区的次数
		
		appendcounts--;
		if(readappend>=APPENDDATA_COUNTS-1)
			readappend=0;
		else
			readappend++;

		return(0);
	}

	if(maincounts > 0){
		strcpy(teleinfo[channel].hth,maincjdata[readmain].hth);
		strcpy(teleinfo[channel].num,maincjdata[readmain].num);
		strcpy(teleinfo[channel].cuijiao,maincjdata[readmain].cuijiao);
		strcpy(teleinfo[channel].qfmonth,maincjdata[readmain].qfmonth);
		teleinfo[channel].cjcount=maincjdata[readmain].cjcount;
		strcpy(teleinfo[channel].cjmonth,maincjdata[readmain].cjmonth);
		teleinfo[channel].cjyin_flag=maincjdata[readmain].cjyin_flag;
		teleinfo[channel].append_count=0;				//进辅缓冲区的次数
		
		maincounts--;
		telecount.rdrecord_count=maincounts;
		::SendMessage( myhwnd, WM_COPY ,(WPARAM) 0, (LPARAM) 0);
		if(readmain>=MAINDATA_COUNTS-1)
			readmain=0;

⌨️ 快捷键说明

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