📄 djisdnboard.cpp
字号:
#include "stdafx.h"
#include "DjIsdnBoard.h"
CDjIsdnBoard * g_pDjIsdnBoard = NULL;
CDjIsdnBoard::CDjIsdnBoard()
{
m_bRun = false;
m_bOutDial = false;
m_bShow = true;
g_pDjIsdnBoard = this;
InitializeCriticalSection(&m_ShowCriticalSection);
}
CDjIsdnBoard::~CDjIsdnBoard()
{
DJISDN_ExitSystem();
DJSys_DisableCard();
DeleteCriticalSection(&m_ShowCriticalSection);
}
DWORD WINAPI CDjIsdnBoard::DialThread(LPVOID lpVoid)
{
CDjIsdnBoard * pDjIsdnBoard = (CDjIsdnBoard *)lpVoid;
CString csShow;
while(pDjIsdnBoard->m_bRun)
{
while(pDjIsdnBoard->m_bOutDial == true)
{
for(int i=1;i<pDjIsdnBoard->m_nTotalTrunk;i++)
{
CSync sync(&pDjIsdnBoard->m_CriticalSection);
if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState == IDLE && pDjIsdnBoard->m_MapChannelInfo[i]->m_bOutDial == false)
{
csShow.Format("通道%d:开始外拨",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
pDjIsdnBoard->m_MapChannelInfo[i]->m_bOutDial = true;
DJISDN_Callout( i/30,i%30, OUTCALLDNIS,"", CALLANI,"" ) ;
}
else if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState == WORK )
{
long lCurrentTime = CTime::GetCurrentTime().GetTime();
long lStartTime = pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime.GetTime();
if (lCurrentTime-lStartTime>10)
{
csShow.Format("通道%d:挂断",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
pDjIsdnBoard->m_MapChannelInfo[i]->m_bOutDial = false;
DJISDN_SetChnState( i/30,i%30,CH_SET_DISCONNECT, 0 );(i);
}
}
}
}
Sleep(100);
}
return true;
}
DWORD WINAPI CDjIsdnBoard::GetUserEventThread(LPVOID lpVoid)
{
CDjIsdnBoard * pDjIsdnBoard = (CDjIsdnBoard *)lpVoid;
CString csShow;
pDjIsdnBoard->ShowMsg("开始获取分机事件信息");
int nChannelNum;
while(pDjIsdnBoard->m_bRun)
{
CSync sync(&pDjIsdnBoard->m_CriticalSection);
DJISDN_GetEvent() ;
DJSys_PushPlay() ;
for(int i=0;i<pDjIsdnBoard->m_nTotalUser;i++)
{
nChannelNum = i + pDjIsdnBoard->m_nTotalTrunk;
switch( DJISDN_GetChnState(OUTCALLCHANNEL/30,OUTCALLCHANNEL%30))
{
case CH_WAIT_APP_FREE:
DJISDN_SetChnState(i/30,i%30 ,CH_SET_FREE, 0);
break;
case CH_FREE:
break;
}
if (DJUser_CheckHookOFF(i) == 0)
{
if (pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState == INIT)
{
DJExg_ClearLinkTrunkAndUserByUser(i);
DJExg_ClearLinkPlayVoiceFromUser(i);
csShow.Format("通道%d:空闲",nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState = IDLE;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
}
else
{
if (pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState != IDLE)
{
DJExg_ClearLinkTrunkAndUserByUser(i);
DJExg_ClearLinkPlayVoiceFromUser(i);
DJUser_InitDialBuf(i);
DJISDN_SetChnState( OUTCALLCHANNEL/30,OUTCALLCHANNEL%30,CH_SET_DISCONNECT, 0 );
csShow.Format("通道%d:空闲",nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState = IDLE;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
}
}
}
else
{
if (pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState != WORK)
{
DJExg_ClearLinkTrunkAndUserByUser(i);
DJExg_ClearLinkPlayVoiceFromUser(i);
csShow.Format("通道%d:摘机",nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_nState = WORK;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
}
else
{
if (pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bOutDial == false)
{
int nState = DJISDN_GetChnState(OUTCALLCHANNEL/30,OUTCALLCHANNEL%30);
if (nState != CH_FREE)
{
DJExg_ClearLinkTrunkAndUserByUser(i);
DJExg_ClearLinkPlayVoiceFromUser(i);
csShow.Format("通道%d:连通",OUTCALLCHANNEL);
pDjIsdnBoard->ShowMsg(csShow,true);
DJISDN_SetChnState( OUTCALLCHANNEL/30,OUTCALLCHANNEL%30,CH_SET_FREE, 0 );
continue;
}
if (DJUser_GetDialNum(i) >= 5 )
{
DJExg_ClearLinkTrunkAndUserByUser(i);
DJExg_ClearLinkPlayVoiceFromUser(i);
CString csCall;
csCall.Format("%s",DJUser_GetDialCode(i));
DJISDN_Callout( OUTCALLCHANNEL/30,OUTCALLCHANNEL%30, (LPSTR)(LPCTSTR)csCall,"", /*CALLANI*/"11111111","" ) ;
csShow.Format("通道%d:外拨 " + csCall,nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bOutDial = true;
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
DJExg_ClearLinkPlayVoiceFromUser(i) ;
DJExg_SetLinkTrunkAndUser(OUTCALLCHANNEL,i);
}
}
else
{
int nState = DJISDN_GetChnState(OUTCALLCHANNEL/30,OUTCALLCHANNEL%30);
switch( nState)
{
case CH_CONNECT:
if (pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect == false)
{
csShow.Format("通道%d:连通",nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
// DJExg_ClearLinkPlayVoiceFromUser(i) ;
// DJExg_SetLinkTrunkAndUser(OUTCALLCHANNEL,i);
pDjIsdnBoard->m_MapChannelInfo[nChannelNum]->m_bConnect = true;
}
break;
case CH_FREE:
csShow.Format("通道%d:挂断",nChannelNum);
pDjIsdnBoard->ShowMsg(csShow,true);
break;
}
}
}
}
}
Sleep(10);
}
return 0;
}
DWORD WINAPI CDjIsdnBoard::GetTrunkEventThread(LPVOID lpVoid)
{
CDjIsdnBoard * pDjIsdnBoard = g_pDjIsdnBoard;
int nTemp = (int)lpVoid;
int lStart = nTemp * 10 + 1;
int lEnd = nTemp * 10 + 10;
if (lEnd > pDjIsdnBoard->m_nTotalTrunk)
lEnd = pDjIsdnBoard->m_nTotalTrunk;
lStart = 1;
lEnd = pDjIsdnBoard->m_nTotalTrunk;
CString csShow;
pDjIsdnBoard->ShowMsg("开始获取语音事件信息");
while(pDjIsdnBoard->m_bRun)
{
CSync sync(&pDjIsdnBoard->m_CriticalSection);
DJISDN_GetEvent() ;
DJSys_PushPlay() ;
for(int i=lStart;i<pDjIsdnBoard->m_nTotalTrunk;i++)
{
switch(DJISDN_GetChnState(i/30,i%30))
{
case CH_WAIT_APP_FREE:
DJISDN_SetChnState(i/30,i%30 ,CH_SET_FREE, 0);
break;
case CH_FREE:
if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState == INIT)
{
csShow.Format("通道%d:空闲",i);
pDjIsdnBoard->ShowMsg(csShow,true);
pDjIsdnBoard->m_MapChannelInfo[i]->m_nState = IDLE;
pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
pDjIsdnBoard->m_MapChannelInfo[i]->m_bOutDial = false;
pDjIsdnBoard->m_MapChannelInfo[i]->m_bConnect = false;
}
// pDjIsdnBoard->m_MapChannelInfo[i]->m_nState = IDLE;
if (pDjIsdnBoard->m_bOutDial == true)
{
if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState == IDLE)
{
long lCurrentTime = CTime::GetCurrentTime().GetTime();
long lStartTime = pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime.GetTime();
if (( lCurrentTime- lStartTime) >= 3)
{
csShow.Format("通道%d:开始外拨",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
DJISDN_Callout( i/30,i%30, OUTCALLDNIS,"", CALLANI,"" ) ;
pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
}
}
else
{
csShow.Format("通道%d:空闲",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
pDjIsdnBoard->m_MapChannelInfo[i]->m_nState = IDLE;
pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
}
}
break;
case CH_CONNECT:
/*
if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState != WORK)
{
pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
pDjIsdnBoard->m_MapChannelInfo[i]->m_nState = WORK;
}
*/
if (pDjIsdnBoard->m_bOutDial == true)
{
if (pDjIsdnBoard->m_MapChannelInfo[i]->m_nState == WORK)
{
long lCurrentTime = CTime::GetCurrentTime().GetTime();
long lStartTime = pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime.GetTime();
int nRet = 0;
if ((lCurrentTime - lStartTime) == 20)
{
csShow.Format("通道%d:发送按键",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
// int voc = DJVoc_SFVC_ForPlay_New(i,TRUE);
// DJExg_SetLinkPlayVoiceToTrunk(i,voc);
nRet = DJTrk_SendDtmfStr(i,"0");
// DJExg_ClearLinkPlayVoiceFromTrunk(i);
}
if ((lCurrentTime - lStartTime) >= 100)
{
csShow.Format("通道%d:挂断",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
DJISDN_SetChnState( i/30,i%30,CH_SET_DISCONNECT, 0 );
}
}
else
{
csShow.Format("通道%d:连通",i);
pDjIsdnBoard->ShowMsg(csShow,pDjIsdnBoard->m_bShow);
pDjIsdnBoard->m_MapChannelInfo[i]->m_nState = WORK;
pDjIsdnBoard->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
}
}
break;
}
}
Sleep(10);
}
return true;
}
bool CDjIsdnBoard::Dial()
{
ShowMsg("开始外拨");
m_bOutDial = true;
return true;
}
bool CDjIsdnBoard::HangUp()
{
ShowMsg("停止外拨");
CSync sync(&m_CriticalSection);
for(int i=0;i<m_nTotalTrunk;i++)
{
DJTrk_BackwardHangUp(i);
m_MapChannelInfo[i]->m_nState = IDLE;
m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
}
m_bOutDial = false;
return true;
}
bool CDjIsdnBoard::Init()
{
int nRet = DJSys_EnableCard( "", "PROMPT.INI" ) ;
if ( nRet != 0 )
{
AfxMessageBox("Load Drive Faile!", MB_OK ) ;
return false;
}
if (DJSys_EnableDtmfSend() !=1)
{
AfxMessageBox("Initialize No.7 Driver Fail!", MB_OK ) ;
ExitProcess(-1);
}
if( DJISDN_InitSystem() != 1 )
{
AfxMessageBox("Initialize No.7 Driver Fail!", MB_OK ) ;
ExitProcess(-1);
}
CString csShow;
csShow = "启动板卡成功";
ShowMsg(csShow);
int i = 0;
int nTotalNum = 0;
m_nTotalTrunk = DJTrk_GetTotalTrunkNum();
m_nTotalUser = DJUser_GetTotalUserNum();
for(i=0;i<m_nTotalTrunk;i++)
{
// DJTrk_SetTrunkType(i,Type_Export);
CChannelInfo *pChannelInfo = new CChannelInfo();
pChannelInfo->m_nChannelNum = nTotalNum;
pChannelInfo->m_nState = INIT;
pChannelInfo->m_nType = IVR;
pChannelInfo->m_StartTime = CTime::GetCurrentTime();
pChannelInfo->m_bOutDial = false;
pChannelInfo->m_bConnect = false;
m_MapChannelInfo[i] = pChannelInfo;
nTotalNum++;
}
csShow.Format("语音通道数:%d",m_nTotalTrunk);
ShowMsg(csShow);
for(i=0;i<m_nTotalUser;i++)
{
DJUser_SetPowerON(i);
if ( ! DJUser_EnableDialSound(i) )
{
DJSys_DisableCard();
AfxMessageBox("Init UserBoard Error!", MB_OK ) ;
return false;
}
CChannelInfo *pChannelInfo = new CChannelInfo();
pChannelInfo->m_nChannelNum = nTotalNum;
pChannelInfo->m_nState = IDLE;
pChannelInfo->m_nType = EXTENSION;
pChannelInfo->m_StartTime = CTime::GetCurrentTime();
pChannelInfo->m_bOutDial = false;
pChannelInfo->m_bConnect = false;
m_MapChannelInfo[nTotalNum] = pChannelInfo;
nTotalNum++;
}
csShow.Format("座席通道数:%d",m_nTotalUser);
ShowMsg(csShow);
m_bRun = true;
DWORD dwId = 0;
// for(int i = 0;i<6;i++)
{
CreateThread(NULL,0,CDjIsdnBoard::GetTrunkEventThread,(LPVOID)i,true,&dwId);
}
CreateThread(NULL,0,CDjIsdnBoard::GetUserEventThread,this,true,&dwId);
// CreateThread(NULL,0,CDjIsdnBoard::DialThread,this,true,&dwId);
return true;
}
void CDjIsdnBoard::ShowMsg(CString csShow,bool bShow)
{
CSync sync(&m_ShowCriticalSection);
CString csTemp;
csTemp.Format("%s %s",CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S"),csShow);
CShowMsg::ShowMsg(csTemp,bShow);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -