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

📄 klcinterface.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
*
*  Module:         KlcInterface.c
*
*  Description:    KLC Interface Routines
*
*  Author:         Craig L. Mahananey
*
*  Copyright 1999, Lucent Technologies, Inc., All rights reserved
*
*
*  Change Log:
*
*  Date        By      Description
*  ========    ===     ====================================================
*  11/11/99    CLM     Created
*  01/31/00    DSO     Added support for IP Demo Application message format.
*  11/06/2000  mwb     Added INTERFACE_TERSE for quieter operation
*
***************************************************************************/


/*
 * Application layer include files
 */
#include "SysDep.h"
#include "KlcInterface.h"
#include "klc.h"
#include "DSPInterface.h"
                
             
/*
 * Standard include files
 */

#include <stdio.h>
#include <string.h>
#include <sockLib.h>
#include <inetLib.h>
#include <strLib.h>
#include <ioLib.h>
#include <fioLib.h>
#include <taskLib.h>
#include <in.h>


#ifdef PPA 
/*------------*/
/*  DEFINES   */
/*------------*/
#define  MAX_NUM_DIGIT  12
#define  PORT_FACTOR    4
/*------------*/
/*  TYPEDEFS  */
/*------------*/
typedef unsigned char   byte;
/*---------------*/
/*  LOCAL DATA   */
/*---------------*/
MSG_Q_ID      PPAKlcInterfaceQId;                /* klc's message queue Id */

int dtmfDigitEnable = 0;
int dtmfDigitDisable = 0;

unsigned int dtmfDigitTbl[PORT_FACTOR];
unsigned int dtmfDigitCollectTbl[MAX_NUM_DIGIT*PORT_FACTOR];
unsigned short destinationDigitTbl[MAX_NUM_DIGIT*PORT_FACTOR];
char dstinationAddrTbl [PORT_FACTOR][MAX_NUM_DIGIT+1];
/*--------------*/
/*  PROTOTYPES  */
/*--------------*/
static void  PPAInterfaceInit();
static void  PPAInterfaceDaemon (void);
static void  PPAInterfacePut(char *readBuff);
static void dtmfDigitTable(void);
/*---------------*/
/*  GLOBAL DATA  */
/*---------------*/
int onHook = 0;;
int offHook = 0;
extern unsigned short  ppaChannelNum;
#endif /*#ifdef PPA */ 
/***************************************************************************
 *
 *  KeyLampMonitor( MSG_Q_ID eventQ)
 *
 *  Arguments
 *      Input: Event Q to use to send events
 *
 *  Returns:   Nothing
 *
 *  Description:
 *  1. Open key/lamp monitor device
 *  2. Wait on read and send events over eventQ
 *
 **************************************************************************/ 
/* sdg added */
extern int handset_up;
extern int on_speakerphone;
extern int tone_enabled;

/* dial-digit-tone-disconnect */
/* The tone currently being played.*/
extern tone_type tone_playing;

/* sdg end */
/*#include "h323.h"
extern int* state;
*/
void KeyLampMonitor( MSG_Q_ID eventQ )
{
	MSG_Q_ID        klcQ;
	klcKeyEnums     keypress;
	klcdatatype     klcdata;
	dtmf_tone_type  tone;
	NonWrapperMsg   *msg;
	NonWrapperMsg  temp;
	int loopCounter;

	int wait_time = -1;

	static int   keyLongPressEvent;
	static int   keyPressFlag=0;
	static char keyLongPress;
	static int keyHangUpPress = 0;

	/* dial-digit-tone-disconnect */
	/* The tone to be resumed after the DTMF digit is played.*/
	tone_type tone_tobe_resumed = null_tone;
	/*
	 * Initialize the KLC driver
	 */

	klcInit( MAXNUMPROGKEYS );

	/*
	 * Create and register a message queue with the driver
	 */

	if(( klcQ = msgQCreate( MAX_NUM_KLC_EVENTS, sizeof(klcdatatype), MSG_Q_FIFO )) == (MSG_Q_ID)ERROR )
	{
#ifndef INTERFACE_TERSE
		fprintf( stderr, "KeyLampMonitor: Failure to create message queue.\n" );
#endif /* INTERFACE_TERSE */
		return;
	}

	klcRegister( klcQ );

#ifdef PPA 
	PPAKlcInterfaceQId = klcQ; /* use for PPA Demo App */
	PPAInterfaceInit();
#endif 
	/*
	 * Get a buffer for sending data to the Application.
	 */

	if ((msg = (NonWrapperMsg *) MQBufGet()) == NULL)
	{
#ifndef INTERFACE_TERSE
		fprintf( stderr, "KeyLampMonitor: Could not get buffer.\n" );
#endif /* INTERFACE_TERSE */
		return;
	}

	/*
	 * Read forever on the queue and turn data into events
	 */

	while ( 1 )
	{
		/*
		 * Receive message from KLC driver.
		 */
		if( msgQReceive( klcQ, (char *)&klcdata, sizeof( klcdata ), wait_time ) == ERROR )
		{
			if (keyHangUpPress)
			{
				keyHangUpPress = 0;
				wait_time = -1;
				msg->event = local_on_hook_event;
			}
			else if(keyPressFlag)
			{
				/*keyPressFlag=0;*/
				tone  = null_dtmf_tone;
				msg->event = null_event;
				msg->digit = 0;
				if(keyLongPressEvent == digit_event)
				{
					keyLongPressEvent = long_digit_event;
					msg->event = long_digit_event;
					msg->digit   = keyLongPress;
				}
				else if(keyLongPressEvent == cancel_key_event)
				{
					keyLongPressEvent = long_cancel_key_event;
					msg->event = long_cancel_key_event;
				}
				else
				{
					continue;
				}
			}	

			loopCounter = 0;
			if (MQSend ((char*)msg, NO_WAIT) == -1)
			{
				while (loopCounter++ < 10)
				{
					taskDelay(10);
					if (MQSend ((char*)msg, NO_WAIT) != -1) /* resend message */
					{
						break;
					}
				}				
				if (loopCounter >= 10)
				{
					fprintf(stderr, "KeyLampMonitor: Could not get buffer after 10 tries.\n");
					MQBufFree((char*)msg);
				}
			}
			loopCounter = 0;
			while (((msg = (NonWrapperMsg *) MQBufGet()) == NULL) && loopCounter++ < 10)
			{
				taskDelay(10);
			}
#ifndef INTERFACE_TERSE	
			if (loopCounter >= 10)
				fprintf(stderr, "KeyLampMonitor: Could not get buffer after 10 tries.\n");
#endif
			continue;
			/*			
#ifndef INTERFACE_TERSE
			fprintf( stderr, "KeyLampMonitor: Failure reading from klcQ.\n" );
#endif  INTERFACE_TERSE 
			return;*/
		}

		tone  = null_dtmf_tone;
		msg->event = null_event;
		msg->digit = 0;

		/*  printf("\n klcdata.keypress is %d \n",klcdata.keypress);
		printf("\n klcdata.tag is %d \n",klcdata.tag);*/
		if(klcdata.tag)
		{

		}
		else
		{
			keyPressFlag=0;
			if (!keyHangUpPress)
				wait_time = -1;
		}
       
		keypress = (klcKeyEnums)klcdata.keypress;

		if( keypress == klcKeyHOOK_UP )
		{
			if (keyHangUpPress)
			{
				msg->event = call_transfer_key_event;
			}
			else
			{
				msg->event = local_off_hook_event;	
			}
			keyHangUpPress = 0;
			wait_time = -1;
		}
		else if( keypress == klcKeyHOOK_DOWN )
		{
			keyHangUpPress = 1;
			wait_time = 30;		
			/*msg->event = local_on_hook_event;*/
		}
		else if( klcdata.tag == KLC_PRESSED )
		{
			if (keyHangUpPress)
			{
				keyHangUpPress = 0;
				wait_time = -1;
				msg->event = local_on_hook_event;
				
				loopCounter = 0;
				if (MQSend ((char*)msg, NO_WAIT) == -1)
				{
					while (loopCounter++ < 10)
					{
						taskDelay(10);
						if (MQSend ((char*)msg, NO_WAIT) != -1) /* resend message */
						{
							break;
						}
					}				
					if (loopCounter >= 10)
					{
						fprintf(stderr, "KeyLampMonitor: Could not get buffer after 10 tries.\n");
						MQBufFree((char*)msg);
					}
				}
				loopCounter = 0;
				while (((msg = (NonWrapperMsg *) MQBufGet()) == NULL) && loopCounter++ < 10)
				{
					taskDelay(10);
				}
#ifndef INTERFACE_TERSE	
				if (loopCounter >= 10)
					fprintf(stderr, "KeyLampMonitor: Could not get buffer after 10 tries.\n");
#endif

				continue;
			}

			switch( keypress )
			{                
				case klcKey0:
					tone  = dtmf_0;
					msg->event = digit_event;
					msg->digit = 0;
					break;

				case klcKey1:
					tone  = dtmf_1;
					msg->event = digit_event;
					msg->digit = 1;
					break;

				case klcKey2:
					tone  = dtmf_2;
					msg->event = digit_event;
					msg->digit = 2;
					break;

				case klcKey3:
					tone  = dtmf_3;
					msg->event = digit_event;
					msg->digit = 3;
					break;

				case klcKey4:
					tone  = dtmf_4;
					msg->event = digit_event;
					msg->digit = 4;
					break;

				case klcKey5:
					tone  = dtmf_5;
					msg->event = digit_event;
					msg->digit = 5;
					break;

				case klcKey6:
					tone  = dtmf_6;
					msg->event = digit_event;
					msg->digit = 6;
					break;

				case klcKey7:
					tone  = dtmf_7;
					msg->event = digit_event;
					msg->digit = 7;
					break;

				case klcKey8:
					tone  = dtmf_8;
					msg->event = digit_event;
					msg->digit = 8;
					break;

				case klcKey9:
					tone  = dtmf_9;
					msg->event = digit_event;
					msg->digit = 9;
					break;

				case klcKeySTAR:
					msg->event = digit_event;
					msg->digit = 10;
					tone  = dtmf_star;
					break;

				case klcKeyHASH:
					msg->event = digit_event;
					msg->digit = 11;
					tone  = dtmf_hash;
					break;

				case klcKeySPKR:
					msg->event = speaker_event;
					break;

				case klcKeyVOLP:
					msg->event = volume_up_event;
					break;

				case klcKeyVOLM:
					msg->event = volume_down_event;
					break;

				case klcKeya:
					msg->event = call_to_key_event;
					break;	       

				case klcKeyb:
					msg->event = call_in_key_event;
					break;	       

				case klcKeyc:
					msg->event = redial_key_event;
					break;

				case klcKeyTRAN:
					msg->event = call_transfer_key_event;/*G1*/
					break;

				case klcKeyRegister:
					msg->event = query_register_number_event;
					break;
					
				case klcKeyDROP:
					msg->event = volume_mute_event;/*G4*/
					break;

				case klcKeyConfig:
					msg->event = rapid_config_event;
					break;
					
				case klcKeyFWD:
					msg->event = noanswer_key_event;/*G5*/
					break;

				case klcKeyMSG:
					msg->event = message_key_event;
					break;

				case klcKeyG2:
					msg->event = phonebook_key_event;
					break;

				case klcKeyG3:
					msg->event = callout_key_event;
					break;

				case klcKeyG6:
					msg->event = save_event;
					break;

				case klcKeyG7:
					msg->event = delete_event;
					break;

				case klcKeyMUTE:
					msg->event = volume_mute_event;
					break;	       

				case klcKeySK1:
					msg->event = cancel_key_event;
					break;

				case klcKeySK2:
					msg->event = left_key_event;
					break;

				case klcKeySK3:
					msg->event = right_key_event;
					break;

				case klcKeySK4:
					msg->event = ok_key_event;
					break;

				case klcKeySPEED1:
					msg->event = speed_dial_key_event;
					msg->digit = 1;
					break;

				case klcKeySPEED2:
					msg->event = speed_dial_key_event;
					msg->digit = 2;
					break;

				case klcKeySPEED3:
					msg->event = speed_dial_key_event;
					msg->digit = 3;
					break;

				case klcKeySPEED4:
					msg->event = speed_dial_key_event;
					msg->digit = 4;
					break;

				case klcKeySPEED5:
					msg->event = speed_dial_key_event;
					msg->digit = 5;
					break;

⌨️ 快捷键说明

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