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

📄 asyin.c.demo

📁 170话费查询系统
💻 DEMO
📖 第 1 页 / 共 2 页
字号:
			return TM_EOD;
			break;

	case TDX_PLAY: /* Play ENDS*/
		//if(DEBUG) 
//#define TM_NORMTERM           0x00000     /* Normal Termination */
//#define TM_MAXDTMF            0x00001     /* Max Number of Digits Recd */
//#define TM_MAXSIL             0x00002     /* Max Silence */
//#define TM_MAXNOSIL           0x00004     /* Max Non-Silence */
//#define TM_LCOFF              0x00008     /* Loop Current Off */
//#define TM_IDDTIME            0x00010     /* Inter Digit Delay */
//#define TM_MAXTIME            0x00020     /* Max Function Time Exceeded */
//#define TM_DIGIT              0x00040     /* Digit Mask or Digit Type Term. */
//#define TM_PATTERN            0x00080     /* Pattern Match Silence Off */
//#define TM_USRSTOP            0x00100     /* Function Stopped by User */
//#define TM_EOD                0x00200     /* End of Data Reached on Playback */
//#define TM_TONE               0x02000     /* Tone On/Off Termination */
//#define TM_BARGEIN            0x08000     /* Play terminated due to Barge-in */
//#define TM_ERROR              0x80000     /* I/O Device Error */

		printf("%s: EVENT TYPE: TDX_PLAY\n",dev[channel].voxname);
		term=ATDX_TERMMSK(dev[channel].vox);  //检测播报的终止情况。
		if(term & TM_EOD) {
			printf("%s: Play ended by 全部拨完TM_EOD\n",dev[channel].voxname);
		}
		if(term & TM_MAXTIME){    //超时
			printf("%s: Play ended by 超出时间TM_MAXTIME\n",dev[channel].voxname);		
		}
		if (term & TM_USRSTOP){
			printf("%s: Play ended by 用户挂机终止(tm_usrstop)\n",dev[channel].voxname);		
		    //按键终止语音的情况下开始读键
			if (strcmp(dev[channel].dnis,"177")==0) {
		    ReadUserKey(channel);
			}
		}
		if (term & TM_MAXDTMF){
			printf("%s: Play ended by 用户按键终止(tM_maxdtmf)\n",dev[channel].voxname);
		    //按键终止语音的情况下开始读键
			if (strcmp(dev[channel].dnis,"177")==0) {
		    ReadUserKey(channel);
			}

		}


		//return TM_EOD;
		break;
	case TDX_PLAYTONE:
		//if(DEBUG) printf("%s: EVENT DATA: TDX_PLAYTONE\n",dev[channel].voxname);
		return TM_TONE;
		break;
   default:
		if(DEBUG) printf("%s: EVENT TYPE AND DATA: 0X%X UNANALYSED\n",dev[channel].voxname,EventType);
		return EventType;
		break;
   }  // end switch
}         

/*************************************************************************
* NAME:   wait_event()
* Input:  None
* Des:    It blocks at sr_waitevt() and  wait for events, once the event is
*                 received, it find out the device and channel number and calls
*                 process_events() for voice and ms_process_event() for msi events.
*                 After getting an event, it calls check_events() to initiate the
*                 appropriate function.
**************************************************************************/
void wait_event()
{
   int channel;
   int chdev;
   int event;
	char ch;

	while ( 1 )  {
	 if(_kbhit()){
			ch=_getch();
			if(ch==27) break;
	 }
	
      
      /* Wait for Completion of an Event */
      if(sr_waitevt(-1)==-1){
		   continue;
	  }
		//printf("----------------- Event comes. ---------------\n");
      // Get the channel number from which the event was received.
       
      channel = 0;
      chdev = sr_getevtdev();
	   
      while (channel < MAXCHAN) {
			if((dev[channel].dti==chdev)||(dev[channel].vox==chdev))break; 
			else channel++;
      }
   
		event = process_event(channel);
        //printf("chdev is %d, channal is %d, event is %d.\n",chdev,channel,event);
		if(check_event(channel,event)==-1)
			//printf("%s: EVENT Not Listed 0X%X, %s\n",dev[channel].voxname,event,ATDV_ERRMSGP(dev[channel].vox));
		chktmout();
   } /* end while */
	end_prog();
}


/*******************************************************************************
* Name : end_prog()
* Input: none.
* Des:   This function stops, setonhook and closes all channels
*
*******************************************************************************/
int end_prog()
{
	int i;
	if(DEBUG) printf("______\nIn end_prog()\n");
	for(i=0;i<MAXCHAN;i++){
		dx_stopch(dev[i].vox,EV_ASYNC);
		dx_close(dev[i].vox);
		dt_close(dev[i].dti);
	}
	dx_fileclose(promptfh);
	printf("\nAll channels closed.\n");
	return 0;
}

/******************************************************************************
* Name: dt_mfc()
* Function: To complete Multifrequecy Control.
*
******************************************************************************/
int dt_mfc(int i)
{
	int bksig,fwsig;
    
	DX_CST *cstp;
	char dig;
	int  slen;

   cstp = (DX_CST *)sr_getevtdatap();
	if(DEBUG) printf("%s: In dt_mfc() cstp->data=%d\n",dev[i].voxname,cstp->cst_data);
	switch (dev[i].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;
	//最长的号码如 (021-88565678-1234)共15位。
	if((fwsig>115)||(fwsig<101))  	
		printf("%s: Bad ToneID=%d,Number=%d\n",dev[i].voxname,fwsig,dev[i].number);
	dig=(fwsig==SIGI_10)?'0':(char)(fwsig-SIGI_1+0x31);

	slen = strlen(myrecv);
    myrecv[slen]=dig;
	myrecv[slen+1] = '\0';
    //printf("接收号码=[%s]\n",myrecv);

    //printf(" DIG=%c \n",dig);
	if(dev[i].number<DNIS_LEN){
		if((dig>'9')||(dig<'0')){
			printf("%s: DNIS=%s ToneID=%d\n",dev[i].voxname,dev[i].dnis,fwsig);
			return -2;
		} 
		else 
		{
		   dev[i].dnis[dev[i].number]=dig;
		}
	}

	if(dev[i].number==DNIS_LEN)	{
		dev[i].dnis[DNIS_LEN]='\0';
	}

	if((dev[i].number>DNIS_LEN)&&(dev[i].number<DNIS_LEN+ANI_LEN+1)) 
		if((dig>'9')||(dig<'0')){
			printf("%s: ANI=%s ToneID=%d\n",dev[i].voxname,dev[i].ani,fwsig);
			return -2;
		} else 
		dev[i].ani[dev[i].number-DNIS_LEN-1]=dig;
	if(dev[i].number==DNIS_LEN+ANI_LEN+1)
		dev[i].ani[ANI_LEN]='\0';
	
    if(r2_playbsig(dev[i].vox,bksig,fwsig,EV_ASYNC)==-1) {
	   printf("%s: r2_playbsig(),because %s\n",dev[i].voxname,ATDV_ERRMSGP(dev[i].vox)) ;
		return -1;
	}
	// if  bksig = SIGA_1, 表明请求交换机发送下一个数字,交换机确认这个请求
	// ,则回送一个TDX_PLAYTONE事件
	if(DEBUG) printf("%s: DNIS=%s, ANI=%s\n",dev[i].voxname,dev[i].dnis,dev[i].ani);
   return 0;
}


/*
  交换机(Abit)		语音卡(Bbit)		状态
  ---------------------------------------------------------
  1			0			初始状态,等待来话
  0(交换机跳0)		0			交换机来话!
  0			1(置1)			语音卡确认来话,开始通话....
  1(交换机跳1)		1			正在通话,交换机那端挂断了!
  1(语音卡置1)		1			通话结束,语音卡主动挂断!
  1			0(置0)			语音卡也挂断,回到初始状态			
  
*/

/******************************************************************************
* Name: dt_bwaon()
* Function: After normal play, this side haungup.
* 语音卡主动挂机
******************************************************************************/
int dt_bwaon(int i)
{
	int retval;

	//backword signal hangs up first
	//BW:01-->11
	if((retval=dt_settssig(dev[i].dti,DTB_ABIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_bwaon(2) error\n");
		return -1;
	}
	return 0;//successful
}

/******************************************************************************
* Name: dt_fwaoff()
* Function: Call begins from here. CO set seize signal, 
*				CPE gives acknowlage
* 通话开始,交换机设置占线忙,然后(用户)语音卡发出确认信号,建立通话
******************************************************************************/
int dt_fwaoff(int i)
{
	int retval;
	//Seize_acknowledge
	//BW:10-->11 after FW:10-->00
	if(DEBUG) printf("%s: In dt_fwaoff()\n",dev[i].voxname);
	//设置BBIT= ON, 这将触发语音卡端口的 DE_TONEON 事件。
	if((retval=dt_settssig(dev[i].dti,DTB_BBIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_fwaoff()\n");
		return -1;
	}
	dev[i].start_t=time(NULL);
	return 0;//successful
}

/******************************************************************************
* Name: dt_fwaon()
* Function: CO hangs up first, CPE prepare to hang up.
* forward ABIT is on: 交换机已挂机,用户挂机
******************************************************************************/
int dt_fwaon(int i)
{
	int retval;

	if(DEBUG) printf("%s: In dt_fwaon()\n",dev[i].voxname);
	
   	dx_stopch(dev[i].vox,EV_ASYNC);
	// dx_stopch 将向语音卡发送一个用户终止事件。

	printf("%s: 用户挂机\n",dev[i].voxname);
	//The forward signal hangs up first (FW:00->10);
	//BW:01-->11
	//     ABIT = 1 表示交换机挂断,= 0 表示要开始通话了。
	if((retval=dt_settssig(dev[i].dti,DTB_ABIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_fwaon(1) error\n");
		return -1;
	}//这里语音卡向交换机发消息,表示对“交换机挂机”的确认。

	//BW:11-->10    BBIT =0,表示用户挂机了,BBIT = 1 表示用户确认可以开始通话了!
	if((retval=dt_settssig(dev[i].dti,DTB_BBIT,DTA_SUBMSK))!=0){
		printf("dt_settssig() in dt_fwaon(2) error\n");
		return -1;
	}//这里语音卡向交换机发消息,传送“语音卡挂机”信号。

	chan_init(i);
	printts(i);
	return 0;
}

/******************************************************************************
* Name: main()
* Function: To receive calls from CO.
*
******************************************************************************/
int main()
{
	strcpy(myrecv,"");
	printstart();
	sysinit();
	wait_event();	
	return 0;
}

/******************************************************************************
*          Name: int chan_init(int i)
*      Function: set dti device on hook
*	    Parameter: channel NUMBER
*  Return value: 0, if successful
*					 : -1, unsuccessful	 
******************************************************************************/
int chan_init(int i)
{
	if(DEBUG) printf("%s: In chan_init()\n",dev[i].voxname);
	strcpy(dev[i].dnis,"");
	strcpy(dev[i].ani,"");
	dev[i].number=0;
	dev[i].state=ST_SZ_ACK;
	dt_settssigsim(dev[i].dti,DTB_AON|DTB_BOFF|DTB_CON|DTB_DON);
	return 0;
}

/******************************************************************************
* Name: dt_pltone()
* Function: Call setup complete, then play vox file.
*
******************************************************************************/
int dt_pltone(int i)
{
	if(DEBUG) printf("%s: In dt_pltone()\n",dev[i].voxname);
   	if (dev[i].number==DNIS_LEN+ANI_LEN+2) {
      	//printf("%s: MFC ENDS\n",dev[i].voxname) ;
		//set offhook BW:11-->01
      		if(dt_settssig(dev[i].dti,DTB_ABIT,DTA_SUBMSK)!=0){
		   printf("%s: dt_settssig()\n",dev[i].dtiname) ;
			return -1;
		}
		//play sample.vox file
		printf("%s: DNIS=%s; ANI=%s\n",dev[i].voxname,dev[i].dnis,dev[i].ani);
		dt_playf(i);
		dev[i].number=0;
		dev[i].state=ST_PLAYFILE;
		//
		strcpy(myrecv,"");
		return 0;
	}
	dev[i].number++;
	return 0;
}

/******************************************************************************
* Name: chktmout()
* Function: To check if it is timeout during MFC. If so, hangup, 
*				initialize this channel
******************************************************************************/
int chktmout()
{
	time_t endt;
	int i;
	if(DEBUG) printf("%s: In chktmout()\n","CHANNELS");
	for(i=0;i<MAXCHAN;i++){
		endt=time(NULL);
		if((dev[i].state!=ST_SZ_ACK)&&(difftime(endt,dev[i].start_t)>120.0)){
			dev[i].state=ST_SZ_ACK;
			dev[i].start_t=time(NULL);
			dx_stopch(dev[i].vox,EV_ASYNC);
			
			//reopen the channel
			dx_close(dev[i].vox);
			dt_close(dev[i].dti);
			dev[i].vox = dx_open(dev[i].voxname, 0);
			dev[i].dti = dt_open(dev[i].dtiname, 0);		
			nr_scunroute(dev[i].dti,SC_DTI,dev[i].vox,SC_VOX,SC_FULLDUP);
			nr_scroute(dev[i].dti,SC_DTI,dev[i].vox,SC_VOX,SC_FULLDUP);
			dx_deltones(dev[i].vox);
			r2_creatfsig(dev[i].vox,R2_ALLFSIG);
			dt_setevtmsk(dev[i].dti,DTG_SIGEVT,DTMM_AON|DTMM_AOFF,DTA_SETMSK);
			chan_init(i);
			printf("%s: Timeout, and to be reopened\n",dev[i].voxname);
		}
	}
	return 0;
}

/******************************************************************************
* Name: printts()
* Function: To show the RX and TX bits.
*
******************************************************************************/
int printts(int i)
{
	long tsbits;
	int arcv,brcv,crcv,drcv,axmt,bxmt,cxmt,dxmt;

	if((tsbits=ATDT_TSSGBIT(dev[i].dti))==AT_FAILURE){
		printf("ATDT_TSSGBIT() error.\n");
		return -1;
	}
	arcv=(tsbits & DTSG_RCVA)?1:0;
	brcv=(tsbits & DTSG_RCVB)?1:0;
	crcv=(tsbits & DTSG_RCVC)?1:0;
	drcv=(tsbits & DTSG_RCVD)?1:0;
	axmt=(tsbits & DTSG_XMTA)?1:0;
	bxmt=(tsbits & DTSG_XMTB)?1:0;
	cxmt=(tsbits & DTSG_XMTC)?1:0;
	dxmt=(tsbits & DTSG_XMTD)?1:0;
	printf("%s: RX=%d%d%d%d, ",dev[i].voxname,arcv,brcv,crcv,drcv);
	printf("TX=%d%d%d%d.\n",axmt,bxmt,cxmt,dxmt);
	return 0;
}

/******************************************************************************
* Name: printstart()
* Function: To print attention information.
*
******************************************************************************/
void printstart(void)
{
	printf("\nD/300SC-E1 Windows NT Dialin Demo Program.\n");
	printf("Compiler: Visual C++2.0 or later, Asynchronous Mode.\n");
	printf("---- Dialogic Corporation, Beijing. Tel: 8610-65045364.\n");
	printf("\nBefore you compile this program, you must specify\n");
	printf("your local telephone number length in the line\n");
   printf("   #define MAXCHAN %d\n",MAXCHAN);
   printf("   #define DNIS_LEN %d\n",DNIS_LEN);
   printf("   #define ANI_LEN %d\n",ANI_LEN);
	printf("You need a file \"sample.vox\".\n\n");
	printf("This program uses the %d channels (i) to wait calls,\n",MAXCHAN);
	printf("When ring comes, it get the dialer' s telephone number,\n");
	printf("through multi_frequency control process,\n");
	printf("after plays the sample.vox, it hangup and rewaiting calls.\n");
	printf("----------------------------------------------------------\n\n");
	printf("Please Wait it opening channels\n");
	
}




int digit_handler()
{
   int chfd;
   int cnt, numdigs;
   chfd = sr_getevtdev();
   numdigs = strlen(digp[chfd].dg_value);
   for(cnt=0; cnt < numdigs; cnt++) {
      printf("\nDigit received = %c, digit type = %d",
                         digp[chfd].dg_value[cnt], digp[chfd].dg_type[cnt]);
   }
   
   return 0;
}

⌨️ 快捷键说明

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