📄 mh_endpoint.c
字号:
/////////////////////////////////////////////////////////////////////// mh_endpoint.c//// handset/endpoint related event handling module for MH2 app//// Copyright Netergy Microelectronics 2000, 2001//////////////////////////////////////////////////////////////////////#include "NNstyle.h"#include <string.h>#include <stdlib.h>#include "digitmap.h"#include "endpoint.h"#include "common.h"////////////////////////////////////////////////////////////////////// EndPointProcessRedialEvent//// Process redial event: generaqte DTMF tone and dial////////////////////////////////////////////////////////////////////ENDPOINT_EVENT EndPointProcessRedialEvent(END_POINT* pEndPoint, CALL* pCall, ENDPOINT_EVENT eEvent){ /* nothing to do */ return eEvent;}////////////////////////////////////////////////////////////////////// EndPointEncodeDtmf//// Start/stop encoding inband DTMF signalling for keypad input////////////////////////////////////////////////////////////////////void EndPointEncodeDtmf(END_POINT *pEndPoint, CALL* pCall, char chKey, BOOL bStart){ /* nothing to do */}////////////////////////////////////////////////////////////////////// EndPointDisplayCallerID//// control DFSK to send caller ID info to handset////////////////////////////////////////////////////////////////////void EndPointDisplayCallerID(END_POINT *pEndPoint, char *pchCallerName, char *pchCallerNumber){ CALLER_ID_INFO xCID; memset(&xCID, 0, sizeof(CALLER_ID_INFO)); if (pchCallerName) { strncpy(xCID.pcCallerName, pchCallerName,CALLERNAME_MAX_LENGTH); } if (pchCallerNumber) { char chString[20]; sprintf(chString,"Incoming %s",pchCallerNumber); strncpy(xCID.pcCallerNumber, pchCallerNumber,CALLERNUMBER_MAX_LENGTH); EndPointDisplayString(pEndPoint, chString); } EndPointsDisplayCallerID(pEndPoint->wChannel, &xCID);}////////////////////////////////////////////////////////////////////// EndPointUpdateHoldIndicator//// correctly represents the existence of held call by examinig call// states////////////////////////////////////////////////////////////////////void EndPointUpdateHoldIndicator(END_POINT *pEndPoint){ /* nothing to do */}#if 0static void _ProcVoipEnable(END_POINT *pEndPoint);#ifdef FXO_SUPPORTstatic void _ProcVoipDisable(END_POINT *pEndPoint);BOOL g_bVoipDisable = FALSE;#endifstatic ENDPOINT_EVENT _FxsDialPlanMatch(END_POINT *pEndPoint){ dfe char *pchDialString = pEndPoint->szEventString; if (pEndPoint->szEventString[0] == '#' && strlen(pchDialString) == 1) { char chParamName[10]; char chParamValue[CONFIG_MAXPARAMLENGTH+1]; sprintf(chParamName, "USER%c", chKey); if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)!=CONFIG_OK) { return EVENT_NONE; } else { StrCpy(pEndPoint->szDialString, chParamValue, sizeof(pEndPoint->szDialString)); sprintf(chParamName, "HOST%c", chKey); if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)==CONFIG_OK) { StrCpy(pEndPoint->szSipUrlHost, chParamValue, sizeof(pEndPoint->szSipUrlHost)); } sprintf(chParamName, "PORT%c", chKey); if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)!=CONFIG_OK || (pEndPoint->wSipUrlPort = strtoul(chParamValue,NULL,0)) == 0) { pEndPoint->wSipUrlPort = 5060; /* Default SIP port */ } pEndPoint->oDialout = DIALOUT_VOIP_DIRECTCALL; return EVENT_DIAL_MATCH; } } if (*pchDialString == '9') { /* Prefix 9: PSTN call */ pEndPoint->oDialout = DIALOUT_PSTN; strcpy(pEndPoint->szDialString, pchDialString+1); /* strip of digit 9 */ } else { pEndPoint->oDialout = DIALOUT_VOIP; strcpy(pEndPoint->szDialString, pchDialString); /* strip of digit 9 */ } pEndPoint->szEventString[0] = '\0'; return EVENT_DIAL_MATCH;}////////////////////////////////////////////////////////////////////// EndPointProcess//// process endpoint event including keypad, hook and function key input////////////////////////////////////////////////////////////////////void EndPointProcess(END_POINT *pEndPoint){ pthread_mutex_lock(&(pEndPoint->mMutex));#ifndef FXO_SUPPORT _ProcVoipEnable(pEndPoint);#else if (g_bVoipDisable) { _ProcVoipDisable(pEndPoint); } else { _ProcVoipEnable(pEndPoint); }#endif pthread_mutex_unlock(&(pEndPoint->mMutex));}#ifdef FXO_SUPPORTstatic void _ProcVoipDisable(END_POINT *pEndPoint){ unsigned char chKey[20]; E_HANDSET_RETURN_VALUES eReturn; E_FXO_RETURN_VALUES eFxoRet; //H_MEDIA_STREAM hStream; eReturn = HandsetProcess(pEndPoint->wChannel, chKey); if (eReturn != HANDSET_NO_EVENT) { printf("HandsetProcess() %d, chKey %d\n", eReturn, chKey[0]); } switch(eReturn) { case HANDSET_ON_HOOK_EVENT: FxoOnHook(pEndPoint->hInstFxo); // FxoDestroyStream(pEndPoint->hInstFxo); break; case HANDSET_OFF_HOOK_EVENT: FxoOffHook(pEndPoint->hInstFxo); //hStream = FxoCreateStream(pEndPoint->hInstFxo); //MediaStreamStatus(hStream, PROTOCOL_TXRX_RX); break; case HANDSET_KEY_DOWN_EVENT: FxoPlaceDigit(pEndPoint->hInstFxo, chKey[0]); break; default: break; } eFxoRet = FxoProcess(pEndPoint->hInstFxo); switch (eFxoRet) { case FXO_RING_ON: EndPointTone(pEndPoint, HANDSET_RING_CADENCE_0, ON); break; case FXO_RING_OFF: EndPointTone(pEndPoint, HANDSET_RING_CADENCE_0, OFF); break; default: break; }}#endifstatic void _ProcVoipEnable(END_POINT *pEndPoint){ E_HANDSET_RETURN_VALUES eReturn; ENDPOINT_EVENT eEvent = EVENT_NONE; CALL *pCall=NULL; CALL *pCallComp=NULL; unsigned char chKey[20];#ifdef FXO_SUPPORT { E_FXO_RETURN_VALUES eFxoRet = FxoProcess(pEndPoint->hInstFxo); PROTOCOL_CBKDATA xData; eEvent = EVENT_NONE; memset(&xData, 0, sizeof(PROTOCOL_CBKDATA)); switch (eFxoRet) { case FXO_RING_ON: eEvent = EVENT_CBK_INCOMING; break; case FXO_RING_OFF: case FXO_DISCONNECT: pCall = EndPointFindCallHandle(pEndPoint, 0); if (pCall) { eEvent = EVENT_CBK_DISCONNECTED; } break; default: break; } if (eEvent != EVENT_NONE) { pEndPoint->fpHandler(eEvent, pEndPoint, 0, &xData); } eEvent = EVENT_NONE; }#endif pCall = EndPointFindCallState(pEndPoint,CALL_ALERT|CALL_CONNECT); pCallComp = EndPointFindCallState(pEndPoint,CALL_CONNECT); eReturn = HandsetProcess(pEndPoint->wChannel, chKey); if (g_bH323InitOK) { switch(eReturn) { case HANDSET_ON_HOOK_EVENT: eEvent = EVENT_ON_HOOK; break; case HANDSET_OFF_HOOK_EVENT: eEvent = EVENT_OFF_HOOK; break; case HANDSET_FLASH_HOOK_EVENT: eEvent = EndPointEvent(pEndPoint, 'F'); break; case HANDSET_T38_START: DEBUG(EPLOG(LOG_INFO,pEndPoint,"\nT38_START\n")); eEvent = EVENT_T38_START; break; case HANDSET_T38_STOP: DEBUG(EPLOG(LOG_INFO,pEndPoint,"\nT38_STOP\n")); eEvent = EVENT_T38_STOP; break; case HANDSET_FAX_TONE_EVENT: case HANDSET_ANSWER_TONE_EVENT: eEvent = EVENT_FAX_DETECTED; break; case HANDSET_KEY_DOWN_EVENT: case HANDSET_PULSE_DIAL_EVENT: eEvent = EndPointEvent(pEndPoint, chKey[0]); break; case HANDSET_KEY_UP_EVENT: /* reset timer */ pEndPoint->dwTimer=0; default: break; } // process OOB DTMF, RFC2833 events EndPointTelephoneEvent(pEndPoint, eReturn, chKey[0]); if (eEvent == EVENT_NONE && strlen(pEndPoint->szEventString) && pEndPoint->dwTimer > DIAL_TIMEOUT) { /* check dial plan when dial timer expired */ eEvent = _FxsDialPlanMatch(pEndPoint); pEndPoint->dwTimer = 0; } if (pEndPoint->hInstance) { pEndPoint->fpHandler(eEvent, pEndPoint, 0, NULL); } pEndPoint->dwTimer++; if (g_eKeypadType == KEYPADTYPE_H245_SIGNAL && pEndPoint->wDtmfUpdate && (pEndPoint->dwTimer-pEndPoint->dwDtmfTimer)>(pEndPoint->wDtmfUpdate-10)) { /* 100 ms margin */ pEndPoint->wDtmfUpdate += 50; /* Send out H245 Signal update with the full duration */ H323CallSendDTMF(pEndPoint->hInstance, pCall->hCall, NULL, H323INFO_H245SIGNALUPDATE, pEndPoint->wDtmfUpdate * 10); if (pEndPoint->wDtmfUpdate > 1000) { /* To prevent error, stop DTMF signal after 10 seconds */ pEndPoint->wDtmfUpdate = 0; } } if (pEndPoint->wDtmfPlayTimeout && (pEndPoint->dwTimer-pEndPoint->dwDtmfPlayTime)>(pEndPoint->wDtmfPlayTimeout)) { EndPointTone(pEndPoint, AUDIO_TONE_ALL, OFF); pEndPoint->wDtmfPlayTimeout = 0; } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -