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

📄 callcontrol.oldc

📁 基于嵌入式Linux平台的网络电话设计控制部分原程序代码。
💻 OLDC
📖 第 1 页 / 共 5 页
字号:

	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 {
			if ( giAutoTalk ) {
				vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
			}
		}
	} else {
		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, meChannelStatus[dwChannel] );

	switch( meChannelStatus[dwChannel] ) {
	case eFxx_null:
		vFxxnull( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_idle:
		vFxsidle( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_waitdial:
		vFxswaitdial( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_dialing:
		vFxsdialing( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_waitonhook:
		vFxswaitonhook( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_ringing:
		vFxsringing( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_connecting:
		vFxsconnecting( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_calling:
		vFxscalling( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_waitconnect:
		vFxswaitconnect( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_disconnect:
		vFxsdisconnect( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_talking:
		vFxstalking( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_replace:
		vFxsreplace( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_followme:
		vFxsfollowme( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_waitcmdans:
		vFxswaitcmdans( dwChannel, eMsgType, pchMsg );
		break;
	case eFxs_playing:
		vFxsplaying( dwChannel, eMsgType, pchMsg );
		break;

	case eFxo_idle:
		vFxoidle( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_calling:
		vFxocalling( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_disconnect:
		vFxodisconnect( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_end:
		vFxoend( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_waitconnect:			// fxocallsetup.c
		vFxowaitconnect( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_connecting:			// fxocallsetup.c
		vFxoconnecting( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_waitdial:				// fxocallsetup.c
		vFxowaitdial( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_dialing:				// fxocallsetup.c
		vFxodialing( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_talking:
		vFxotalking( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_getpasswd:
		vFxogetpasswd( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_getnumber:
		vFxogetnumber( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_waitinfo:
		vFxowaitinfo( dwChannel, eMsgType, pchMsg );
		break;
	case eFxo_play:
		vFxoplay( dwChannel, eMsgType, pchMsg );
		break;
	}

//printf( "out of Channel is %d, Status is %d\n", dwChannel, meChannelStatus[dwChannel] );
	sem_post( &m_smCallControl );
}

void CCallControl::vSendMsgToUA( ptCC_UA_MSG ptCcUaMsg )
{
	if ( gboolTraceEnable && ptCcUaMsg->hdr.eMsgType != eAudioData ) {
		ptCcUaMsg->hdr.dwDirection = 1;
		ptCcUaMsg->hdr.dwStatus = goCC.dwGetStatus( ptCcUaMsg->hdr.dwChannel );
		iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
	}

	// call function of HEGS
//printf( "Before vReceiveCCMesg\n" );
	vReceiveCCMesg( ptCcUaMsg );
//printf( "After vReceiveCCMesg\n" );
}

BOOL CCallControl::boolTalk( DWORD dwChannel )
{
	if ( meChannelStatus[dwChannel] == eFxs_talking
		|| meChannelStatus[dwChannel] == eFxo_talking ) {
		return TRUE;
	}

	return FALSE;
}

#if	0
void vThreadReadFromDriver()
{
	tFXEVENTMESSAGE		tEvent;

	//driver init
	if ( goIppbxfx.dwGetLastError() ){
		return ;
	}
	
	goIppbxfx.vEnableInterrupt();

	tCC_UA_MSG			tCcUaMsg;

	while( 1 ) {
#ifdef	DEBUG
		memset(&tEvent, 0, sizeof(tEvent)-sizeof(tEvent.chBuffer));
#endif
		if ( FALSE == goIppbxfx.boolReadFile( &tEvent ) ) {
			continue;
		}
		if ( tEvent.dwChannel < 0 || tEvent.dwChannel >= MAX_LINE_NUM ) {
			continue;
		}

		if ( eEVENT_VOICE_MSG == tEvent.dwEventType && goCC.boolTalk( tEvent.dwChannel ) ) {
			// 语音,直接给UA
//printf( "Tone Packet, %d\n", tEvent.dwChannel );
			tCcUaMsg.hdr.eMsgType = eAudioData;
			tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
			tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tVoiceMsg);

			if ( giAutoTalk ) {
				tCcUaMsg.u.tVoiceMsg.dwCallee = goCC.dwGetCallee( tEvent.dwChannel );
				tCcUaMsg.u.tVoiceMsg.dwCaller = goCC.dwGetCaller( tEvent.dwChannel );
			}
			tCcUaMsg.hdr.dwCcIdx = goCC.dwGetCCIdx( tEvent.dwChannel );
			tCcUaMsg.u.tVoiceMsg.dwLength = tEvent.dwVoiceLength;
			tCcUaMsg.u.tVoiceMsg.pVoiceMessage = tEvent.chBuffer;
			tCcUaMsg.u.tVoiceMsg.dwTime = tEvent.dwTime;
			goCC.vSendMsgToUA( &tCcUaMsg );
			continue;
		}

		if ( eEVENT_FAX_MSG == tEvent.dwEventType && goCC.boolTalk( tEvent.dwChannel ) ) {
			// 语音,直接给UA
			tCcUaMsg.hdr.eMsgType = eFaxData;
			tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
			tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tVoiceMsg);

			if ( giAutoTalk ) {
				tCcUaMsg.u.tVoiceMsg.dwCallee = goCC.dwGetCallee( tEvent.dwChannel );
				tCcUaMsg.u.tVoiceMsg.dwCaller = goCC.dwGetCaller( tEvent.dwChannel );
			}
			tCcUaMsg.hdr.dwCcIdx = goCC.dwGetCCIdx( tEvent.dwChannel );
			tCcUaMsg.u.tVoiceMsg.dwLength = tEvent.dwVoiceLength;
			tCcUaMsg.u.tVoiceMsg.pVoiceMessage = tEvent.chBuffer;
			tCcUaMsg.u.tVoiceMsg.dwTime = tEvent.dwTime;
			goCC.vSendMsgToUA( &tCcUaMsg );
			continue;
		}

		if ( eEVENT_VOICE_MSG == tEvent.dwEventType || eEVENT_FAX_MSG == tEvent.dwEventType ) {
			continue;
		}

		if ( eEVENT_FXS_DTMF_CODE == tEvent.dwEventType ) {
			goCC.vDirectLineCallOver( tEvent.dwChannel );
		}

		if ( gboolTraceEnable ) {
			tCcUaMsg.hdr.eMsgType = eMsgToDriver;
			tCcUaMsg.hdr.dwDirection = 0;
			tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
			tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( tEvent.dwChannel );
			memcpy( (char *)&(tCcUaMsg.u), &tEvent, sizeof(tCcUaMsg.u) );
			iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
		}

		goCC.vCallControl( tEvent.dwChannel, eMsgFromDriver, (char *)&tEvent );
	}
}
#endif

void vThreadSignalProc( void )
{
	tCC_UA_MSG			tCcUaMsg;
//yy	tTraceResultMessage	tTrace;

	gblnvThreadSignalProc = TRUE;
printf( "vThreadSignalProc is up\n" );
	while( gblnShutdown == FALSE ) {
		sem_wait( &( gqxQueueUaMsg.smSemaphore ) );


		if ( iQXget( &gqxQueueUaMsg, (BYTE *)&tCcUaMsg ) != 0 ) {
			continue;
		}

		if ( gboolTraceEn

⌨️ 快捷键说明

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