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

📄 callcontrol.c

📁 基于嵌入式Linux平台的网络电话设计控制部分原程序代码。
💻 C
📖 第 1 页 / 共 5 页
字号:
		vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
		vChangeCCStatus( dwChannel, eFxs_replace );
		break;
	case eFuncModifyPassword:			// 修改密码
		if ( mtFxxAttrib[dwChannel].dwNewPasswordFirst != mtFxxAttrib[dwChannel].dwNewPasswordSecond ) {
			vPlayVoiceFile( dwChannel, eNewPasswdInvalid );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}
		if ( mtFxxAttrib[dwChannel].dwOldPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
			vPlayVoiceFile( dwChannel, eOldPasswdError );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}
		memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
		tCcUaMsg.hdr.eMsgType = eModifyPassword;
		tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tModifyPasswd );
		tCcUaMsg.hdr.dwChannel = dwChannel;

		tCcUaMsg.u.tModifyPasswd.dwChannel = dwChannel;
		tCcUaMsg.u.tModifyPasswd.dwNewPassword = mtFxxAttrib[dwChannel].dwNewPasswordFirst;
		vSendMsgToUA( &tCcUaMsg );

		m_tModuleInfo.port.dwPwd[dwChannel] = mtFxxAttrib[dwChannel].dwNewPasswordFirst;
		vPlayVoiceFile( dwChannel, eModifyPasswdOk );
		mtFxxAttrib[dwChannel].dwPlayMode = 1;
		vChangeCCStatus( dwChannel, eFxs_playing );
		break;
	case eFuncConference:				// 三方通话
		break;
	case eFuncChangeAgentArgs:
		printf("eFuncChangeAgentArgs %d,%d,%d,%d\n",mtFxxAttrib[dwChannel].dwAgentPassword , m_tModuleInfo.port.dwPwd[dwChannel]
													,	m_tModuleInfo.port.dwTelno[dwChannel] ,m_tGlobalInfo.ctg.admin.dwTelno[0]);
		if ( mtFxxAttrib[dwChannel].dwAgentPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
			vPlayVoiceFile( dwChannel, eOldPasswdError );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}

		for( dwTmp = 0; dwTmp < MAX_CTG_ADMIN_NUMBER; dwTmp ++ ) {
			if ( m_tModuleInfo.port.dwTelno[dwChannel] == m_tGlobalInfo.ctg.admin.dwTelno[dwTmp] ) {
				break;
			}
		}
		if ( dwTmp >= MAX_CTG_ADMIN_NUMBER ) {
			vPlayVoiceFile( dwChannel, eOldPasswdError );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}

		memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
		tCcUaMsg.hdr.eMsgType = eSetAgentArgs;
		tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetAgentArgsValue );
		tCcUaMsg.hdr.dwChannel = dwChannel;

		tCcUaMsg.u.tSetAgentArgsValue.dwChannel = m_tModuleInfo.port.dwTelno[dwChannel];
		tCcUaMsg.u.tSetAgentArgsValue.boolAutoAgentService = mtFxxAttrib[dwChannel].boolAutoAgentService;
		tCcUaMsg.u.tSetAgentArgsValue.dwAgentNumber = mtFxxAttrib[dwChannel].dwAgentNumber;

		vSendMsgToUA( &tCcUaMsg );

		vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
		vChangeCCStatus( dwChannel, eFxs_waitcmdans );

		break;
	case eFuncChangeAgentStatus:
		printf("eFuncChangeAgentStatus %d,%d\n",mtFxxAttrib[dwChannel].dwAgentPassword , m_tModuleInfo.port.dwPwd[dwChannel]);

		if ( mtFxxAttrib[dwChannel].dwAgentPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
			vPlayVoiceFile( dwChannel, eOldPasswdError );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}
		for( dwTmp = 0; dwTmp < MAX_CTG_ADMIN_NUMBER; dwTmp ++ ) {
			if ( m_tModuleInfo.port.dwTelno[dwChannel] == m_tGlobalInfo.ctg.admin.dwTelno[dwTmp] ) {
				break;
			}
		}
		if ( dwTmp >= MAX_CTG_ADMIN_NUMBER ) {
			vPlayVoiceFile( dwChannel, eOldPasswdError );
			mtFxxAttrib[dwChannel].dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxs_playing );
			break;
		}

		memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
		tCcUaMsg.hdr.eMsgType = eSetAgentMode;
		tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetAgentModeValue );
		tCcUaMsg.hdr.dwChannel = dwChannel;

		tCcUaMsg.u.tSetAgentModeValue.dwChannel = m_tModuleInfo.port.dwTelno[dwChannel];
		tCcUaMsg.u.tSetAgentModeValue.boolAutoAgentService = mtFxxAttrib[dwChannel].boolAutoAgentService;

		vSendMsgToUA( &tCcUaMsg );

		vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
		vChangeCCStatus( dwChannel, eFxs_waitcmdans );

		break;
	}
}

void CCallControl::vPlayVoiceFile( DWORD dwChannel, eToneFileId eFileId)
{
	boolStopFilePlay( dwChannel );

	vPutDriver( dwChannel, eACTION_CHANGE_CODEC, NULL, eG_711_A_LAW );
	vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
	mtFxxAttrib[dwChannel].eLastVoiceID = eFileId;

	if ( boolStartFilePlay( dwChannel, eFileId) == FALSE ) {
			printf( "StartFilePlay 5\n" );
			vPlayFileEnd( dwChannel );
	}
}

void CCallControl::vChangeCCStatus( DWORD dwChannel, eCCStatus eStatus )
{
	DWORD	dwIdx;

	dwIdx = mtFxxAttrib[dwChannel].eActiveCall;

	meChannelStatus[dwChannel] = eStatus;

	// need add more functions here
	if ( eStatus == eFxs_playing || eStatus == eFxo_play ) {
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord[0] = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter = 0;
	}

	if ( eStatus == eFxo_end ) {
//		if ( mtFxxAttrib[dwChannel].dwBillSn ) {
			vReportBill( dwChannel, eBillEnd );
			mtFxxAttrib[dwChannel].dwBillSn = 0;
//		}
#if	0
		goIppbxfx.vSetCoder( dwChannel, eG_711_A_LAW );
#endif
	}

	if ( eStatus == eFxo_idle ) {
		vPutDriver( dwChannel, eACTION_SCE_OFF, NULL, 0 );

		mtFxxAttrib[dwChannel].boolInConference = FALSE;
#ifdef	SOFT_PBX
		mtFxxAttrib[dwChannel].boolCallType = FALSE;
		//goIppbxfx.vSetCallType( dwChannel, 0 );
#endif
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwReceivePtr = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwReceivePtr = 0;
		if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDirectCall == 0 ) {
			mtFxxAttrib[dwChannel].mchCallidNumber[0] = 0;
			mtFxxAttrib[dwChannel].dwRingCounter = 0;
		}
		mtFxxAttrib[dwChannel].dwInputFxsNumber = 0;
		mtFxxAttrib[dwChannel].dwInputFxsGrade = 0;
		mtFxxAttrib[dwChannel].boolSendDtmfEnable = FALSE;
		if ( m_tModuleInfo.port.isUsed[dwChannel] == FALSE || m_tModuleInfo.port.dwTelno[dwChannel] == 0 ) {
			// disable
			meChannelStatus[dwChannel] = eFxx_null;
		}
	}

	if ( eStatus == eFxs_idle ) {

#if	0
		goIppbxfx.vSetCoder( dwChannel, eG_711_A_LAW );
#endif

		mtFxxAttrib[dwChannel].boolInConference = FALSE;
#ifdef	SOFT_PBX
		mtFxxAttrib[dwChannel].boolCallType = FALSE;
		//goIppbxfx.vSetCallType( dwChannel, 0 );
#endif
		mtFxxAttrib[dwChannel].dwCallCounter = 0;
		mtFxxAttrib[dwChannel].eActiveCall = eFirstcall;
		mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallNull;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwDirectCall = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwUaIdx = (DWORD)-1;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwDirectCall = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwUaIdx = (DWORD)-1;
		mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
		mtFxxAttrib[dwChannel].boolTransfer = FALSE;
		mtFxxAttrib[dwChannel].boolSendDtmfEnable = FALSE;

		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].tSetup.dwCallee = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].tSetup.dwCaller = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].tSetup.dwCallee = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].tSetup.dwCaller = 0;

		mtFxxAttrib[dwChannel].boolRedialLast = FALSE;
		if ( m_tModuleInfo.port.isUsed[dwChannel] == FALSE || m_tModuleInfo.port.dwTelno[dwChannel] == 0 ) {
			// disable
			meChannelStatus[dwChannel] = eFxx_null;
		}
	}

	if ( eStatus == eFxs_waitdial || eStatus == eFxo_waitdial ) {
		// clear dtmf buffer
		mtFxxAttrib[dwChannel].dwCurrentDialNumberCounter = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfPtr = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord[0] = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].boolAcdCall = FALSE;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].boolAcdCall = FALSE;
		if ( eStatus == eFxs_waitdial ) {
			mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].tSetup.cDispName[0] = 0;
		}
	}

	if ( eStatus == eFxs_calling || eStatus == eFxo_calling ) {
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolAcdCall = FALSE;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwCallNumber = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwCallNumberPtr = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchCallNumber[0] = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolDtmfTransferReady = FALSE;

		if ( eStatus == eFxo_calling ) {
			mtFxxAttrib[dwChannel].eActiveCall = eFirstcall;
		}
	}

	if ( eStatus == eFxs_ringing ) {
		mtFxxAttrib[dwChannel].boolCallidSend = FALSE;
		mtFxxAttrib[dwChannel].dwRingOffStartTime = 0;
	}

	if ( eStatus == eFxs_talking ) {
		mtFxxAttrib[dwChannel].dwFuncCodePtr = 0;
//		memset( mtFxxAttrib[dwChannel].mchFuncCode, 0, sizeof(mtFxxAttrib[dwChannel].mchFuncCode) );
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwReceiveNumber = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchReceiveNumber[0] = 0;
		if ( mtFxxAttrib[dwChannel].dwCallCounter == 1 ) {
			mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallNull;
			mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
			mtFxxAttrib[dwChannel].boolTransfer = FALSE;
		} else {
			mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallTalk;
		}
	}

	if ( eStatus == eFxs_talking || eStatus == eFxo_talking ||
		eStatus == eFxs_playing || eStatus == eFxo_play ) {
//		if ( eStatus == eFxs_talking || eStatus == eFxo_talking ) {
//			vChangeCodec( dwChannel );
//		} else {
//			vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
//		}
		if ( eStatus == eFxs_playing || eStatus == eFxo_play ) {
			vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
		} else {
			//printf("giAutoTalk=%d\n",giAutoTalk);
			if ( giAutoTalk ) {
				vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
			}
		}
	} else {
		//printf("eACTION_TALK_DENY,dwChannel=%d,eStatus=%d\n",dwChannel,eStatus);
		vPutDriver( dwChannel, eACTION_TALK_DENY, NULL, 0 );
	}

	if ( eStatus != eFxs_playing && eStatus != eFxo_play ) {
		boolStopFilePlay( dwChannel );
	}

	if ( eStatus == eFxs_waitonhook ) {
		mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
		mtFxxAttrib[dwChannel].boolTransfer = FALSE;
		mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
		mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
	}

	vReportCCStatus( dwChannel );
}

// channel 定时器
// eType, type of timer
// dwTimelength, timeout of timer, in milisec
void CCallControl::vSetTimer( DWORD dwChannel, eChannelTimer eType, DWORD dwTimelength )
{
	if ( gboolTraceEnable ) {

		tCC_UA_MSG	tCcUaMsg;

		tCcUaMsg.hdr.eMsgType = eSetTimer;
		tCcUaMsg.hdr.dwDirection = 1;
		tCcUaMsg.hdr.dwChannel = dwChannel;
		tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( dwChannel );
		tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tTimerMsg);
		tCcUaMsg.u.tTimerMsg.dwChannel = dwChannel;
		tCcUaMsg.u.tTimerMsg.dwTimerType = eType;
		iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
	}

	dwTimelength *= 1000;

	if ( mtFxxAttrib[dwChannel].mdwTimeID[eType] != 0 ) {
		mtFxxAttrib[dwChannel].mdwTimeID[eType] = 
			uSetUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[eType], dwTimelength, eType, mtFxxAttrib[dwChannel].tmProc );
	} else {
		mtFxxAttrib[dwChannel].mdwTimeID[eType] = 
			uSetUFTimer( 0, dwTimelength, eType, mtFxxAttrib[dwChannel].tmProc );
	}
}

void CCallControl::vKillAllTimer( DWORD dwChannel )
{
	DWORD	dwTmp;

	for( dwTmp = 0; dwTmp < MAX_TIMEOUT_TYPE; dwTmp ++ ) {
		if ( mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] > 0 ) {
			KillUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] );
			mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] = 0;
		}
	}
}

void CCallControl::vKillTimer( DWORD dwChannel, eChannelTimer eType )
{
	if ( gboolTraceEnable ) {

		tCC_UA_MSG	tCcUaMsg;

		tCcUaMsg.hdr.eMsgType = eKillTimer;
		tCcUaMsg.hdr.dwDirection = 1;
		tCcUaMsg.hdr.dwChannel = dwChannel;
		tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( dwChannel );
		tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tTimerMsg);
		tCcUaMsg.u.tTimerMsg.dwChannel = dwChannel;
		tCcUaMsg.u.tTimerMsg.dwTimerType = eType;
		iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
	}

	if ( mtFxxAttrib[dwChannel].mdwTimeID[eType] > 0 ) {
		KillUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[eType] );
		mtFxxAttrib[dwChannel].mdwTimeID[eType] = 0;
	}
}

void CCallControl::vCallControl( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	if ( dwChannel >= MAX_LINE_NUM ) {
printf( "ERR: %d\n", dwChannel );
		return;
	}

	sem_wait( &m_smCallControl );

//printf( "Channel is %d, Status is %d\n", dwChannel, meCh

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -