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