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