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

📄 fxoappendix.c

📁 基于嵌入式Linux平台的网络电话设计外部交换局控制代码段。
💻 C
字号:
//
// Copyright (c) Blueinfosys.  All rights reserved.
//
// Module Name: Fxogetpasswd.cpp
//
// Abstract:
//
// Author:
// Date: Feb 19, 2004
// Ver:1.00
//
// Modified by:
// Modified Date:
// Notes:
////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include	<stdio.h>
#include	<stdarg.h>

#include	<sys/types.h> 
#include	<sys/stat.h> 
#include	<fcntl.h> 
#include	<sys/ioctl.h> 
#include	<errno.h>
#include	<time.h>
#include	<pthread.h>
#include	<string.h>
#include	<unistd.h>
#include	<stdlib.h>
#include	<signal.h>
#include	"commondef.h"

#include	"ccuatype.h"
#include	"queue.h"
#include	"WebSrv.h"
#include	"rtp.h"
#include	"sipmessage.h"
#include	"commtrace.h"
#include	"CallControl.h"

void CCallControl::vFxogetpasswd( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	tCC_UA_MSG			tCcUaMsg;
	int					j;
	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("fxoappendix,%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:
			vKillTimer( dwChannel, eT204 );
			dwIdx = eFirstcall;
			ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
			ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
			if ( ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter >= FXS_PASSWD_LEN ) {
				// password is ok
				// save password first
				ptAttrib->dwInputFxsPasswd = 0;
				for( j = 0; j < FXS_PASSWD_LEN; j ++ ) {
					ptAttrib->dwInputFxsPasswd *= 10;
					ptAttrib->dwInputFxsPasswd += ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[j];
				}
				// send Getinfo message to UA
				dwIdx = eFirstcall;
				memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
				tCcUaMsg.hdr.eMsgType = eGetFxsInfo;
				tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tGetFxsInfo);
				tCcUaMsg.hdr.dwChannel = dwChannel;

				tCcUaMsg.u.tGetFxsInfo.dwType = 0;
				tCcUaMsg.u.tGetFxsInfo.iDestChannel = ptAttrib->dwInputFxsNumber;
				tCcUaMsg.u.tGetFxsInfo.dwSrcChannel = m_tModuleInfo.port.dwTelno[dwChannel];

				tCcUaMsg.hdr.dwCcIdx = 0;
				tCcUaMsg.hdr.dwUaIdx = 0;
				vSendMsgToUA( &tCcUaMsg );

				vSetTimer( dwChannel, eT115, mdwTimeoutLength[eT115] );

				vChangeCCStatus( dwChannel, eFxo_waitinfo );
			} else {
				// need to receive more dtmf code
				vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
			}
			break;
		default:
			break;
		}
		break;
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT204:
			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, eInputPasswd );
			ptAttrib->dwPlayMode = 5;
			vChangeCCStatus( dwChannel, eFxo_play );
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
}

void CCallControl::vFxogetnumber( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	tCC_UA_MSG			tCcUaMsg;
	int					j;
	DWORD				dwNumberLen;
	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("fxoappendix11,%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:
			vKillTimer( dwChannel, eT204 );
			dwIdx = eFirstcall;
			ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
			ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
			dwNumberLen = m_tGlobalInfo.general.dwFxsTelLength;
			if ( ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter >= dwNumberLen ) {
				// number is ok
				// save number first
				ptAttrib->dwInputFxsNumber = 0;
				for( j = 0; j < dwNumberLen; j ++ ) {
					ptAttrib->dwInputFxsNumber *= 10;
					ptAttrib->dwInputFxsNumber += ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[j];
				}
				vPlayVoiceFile( dwChannel, eInputPasswd );
				ptAttrib->dwPlayMode = 5;
				vChangeCCStatus( dwChannel, eFxo_play );
			} else {
				// need to receive more dtmf code
				vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
			}
			break;
		default:
			break;
		}
		break;
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT204:
			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, eInputPortNumber );
			ptAttrib->dwPlayMode = 4;
			vChangeCCStatus( dwChannel, eFxo_play );
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
}

void CCallControl::vFxowaitinfo( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
	tCC_UA_MSG			tCcUaMsg;
	int					i;
	char				chBuffer[MAX_TELNO_LEN*4];

	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;
		case eGetFxsInfoAns:
			vKillTimer( dwChannel, eT115 );
			if ( ptMsgReq->u.tGetFxsInfo.dwPassword != ptAttrib->dwInputFxsPasswd ) {
				// password error
				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;
			}
			/*if ( ptMsgReq->u.tGetFxsInfo.dwGrade < OUTLAND_CITY_CALL ) {
				// no right
				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;
			}*/

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

			i = eFirstcall;

			tCcUaMsg.u.tSetup.dwCallee = ptAttrib->mtCallInfo[i].dwDialNumber;
			tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
			sprintf( chBuffer, "AAA%ldAAA%s", ptAttrib->dwInputFxsNumber,
				ptAttrib->mtCallInfo[i].tSetup.cDispName );
			chBuffer[MAX_TELNO_LEN * 2 - 1] = 0;
			strcpy( tCcUaMsg.u.tSetup.cDispName, chBuffer );
			ptAttrib->mtCallInfo[ptAttrib->eActiveCall].tSetup = tCcUaMsg.u.tSetup;
			tCcUaMsg.hdr.dwCcIdx = i;
			tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
			ptAttrib->mtCallInfo[i].dwUaIdx = (DWORD)-1;
			vSendMsgToUA( &tCcUaMsg );

			vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
			vChangeCCStatus( dwChannel, eFxo_calling );
			break;
		default:
			break;
		}
		break;
	case eMsgFromDriver:
		printf("fxoappendix22,%d\n",ptEvent->dwEventType);
		switch( ptEvent->dwEventType ) {
		case eEVENT_BUSY_TONE:
			vKillTimer( dwChannel, eT115 );
			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		default:
			break;
		}
		break;
	case eMsgFromTimer:
		switch( ptTimer->dwTimerType ) {
		case eT115:
			vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
			vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
			vChangeCCStatus( dwChannel, eFxo_end );
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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