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

📄 tone.c

📁 telcobridges tone develop
💻 C
📖 第 1 页 / 共 5 页
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |	Project:    	VoiceLink TB640 sample (tone)
 |
 |	Filename:   	connection.c
 |
 |	Copyright:  	TelcoBridges 2002-2003, All Rights Reserved
 |
 |	Description:
 |
 |	Notes:      	Tabs = 4
 |
 *-------------------------------------------------------------------------------------------------------------------------------
 |
 |	Revision:   	$Revision: 1.51 $
 |
 *------------------------------------------------------------------------------------------------------------------------------*/



/*--------------------------------------------------------------------------------------------------------------------------------
 |  Includes
 *------------------------------------------------------------------------------------------------------------------------------*/

#include "structures.h"

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Forward declarations
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Defines
 *------------------------------------------------------------------------------------------------------------------------------*/

#define TONE_MAX_RESOURCES				4096		/* Max resources that will be handled by this app */
#define TONE_TIMER_GRANULARITY			100 		/* ms */
#define TONE_TIMER_MAX_TIMEOUT			30000 		/* 30 sec */
#define TONE_SHORT_DTMF_FLAG			0x80000000

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Types
 *------------------------------------------------------------------------------------------------------------------------------*/

TB640_RESOURCE_HANDLE	g_ahTrunkRes[ 2048 ];
TB640_RESOURCE_HANDLE	g_ahVpRes [ 2048 * 2 ];
TB640_RESOURCE_HANDLE	g_ahStrmRes [ 2048 ];
TB640_RESOURCE_HANDLE	g_ahVpGrp [ 2048 ];
TB640_CONNECTION_HANDLE	g_ahConn[ 2048 * 2 ];

TBX_UINT32	g_un32RxPlayTonesCnt = 0;
TBX_UINT32	g_un32RxStopTonesCnt = 0;
TBX_TICK	g_SentTick;

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Versioning
 *------------------------------------------------------------------------------------------------------------------------------*/
#ifdef WIN32
#pragma ident "$Revision: 1.51 $"
#endif

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Global variables
 *------------------------------------------------------------------------------------------------------------------------------*/

TBX_CHAR g_abyDigitToDtmf[] =
{
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT0, 		/* Digit 0 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT1,		/* Digit 1 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT2, 		/* Digit 2 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT3,		/* Digit 3 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT4,		/* Digit 4 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT5,		/* Digit 5 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT6,		/* Digit 6 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT7,		/* Digit 7 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT8,		/* Digit 8 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGIT9,		/* Digit 9 */
	TB640_VP_DIGIT_TYPE_DTMF_DIGITPND,		/* Digit # */
	TB640_VP_DIGIT_TYPE_DTMF_DIGITST		/* Digit * */
};

TBX_CHAR* g_apszToneString[] = {
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT1",    /*0*/
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT2",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT3",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITA",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT4",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT5",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT6",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITB",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT7",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT8",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT9",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITC",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITST",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGIT0",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITPND",
    "TB640_VP_DIGIT_TYPE_DTMF_DIGITD",     /*15*/
    "UNK", "UNK", "UNK", "UNK",

    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT1",     /*20*/
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT2",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT4",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT7",
    "TB640_VP_DIGIT_TYPE_MFR1_CODE11",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT3",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT5",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT8",
    "TB640_VP_DIGIT_TYPE_MFR1_CODE10",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT6",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT9",
    "TB640_VP_DIGIT_TYPE_MFR1_KPTERMST",
    "TB640_VP_DIGIT_TYPE_MFR1_DIGIT0",
    "TB640_VP_DIGIT_TYPE_MFR1_KPTRANTR",
    "TB640_VP_DIGIT_TYPE_MFR1_STENDPLS",   /*34*/
    "UNK", "UNK", "UNK", "UNK", "UNK",

    "TB640_VP_DIGIT_TYPE_MFR2_FWD1", 	   /*40 */
    "TB640_VP_DIGIT_TYPE_MFR2_FWD2",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD4",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD7",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD11",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD3",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD5",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD8",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD12",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD6",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD9",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD13",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD10",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD14",
    "TB640_VP_DIGIT_TYPE_MFR2_FWD15",     /*54 */
    "UNK", "UNK", "UNK", "UNK", "UNK",

    "TB640_VP_DIGIT_TYPE_MFR2_BCK1",      /*60 */
    "TB640_VP_DIGIT_TYPE_MFR2_BCK2",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK4",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK7",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK11",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK3",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK5",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK8",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK12",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK6",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK9",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK13",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK10",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK14",
    "TB640_VP_DIGIT_TYPE_MFR2_BCK15",     /*74 */
    "UNK", "UNK", "UNK", "UNK", "UNK",
    "TB640_VP_DIGIT_TYPE_FSK_TAS",       /* 80 */
    "TB640_VP_DIGIT_TYPE_FAX_CNG",       /* 81 */
    "TB640_VP_DIGIT_TYPE_FAX_G164",      /* 82 */
    "TB640_VP_DIGIT_TYPE_FAX_G165",      /* 83 */
};
TBX_UINT32		g_un32ToneStringCnt = 84;

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Macros
 *------------------------------------------------------------------------------------------------------------------------------*/
#define TONE_STRING( _Tone ) \
	((TBX_UINT32)_Tone < g_un32ToneStringCnt) ? g_apszToneString[_Tone] : "UNK"

#define TONE_STRING_SHORT( _Tone ) \
	((TBX_UINT32)_Tone < g_un32ToneStringCnt) ? g_apszToneString[_Tone] + sizeof("TB640_VP_DIGIT_TYPE_DTMF_DIGIT") - 1 : "UNK"


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Function Prototypes
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Implementation
 *------------------------------------------------------------------------------------------------------------------------------*/


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  ToneMainMenu:	This function displays the PM application's main menu.
 |
 |  in_hLib         :	Handle to the TBX library returned by TBXOpenLib()
 |  in_hAdapter     :	Handle to an adapter that was previously selected and attached to by SelectAdapter()
 |	in_un32TrunkNo	:	Trunk number to use
 |
 |  Note			:	~
 |
 |  Return          :	TBX_RESULT_OK
 |						TBX_RESULT_FAIL
 |						or others
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT ToneMainMenu (
  IN		TBX_LIB_HANDLE			in_hLib,
  IN		TBX_ADAPTER_HANDLE		in_hAdapter,
  IN		TBX_UINT32				in_un32TrunkNo )
{
	TBX_RESULT			Result = TBX_RESULT_OK;
	TBX_BOOL			fAgain;
	TBX_BOOL			fPrintMenu;
	TBX_INT32			iInput;

	TONE_EVENTS_THREAD_CONTEXT		EventsThreadCtx;
	TONE_TIMER_THREAD_CONTEXT		TimerThreadCtx;
	TONE_COLLECTOR_THREAD_CONTEXT	CollectorThreadCtx;
	TBX_THREAD						hCollectorThread;
	TBX_THREAD						hEventsThread;
	TBX_THREAD						hTimerThread;
	TBX_UINT32						un32TimeSlot;
	TBX_UINT32						un32Duration;
	TBX_UINT32						un32OnTime;
	TBX_UINT32						un32OffTime;
	TBX_UINT32						un32Count;
	TBX_UINT32						un32TimeSlotPlay;
	TBX_UINT32						un32SegmentCnt;
	TBX_UINT32						un32Freq1;
	TBX_UINT32						un32Freq2;
	TBX_UINT32						un32ToneIdx;
	TBX_INT32						n32Level;
	TB640_VP_TONE_DETECT_TYPE		ToneType;
	TB640_VP_DIGIT_TYPE				Digit;
	TBX_UINT32						un32ToneStringIdx;
	TBX_CHAR						szPhoneNumber[64];
	TB640_TRUNK_HANDLE				hTrunk;
	PTB640_REQ_VP_TONE_PLAY			pMsToneReq;
	TBX_FIFO						msToneFifo;
	TBX_UINT32						un32SegmentIdx;
	TBX_UINT32						un32Tone;
	PTB640_VP_DIGIT_PARAMS			pToneIdx;
	TBX_UINT32						un32ToneCnt;
	TBX_UINT32						un32FirstDigitTimeout;
	TBX_UINT32						un32InterDigitTimeout;
	TBX_BOOL						fUseShortDtmf;
	TBX_CHAR						cDigit;
	TBX_CHAR						szDigit[2] = "#";

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialization of local variables */
		memset( &EventsThreadCtx, 0, sizeof(EventsThreadCtx) );
		memset( &TimerThreadCtx, 0, sizeof(TimerThreadCtx) );
		memset( &CollectorThreadCtx, 0, sizeof(CollectorThreadCtx) );
		memset( &msToneFifo, 0, sizeof(msToneFifo) );
		EventsThreadCtx.hEventsFilter		= (TBX_FILTER_HANDLE)TBX_HANDLE_INVALID;
		EventsThreadCtx.hLib				= in_hLib;
		EventsThreadCtx.hAdapter			= in_hAdapter;
		TimerThreadCtx.hAdapter				= in_hAdapter;
		TimerThreadCtx.hLib					= in_hLib;
		TimerThreadCtx.un32Timeout			= TONE_TIMER_GRANULARITY;
		CollectorThreadCtx.hAdapter			= in_hAdapter;
		CollectorThreadCtx.hLib				= in_hLib;
		hEventsThread						= TBX_THREAD_INVALID;
		fAgain								= TBX_TRUE;
		fPrintMenu							= TBX_TRUE;
		un32TimeSlot						= 1;
		un32TimeSlotPlay					= 1;
		un32OnTime							= 200;
		un32OffTime							= 500;
		un32SegmentCnt						= 2;
		Digit								= 1;
		un32Freq1 							= 1000;
		un32Freq2 							= 2000;
		n32Level 							= TB640_VP_TONE_LEVEL_MINUS_10_DBM;
		un32Tone							= 0;
		un32FirstDigitTimeout				= 5000;
		un32InterDigitTimeout				= 2000;
		fUseShortDtmf						= TBX_FALSE;

		Result = TBX_FIFO_CREATE( &msToneFifo, 100 );
		if( TBX_RESULT_FAILURE(Result) )
		{
			return Result;
		}

		/* Launch the thread that waits for these events */
		CollectorThreadCtx.fContinue = TBX_TRUE;
		Result = TBX_THREAD_CREATE_HPRIO (
			&hCollectorThread,
			CollectorThread,
			&CollectorThreadCtx );

		/* Launch our Timer thread, we want it High Prio for better accuracy */
		TimerThreadCtx.fContinue = TBX_TRUE;
		TBX_THREAD_CREATE_HPRIO(
			&hTimerThread,
			ToneTimerThread,
			&TimerThreadCtx );

		/* Launch the thread that waits for these events */
		EventsThreadCtx.fContinue = TBX_TRUE;
		Result = TBX_THREAD_CREATE (
			&hEventsThread,
			ToneEventsThread,
			&EventsThreadCtx );

		/* Set the trunk handles */
		hTrunk = g_aTrunkInfo[ in_un32TrunkNo ].hTrunk;

		/* Invalidate all connection handles */
		memset( g_ahConn, ~0, sizeof( g_ahConn ) );
		memset( g_ahVpRes, ~0,  sizeof( g_ahVpRes ) );
		memset( g_ahStrmRes, ~0,  sizeof( g_ahStrmRes ) );
		memset( g_ahVpGrp, ~0,  sizeof( g_ahVpGrp ) );
		memset( g_ahTrunkRes, ~0,   sizeof( g_ahTrunkRes ) );

		fprintf(stdout,"\nLegend:\n");
		fprintf(stdout,"I : Internally connected (timeslot 0)\n");
		fprintf(stdout,"E : Externally connected to trunk (timeslot 1-31)\n");

		while (fAgain)
		{
			Result = TBX_RESULT_OK;
			if (fPrintMenu == TBX_TRUE)
			{
				fprintf(stdout,"\n\nStart of Menu");
				fprintf(stdout,"\n1. Display this menu again");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\n2. Allocate & Connect Tone Resource (E)");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\n3. Play Specific Tone");
				fprintf(stdout,"\n4. Play All Tone");
				fprintf(stdout,"\n5. Dial a number");
				fprintf(stdout,"\n6. Play multi-segment Tone");
				fprintf(stdout,"\n7. Stop Tone");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\n10. Define a multi-segment tone");
				fprintf(stdout,"\n11. List ms-tone definitions");
				fprintf(stdout,"\n12. Play a ms-Tone definition");
				fprintf(stdout,"\n13. Collect multi Digits");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\n20. DaisyChain test (I)");
				fprintf(stdout,"\n21. Burst test (I)");
				fprintf(stdout,"\n22. ShortDtmf test (I)");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\n30. Free Allocated Resource/connections");
				fprintf(stdout,"\n-----------------");
 				fprintf(stdout,"\n0. Quit");
				fprintf(stdout,"\n-----------------");
				fprintf(stdout,"\nPlay:%d Stop:%d\n", g_un32RxPlayTonesCnt, g_un32RxStopTonesCnt );
				fPrintMenu = TBX_FALSE;
			}

			iInput = PromptUserWithDefault_TBX_INT32( "Command? ", 1 );

			switch ( iInput )
			{
				case 2:	/* Allocate Tone Resource */
				{
					ToneType = PromptUserWithDefault_TBX_INT32( "ToneType [1=DTMF|2=MFR1|4=MFR2FWD|8=MFR2BCK|128=FAX]? ", TB640_VP_TONE_DETECT_TYPE_DTMF );
					if( ToneType & TB640_VP_TONE_DETECT_TYPE_DTMF )
						fUseShortDtmf = PromptUserWithDefault_TBX_BOOL( "Use Short Dtmf Detection ? ", fUseShortDtmf );
					un32TimeSlot = PromptUserWithDefault_TBX_INT32( "Tdm Timeslot to connect to? ", un32TimeSlot );

					if( fUseShortDtmf )
						ToneType |= TONE_SHORT_DTMF_FLAG;

					/* Allocate and connect Tone Definition */
					Result = ToneResAllocateAndConnect
					(
						in_hLib,
						in_hAdapter,
						ToneType,
						hTrunk,
						un32TimeSlot
					);
					un32TimeSlot++;
				} break;

				case 3: /* Play Specific Tone */
				{
					un32TimeSlotPlay = PromptUserWithDefault_TBX_INT32( "Tdm timeslot play tone to? ", un32TimeSlotPlay );
					un32OnTime = PromptUserWithDefault_TBX_INT32( "tone On Time (ms)? ", un32OnTime );
					if(un32OnTime != ~0 )
						un32OffTime = PromptUserWithDefault_TBX_INT32( "tone Off Time (ms)? ", un32OffTime );
					un32ToneStringIdx = g_un32ToneStringCnt;
					while( un32ToneStringIdx-- )
						if( strcmp( TONE_STRING(un32ToneStringIdx), "UNK" ) )
							fprintf( stdout, "%02d: %s\n", un32ToneStringIdx, TONE_STRING(un32ToneStringIdx) );


					fprintf( stdout, "99: Exit Play Tone\n" );
					do
					{
						Digit = (TB640_VP_DIGIT_TYPE)PromptUserWithDefault_TBX_INT32( "What digit? ", 99 );
						if( Digit == 99 )
							break;

⌨️ 快捷键说明

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