⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djisdnboard.cpp

📁 东进语音板卡开发
💻 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 + -