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

📄 e1asyin.c

📁 中国1号信令的接入源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************
 *			Dial into D/300SC-E1 Demo program for Windows NT
 *			Dialogic Corporation, Beijing
 *			All Rights Reserved
 *			Dec, 1996
 *			Environment: Windows NT 3.51
 *			Asynchronous Mode
 *			Compiler: Visual C++ 4.0
 ********************************************************/
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <fcntl.h>
#include <srllib.h>
#include <dxxxlib.h>
#include <dtilib.h>
#include <sctools.h>

#define MAXCHAN 22  //Maximum number of channels allowed. 
#define DNIS_LEN 4   //The Dialed Number Identification Number Service length, can change
#define ANI_LEN 3    //The Automatic Number identification length, can change
DV_DIGIT digp;

char *voxchannels[] = {
   "dxxxB1C1" , "dxxxB1C2" , "dxxxB1C3" , "dxxxB1C4",
   "dxxxB2C1" , "dxxxB2C2" , "dxxxB2C3" , "dxxxB2C4",
   "dxxxB3C1" , "dxxxB3C2" , "dxxxB3C3" , "dxxxB3C4",
   "dxxxB4C1" , "dxxxB4C2" , "dxxxB4C3" , "dxxxB4C4",
   "dxxxB5C1" , "dxxxB5C2" , "dxxxB5C3" , "dxxxB5C4",
   "dxxxB6C1" , "dxxxB6C2" , "dxxxB6C3" , "dxxxB6C4",
   "dxxxB7C1" , "dxxxB7C2" , "dxxxB7C3" , "dxxxB7C4",
   "dxxxB8C1" , "dxxxB8C2" , 
	NULL,
};

char *dtichannels[] = {
   "dtiB1T1" , "dtiB1T2" , "dtiB1T3" , "dtiB1T4",
   "dtiB1T5" , "dtiB1T6" , "dtiB1T7" , "dtiB1T8",
   "dtiB1T9" , "dtiB1T10", "dtiB1T11", "dtiB1T12",
   "dtiB1T13", "dtiB1T14", "dtiB1T15", "dtiB1T16",
   "dtiB1T17", "dtiB1T18", "dtiB1T19", "dtiB1T20",
   "dtiB1T21", "dtiB1T22", "dtiB1T23", "dtiB1T24",
   "dtiB1T25", "dtiB1T26", "dtiB1T27", "dtiB1T28",
   "dtiB1T29", "dtiB1T30", 
	NULL,
};

typedef struct channel{
	int  vox;//voice handle
	int  dti;//dti handle
	char voxname[20];
	char dtiname[20];
	char dnis[20];
	char ani[20];
	int  state;
	int  number;
	FILE *fh;
	time_t start_t;
} CHANNEL;
CHANNEL dev[MAXCHAN];
int  dt_brdnum;     /* DTI board number */
unsigned char *sigbits;
int debug_flag=1;

/* Defines for states */
#define ST_SZ_ACK    1
#define ST_MFC       2
#define ST_PLAYFILE  3
#define ST_HUNGUP    4
#define ST_PLAYCADT  5

/* Other defines */
#define TABLE_SIZE   9

int  promptfh;

/* voice file handles */
extern int r2_creatfsig();
extern int r2_playbsig();
/* Function Declaration */
int  process_event(int);
int  check_event(int,int);
void wait_event();
void printstart(void);
void end_prog(void);
int  dt_fwaoff(int);
int  dt_mfc(int);
int  dt_playf(int);
int  dt_fwaon(int);
int  dt_bwaon(int);
int  dt_bwfwaon(int);
int  dt_usrstop(int);
int  dt_toneoff(int);
int  dt_pltone(int);
int  dt_playcadt(int);
int  chan_init(int);
int  chktmout();
int  get_bits();

/* Structure for look up table */
typedef struct 
{
	int current_state;
	int event;
	int next_state;
	int (*funcptr)(int);
}TABLE;

TABLE table[TABLE_SIZE]=
      {/*current_state    event        next_stat    function */
      { ST_SZ_ACK,        DTMM_AOFF,   ST_MFC,      dt_fwaoff },
      { ST_MFC,           DE_TONEON,   ST_MFC,      dt_mfc    },
      { ST_MFC,           DE_TONEOFF,  ST_MFC,      dt_toneoff},
      { ST_MFC,           TM_TONE,     ST_MFC,      dt_pltone },
      { ST_MFC,           DTMM_AON,    ST_SZ_ACK,   dt_fwaon  },
      { ST_PLAYFILE,      TM_EOD,      ST_HUNGUP,   dt_bwaon  },
      { ST_PLAYFILE,      TM_USRSTOP,  ST_SZ_ACK,   dt_usrstop},
      { ST_PLAYFILE,      DTMM_AON,    ST_PLAYFILE, dt_fwaon  },
      { ST_HUNGUP,        DTMM_AON,    ST_SZ_ACK,   dt_bwfwaon},
};

/***************************************************************************
 *        NAME: void sysinit()
 * DESCRIPTION: Start System
 ***************************************************************************/
void sysinit(void)
{
	int mode;
	int i;
   /* Set the Device to Polled Mode  */
   mode = SR_POLLMODE;
   if (sr_setparm(SRL_DEVICE,SR_MODEID,&mode )==-1) {
		printf("sr_setparm()\n");
		exit(0);
   }
   promptfh=dx_fileopen("samples.vox",O_RDONLY|O_BINARY);
	if(promptfh<=0){
		//printf("File SAMPLE.VOX not found, please  copy it to the current directory.\n");
		printf("File [%s] not found, please  copy it to the ask directory.\n","samples.vox");
		exit(0);
	}
    dt_brdnum =dt_open("dtiB1",0);
	for (i = 0; i < MAXCHAN; i++) 
	{
		strcpy(dev[i].voxname,voxchannels[i]);
		if ((dev[i].vox = dx_open(dev[i].voxname, 0)) == -1) {
			printf("%s: Error opening this channel\n",dev[i].voxname);
			exit(1);
		}
		strcpy(dev[i].dtiname,dtichannels[i]);
		if ((dev[i].dti = dt_open(dev[i].dtiname, 0)) == -1) {
			printf("%s: Error opening this channel\n",dev[i].dtiname);
			exit(1);
		}
		
		if(nr_scunroute(dev[i].dti,SC_DTI,dev[i].vox,SC_VOX,SC_FULLDUP)==-1){
			printf("%s <=== UnRoute Failed ===> %s\n",dev[i].voxname,dev[i].dtiname);
			exit(1);
		}
		if(nr_scroute(dev[i].dti,SC_DTI,dev[i].vox,SC_VOX,SC_FULLDUP)==-1){
			printf("%s <=== Route Failed ===> %s\n",dev[i].voxname,dev[i].dtiname);
			exit(1);
		}
		
		if(dx_deltones(dev[i].vox)==-1){
			printf("%s: dx_deltones()\n",dev[i].voxname);
			exit(1);
		}
		if(r2_creatfsig(dev[i].vox,R2_ALLFSIG)==-1){
			printf("%s: r2_creatfsig()\n",dev[i].voxname);
			exit(1);
		}
		if(dt_setevtmsk(dev[i].dti,DTG_SIGEVT,DTMM_AON|DTMM_AOFF,DTA_SETMSK)==-1){
			printf("%s: dt_setevtmsk()\n",dev[i].dtiname);
			exit(1);
		}
	   /* Set channel to detect DTMF and loop pulse digits */

	   if (dx_setdigtyp(dev[i].vox, DM_DTMF|DM_LPD) == -1) {
			printf("%s: error on dx_setdigtyp()\n",dev[i].voxname);
	   }
		chan_init(i);
		printf(".");
	}
	printf("\nAll Channels opened, dial in now.\n");
}

/***************************************************************************
 * Name:   int dx_intro( channum )
 * Des:    Set up IOTT and TPT's and Initiate the Play-Back and update
 *         the child window.
 * Input : int channel number;   
 * Output: Starts the play-back        
 *       
 *     
 *    
 ***************************************************************************/
int dt_playf(int i)
{
	static DV_TPT tpt[2];
	static DX_IOTT iott[3];

   dx_distone(dev[i].vox,TONEALL,DM_TONEON|DM_TONEOFF); 
   dx_clrtpt(tpt,2);
   // Terminate Play on Receiving any DTMF tone 
   tpt[0].tp_type = IO_CONT;
   tpt[0].tp_termno = DX_MAXDTMF;
   tpt[0].tp_length = 1;
   tpt[0].tp_flags = TF_MAXDTMF;

   // Terminate  on MAXTIME 
   tpt[1].tp_type = IO_EOT;
   tpt[1].tp_termno = DX_MAXTIME;
   tpt[1].tp_length = 20000;
   tpt[1].tp_flags = TF_MAXTIME;

	//iott[0].io_type=IO_DEV|IO_LINK;
	iott[0].io_type=IO_DEV|IO_EOT;
	//iott[0].io_bufp=0;
	iott[0].io_fhandle=promptfh;
	iott[0].io_offset=0;
	iott[0].io_length=-1;
   dx_clrdigbuf(dev[i].vox);
	/* Play VOX File on D/4x Channel, Normal Play Back */
   if (dx_play(dev[i].vox,iott,tpt,PM_TONE|EV_ASYNC)==-1 ){
      printf("%s: %s in dx_play()\n",dev[i].voxname,ATDV_ERRMSGP(dev[i].vox));
		return -1;
   }
	return 0;
}


int dt_playcadt(int i)
{
DV_TPT tpt[2];
int numdigs, cnt;	
   dx_clrtpt(tpt,2);
   // Terminate Play on Receiving any DTMF tone 
   tpt[0].tp_type = IO_CONT;
   tpt[0].tp_termno = DX_MAXDTMF;
   tpt[0].tp_length = 4;
   tpt[0].tp_flags = TF_MAXDTMF;

   // Terminate  on MAXTIME 
   tpt[1].tp_type = IO_EOT;
   tpt[1].tp_termno = DX_MAXTIME;
   tpt[1].tp_length = 45;
   tpt[1].tp_flags = TF_MAXTIME;
if ((numdigs = dx_getdig(dev[i].vox,tpt, &digp, EV_SYNC)) == -1) {
     /* process error */

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

   /*tngencad.cycles=2;
   tngencad.numsegs=2;
   tngencad.offtime[0]=0;
   tngencad.offtime[1]=30;
   //tngencad.offtime[2]=10;
   //tngencad.offtime[3]=10;
   dx_bldtngen(&tngencad.tone[0],1400,0,-10,0,20);
   dx_bldtngen(&tngencad.tone[1],2300,0,-10,0,20);
   //dx_bldtngen(&tngencad.tone[2],450,400,-15,-15,20);
   //dx_bldtngen(&tngencad.tone[3],450,400,-18,-18,20);
   if (dx_playtoneEx(dev[i].vox,&tngencad,tpt,EV_ASYNC)==-1){
      printf("%s: %s in dx_play()\n",dev[i].voxname,ATDV_ERRMSGP(dev[i].vox));
		return -1;
   }*/
	return 0;
}

/******************************************************************************
* Name:  check_event()
* Input: int channel number
*                int voice/msi events
* Des:   It checks the current state of a channel, look up in the state 
*                for the next state of the channel depanding on the event received
*                sets the next state and initiates the apprpriate func.
*
*
*******************************************************************************/
int check_event(int channel, int event)
{
   int i;
   int (*func_ptr)(int);

   for (i=0; i< TABLE_SIZE; i++)
      if((dev[channel].state==table[i].current_state) && 
				    (table[i].event==event)){
			func_ptr = table[i].funcptr;
			dev[channel].state = table[i].next_state;
			//printf("--- EVENT FUNCTION NUMBER IS %d\n",i);
			(*func_ptr)(channel);
			return 0;
			break;
      }
	return -1;
}


/****************************************************************************
* Name:   process_event
* Input:  int channel number
* output: returns a voice event
* Des:    It retreives voice events on a channel by calling sr_getevttype()
*                 sr_getevtdatap() and returns it to the wait_event()
*
*
*****************************************************************************/
int process_event(int channel)
{
   int event;
	int index;
	int *datap;
   long term;
   DX_CST *cstp;
   
   event = sr_getevttype();
   switch(event){
   case DTEV_SIG:
		datap=(int*)sr_getevtdatap();
		//printf("--- EVENT TYPE: DTEV_SIG\n");
		for(index=0;index<4;index++){
			switch (*datap&(0x1111<<index)){
			case DTMM_AON:
				//printf("--- EVENT DATA: DTMM_AON\n");
				return DTMM_AON;
				break;
			case DTMM_AOFF:
				//printf("--- EVENT DATA: DTMM_AOFF\n");
				return DTMM_AOFF;
				break;
			}
		}
		break;
	case TDX_CST:
		//printf("--- EVENT TYPE: TDX_CST\n");
		cstp=(DX_CST*)sr_getevtdatap();
		switch (cstp->cst_event){
		case DE_TONEON:
			//printf("--- EVENT DATA: DE_TONEON\n");
			return DE_TONEON;
			break;
		case DE_TONEOFF:
			//printf("--- EVENT DATA: DE_TONEOFF\n");
			return DE_TONEOFF;
			break;
		}

	case TDX_PLAY: /* Play ENDS*/
		//printf("--- EVENT TYPE: TDX_PLAY\n");
		term=ATDX_TERMMSK(dev[channel].vox);
		if(term&TM_USRSTOP){
		if (debug_flag==1)
			printf("%s: Caller hangup.\n",dev[channel].voxname);
			//printf("--- EVENT DATA: TM_USRSTOP\n");
			return TM_USRSTOP;
		} else {
			//printf("--- EVENT DATA: TM_EOD\n");
		if (debug_flag==1)
			printf("%s: Play ends.\n",dev[channel].voxname);

⌨️ 快捷键说明

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