📄 d160aunpbxdlg.cpp
字号:
for(i=0;i<=channel-1;i++)
{
TelLine[i].ChType=CheckChType(i);
if(TelLine[i].ChType==CHTYPE_EMPTY)
continue; // 空置通道(未插模块)
TelLine[i].Status=LINE_INIT;
TelLine[i].DisStatusMessage="空 闲";
m_listctrl.SetItemText(i,COL_OF_LINE_STATUS,"空 闲 "); // 显示初始化时的线路状态
m_listctrl.SetItemText(i,COL_OF_REMARK," *");
if(TelLine[i].ChType==CHTYPE_USER)
{ // 内线处理
tempstr.Format (" 内线 %d",interline); // 显示线路号码
tempstr1.Format ("%d",interline); // 保存线路号码
strcpy(TelLine[i].LineNum,tempstr1);
if(interline<9)
{
tempstr1.Format("0%d",interline);
strcpy(TelLine[i].LineNum,tempstr1);
tempstr.Format (" 内线 0%d",interline);
}
m_listctrl.SetItemText(i,COL_OF_LINE_NUMBER,tempstr);
interline++;
}
if(TelLine[i].ChType==CHTYPE_TRUNK)
{ // 外线处理
tempstr.Format (" 外线 %d",outline);
if(outline<9)
tempstr.Format (" 外线 0%d",outline);
m_listctrl.SetItemText(i,COL_OF_LINE_NUMBER,tempstr);
outline++;
}
}
}
void CD160AUNPBXDlg::RefreshDisp()
{ // 更新显示
for(channel=0;channel<TotalLine-1;channel++)
{
char tempstr1[50];
m_listctrl.GetItemText(channel,2,tempstr1,50);
if(strcmp((CString)tempstr1,TelLine[channel].DisStatusMessage)!=0)
{
m_listctrl.SetItemText(channel,2,TelLine[channel].DisStatusMessage);
;
}
}
}
void CD160AUNPBXDlg::DoWork()
{
//*********
// int GetCallerIDMode=DTMF_MODE;
int GetCallerIDMode=FSK_MODE;
PUSH_PLAY(); // 维持文件录放音的持续进行
FeedSigFunc(); // 维持持续振铃及信号音的函数
RefreshDisp(); // 刷新显示
for(channel=0;channel<TotalLine-1;channel++)
//for(channel=0;channel<15;channel++)
{
switch(TelLine[channel].Status)
{ // start of switch
case LINE_INIT: // 初始化及适当的冗余措施
StopPlayFile(channel);
StartPlaySignal(channel,SIG_STOP);
TelLine[channel].CallCh=-1; // 主叫通道设为空
TelLine[channel].ConnectCh=-1; // 被叫(和它连接的)通道设为空
TelLine[channel].HoldCh=-1; // 呼叫转接和代接时的保持通道,由主叫保持社为空
TelLine[channel].SaveSubmiteCh=-1; // 呼叫转移通道设为空,本程序暂未做这一功能
// 用户可做一小型数据库,每次初始化后读入呼叫转移号码信息
InitDtmfBuf(channel); // 初始化 DTMF码缓冲区
TelLine[channel].DtmfPos=0; // 初始化 DTMF码的缓冲区的指针
TelLine[channel].CallerID="";
TelLine[channel].ListenFlag=false;
if(TelLine[channel].ChType ==CHTYPE_USER)
{
TelLine[channel].WaiConnectCh=-1;
TelLine[channel].PRESSFLAG=FALSE; // 拍叉簧标志
FeedPower(channel); // 停止馈零流
}
if(TelLine[channel].ChType ==CHTYPE_TRUNK)
{
HangUp(channel);
ResetCallerIDBuffer(channel); // 初始化某路的主叫号码缓冲区
}
m_listctrl.SetItemText (channel,3," ");
m_listctrl.SetItemText (channel,4," ");
TelLine[channel].BusyFlag=FALSE; // 线路忙标志置为否
TelLine[channel].DisStatusMessage ="空 闲";
TelLine[channel].Status=LINE_IDLE; // 初始化完成转空闲等待状态
break;
// End of State of LINE_INIT
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
case LINE_IDLE: // 空闲等待状态
if(RingDetect(channel)) // 检测外线是否振铃或内线是否摘机
{
TelLine[channel].BusyFlag=TRUE;
// 检测用户是否摘机
if(TelLine[channel].ChType == CHTYPE_TRUNK)
{
OffHook(channel); // 外线摘机
StartSigCheck (channel); // 开始外线的信号音检测
TelLine[channel].DisStatusMessage ="外线用户振铃";
TelLine[channel].Status=LINE_WELCOME;
break;
// 受主叫时,……
if(GetCallerIDMode==DTMF_MODE) // 以DTMF方式收CallIerD
TelLine[channel].Status= LINE_GET_DTMF_CALLERID;
if(GetCallerIDMode==FSK_MODE) // 以FSK方式收CallerID
{
TelLine[channel].Status= LINE_GET_FSK_CALLERID;
StartTimer(channel,TIMER_NO);
}
break;
}
if (TelLine[channel].ChType == CHTYPE_USER)
{
StartHangUpDetect (channel); // 开始内线的挂机检测
StartPlaySignal(channel,SIG_DIALTONE);
TelLine[channel].DisStatusMessage ="内线用户摘机 …";
TelLine[channel].Status =LINE_GET_DTMF; // 转收 DTMF 码状态
}
}
break;
// End of state of LINE_IDLE
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
case LINE_GET_DTMF_CALLERID: // 收DTMF方式的主叫号码
if(!DtmfHit(channel))
{ //没有收到主叫号码
TelLine[channel].Status=LINE_WELCOME;
OffHook(channel);
break;
}
i=0;
code=GetDtmfCode(channel);
do
{
TelLine[channel].CallerID[i]=code;
i++;
code=GetDtmfCode(channel);
} while(code!=-1);
strcpy(TelLine[channel].DisStatusMessage,TelLine[channel].CallerID);
m_listctrl.SetItemText(channel,2,TelLine[channel].CallerID);
break;
case LINE_GET_FSK_CALLERID: // 收FSK方式的主叫号码
if(ElapseTime(channel,TIMER_NO)<3*ONE_SECOND)
{
TelLine[channel].DisStatusMessage ="外线用户振铃,FSK方式收主叫号码 …";
break;
}
OffHook(channel); // 3秒后自动摘机
TelLine[channel].Status =LINE_WELCOME;
//if(GetCallerIDStr(channel,TelLine[channel].CallerID)!=ID_STEP_OK)
{ LPTSTR IDStr=" ";
WORD nn=GetCallerIDStr(channel,IDStr);
if(GetCallerIDStr(channel,IDStr)!=ID_STEP_OK)
break;
}
m_listctrl.SetItemText(channel,2,TelLine[channel].CallerID);
break;
case LINE_WELCOME:
InitDtmfBuf(channel);
TelLine[channel].DtmfPos=0;
TelLine[channel].DisStatusMessage =" 对外线用户放提示音 …";
strcpy(FileName,VoicePath);
strcat(FileName,"voc\\welcome.voc");
StartPlayFile(channel,FileName,0L);
StartTimer(channel,TIMER_NO);
TelLine[channel].Status =LINE_WELCOME1;
break;
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
case LINE_WELCOME1:
// 是否收到第一个DTMF码
code=GetDtmfCode(channel);
if(code!=-1)
goto VALID_DTMF; // 收到DTMF打断语音
// 放语音时外线挂机的处理
if(Sig_CheckBusy(channel))
{
HangUp(channel);
TelLine[channel].Status =LINE_INIT;
break;
}
// 处理外线放音是否完成?
if(CheckPlayEnd(channel))
{
StopPlayFile(channel);
StartTimer(channel,TIMER_NO);
TelLine[channel].DisStatusMessage =" 外线呼入,收分机号码(DTMF) …";
TelLine[channel].Status =LINE_GET_DTMF;
StartTimer(channel,TIMER_NO); // 对某一通道进行计时
}
break;
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
case LINE_GET_DTMF: // 一般从此处开始收号
code=GetDtmfCode(channel);
if(code!=-1)
{// 收码部分
VALID_DTMF:////*************************
StopPlayFile(channel);
StartPlaySignal(channel,SIG_STOP);
if(TelLine[channel].ChType==CHTYPE_USER)
TelLine[channel].DisStatusMessage =" 内线收 DTMF 码 …";
TelLine[channel].DtmfArray [TelLine[channel].DtmfPos]=code;
TelLine[channel].DtmfPos +=1;
StartTimer(channel,TIMER_NO);
}
// 收DTMF码时的挂机处理
if(TelLine[channel].ChType==CHTYPE_USER &&HangUpDetect(channel)!=HANG_UP_FLAG_FALSE)
{ // 内线收号时的挂机处理
TelLine[channel].Status=LINE_INIT;
break;
}
if(TelLine[channel].ChType==CHTYPE_TRUNK && Sig_CheckBusy(channel))
{// 收DTMF码时外线挂机处理
HangUp(channel);
TelLine[channel].Status =LINE_INIT;
break;
}
//*******************
// DTMF码的分析和处理
//*******************
if(TelLine[channel].DtmfPos!=0 && TelLine[channel].ChType==CHTYPE_USER)
{// 内线的收码处理
if(TelLine[channel].DtmfArray [0]>=11)
{// 内线呼叫内线或特殊服务
if(TelLine[channel].DtmfPos==3)
{
TelLine[channel].ConnectCh=-1;
TelLine[channel].DtmfArray[3]=TelLine[channel].DtmfArray[0];
for(i=1;i<=2;i++)
TelLine[channel].DtmfArray[i-1]=(char)(TelLine[channel].DtmfArray[i]%10+48);
INTERCALL:
TelLine[channel].DtmfArray[2]='\0';
TelLine[channel].LineNum[2]='\0';
// 判断是语音信箱、自动声讯服务台或特殊服务号码
{
if(int n=strcmp(TelLine[7].LineNum,(char *)TelLine[channel].DtmfArray)==0)
{ // 拨打自动声讯服务台
InitDtmfBuf(channel);
if(TelLine[channel].ChType==CHTYPE_TRUNK)
StartSigCheck(channel);
else
StartHangUpDetect(channel);
strcpy(FileName,VoicePath);
strcat(FileName,"voc\\freecallwel.voc");
StartPlayFile(channel,FileName,0);
TelLine[channel].DisStatusMessage =" 自动声讯服务 …";
TelLine[channel].Status=LINE_FREE_CALL;
break;
}
// 语音信箱功能演示
if(int n=strcmp("88",(char *)TelLine[channel].DtmfArray)==0)
{ // 拨打语音信箱
InitDtmfBuf(channel);
if(TelLine[channel].ChType==CHTYPE_TRUNK)
StartSigCheck(channel);
else
StartHangUpDetect(channel);
TelLine[channel].DisStatusMessage =" 语音信箱服务 …";
strcpy(FileName,VoicePath);
strcat(FileName,"voc\\voicebox.voc");
StartPlayFile(channel,FileName,0);
TelLine[channel].Status=LINE_VOICE_BOX;
break;
}
}
for(i=0;i<=TotalLine;i++)
{
if(TelLine[i].ChType!=CHTYPE_USER) continue;
if(int n=strcmp(TelLine[i].LineNum,(char *)TelLine[channel].DtmfArray)!=0)
continue;
// 找到了对应的分机号码
if(i==channel) goto ErrorProc; // 呼叫的号码为本机号码
if(TelLine[channel].ChType==CHTYPE_TRUNK)
StartSigCheck(channel);
else
StartHangUpDetect(channel);
if(TelLine[i].CallCh!=-1)
{ // 处理用户代接
TelLine[i].Status=LINE_INIT;
FeedPower(i);
StartPlaySignal(TelLine[i].CallCh,SIG_STOP);
SetLink(channel,TelLine[i].CallCh);
if(TelLine[TelLine[i].CallCh].ChType==CHTYPE_TRUNK)
{
TelLine[TelLine[i].CallCh].CallCh=channel;
TelLine[TelLine[i].CallCh].ConnectCh=-1;
TelLine[channel].ConnectCh=TelLine[i].CallCh;
TelLine[TelLine[i].CallCh].Status=LINE_JUST_WAIT;
TelLine[TelLine[i].CallCh].DisStatusMessage="等待用户转接…";
TelLine[channel].Status=LINE_INTER_CALL;
goto default0;
}
else
{
TelLine[channel].CallCh=TelLine[i].CallCh;
TelLine[TelLine[channel].CallCh].ConnectCh=channel;
TelLine[channel].Status=LINE_INTER_CALL;
TelLine[TelLine[i].CallCh].Status=LINE_INTER_CALL;
goto default0;
;
}
} // 用户代接处理结束
if(TelLine[i].BusyFlag==TRUE) // 所拨打的分机占线
goto ErrorProc;
TelLine[i].BusyFlag=TRUE;
TelLine[channel].ConnectCh=i;
TelLine[channel].CallCh=-1;
TelLine[i].CallCh=channel;
TelLine[i].ConnectCh=-1; //***********************
//StartPlayFile(channel,FileName,0);
StartPlaySignal(channel,SIG_RINGBACK);
//TelLine[i].Status=LINE_WAIT_AND_JUDGE;
TelLine[i].Status=LINE_JUST_WAIT;
TelLine[i].DisStatusMessage="有呼叫接入…";
TelLine[channel].Status=LINE_WAIT_INTER_OFFHOOK;
// 正常呼叫,准备接通电话
FeedRealRing(i);
OffHookDetect(i);
break;
}// End of search coordinary channel
if(TelLine[channel].ConnectCh==-1)
goto ErrorProc; // 拨了不存在的分机号
}
break;
}// End of 内线呼叫内线或特殊服务
if(TelLine[channel].DtmfArray [0]<10 )
{// 内线呼叫外线(市话)
if(code==12 ||ElapseTime(channel,TIMER_NO)>6*ONE_SECOND)
{ // 以“#”结束或延迟6秒钟不拨号,则自动拨出
if(code==12) TelLine[channel].DtmfPos--;
for(i=0;i<=TotalLine-1;i++)
{
if(TelLine[i].ChType==CHTYPE_USER) continue;
if(TelLine[i].BusyFlag==FALSE)
{ // 找到了空闲的外线通道
TelLine[i].BusyFlag=TRUE;
TelLine[channel].WaiConnectCh=i;
TelLine[i].CallCh=channel;
break;
}
goto ErrorProc;// 没有空闲的
}
//DTMF码的转换和存储
for(i=0;i<=TelLine[channel].DtmfPos-1;i++)
TelLine[channel].DtmfArray [i]=(TelLine[channel].DtmfArray [i])%10+48;
TelLine[channel].DtmfArray [TelLine[channel].DtmfPos]='\0';
// 通过外线向外拨号
OffHook(TelLine[channel].WaiConnectCh);
StartSigCheck(TelLine[channel].WaiConnectCh);
m_listctrl.SetItemText (TelLine[channel].WaiConnectCh,3,TelLine[channel].LineNum);
m_listctrl.SetItemText (TelLine[channel].WaiConnectCh,4,(char*)(TelLine[channel].DtmfArray));
m_listctrl.SetItemText (channel,4,(char*)(TelLine[channel].DtmfArray));
Sig_StartDial(TelLine[channel].WaiConnectCh,(char*)(TelLine[channel].DtmfArray),"9",0);
TelLine[channel].DisStatusMessage="市话呼叫中…";
TelLine[TelLine[channel].WaiConnectCh].DisStatusMessage="正在进行市话呼出…";
TelLine[TelLine[channel].WaiConnectCh].Status=LINE_JUST_WAIT;
StartTimer(channel,TIMER_NO);
TelLine[channel].Status=LINE_SHIHUA_CALL;
}
break;
}
if(TelLine[channel].DtmfArray [0]==10 && TelLine[channel].DtmfPos==1 )
{// 内线呼叫长途,转IP呼出**********************************
for(i=0;i<=TotalLine-1;i++)
{
if(TelLine[i].ChType==CHTYPE_USER) continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -