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

📄 djss1board.cpp

📁 东进语音板卡开发
💻 CPP
字号:
// DjSS1Board.cpp: implementation of the CDjSS1Board class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DjTest.h"
#include "DjSS1Board.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDjSS1Board * g_pDjSS1Board = NULL;

CDjSS1Board::CDjSS1Board()
{
	m_bRun = false;
	m_bOutDial = false;
	m_bShow = true;
	g_pDjSS1Board = this;
	InitializeCriticalSection(&m_ShowCriticalSection);
}

CDjSS1Board::~CDjSS1Board()
{
	DJSys_DisableCard();
	DeleteCriticalSection(&m_ShowCriticalSection);
}

DWORD WINAPI CDjSS1Board::DialThread(LPVOID lpVoid)
{
	CDjSS1Board * pDjSS1Board = (CDjSS1Board *)lpVoid;
	CString csShow;
	while(pDjSS1Board->m_bRun)
	{
		while(pDjSS1Board->m_bOutDial == true)
		{
			for(int i=1;i<pDjSS1Board->m_nTotalTrunk;i++)
			{
				CSync sync(&pDjSS1Board->m_CriticalSection);
				if (pDjSS1Board->m_MapChannelInfo[i]->m_nState == IDLE && pDjSS1Board->m_MapChannelInfo[i]->m_bOutDial == false)
				{
					csShow.Format("通道%d:开始外拨",i);
					pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
					pDjSS1Board->m_MapChannelInfo[i]->m_bOutDial = true;
					DJTrk_StartDial(i,OUTCALLDNIS,CALLANI);
				}
				else
				{
					csShow.Format("通道%d:挂断",i);
					pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
					pDjSS1Board->m_MapChannelInfo[i]->m_bOutDial = false;
					DJTrk_BackwardHangUp(i);
				}
			}
		}
		Sleep(10000);
	}
	return true;
}

DWORD WINAPI CDjSS1Board::GetUserEventThread(LPVOID lpVoid)
{
	CDjSS1Board * pDjSS1Board = (CDjSS1Board *)lpVoid;
	CString csShow;
	pDjSS1Board->ShowMsg("开始获取分机事件信息");
	int nChannelNum;
	while(pDjSS1Board->m_bRun)
	{
		
		for(int i=0;i<pDjSS1Board->m_nTotalUser;i++)
		{
			nChannelNum = i + pDjSS1Board->m_nTotalTrunk;
			CSync sync(&pDjSS1Board->m_CriticalSection);
			DJSys_PushPlay();
			if (DJUser_CheckHookOFF(i) == 0)
			{
				if (pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState == INIT)
				{
					DJExg_ClearLinkTrunkAndUserByUser(i);
					DJExg_ClearLinkPlayVoiceFromUser(i);
					csShow.Format("通道%d:空闲",nChannelNum);
					pDjSS1Board->ShowMsg(csShow,true);
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState = IDLE;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
				}
				else
				{
					if (pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState != IDLE)
					{
						DJExg_ClearLinkTrunkAndUserByUser(i);
						DJExg_ClearLinkPlayVoiceFromUser(i);
						DJTrk_BackwardHangUp(OUTCALLCHANNEL);
						csShow.Format("通道%d:空闲",nChannelNum);
						pDjSS1Board->ShowMsg(csShow,true);
						pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
						pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState = IDLE;
						pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
						pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
					}
				}
			}
			else
			{
				if (pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState != WORK)
				{
					DJExg_ClearLinkTrunkAndUserByUser(i);
					DJExg_ClearLinkPlayVoiceFromUser(i);
					csShow.Format("通道%d:摘机",nChannelNum);
					pDjSS1Board->ShowMsg(csShow,true);
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bOutDial = false;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_nState = WORK;
					pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_StartTime = CTime::GetCurrentTime();
				}
				else
				{
					if (pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bOutDial == false)
					{
						if (DJUser_GetDialNum(i) >= 5 ) 
						{
							DJExg_ClearLinkTrunkAndUserByUser(i);
							DJExg_ClearLinkPlayVoiceFromUser(i);
							CString csCall;
							csCall.Format("%s",DJUser_GetDialCode(i));
							DJTrk_StartDial( OUTCALLCHANNEL, (LPSTR)(LPCTSTR)csCall, CALLANI ) ;
							csShow.Format("通道%d:外拨 " + csCall,nChannelNum);
							pDjSS1Board->ShowMsg(csShow,true);
							pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bOutDial = true;
							pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect = false;
						}
					}
					else
					{
						switch( DJTrk_GetDialStatus(OUTCALLCHANNEL))
						{
						case DS_Connect:
							if (pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect == false)
							{
								csShow.Format("通道%d:连通",nChannelNum);
								pDjSS1Board->ShowMsg(csShow,true);
								DJExg_ClearLinkPlayVoiceFromUser(i) ;
								DJExg_SetLinkTrunkAndUser(OUTCALLCHANNEL,i);
								pDjSS1Board->m_MapChannelInfo[nChannelNum]->m_bConnect = true;
							}
							break;
						}
					}
				}
			}
		}
		Sleep(10);
	}
	return 0;
}

DWORD WINAPI CDjSS1Board::GetTrunkEventThread(LPVOID lpVoid)
{
	CDjSS1Board * pDjSS1Board = g_pDjSS1Board;
	int nTemp = (int)lpVoid;
	int lStart = nTemp * 10 + 1;
    int lEnd = nTemp * 10 + 10;
	if (lEnd > pDjSS1Board->m_nTotalTrunk)
		lEnd = pDjSS1Board->m_nTotalTrunk;
	CString csShow;
	pDjSS1Board->ShowMsg("开始获取语音事件信息");
	while(pDjSS1Board->m_bRun)
	{
		for(int i=lStart;i<pDjSS1Board->m_nTotalTrunk;i++)
		{
			CSync sync(&pDjSS1Board->m_CriticalSection);
			DJSys_PushPlay();
			if ( DJTrk_GetTrunkStatus(i) == Step_Delay ) 
				continue ;
			switch(DJTrk_GetTrunkStatus(i))
			{
			case Step_Free:
				if (pDjSS1Board->m_MapChannelInfo[i]->m_nState == INIT)
				{
					csShow.Format("通道%d:空闲",i);
					pDjSS1Board->ShowMsg(csShow,true);
					pDjSS1Board->m_MapChannelInfo[i]->m_nState = IDLE;
					pDjSS1Board->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
					pDjSS1Board->m_MapChannelInfo[i]->m_bOutDial = false;
					pDjSS1Board->m_MapChannelInfo[i]->m_bConnect = false;
				}
				pDjSS1Board->m_MapChannelInfo[i]->m_nState = IDLE;
/*
				if (pDjSS1Board->m_bOutDial == true)
				{
					if (pDjSS1Board->m_MapChannelInfo[i]->m_nState == IDLE)
					{
						long lCurrentTime = CTime::GetCurrentTime().GetTime();
						long lStartTime = pDjSS1Board->m_MapChannelInfo[i]->m_StartTime.GetTime();
						if (( lCurrentTime- lStartTime) >= 3)
						{
							csShow.Format("通道%d:开始外拨",i);
							pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
							DJTrk_StartDial(i,OUTCALLDNIS,CALLANI);
							pDjSS1Board->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
						}
					}
					else
					{
						csShow.Format("通道%d:空闲",i);
						pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
						pDjSS1Board->m_MapChannelInfo[i]->m_nState = IDLE;
						pDjSS1Board->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
					}
				}
*/
				break;
			case Step_Connect:
				pDjSS1Board->m_MapChannelInfo[i]->m_nState = WORK;
/*
				if (pDjSS1Board->m_bOutDial == true)
				{
					if (pDjSS1Board->m_MapChannelInfo[i]->m_nState == WORK)
					{
						long lCurrentTime = CTime::GetCurrentTime().GetTime();
						long lStartTime = pDjSS1Board->m_MapChannelInfo[i]->m_StartTime.GetTime();
						if ((lCurrentTime - lStartTime) >= 10)
						{
							csShow.Format("通道%d:挂断",i);
							pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
							DJTrk_BackwardHangUp(i);
						}
					}
					else
					{
						csShow.Format("通道%d:连通",i);
						pDjSS1Board->ShowMsg(csShow,pDjSS1Board->m_bShow);
						pDjSS1Board->m_MapChannelInfo[i]->m_nState = WORK;
						pDjSS1Board->m_MapChannelInfo[i]->m_StartTime = CTime::GetCurrentTime();
					}
				}
*/
				break;
			}
		}
		Sleep(10);
	}
	return true;
}

bool CDjSS1Board::Dial()
{
	ShowMsg("开始外拨");
	m_bOutDial = true;
	return true;
}

bool CDjSS1Board::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 CDjSS1Board::Init()
{
	int nRet = DJSys_EnableCard( "", "PROMPT.INI" ) ;
	if ( nRet != 0 ) 
	{
		AfxMessageBox("Load Drive Faile!", MB_OK ) ;
		return false;
    }
	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(i = 0;i<6;i++)
	{
		CreateThread(NULL,0,CDjSS1Board::GetTrunkEventThread,(LPVOID)i,true,&dwId);
	}
	CreateThread(NULL,0,CDjSS1Board::GetUserEventThread,this,true,&dwId);
	CreateThread(NULL,0,CDjSS1Board::DialThread,this,true,&dwId);
	
	return true;
}

void CDjSS1Board::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 + -