📄 d160aunpbxdlg.cpp
字号:
if(TelLine[i].BusyFlag==FALSE)
{ // 找到了空闲的外线通道
TelLine[i].BusyFlag=TRUE;
TelLine[channel].WaiConnectCh=i;
TelLine[i].CallCh=channel;
break;
}
goto ErrorProc;// 放忙音
}
//DTMF码的转换和存储
OffHook(i);
StartSigCheck(i);
StartHangUpDetect(channel);
//呼叫长途,通过IP
Sig_StartDial(i,"17910,,,,,,1,,,1351700057311018#","9",0);
TelLine[channel].DisStatusMessage="长话呼叫中…";
TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="正在进行长话呼出…";
TelLine[i].Status=LINE_JUST_WAIT;
TelLine[channel].Status=LINE_IP_ISCONNECT;
break;
}
break;
}// End of 内线的状态处理
//*************************************************************************
//*************************************************************************
if(TelLine[channel].DtmfPos==0 && TelLine[channel].ChType==CHTYPE_TRUNK
&& ElapseTime(channel,TIMER_NO)>=ONE_SECOND*10)
{ // 外线通道接通后5秒内不拨分机号,自动转自动声讯服
//**********************我又要用GOTO 语句了,哈哈哈……!
TelLine[channel].DtmfPos =3;
TelLine[channel].DtmfArray [0]=10;
TelLine[channel].DtmfArray [1]=8;
StartSigCheck(channel);
TelLine[channel].DisStatusMessage =" 自动声讯服务 …";
goto INTERCALL;
}
//*************************************************************************
//*************************************************************************
if(TelLine[channel].DtmfPos!=0 && TelLine[channel].ChType==CHTYPE_TRUNK)
{// 外线的收码处理
// 如果拨零查号,则转01
if(TelLine[channel].DtmfArray[0]==9)
{
TelLine[channel].DtmfPos =3;
TelLine[channel].DtmfArray [0]=10;
TelLine[channel].DtmfArray [1]=1;
StartSigCheck(channel);
TelLine[channel].DisStatusMessage =" 呼叫内线分机 …";
goto INTERCALL;
break;
}
// 延时6秒钟,不拨号,自动转01
if(ElapseTime(channel,TIMER_NO)>=ONE_SECOND*3)
{
TelLine[channel].DtmfPos =3;
TelLine[channel].DtmfArray [0]=10;
TelLine[channel].DtmfArray [1]=1;;
StartSigCheck(channel);
TelLine[channel].DisStatusMessage =" 呼叫内线分机 …";
goto INTERCALL;
// TelLine[channel].Status =INTERCALL;
break;
}
// 外线直接拨内线的分机号,则转内线处理
if(TelLine[channel].DtmfPos ==2)
{
//for(i=3;i>0;i--)
// TelLine[channel].DtmfArray [i]
// =TelLine[channel].DtmfArray [i-1];
for(i=0;i<=2;i++)
TelLine[channel].DtmfArray[i]=(char)(TelLine[channel].DtmfArray[i]%10+48);
StartSigCheck(channel);
goto INTERCALL;
}
break;
}// End of 外线的状态处理
break;// End of case LINE_GET_DTMF
///*****************
ErrorProc: //****** // 收码的出错处理部分
///*****************
if(TelLine[channel].ChType==CHTYPE_USER)
{
// 代接,转接的情况
{
}
StartPlaySignal(channel,SIG_BUSY1);
TelLine[channel].Status=LINE_WAIT_HANGUP;
break;
}
if(TelLine[channel].ChType==CHTYPE_TRUNK)
{
InitDtmfBuf(channel);
TelLine[channel].DtmfPos=0;
StartPlayFile(channel,FileName,0);
TelLine[channel].Status=LINE_WELCOME;
break;
}
break;
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
case LINE_WAIT_INTER_OFFHOOK:
TelLine[channel].DisStatusMessage="等待内线被叫用户摘机…";
if(TelLine[channel].ChType==CHTYPE_TRUNK && Sig_CheckBusy(channel))
{ // 外线主叫用户挂机
HangUp(channel);
TelLine[channel].Status=LINE_INIT;
TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
break;
}
if(OffHookDetect(TelLine[channel].ConnectCh))
{ // 被叫摘机
InitDtmfBuf(channel);
InitDtmfBuf(TelLine[channel].ConnectCh);
FeedPower(TelLine[channel].ConnectCh); // 停被叫振铃
StartHangUpDetect(TelLine[channel].ConnectCh);
StartPlaySignal(channel,SIG_STOP); // 停主叫回铃音
StartPlaySignal(TelLine[channel].ConnectCh,SIG_STOP);
StopPlayFile(channel);
StopPlayFile(TelLine[channel].ConnectCh);
SetLink(channel,TelLine[channel].ConnectCh); // 连通主叫和被叫
if(TelLine[channel].ChType==CHTYPE_TRUNK)
{ // 外线呼叫内线,接通以后,主、被叫交换
TelLine[channel].CallCh=TelLine[channel].ConnectCh;
TelLine[TelLine[channel].ConnectCh].ConnectCh=channel;
TelLine[TelLine[channel].ConnectCh].WaiConnectCh=channel;
TelLine[TelLine[channel].ConnectCh].CallCh=-1;
TelLine[channel].ConnectCh=-1;
StartHangUpDetect(TelLine[channel].ConnectCh);
StartSigCheck(channel);
TelLine[channel].Status=LINE_JUST_WAIT;
TelLine[channel].DisStatusMessage="和内线进行通话 …";
TelLine[TelLine[channel].CallCh].Status=LINE_INTER_CALL;
break;
}
TelLine[channel].DisStatusMessage="进行内线通话…";
TelLine[TelLine[channel].ConnectCh].DisStatusMessage="接听内线来电…";
// 所有内线均须进行挂机和拍叉簧处理
TelLine[channel].Status=LINE_INTER_CALL;
TelLine[TelLine[channel].ConnectCh].Status=LINE_INTER_CALL;
break;
}
if(TelLine[channel].ChType==CHTYPE_TRUNK) break;
// 内线的挂机及拍叉簧处理
switch( HangUpDetect(channel))
{
case HANG_UP_FLAG_START:
break;
case HANG_UP_FLAG_FALSE: //
break;
case HANG_UP_FLAG_PRESS_R: // 拍叉簧处理
if(TelLine[channel].PRESSFLAG)
{// 用户二次拍叉簧动作
TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
TelLine[channel].ConnectCh=TelLine[channel].HoldCh;
TelLine[TelLine[channel].HoldCh].CallCh=channel;
TelLine[TelLine[channel].HoldCh].ConnectCh=-1;
TelLine[channel].CallCh=-1;
if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_USER)
TelLine[TelLine[channel].HoldCh].Status=LINE_INTER_CALL;
if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
{
TelLine[TelLine[channel].HoldCh].Status=LINE_JUST_WAIT;
TelLine[TelLine[i].CallCh].DisStatusMessage="和内线进行通话…";
}
break;
}
TelLine[channel].Status=LINE_INIT;
TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
break;
case HANG_UP_FLAG_TRUE: // 挂机处理
TelLine[channel].Status=LINE_INIT;
TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
if(TelLine[channel].PRESSFLAG)
{// 用户一次拍叉簧然后挂机动作
if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
{ // 和外线通道相连
HangUp(TelLine[channel].HoldCh);
TelLine[TelLine[channel].HoldCh].Status=LINE_INIT;
break;
}
StartPlaySignal(TelLine[channel].HoldCh,SIG_BUSY1);
TelLine[TelLine[channel].HoldCh].Status=LINE_WAIT_HANGUP;
break;
}
break;
default: break;
}
break;
case LINE_INTER_CALL: // 只要通话过程一建立,即将外线用户,作为被叫用户
if(TelLine[channel].WaiConnectCh!=-1)
{ // 被叫为外线
if(Sig_CheckBusy(TelLine[channel].ConnectCh))
{ // 外线被叫用户挂机
ClearLink(channel,TelLine[channel].ConnectCh);
HangUp(TelLine[channel].ConnectCh);
TelLine[TelLine[channel].ConnectCh].Status=LINE_INIT;
StartPlaySignal(channel,SIG_BUSY1);
TelLine[channel].Status=LINE_WAIT_HANGUP;
break;
}
}
// 内线的挂机及拍叉簧处理
switch(HangUpDetect(channel))
{
case HANG_UP_FLAG_PRESS_R: // 拍叉簧处理
TelLine[channel].PRESSFLAG=TRUE;
StartHangUpDetect(channel);
if(TelLine[channel].WaiConnectCh!=-1)
{ // 内线呼叫外线用户时,拍叉簧
// if(TelLine[channel].ConnectCh
ClearLink(channel,TelLine[channel].WaiConnectCh);
TelLine[channel].HoldCh=TelLine[channel].WaiConnectCh;
TelLine[channel].ConnectCh=-1;
// 为外线通道放背景音乐
//StartPlayFile(TelLine[channel].WaiConnectCh,FileName,0);
StartPlaySignal(channel,SIG_DIALTONE);
TelLine[channel].Status =LINE_GET_DTMF;
break;
}
if(TelLine[channel].CallCh==-1)
ClearLink(channel,TelLine[channel].ConnectCh);
else
ClearLink(channel,TelLine[channel].CallCh);
StartPlaySignal(channel,SIG_STOP);
InitDtmfBuf(channel);
TelLine[channel].DtmfPos =0;
TelLine[channel].Status =LINE_GET_DTMF;
// 内线用户通话,不管主叫被叫,拍叉簧的重新顶为主叫
if(TelLine[channel].CallCh!=-1)
{
TelLine[channel].HoldCh=TelLine[channel].CallCh;
TelLine[channel].ConnectCh=-1;
TelLine[channel].CallCh=-1;
TelLine[TelLine[channel].CallCh].CallCh=channel;
TelLine[TelLine[channel].CallCh].ConnectCh=-1;
TelLine[TelLine[channel].CallCh].HoldCh=-1;
TelLine[TelLine[channel].CallCh].DisStatusMessage="等待用户转接 …";
TelLine[TelLine[channel].CallCh].Status=LINE_JUST_WAIT;
break;
}
//StartPlayFile(TelLine[channel].ConnectCh,FileName,0);// 放背景音乐
TelLine[channel].HoldCh=TelLine[channel].ConnectCh;
TelLine[TelLine[channel].ConnectCh].ConnectCh=-1;
TelLine[TelLine[channel].ConnectCh].DisStatusMessage="等待用户转接 …";
TelLine[TelLine[channel].ConnectCh].Status= LINE_JUST_WAIT;
break;
case HANG_UP_FLAG_START:
break;
case HANG_UP_FLAG_FALSE: //
break;
case HANG_UP_FLAG_TRUE: // 挂机处理
TelLine[channel].Status=LINE_INIT;
if(TelLine[channel].HoldCh!=-1)
{ //为转接、代接或转叫
TelLine[TelLine[channel].ConnectCh].PRESSFLAG=FALSE;
TelLine[TelLine[channel].HoldCh].PRESSFLAG=FALSE;
TelLine[TelLine[channel].ConnectCh].ConnectCh=TelLine[channel].HoldCh;
TelLine[TelLine[channel].ConnectCh].CallCh=-1;
TelLine[TelLine[channel].HoldCh].CallCh=TelLine[channel].ConnectCh;
StopPlayFile(TelLine[channel].HoldCh);
StartPlaySignal(TelLine[channel].HoldCh,SIG_STOP);
//***
StartHangUpDetect(TelLine[channel].HoldCh);
StartHangUpDetect(channel);
TelLine[TelLine[channel].ConnectCh].Status=LINE_INTER_CALL;
TelLine[TelLine[channel].HoldCh].Status=LINE_INTER_CALL;
TelLine[TelLine[channel].HoldCh].DisStatusMessage="内线通话中 …";
if(TelLine[TelLine[channel].HoldCh].ChType==CHTYPE_TRUNK)
{
TelLine[TelLine[channel].HoldCh].Status=LINE_JUST_WAIT;
TelLine[TelLine[channel].HoldCh].DisStatusMessage="和内线进行通话 …";
}
TelLine[TelLine[channel].ConnectCh].HoldCh=-1;
TelLine[TelLine[channel].HoldCh].HoldCh=-1;
ClearLink(channel,TelLine[channel].ConnectCh);
SetLink(TelLine[channel].ConnectCh,TelLine[channel].HoldCh);
break;
}
if(TelLine[channel].WaiConnectCh!=-1)
{ // 内线呼出,外线呼入情况的内线正常挂机处理
HangUp(TelLine[channel].WaiConnectCh);
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
break;
}
if(TelLine[channel].ConnectCh!=-1)
{ // 被叫正常挂机处理
ClearLink(channel,TelLine[channel].ConnectCh);
StartPlaySignal(TelLine[channel].ConnectCh,SIG_BUSY1);
TelLine[TelLine[channel].ConnectCh].Status=LINE_WAIT_HANGUP;
break;
}
else
{ // 主叫正常挂机处理
ClearLink(channel,TelLine[channel].CallCh);
StartPlaySignal(TelLine[channel].CallCh,SIG_BUSY1);
TelLine[TelLine[channel].CallCh].Status=LINE_WAIT_HANGUP;
break;
}
default: break;
}
break;
case LINE_WAIT_HANGUP: // 被叫挂机,等待主叫挂机
TelLine[channel].DisStatusMessage="对方已挂机,等待挂机…";
if(HangUpDetect(channel)==TRUE)
TelLine[channel].Status=LINE_INIT;
break;
case LINE_SHIHUA_CALL:
if(ElapseTime(channel,TIMER_NO)>3*ONE_SECOND)
SetLink(channel,TelLine[channel].WaiConnectCh);
switch(Sig_CheckDial(TelLine[channel].WaiConnectCh))
{
case S_NORESULT: //利用它来控制连通的时间
break;
case S_CONNECT:
SetLink(channel,TelLine[channel].WaiConnectCh);
TelLine[channel].ConnectCh=TelLine[channel].WaiConnectCh;
TelLine[TelLine[channel].ConnectCh].CallCh=channel;
TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="和内线进行通话 …";
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
TelLine[channel].Status=LINE_INTER_CALL;
InitDtmfBuf(channel);
TelLine[channel].DisStatusMessage="线路已接通,市话通话…";
break;
case S_NOBODY:
HangUp(TelLine[channel].WaiConnectCh);
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
StartPlaySignal(channel,SIG_BUSY1);
TelLine[channel].Status=LINE_WAIT_HANGUP;
break;
case S_BUSY:
HangUp(TelLine[channel].WaiConnectCh);
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
StartPlaySignal(channel,SIG_BUSY1);
TelLine[channel].Status=LINE_WAIT_HANGUP;
break;
break;
case S_NOSIGNAL:
case S_NODIALTONE:
HangUp(TelLine[channel].WaiConnectCh);
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
StartPlaySignal(channel,SIG_BUSY1);
TelLine[channel].Status=LINE_WAIT_HANGUP;
break;
}
break;
case LINE_IP_ISCONNECT:
if(HangUpDetect(channel)!=HANG_UP_FLAG_FALSE)
{
HangUpDetect(TelLine[channel].WaiConnectCh);
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_INIT;
TelLine[channel].Status=LINE_INIT;
break;
}
switch(Sig_CheckDial(TelLine[channel].WaiConnectCh))
{
case S_NORESULT:
break;
case S_CONNECT:
TelLine[channel].ConnectCh=TelLine[channel].WaiConnectCh;
TelLine[TelLine[channel].WaiConnectCh].CallCh=channel;
strcpy(FileName,VoicePath);
strcat(FileName,"dtmf0");
{int n=StartPlayFile(TelLine[channel].WaiConnectCh,FileName,0L);}
// Sleep(80);
// SetLink(channel,TelLine[channel].WaiConnectCh);
StartTimer(channel,TIMER_NO);
TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="和内线进行通话 …";
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
TelLine[channel].Status=LINE_IP_CONNECTING;
// TelLine[channel].Status=LINE_JUST_WAIT;
break;
case S_NOBODY:
i++;
break;
case S_BUSY:
i++;
break;
case S_NOSIGNAL:
i++;
break;
case S_NODIALTONE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -