📄 e1asyin.c
字号:
/********************************************************
* 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 + -