📄 d300.cpp.demo
字号:
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()
{
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;
}
/*************************************************************************
* 函数 : OpenAllVocFile()
* 描叙 : 打开VFIT中列出的所有语音文件,并将语音句柄保存在VFIT结构中。
*
* 参数 : 无
* 返回 : 打开的文件数
*************************************************************************/
int OpenAllVocFile(void)
{
int number,i;
char snum[10];
char count[10], vocfile[80], shandle[20];
int fhandle;
//系统语音文件数
strcpy(snum,(const char *)ReadGCA("VFIT_LEN"));
number = atoi(snum);
for(i=1; i<=number; i++)
{
itoa(i,count,10);
strcpy(vocfile, (const char *)ReadVFIT(count,"IndexName"));
fhandle=dx_fileopen(vocfile,O_RDONLY|O_BINARY);
if(fhandle<=0){
WinPrintf("语音文件 %s 打开失败.", vocfile);
return i-1;
}
itoa(fhandle,shandle,10);
SetVFIT(count,"FileHandle",shandle);
}
return i-1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -