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

📄 e1asyin.c

📁 中国1号信令的接入源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			return TM_EOD;
		}
		break;
	case TDX_PLAYTONE:
		//printf("--- EVENT DATA: TDX_PLAYTONE\n");
		return TM_TONE;
		break;
   default:
		printf("--- EVENT TYPE AND DATA: 0X%X UNKNOWN\n",event);
		term=ATDX_TERMMSK(dev[channel].vox);
		printf("--- EVENT TYPE AND DATA: 0X%X 0X%X\n",event,term);
		return event;
		break;
   }  // end switch
   return 0;
}         

/*************************************************************************
* 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 ) 
     {
      /* Wait for Completion of an Event */
      if(sr_waitevt(100)==-1)
         {
			if(_kbhit())
			{
				ch=_getch();
			    if(ch==27) break;
			    if(ch==32) get_bits();
			    if((ch=='a')||(ch=='A')) debug_flag=~debug_flag;
             }
			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);
      if(debug_flag==1)
		  printf("\nEvent comes:%x",event);
      if(check_event(channel,event)==-1)
              {
		printf("%s: UNKNOWN EVENT 0X%X, %s\n",dev[channel].voxname,event,ATDV_ERRMSGP(dev[channel].vox));
		chan_init(channel);
	      }
      chktmout();
   } /* end while */
end_prog();
}


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

int dt_idle(int i)
{
	printf("%s: IDLE\n",dev[i].dtiname);
	return 0;
}

int dt_mfc(int i)
{
   int bksig ;
	DX_CST *cstp;
//printf("%d",i);
   cstp = (DX_CST *)sr_getevtdatap();
	switch (dev[i].number) {
	case DNIS_LEN-1: bksig=SIGA_6;
		break;
	case DNIS_LEN+ANI_LEN+1: bksig=SIGA_3;
		break;
	case DNIS_LEN+ANI_LEN+2: bksig=SIGB_1;
		break;
	default: bksig = SIGA_1 ;
		break;
	}
	if(dev[i].number<DNIS_LEN) 
		dev[i].dnis[dev[i].number]=(cstp->cst_data==SIGI_10)?'0':(char)(cstp->cst_data-SIGI_1+0x31);
	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)) 
		dev[i].ani[dev[i].number-DNIS_LEN-1]=(cstp->cst_data==SIGI_10)?'0':(char)(cstp->cst_data-SIGI_1+0x31);
	if(dev[i].number==DNIS_LEN+ANI_LEN+1)
		dev[i].ani[ANI_LEN]='\0';
	if (debug_flag==1)
		printf("--- dt_mfc(%d) cstp->data=%x bksig=%x rev_sig:%d\n",i,cstp->cst_data,bksig,dev[i].number);
	
	if(r2_playbsig(dev[i].vox,bksig,cstp->cst_data,EV_ASYNC)==-1) 
	{
	   printf("%s: r2_playbsig(),because %s\n",dev[i].voxname,ATDV_ERRMSGP(dev[i].vox)) ;
		return -1;
	}
	//printf("--- DNIS=%s, ANI=%s\n",dev[i].dnis,dev[i].ani);
   return 0;
}

int dt_offhk(int i)
{
	//BW:11-->01
	if(dt_settssig(dev[i].dti,DTB_ABIT,DTA_SUBMSK)!=0){
		printf("%s: dt_settssig() in dt_offhk()\n",dev[i].dtiname);
		return -1;
	}
	return 0;
}

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
}

int dt_bwfwaon(int i)
{
	int retval;
	//BW:11-->10 after FW:00-->10
	if((retval=dt_settssig(dev[i].dti,DTB_BBIT,DTA_SUBMSK))!=0){
		printf("dt_settssig() in dt_bkohhk()\n");
		return -1;
	}
	chan_init(i);
	return 0;//successful
}

int dt_fwaoff(int i)
{
	int retval;
	//Seize_acknowledge
	//BW:10-->11 after FW:10-->00
	//printf("now in fwaoff :%d \n",i);
	if((retval=dt_settssig(dev[i].dti,DTB_BBIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_bkohhk()\n");
		return -1;
	}
	dev[i].start_t=time(NULL);
	return 0;//successful
}

int dt_fwaon(int i)
{
	int retval;

	if(dx_stopch(dev[i].vox,EV_ASYNC)==-1){
		printf("%s: dx_stopch()\n",dev[i].voxname);
	}
	//The forward signal hangs up first (FW:00->10);
	//BW:01-->11
	if((retval=dt_settssig(dev[i].dti,DTB_ABIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_onhook(3) error\n");
		return -1;
	}
	//BW:11-->10
	if((retval=dt_settssig(dev[i].dti,DTB_BBIT,DTA_SUBMSK))!=0){
		printf("dt_settssig() in dt_onhook(4) error\n");
		return -1;
	}
	chan_init(i);
	return 0;
}

int main()
{
	printstart();
	sysinit();
	wait_event();	
	return 0;
}

int dt_usrstop(int i)
{
if (debug_flag==1)
	printf("%s: Caller hangup first\n",dev[i].dtiname);
	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)
{
	strcpy(dev[i].dnis,"");
	strcpy(dev[i].ani,"");
	dev[i].number=0;
	dev[i].state=ST_SZ_ACK;
	if(dt_settssig(dev[i].dti,DTB_ABIT|DTB_CBIT|DTB_DBIT,DTA_ADDMSK)==-1){
		printf("dt_settssig() in dt_onhook(1)\n");
		return -1;
	}
	if(dt_settssig(dev[i].dti,DTB_BBIT,DTA_SUBMSK)==-1){
		printf("dt_settssig() in dt_onhook(2)\n");
		return -1;
	}
     dx_enbtone(dev[i].vox,TONEALL,DM_TONEON|DM_TONEOFF); 
	 return 0;
}

int dt_toneoff(i)
{
	return 0;
}
int record(int i)
{
   DV_TPT tpt[4];
   DX_IOTT iott;
   dx_distone(dev[i].vox,TONEALL,DM_TONEON|DM_TONEOFF); 

   dev[i].fh =dx_fileopen("test.vox", _O_RDWR | _O_CREAT | _O_TRUNC | _O_BINARY, 0644);

   tpt[ 0 ].tp_type = IO_CONT;
   tpt[ 0 ].tp_termno = DX_DIGMASK;
   tpt[ 0 ].tp_length = DM_P;
   tpt[ 0 ].tp_flags = TF_DIGMASK;

   /* Terminate on 10s   of silence   */ 
   tpt[ 1 ].tp_type = IO_CONT;
   tpt[ 1 ].tp_termno = DX_MAXSIL;
   tpt[ 1 ].tp_length = 100;
   tpt[ 1 ].tp_flags = TF_MAXSIL;

   /* Terminate rec after 600 Seconds */
   tpt[ 2 ].tp_type = IO_EOT;
   tpt[ 2 ].tp_termno = DX_MAXTIME;
   tpt[ 2 ].tp_length = 6000;
   tpt[ 2 ].tp_flags = TF_MAXTIME;

   iott.io_fhandle = dev[i].fh;
   iott.io_type = IO_DEV|IO_EOT;
   iott.io_bufp = 0;
   iott.io_offset = 0;
   iott.io_length = -1;

   if (dx_rec(dev[i].vox, &iott, tpt, PM_TONE | EV_ASYNC | MD_ADPCM | PM_SR6) != 0) {
     printf("record()/error dx_rec%d",i);
	 return(0);
   }
   return 0;
}


int dt_pltone(int i)
{
   if (dev[i].number==DNIS_LEN+ANI_LEN+2) 
   {
	   _sleep(40);
      if(dt_settssig(dev[i].dti,DTB_ABIT,DTA_SUBMSK)!=0)
	  {
		   printf("%s: dt_settssig()\n",dev[i].dtiname) ;
			return -1;
		}
		get_bits();
	  //play sample.vox file
		printf("\n%s: DNIS=%s; ANI=%s\n",dev[i].voxname,dev[i].dnis,dev[i].ani);
		dt_playf(i);

		//record(i);
		dev[i].number=0;
		dev[i].state=ST_PLAYFILE;
		return 0;
	}
	dev[i].number++;
	return 0;
}

int chktmout()
{
	time_t endt;
	int i;
	for(i=0;i<MAXCHAN;i++){
		endt=time(NULL);
		if((dev[i].state==ST_MFC)&&(difftime(endt,dev[i].start_t)>100.0)){
			printf("%s: Timeout in MFC\n");
			dev[i].start_t=time(NULL);
			chan_init(i);			
		}
	}
	return 0;
}
int get_bits()
{ 
  int  i,arcv,brcv,axmt,bxmt;
  char ff[2],bb[2];
  if((sigbits=ATDT_BDSGBIT(dt_brdnum))==AT_FAILUREP)
     printf("sysinit/error getbdsg");
  printf("\n");
  for (i=0;i<30;i++)
	    {
		  arcv = (sigbits[i] & DTSG_RCVA)? 1:0;
		  brcv = (sigbits[i] & DTSG_RCVB)? 1:0;
		  axmt = (sigbits[i] & DTSG_XMTA)? 1:0;
		  bxmt = (sigbits[i] & DTSG_XMTB)? 1:0;
         itoa(arcv*8+brcv*4+3,ff,16);
         itoa(axmt*8+bxmt*4+3,bb,16);
         if (debug_flag==1)
		    printf(" %c/%c",ff[0],bb[0]);
        }
return (0);
}

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("---- sjc Corporation 袁广殿, Beijing. Tel: 62556874\n");
	printf("\nBefore you compile this program, you must specify\n");
	printf("your local telephone number length in the line\n");
	printf("   #define ANI_LEN 4.\n");
	printf("If your number is 160, then ANI_LEN=3.\n");
	printf("In this program DNIS_LEN=%d, ANI_LEN=%d\n",DNIS_LEN,ANI_LEN);
	printf("You need a file \"sample.vox\".\n\n");
	printf("This program uses the 30 channels (i) to wait calls,\n");
	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 (Esc) Key to quit this program ");
	
}

⌨️ 快捷键说明

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