📄 d300.cpp
字号:
switch(EventType){
case DTEV_SIG: //DTI 信号事件
check_commu_status(cn, evt_handle);
break; // break case DTEV_SIG
case TDX_CST: //Vocie上的状态事件
if(myDEBUG) SysPrintf("%s: EVENT TYPE: TDX_CST\n",Channel[cn-1].voxname);
cstp=(DX_CST*)sr_getevtdatap(evt_handle);
switch (cstp->cst_event){
case DE_TONEON:
break;
case DE_TONEOFF:
break;
case tm_systmout: //系统超时
put_event_to_board(cn,play_systmout);
strcpy(Channel[cn-1].ServerLog.result, "整理资料");
ChnPrintf(cn, "_USER", "系统超时");
break;
case tm_usertmout: //用户超时
case tm_alwayserr: //多次出错
put_event_to_board(cn,play_usertmout);
strcpy(Channel[cn-1].ServerLog.result, "用户超时");
ChnPrintf(cn, "_USER", "操作超时");
break;
case tm_anirefuse: //主叫拒绝
put_event_to_board(cn,tm_voc_hangup);
break;
case play_systmout:
Channel[cn -1].TimeOut.cur_st = play_systmout;
play_voc(cn,"系统超时");
break;
case play_usertmout:
Channel[cn -1].TimeOut.cur_st = play_usertmout;
play_voc(cn,"用户超时");
break;
case tm_voc_hangup:
Channel[cn -1].TimeOut.cur_st = tm_idle;
dti_hangup(cn);
break;
} // end switch (cstp->cst_event)
break; // break case TDX_CST
case TDX_GETDIG:
break; // break case TDX_GETDIG
case TDX_PLAY:
switch (Channel[cn -1].TimeOut.cur_st) {
case play_usertmout:
case play_systmout:
put_event_to_board(cn,tm_voc_hangup);
break;
}
break; // break case TDX_PLAY
case TDX_PLAYTONE:
break; // break case TDX_PLAYTONE;
default:
break;
} // end switch(EventType)
return 1;
} //end of timeout_thread_func()
/*************************************************************************
* FUNC: dit_onhook(int dti)
*
* 说明: 挂机等待拨入
*
*
************************************************************************/
int dti_onhook (int dti)
{
int retval ;
if ((retval = dt_setsigmod(dti, DTM_SIGINS)) != 0) {
SysPrintf("dti_onhook() :dt_setsigmod() error") ;
return (retval) ;
}
if ((retval = dt_settssig (dti, DTB_ABIT|DTB_CBIT|DTB_DBIT, DTA_SETMSK)) != 0) {
SysPrintf("dti_onhook() :dt_settssig() error") ;
return (retval) ;
}
if ((retval = dt_settssig (dti, DTB_BBIT, DTA_SUBMSK)) != 0) {
SysPrintf("dti_onhook() :dt_settssig() error") ;
return (retval) ;
}
return (retval) ;
}
/******************************************************************************
* Name: dti_offhook(int cn)
* Function: Call begins from here. CO set seize signal,
* CPE gives acknowlage
* 通话开始,交换机设置占线忙,然后(用户)语音卡发出确认信号,建立通话
* 及demo中 dt_fwaoff()
******************************************************************************/
int dti_offhook(int cn)
{
int retval;
ChnPrintf(cn, "_STATE", "通话建立中 ....");
//Seize_acknowledge
//BW:10-->11 after FW:10-->00
//设置BBIT= ON, 这将触发语音卡端口的 DE_TONEON 事件。
if((retval=dt_settssig(Channel[cn-1].dti,DTB_BBIT,DTA_ADDMSK))!=0){
SysPrintf("dti_offhook() error: dt_setssig\n");
return -1;
}
return 0;//successful
}
/*************************************************************************
* FUNC: get_chn_next_state(int cn, EVT ev)
*
* 说明: 取通道的下一状态
*
************************************************************************/
/*************************************************************************
* FUNC: get_next_state(int cn, EVT ev)
*
* 说明: 取通道的下一状态
*
************************************************************************/
STATE get_next_state(int cn, EVT ev)
{
int count=0;
STATE current_state;
switch (Channel[cn-1].thread_id) {
case _main :
current_state = Channel[cn-1].Main.cur_st;
break;
case _singleinput :
current_state = Channel[cn-1].SingleInput.cur_st;
break;
case _monthinput :
current_state = Channel[cn-1].MonthInput.cur_st;
break;
case _multiplay :
current_state = Channel[cn-1].MultiPlay.cur_st;
break;
case _timeout :
current_state = Channel[cn-1].TimeOut.cur_st;
break;
default:
WinPrintf("get_next_state():错误的当前线程号 %d",Channel[cn-1].thread_id);
break;
}
while (MST[count].no != _nodefine)
{
if ((Channel[cn-1].thread_id == MST[count].curr_th) &&
(current_state == MST[count].curr_st) &&
(ev == MST[count].event) )
{
return MST[count].next_st;
}
count++;
}
return 0;
}
/*************************************************************************
* FUNC: get_next_thread(int cn, EVT ev)
*
* 说明: 取通道的下一线程
*
************************************************************************/
THREAD get_next_thread(int cn, EVT ev)
{
int count=0;
while (MST[count].no != _nodefine)
{
if ((Channel[cn-1].thread_id == MST[count].curr_th) &&
(Channel[cn-1].curr_st == MST[count].curr_st) &&
(ev == MST[count].event) )
{
return MST[count].next_th;
}
count++;
}
return 0;
}
/*************************************************************************
* FUNC: get_timeout_value(int cn, EVT ev)
*
* 说明: 取通道的下一状态
*
************************************************************************/
int get_timeout_value(int cn, EVT ev)
{
int count=0;
while (MST[count].no != _nodefine)
{
if ((Channel[cn-1].thread_id == MST[count].curr_th) &&
(Channel[cn-1].curr_st == MST[count].curr_st) &&
(ev == MST[count].event) )
{
return MST[count].timeout;
}
count++;
}
return _nodefine;
}
/******************************************************************************
* Name: dti_read_ani(int cn)
* Function: 读主叫(ANI),建立通话
* aysin.cpp - mfc()
******************************************************************************/
int dti_read_ani(int cn)
{
bool myDEBUG = false;
int bksig,fwsig;
DX_CST *cstp;
char dig;
cstp = (DX_CST *)sr_getevtdatap(Channel[cn-1].evt_handle);
switch (Channel[cn-1].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;
if((fwsig>115)||(fwsig<101)) {
SysPrintf("%s: Bad ToneID=%d,Number=%d\n",Channel[cn-1].voxname,fwsig,Channel[cn-1].number);
}
dig=(fwsig==SIGI_10)?'0':(char)(fwsig-SIGI_1+0x31);
if(Channel[cn-1].number<DNIS_LEN){
if((dig>'9')||(dig<'0')){
SysPrintf("%s: DNIS=%s ToneID=%d\n",Channel[cn-1].voxname,Channel[cn-1].dnis,fwsig);
return -2;
}
else
{
Channel[cn-1].dnis[Channel[cn-1].number]=dig;
}
}
if(Channel[cn-1].number==DNIS_LEN) {
Channel[cn-1].dnis[DNIS_LEN]='\0';
}
if((Channel[cn-1].number>DNIS_LEN)&&(Channel[cn-1].number<DNIS_LEN+ANI_LEN+1))
{
if((dig>'9')||(dig<'0'))
{
SysPrintf("%s: ANI=%s ToneID=%d\n",Channel[cn-1].voxname,Channel[cn-1].ani,fwsig);
return -2;
}
else
{
Channel[cn-1].ani[Channel[cn-1].number-DNIS_LEN-1]=dig;
}
}
if(Channel[cn-1].number==DNIS_LEN+ANI_LEN+1)
{
Channel[cn-1].ani[ANI_LEN]='\0';
}
//是想vox发backward signal
if(r2_playbsig(Channel[cn-1].voc,bksig,fwsig,EV_ASYNC)==-1)
{
SysPrintf("%s: r2_playbsig(),because %s\n",Channel[cn-1].voxname,ATDV_ERRMSGP(Channel[cn-1].voc)) ;
return -1;
}
// if bksig = SIGA_1, 表明请求交换机发送下一个数字,交换机确认这个请求
// ,则回送一个TDX_PLAYTONE事件
ChnPrintf(cn, "_TELE", "(%s)ANI=%s",Channel[cn-1].dnis,Channel[cn-1].ani);
return 0;
}
/******************************************************************************
* Name: dti_play_tone(int cn)
* Function: Call setup complete.
* 呼叫建立完成
*
******************************************************************************/
int dti_play_tone(int cn)
{
//SysPrintf("通道%d: In dt_pltone()",cn);
if (Channel[cn-1].number==DNIS_LEN+ANI_LEN+2) {
//set offhook BW:11-->01
if(dt_settssig(Channel[cn-1].dti,DTB_ABIT,DTA_SUBMSK)!=0){
SysPrintf("%s: dt_settssig()\n",Channel[cn-1].dtiname) ;
return -1;
}
Channel[cn-1].number=0;
//主叫收到
return 1;
}
Channel[cn-1].number++;
return 0;
}
/******************************************************************************
* 函数: int dti_hangup(int cn)
*
* 调用:但 ABIT 跳 1 时,调用此函数。
* 来源: Asyin.cpp - dt_fwaon()
*
* Abit跳1,表明有一方挂断,如果当前状态是TimeOut线程
* 的 tm_voc_hangup, 表明是语音卡主动挂机, 结束通话的
* 工作交给交换机自动完成,语音卡直接回到初始状态。否
* 则,表明是用户先挂机(交换机先挂),那么需要返回一
* 个backward signal,才能回到初始状态。
******************************************************************************/
int dti_hangup(int cn)
{
int retval;
char sdatetime[128];
get_system_datetime(sdatetime);
strcpy(Channel[cn-1].ServerLog.end_time,sdatetime);
ChnPrintf(cn,"_END", sdatetime);
//向主控程序发送写日志消息
if (Channel[cn-1].ServerLog.WriteLog == true) {
ChnPrintf(cn,"_STATE", "日志记录中...");
WriteSystemLog(cn);
Channel[cn-1].ServerLog.WriteLog = false;
}
// 先终止语音通道的工作,它将向语音卡发送一个用户终止事件。
// 如果用户挂机前正在播放语音,这个终止事件 = TDX_PLAY.TM_USRSTOP
retval =0;
dx_stopch(Channel[cn-1].voc,EV_ASYNC);
//语音卡挂先
if (Channel[cn-1].TimeOut.cur_st == tm_voc_hangup)
{
init01(cn);
}
else //用户挂机先
{
//(FW:00->10 BW:01-->11) —— 确认交换机挂机信号
if((retval=dt_settssig(Channel[cn-1].dti,DTB_ABIT,DTA_ADDMSK))!=0){
//ChnPrintf(cn, "_STATE","dti_hangup error 1");
SysPrintf("dti_hangup error 1");
return -1;
}
//(BW:11-->10)—— 告诉交换机“语音卡也挂机了”
if((retval=dt_settssig(Channel[cn-1].dti,DTB_BBIT,DTA_SUBMSK))!=0){
//ChnPrintf(cn, "_STATE","dti_hangup error 1");
SysPrintf("dti_hangup error 2");
return -1;
}
init01(cn);
}
//SysPrintf("通道%d dti=%d, Hangup!",cn,Channel[cn-1].dti);
ChnPrintf(cn, "_USER", " ");
ChnPrintf(cn, "_BEGIN", " ");
ChnPrintf(cn, "_END", " ");
ChnPrintf(cn, "_TELE", " ");
//printts(cn);
ChnPrintf(cn, "_STATE", "空闲");
return 0;
}
/******************************************************************************
* 函数: put_event_to_board(int cn, int evt)
* cn: 通道号
* evt: 事件代号
* 往通道上写事件
******************************************************************************/
bool put_event_to_board(int cn, int evt)
{
DX_CST cst;
cst.cst_event = evt;
cst.cst_data = 0;
if(sr_putevt(Channel[cn-1].voc, TDX_CST, sizeof(DX_CST), &cst, 0) != 0)
{
SysPrintf("put_event_to_board:失败!");
return false;
}
return true;
}
/***************************************************************************
* 函数: int get_voc_descr(char * voc_index, int * fhandle, int * offset, int *length)
*
* Des : 获取VFIT中保存的语音文件描叙
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -