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

📄 xms_demo_sub.cpp

📁 基于东进Keygoe交换机的电话银行演示程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		s16ChID = pOneTrunk->deviceID.m_s16ChannelID;
		
		i = pOneTrunk->iModSeqID;

		if ( i < AllDeviceRes[s8ModID].lVocNum )
		{
			pOneVoice = &AllDeviceRes[s8ModID].pVoice[i];
			if ( pOneVoice->State != VOC_WAITOPEN )
			{
				*pFreeVocDeviceID = pOneVoice->deviceID;

				// 占用该voice device 
				Change_Voc_State ( pOneVoice, VOC_USED);
				AllDeviceRes[s8ModID].lVocFreeNum--;
				g_iTotalVoiceFree --;
				DrawCount_Voc ( s8ModID );
				return i;
			}
		}

		return -1;
	}

	if ( cfg_iVoiceRule == 1 )			// Search in Same Module
	{
		s8SearchModID = s8ModID;
	}
	else		// Search in Most free resource module
	{
		s8SearchModID = -1;
		lNowMostFreeNum = -1;
		for ( i = 0; i < g_iTotalModule; i ++ )
		{
			if ( AllDeviceRes[MapTable_Module[i]].lVocFreeNum > lNowMostFreeNum )
			{
				s8SearchModID = MapTable_Module[i];
				lNowMostFreeNum = AllDeviceRes[MapTable_Module[i]].lVocFreeNum;
			}
		}
	}

	for ( i = 0; i < AllDeviceRes[s8SearchModID].lVocNum; i ++ )
	{
		pOneVoice = &AllDeviceRes[s8SearchModID].pVoice[i];
		if ( pOneVoice->State == VOC_FREE )
		{
			*pFreeVocDeviceID = pOneVoice->deviceID;

			// 占用该voice device 
			Change_Voc_State ( pOneVoice, VOC_USED);
			AllDeviceRes[s8SearchModID].lVocFreeNum--;
			g_iTotalVoiceFree --;
			DrawCount_Voc ( s8SearchModID );
			return i;
		}
	}

	return -1;
}

int		FreeOneFreeVoice (  DeviceID_t *pFreeVocDeviceID )
{
	DJ_S8	s8ModID;

	s8ModID = pFreeVocDeviceID->m_s8ModuleID;
	if ( AllDeviceRes[s8ModID].lFlag == 1 )
	{
		Change_Voc_State ( &M_OneVoice(*pFreeVocDeviceID), VOC_FREE);

		AllDeviceRes[s8ModID].lVocFreeNum++;
		g_iTotalVoiceFree ++;
		DrawCount_Voc ( s8ModID );
		return	0;		// OK
	}

	return -1;			// invalid VocDeviceID
}

void	Change_Voc_State ( VOICE_STRUCT *pOneVoice, VOICE_STATE NewState )
{
	pOneVoice->State = NewState;

	// 检查是否准备开始删除DSP单元
	if ( (AllDeviceRes[pOneVoice->deviceID.m_s8ModuleID].RemoveState == DSP_REMOVE_STATE_START)
		&& (NewState == VOC_FREE) )
	{
		pOneVoice->State = VOC_WAIT_REMOVE;

		CheckRemoveReady ( pOneVoice->deviceID.m_s8ModuleID );
	}
}

void	Change_State ( TRUNK_STRUCT *pOneTrunk, TRUNK_STATE NewState )
{
	pOneTrunk->State = NewState;

	DrawMain_State ( pOneTrunk );

	// 检查是否准备开始删除DSP单元
	if ( (AllDeviceRes[pOneTrunk->deviceID.m_s8ModuleID].RemoveState == DSP_REMOVE_STATE_START)
		&& (NewState == TRK_FREE) )
	{
		pOneTrunk->State = TRK_WAIT_REMOVE;

		DrawMain_State ( pOneTrunk );

		CheckRemoveReady ( pOneTrunk->deviceID.m_s8ModuleID );
	}
}

void	InitTrunkChannel ( TRUNK_STRUCT *pOneTrunk )
{
	Change_State ( pOneTrunk, TRK_FREE );

	pOneTrunk->CallerCode[0]=0;
	pOneTrunk->CalleeCode[0]=0;

	My_InitDtmfBuf ( pOneTrunk );
	DrawMain_DTMF ( pOneTrunk );

	memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// -1表示还没有分配Voc Device
	DrawMain_VocInfo ( pOneTrunk );
}

void ResetTrunk ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	StopPlayFile ( &pOneTrunk->VocDevID );

	// free the used Voice Resource
	if ( pOneTrunk->VocDevID.m_s16DeviceMain != 0 )
	{
		My_DualUnlink ( &pOneTrunk->VocDevID, &pOneTrunk->deviceID );

		FreeOneFreeVoice (  &pOneTrunk->VocDevID );

		memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device 
		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );
	}

	InitTrunkChannel ( pOneTrunk );
}

// Special code for CAS(SS1)
void	SpecialForCas ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	DeviceID_t				FreeVocDeviceID;

	if ( pOneTrunk->deviceID.m_s16DeviceSub != XMS_DEVSUB_E1_CAS )
		return;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_CAS_MFC_START )	/* 开始接收MFC,需要一个Voc设备*/
	{
		if ( SearchOneFreeVoice ( pOneTrunk,  &FreeVocDeviceID ) >= 0 )
		{
			pOneTrunk->VocDevID = FreeVocDeviceID;
			M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID; 
			DrawMain_VocInfo ( pOneTrunk );

			g_Param_CAS.m_VocDevID = FreeVocDeviceID;
			XMS_ctsSetParam ( g_acsHandle, &pOneTrunk->deviceID, 
				CAS_PARAM_UNIPARAM, sizeof(CmdParamData_CAS_t), (DJ_Void *)&g_Param_CAS );
		}
	}

	if ( pAcsEvt->m_s32EventType == XMS_EVT_CAS_MFC_END )	/* 接收MFC完毕,释放Voc设备*/
	{
		FreeOneFreeVoice (  &pOneTrunk->VocDevID );

		memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device 
		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );
	}
}
// end of code for CAS(SS1)

void SetGtD(DeviceID_t* pDevId)
{
	//========Set GTG Begin========
				
				CmdParamData_Voice_t cmdVoc;
				memset(&cmdVoc,0,sizeof(cmdVoc));
				cmdVoc.m_u8GtdCtrlValid = 1 ; //Enable GTD
				cmdVoc.m_VocGtdControl.m_u8ChannelEnable = 1;//Enable Gtd channel
				cmdVoc.m_VocGtdControl.m_u8DTMFEnable = 1;
				cmdVoc.m_VocGtdControl.m_u8MR2FEnable = 1;
				cmdVoc.m_VocGtdControl.m_u8MR2BEnable = 1;
				cmdVoc.m_VocGtdControl.m_u8GTDEnable = 1;
				cmdVoc.m_VocGtdControl.m_u8FSKEnable = 1;
				strcpy((char*)&cmdVoc.m_VocGtdControl.m_u8GTDID[0],"GHIJK");

				DJ_U16 u16ParamType = VOC_PARAM_UNIPARAM;
				DJ_U16 u16ParamSize = sizeof(cmdVoc);
				void* p = (void*) &cmdVoc;

				int r = XMS_ctsSetParam( g_acsHandle,pDevId,u16ParamType,u16ParamSize,(void*)p);
				char szbuffer[1024];
				memset(szbuffer,0,sizeof(szbuffer));
				sprintf(szbuffer,"Set GTD ret = %d\n",r);
				AddMsg ( szbuffer );

				//========Set GTG End  ========
}

void TrunkWork ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	Acs_CallControl_Data *	pCallControl = NULL;
	DeviceID_t				FreeVocDeviceID;
	char					FileName[256];
	char					TmpDtmf;


	if ( pAcsEvt->m_s32EventType == XMS_EVT_CLEARCALL )	/*拆线事件*/
	{
		if ( (pOneTrunk->State != TRK_FREE) && (pOneTrunk->State != TRK_WAIT_REMOVE) )
		{
			ResetTrunk ( pOneTrunk, pAcsEvt );
			return ; 
		}
	}

	if ( pAcsEvt->m_s32EventType == XMS_EVT_RECVIODATA )	/*忙音事件*/
	{
		Acs_IO_Data				*pIOData = NULL;
		char		*p;
				pIOData = (Acs_IO_Data *)FetchEventData(pAcsEvt);

		if ( ( pIOData->m_u16IoType == XMS_IO_TYPE_GTG ) //
			&& ( pIOData->m_u16IoDataLen > 0 ) )
		{
			p = (char *)FetchIOData(pAcsEvt);

		 if ( *p == 'I' || *p == 'J' || *p == 'K' )//忙音
			{
				XMS_ctsResetDevice(g_acsHandle,&pOneTrunk->deviceID,NULL);
				XMS_ctsClearCall(g_acsHandle,&pOneTrunk->deviceID,0,NULL);
				ResetTrunk(pOneTrunk,pAcsEvt);
			}

		}

	}

	switch(pOneTrunk->State)
	{
	case TRK_FREE:
		// Special code for CAS(SS1)
		SpecialForCas(pOneTrunk,pAcsEvt);

		if ( pAcsEvt->m_s32EventType == XMS_EVT_CALLIN )	/*呼入事件*/
		{
			pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

			XMS_ctsAlertCall ( g_acsHandle, &pOneTrunk->deviceID, NULL );

			XMS_ctsAnswerCallIn ( g_acsHandle, &pOneTrunk->deviceID, NULL );

			sprintf ( pOneTrunk->CalleeCode, pCallControl->m_s8CalledNum );
			sprintf ( pOneTrunk->CallerCode, pCallControl->m_s8CallingNum );
			DrawMain_CallInfo( pOneTrunk );
			
			Change_State ( pOneTrunk, TRK_WAIT_ANSWERCALL );
		}
		break;

	case TRK_WAIT_ANSWERCALL:
		// Special code for CAS(SS1)
		SpecialForCas(pOneTrunk,pAcsEvt);

		if ( pAcsEvt->m_s32EventType == XMS_EVT_ANSWERCALL )	/*应答呼入完成事件*/
		{
			pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

			if ( SearchOneFreeVoice ( pOneTrunk,  &FreeVocDeviceID ) >= 0 )
			{
				pOneTrunk->u8PlayTag = 16;

				pOneTrunk->VocDevID = FreeVocDeviceID;

				M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID; 

				DrawMain_VocInfo ( pOneTrunk );

				My_DualLink ( &FreeVocDeviceID, &pOneTrunk->deviceID ); 

				SetGtD(&pOneTrunk->VocDevID);

				
				Change_State ( pOneTrunk, TRK_WAIT_LINKOK );
			}
		}
		break;

	case TRK_WAIT_LINKOK:
		if ( pAcsEvt->m_s32EventType == XMS_EVT_LINKDEVICE )	/*LinkDevice完成*/
		{
			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\bank.001");
			pOneTrunk->u8PlayTag ++;
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );

			Change_State ( pOneTrunk, TRK_WELCOME );
		}
		break;

	case TRK_WELCOME:
		if ( CheckPlayEnd ( pOneTrunk, pAcsEvt) )	/*play完成事件*/
		{
			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\bank.002");
			pOneTrunk->u8PlayTag ++;
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );

			Change_State ( pOneTrunk, TRK_ACCOUNT );
		}

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf != -1 )								/*DTMF按键*/
		{
			My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
			DrawMain_DTMF ( pOneTrunk );

			StopPlayFile ( &pOneTrunk->VocDevID );
				
			Change_State ( pOneTrunk, TRK_ACCOUNT );
		}
		break;

	case TRK_ACCOUNT:
		// if play end
			// do nothing

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf != -1 )								/*DTMF按键*/
		{
			My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
			DrawMain_DTMF ( pOneTrunk );

			StopPlayFile ( &pOneTrunk->VocDevID );
			
			if ( pOneTrunk->DtmfCount >= 8 )
			{
				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.003");
				pOneTrunk->u8PlayTag ++;
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );

				My_InitDtmfBuf ( pOneTrunk );
				Change_State ( pOneTrunk, TRK_PASSWORD );
			}
		}
		break;

	case TRK_PASSWORD:
		// if play end
			// do nothing

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf != -1 )								/*DTMF按键*/
		{
			My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
			DrawMain_DTMF ( pOneTrunk );

			StopPlayFile ( &pOneTrunk->VocDevID );

			if ( pOneTrunk->DtmfCount >= 6 )
			{
				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.004");
				pOneTrunk->u8PlayTag ++;
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );

				My_InitDtmfBuf ( pOneTrunk );
				Change_State ( pOneTrunk, TRK_SELECT );
			}
		}
		break;

	case TRK_SELECT:
		// if play end
			// do nothing

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf == -1 )								/*DTMF按键*/
			break;

		My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
		DrawMain_DTMF ( pOneTrunk );

		pOneTrunk->u8PlayTag ++;
		strcpy ( FileName, cfg_VocPath );
		switch(TmpDtmf)
		{
		case '1':	 
			{
				StopPlayFile ( &pOneTrunk->VocDevID );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.005");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				PlayIndex ( &pOneTrunk->VocDevID, 5, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 12, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 11, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 9, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 10, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 15, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );

				PlayIndex ( &pOneTrunk->VocDevID, 16, pOneTrunk->u8PlayTag, true );		// bank.008

				Change_State ( pOneTrunk, TRK_PLAYRESULT );
			}
			break;

		case '2':
				StopPlayFile ( &pOneTrunk->VocDevID );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.006");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
				
				PlayIndex ( &pOneTrunk->VocDevID, 0, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 15, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 4, pOneTrunk->u8PlayTag, true );
				PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.008");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				Change_State ( pOneTrunk, TRK_PLAYRESULT );
			break;

		case '3':
				StopPlayFile ( &pOneTrunk->VocDevID );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.007");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
				
				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\D3");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\D13");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\D7");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\D12");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				strcpy ( FileName, cfg_VocPath );
				strcat ( FileName, "\\bank.008");
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

				Change_State ( pOneTrunk, TRK_PLAYRESULT );
			break;

		case '4':
			StopPlayFile ( &pOneTrunk->VocDevID );

			sprintf ( FileName, "%s\\DemoRec.%03d", cfg_VocPath, pOneTrunk->iSeqID );
			RecordFile ( &pOneTrunk->VocDevID, FileName, 8000L*10, false );

			Change_State ( pOneTrunk, TRK_RECORDFILE );
			break;

		default:
			break;
		}
		break;

	case TRK_PLAYRESULT:
	case TRK_PLAYRECORD:
		if ( CheckPlayEnd ( pOneTrunk, pAcsEvt) )	/*play完成事件*/
		{
			// 主动挂机
			XMS_ctsClearCall ( g_acsHandle, &pOneTrunk->deviceID, 0, NULL );

			Change_State ( pOneTrunk, TRK_HANGON );
		}
		break;

	case TRK_RECORDFILE:
		//
		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf != -1 )								/*DTMF按键*/
		{
			My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
			DrawMain_DTMF ( pOneTrunk );

			StopRecordFile ( &pOneTrunk->VocDevID );
		}

		if ( CheckRecordEnd ( pOneTrunk, pAcsEvt) )	/*record完成事件*/
		{
			pOneTrunk->u8PlayTag ++;

			sprintf ( FileName, "%s\\DemoRec.%03d", cfg_VocPath, pOneTrunk->iSeqID );
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );

			Change_State ( pOneTrunk, TRK_PLAYRECORD );
		}
		break;
	}
}

⌨️ 快捷键说明

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