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

📄 fxocallsetup.c

📁 基于嵌入式Linux平台的网络电话外部交换局呼叫设置功能部分代码段。
💻 C
📖 第 1 页 / 共 2 页
字号:
			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		case eConnectAck:
			vKillTimer( dwChannel, eT208 );
			if ( ptAttrib->boolSendDtmfEnable ) {
				// send all dtmfcodes received before
				dwIdx = eFirstcall;
//				ptAttrib->mtCallInfo[dwIdx].dwReceivePtr = 0;
				vSetTimer( dwChannel, eT116, mdwTimeoutLength[eT116] );
#ifdef	FXO_CONTROL
				vSetTimer( dwChannel, eT119, mdwTimeoutLength[eT119] );
#endif
				ptAttrib->dwFxoStatusEnquiryCounter = 0;
				vChangeCCStatus( dwChannel, eFxo_talking );
				vFxoSendDtmfCode( dwChannel );
			} else {
				vSetTimer( dwChannel, eT116, mdwTimeoutLength[eT116] );
#ifdef	FXO_CONTROL
				vSetTimer( dwChannel, eT119, mdwTimeoutLength[eT119] );
#endif
				ptAttrib->dwFxoStatusEnquiryCounter = 0;
				vChangeCCStatus( dwChannel, eFxo_talking );
			}
			break;
		case eDtmfCode:
			dwIdx = eFirstcall;
			ptr = ptAttrib->mtCallInfo[dwIdx].mchReceiveNumber;
			ptr[ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber++] = ptMsgReq->u.tDtmfCode.dwDtmfValue;
			ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber %= MAX_DTMF_SAVED;
			break;
		default:
			break;
		}
		break;
	case eMsgFromDriver:
		printf("fxocallsetup11,%d\n",ptEvent->dwEventType);
		switch( ptEvent->dwEventType ) {
		case eEVENT_FXO_DIAL_TONE:
			ptAttrib->boolSendDtmfEnable = TRUE;
			break;
		case eEVENT_BUSY_TONE:
			vKillTimer( dwChannel, eT208 );

			ptAttrib->eActiveCall = eFirstcall;
			RELEASECOMP( dwChannel, &tCcUaMsg, eRls_OnHook );

			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		}
		break;
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT208:
			ptAttrib->eActiveCall = eFirstcall;
			RELEASECOMP( dwChannel, &tCcUaMsg, eRls_WaitAckTimeout );

			dwIdx = eFirstcall;
			if ( blnCOMMFUNC_FXO_ACD( dwChannel, &tCcUaMsg, ptMsgReq, dwIdx ) == TRUE ) {
				break;
			}

			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
}

void CCallControl::vFxowaitdial( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	tCC_UA_MSG			tCcUaMsg;
	DWORD				dwIdx;

	ptCC_UA_MSG			ptMsgReq;
	ptFXEVENTMESSAGE	ptEvent;
	ptMyTimerMsg		ptTimer;
	ptFxxAttrib			ptAttrib = &mtFxxAttrib[dwChannel];

	ptMsgReq = (ptCC_UA_MSG)pchMsg;
	ptEvent = (ptFXEVENTMESSAGE)pchMsg;
	ptTimer = (ptMyTimerMsg)pchMsg;

	switch( eMsgType ) {
	case eMsgFromUa:
		switch( ptMsgReq->hdr.eMsgType ) {
		case eSetup:
			COMMFUNC_V( dwChannel, &tCcUaMsg, ptMsgReq );
			break;
		default:
			break;
		}
		break;
	case eMsgFromDriver:
		printf("fxocallsetup22,%d\n",ptEvent->dwEventType);
		switch( ptEvent->dwEventType ) {
		case eEVENT_BUSY_TONE:
			vKillTimer( dwChannel, eT102 );
			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		case eEVENT_DTMF_CODE:
			printf("**eEVENT_DTMF_CODE=%d\n",ptEvent->chBuffer[0]);
			vKillTimer( dwChannel, eT102 );
			dwIdx = eFirstcall;
			ptAttrib->eActiveCall = eFirstcall;
			switch( ptEvent->chBuffer[0] ) {
			case 4:					//不允许使用外线,add by lwd
			case 9:
			case 10:				// *
			case 11:				// #
				vPlayVoiceFile( dwChannel, eDisable );
				ptAttrib->dwPlayMode = 3;
				vChangeCCStatus( dwChannel, eFxo_play );
				break;
			case 0:
				memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
				ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
				tCcUaMsg.hdr.eMsgType = eSetup;
				tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
				tCcUaMsg.hdr.dwChannel = dwChannel;

				tCcUaMsg.u.tSetup.dwCallee = 0;//ptAttrib->dwAgentNumber;
				tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
				strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
				ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
				ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
				tCcUaMsg.hdr.dwCcIdx = dwIdx;
				tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
				ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
				vSendMsgToUA( &tCcUaMsg );

				vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
				vChangeCCStatus( dwChannel, eFxo_calling );
				break;
			default:
				ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
				ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
				vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
				vChangeCCStatus( dwChannel, eFxo_dialing );
				break;
			}
			break;
		}
		break;
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT102:
			//if ( ptAttrib->boolFxoAcdZeroFail ) {
				ptAttrib->dwPromptCounter ++;
				if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
					dwIdx = eFirstcall;
					ptAttrib->eActiveCall = eFirstcall;
					memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
					ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
					tCcUaMsg.hdr.eMsgType = eSetup;
					tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
					tCcUaMsg.hdr.dwChannel = dwChannel;

					tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
					tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
					strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
					ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
					ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
					tCcUaMsg.hdr.dwCcIdx = dwIdx;
					tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
					ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
					vSendMsgToUA( &tCcUaMsg );

					vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
					vChangeCCStatus( dwChannel, eFxo_calling );
						
					break;//modify by lwd

					vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
					vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
					vChangeCCStatus( dwChannel, eFxo_end );
					break;
				}
				vPlayVoiceFile( dwChannel, eWelcome );
				ptAttrib->dwPlayMode = 1;
				vChangeCCStatus( dwChannel, eFxo_play );
				break;
			//}
			dwIdx = eFirstcall;
			ptAttrib->eActiveCall = eFirstcall;
			memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
			ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
			tCcUaMsg.hdr.eMsgType = eSetup;
			tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
			tCcUaMsg.hdr.dwChannel = dwChannel;

			tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
			tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
			strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
			ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
			ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
			tCcUaMsg.hdr.dwCcIdx = dwIdx;
			tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
			ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
			vSendMsgToUA( &tCcUaMsg );

			vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
			vChangeCCStatus( dwChannel, eFxo_calling );
			break;
#if	0
			ptAttrib->dwPromptCounter ++;
			if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
				vPutDriver( dwChannel, eACTION_FXO_ONHOOK );
				vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
				vChangeCCStatus( dwChannel, eFxo_end );
				break;
			}
			vPlayVoiceFile( dwChannel, vocWelcome );
			ptAttrib->dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxo_play );
#endif
			break;
		}
		break;
	default:
		break;
	}
}

void CCallControl::vFxodialing( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	tCC_UA_MSG			tCcUaMsg;
	DWORD				dwIdx;
	eCodeParserResult	eCodeRslt;

	ptCC_UA_MSG			ptMsgReq;
	ptFXEVENTMESSAGE	ptEvent;
	ptMyTimerMsg		ptTimer;
	ptFxxAttrib			ptAttrib = &mtFxxAttrib[dwChannel];

	ptMsgReq = (ptCC_UA_MSG)pchMsg;
	ptEvent = (ptFXEVENTMESSAGE)pchMsg;
	ptTimer = (ptMyTimerMsg)pchMsg;

	switch( eMsgType ) {
	case eMsgFromUa:
		switch( ptMsgReq->hdr.eMsgType ) {
		case eSetup:
			COMMFUNC_V( dwChannel, &tCcUaMsg, ptMsgReq );
			break;
		default:
			break;
		}
		break;
	case eMsgFromDriver:
		printf("fxocallsetup44,%d\n",ptEvent->dwEventType);
		switch( ptEvent->dwEventType ) {
		case eEVENT_BUSY_TONE:
			vKillTimer( dwChannel, eT204 );
			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		case eEVENT_DTMF_CODE:
			printf("eEVENT_DTMF_CODE,%d\n",ptEvent->chBuffer[0]);
			vKillTimer( dwChannel, eT204 );
			if ( ptEvent->chBuffer[0] == 10 ) {
				vPlayVoiceFile( dwChannel, eDisable );
				ptAttrib->dwPlayMode = 3;
				vChangeCCStatus( dwChannel, eFxo_play );
				break;
			}
			if ( ptEvent->chBuffer[0] == 11 ) {//外线进来的号码允许拨软交换,且出现'#'时只能用于软交换
				int dwIdx = mtFxxAttrib[dwChannel].eActiveCall;
				char *ptr = mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord;
				if(ptr[0]!=8)
				{
					vPlayVoiceFile( dwChannel, eDisable );
					ptAttrib->dwPlayMode = 3;
					vChangeCCStatus( dwChannel, eFxo_play );
					break;
				}
			}

			eCodeRslt = eCodeParser( dwChannel, ptEvent->chBuffer[0] );

			printf("eCodeRslt,%d\n",eCodeRslt);

			dwIdx = eFirstcall;
			switch( eCodeRslt ) {
			case eFuncVoip:					// 软交换呼叫
#ifdef	SOFT_PBX
				ptAttrib->boolCallType = TRUE;
#endif
				memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
				tCcUaMsg.hdr.eMsgType = eSetup;
				tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
				tCcUaMsg.hdr.dwChannel = dwChannel;

				tCcUaMsg.u.tSetup.dwCallee = 1;
				tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];

				ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter - 1] = 0;
				for( int i = 0; i < ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter - 1; i ++ ) {
					ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[i] += '0';
				}
				if ( ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[0] == '8' ) {
					strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord + 1 );
				} else {
					strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord + 3 );
				}
				ptAttrib->mtCallInfo[dwIdx].dwDialNumber = tCcUaMsg.u.tSetup.dwCallee;
				ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
				ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
				tCcUaMsg.hdr.dwCcIdx = dwIdx;
				tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
				vSendMsgToUA( &tCcUaMsg );
				vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
				vChangeCCStatus( dwChannel, eFxo_calling );
				break;
			case eCalleeOk:					// 被叫号码收全
#ifdef	NEED_VERIFY
				if ( ptAttrib->mtCallInfo[dwIdx].boolFxoCall ) {
					// call 8xx, need verify user-number and password
					vPlayVoiceFile( dwChannel, eInputPortNumber );
					ptAttrib->dwPlayMode = 4;
					vChangeCCStatus( dwChannel, eFxo_play );
					break;
				} else {
#endif
					//printf("eCallOk,%d\n",ptAttrib->mtCallInfo[dwIdx].dwDialNumber);
					memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
					tCcUaMsg.hdr.eMsgType = eSetup;
					tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
					tCcUaMsg.hdr.dwChannel = dwChannel;

					dwIdx = eFirstcall;
					ptAttrib->eActiveCall = eFirstcall;

					tCcUaMsg.u.tSetup.dwCallee = ptAttrib->mtCallInfo[dwIdx].dwDialNumber;
					tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
					strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
					ptAttrib->mtCallInfo[ptAttrib->eActiveCall].tSetup = tCcUaMsg.u.tSetup;
					tCcUaMsg.hdr.dwCcIdx = dwIdx;
					tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
					ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
					vSendMsgToUA( &tCcUaMsg );

                            vReportBill( dwChannel, eBillStart );
					vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
					vChangeCCStatus( dwChannel, eFxo_calling );
#ifdef	NEED_VERIFY
				}
#endif
			break;
		case eCalleeContinue:			// 被叫号码不全
			vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
			break;
		case eCallLimited:
			printf("eCallLimited \n");
			vPlayVoiceFile( dwChannel, eDisable );
			ptAttrib->dwPlayMode = 3;
			vChangeCCStatus( dwChannel, eFxo_play );
			break;
		default:
			break;
		}
		break;
		}
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT204:
			if ( ptAttrib->boolFxoAcdZeroFail ) {
				ptAttrib->dwPromptCounter ++;
				if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
					/*vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
					vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
					vChangeCCStatus( dwChannel, eFxo_end );*/

					break;
				}
				vPlayVoiceFile( dwChannel, eWelcome );
				ptAttrib->dwPlayMode = 1;
				vChangeCCStatus( dwChannel, eFxo_play );
				break;
			}
			dwIdx = eFirstcall;
			ptAttrib->eActiveCall = eFirstcall;
			memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
			ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
			tCcUaMsg.hdr.eMsgType = eSetup;
			tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
			tCcUaMsg.hdr.dwChannel = dwChannel;

			tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
			tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
			strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
			ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
			ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
			tCcUaMsg.hdr.dwCcIdx = dwIdx;
			tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
			ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
			vSendMsgToUA( &tCcUaMsg );

			vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
			vChangeCCStatus( dwChannel, eFxo_calling );
			break;
#if	0
			ptAttrib->dwPromptCounter ++;
			if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
				vPutDriver( dwChannel, eACTION_FXO_ONHOOK );
				vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
				vChangeCCStatus( dwChannel, eFxo_end );
				break;
			}
			vPlayVoiceFile( dwChannel, vocWelcome );
			ptAttrib->dwPlayMode = 1;
			vChangeCCStatus( dwChannel, eFxo_play );
#endif
			break;
		}
		break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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