📄 fxocallsetup.c
字号:
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
case eConnectAck:
vKillTimer( dwChannel, eT208 );
if ( ptAttrib->boolSendDtmfEnable ) {
// send all dtmfcodes received before
dwIdx = eFirstcall;
// ptAttrib->mtCallInfo[dwIdx].dwReceivePtr = 0;
vSetTimer( dwChannel, eT116, mdwTimeoutLength[eT116] );
#ifdef FXO_CONTROL
vSetTimer( dwChannel, eT119, mdwTimeoutLength[eT119] );
#endif
ptAttrib->dwFxoStatusEnquiryCounter = 0;
vChangeCCStatus( dwChannel, eFxo_talking );
vFxoSendDtmfCode( dwChannel );
} else {
vSetTimer( dwChannel, eT116, mdwTimeoutLength[eT116] );
#ifdef FXO_CONTROL
vSetTimer( dwChannel, eT119, mdwTimeoutLength[eT119] );
#endif
ptAttrib->dwFxoStatusEnquiryCounter = 0;
vChangeCCStatus( dwChannel, eFxo_talking );
}
break;
case eDtmfCode:
dwIdx = eFirstcall;
ptr = ptAttrib->mtCallInfo[dwIdx].mchReceiveNumber;
ptr[ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber++] = ptMsgReq->u.tDtmfCode.dwDtmfValue;
ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber %= MAX_DTMF_SAVED;
break;
default:
break;
}
break;
case eMsgFromDriver:
printf("fxocallsetup11,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_FXO_DIAL_TONE:
ptAttrib->boolSendDtmfEnable = TRUE;
break;
case eEVENT_BUSY_TONE:
vKillTimer( dwChannel, eT208 );
ptAttrib->eActiveCall = eFirstcall;
RELEASECOMP( dwChannel, &tCcUaMsg, eRls_OnHook );
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT208:
ptAttrib->eActiveCall = eFirstcall;
RELEASECOMP( dwChannel, &tCcUaMsg, eRls_WaitAckTimeout );
dwIdx = eFirstcall;
if ( blnCOMMFUNC_FXO_ACD( dwChannel, &tCcUaMsg, ptMsgReq, dwIdx ) == TRUE ) {
break;
}
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
default:
break;
}
break;
default:
break;
}
}
void CCallControl::vFxowaitdial( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
tCC_UA_MSG tCcUaMsg;
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("fxocallsetup22,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_BUSY_TONE:
vKillTimer( dwChannel, eT102 );
vPutDriver( dwChannel, eACTION_FXO_ONHOOK, NULL, 0 );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
case eEVENT_DTMF_CODE:
printf("**eEVENT_DTMF_CODE=%d\n",ptEvent->chBuffer[0]);
vKillTimer( dwChannel, eT102 );
dwIdx = eFirstcall;
ptAttrib->eActiveCall = eFirstcall;
switch( ptEvent->chBuffer[0] ) {
case 4: //不允许使用外线,add by lwd
case 9:
case 10: // *
case 11: // #
vPlayVoiceFile( dwChannel, eDisable );
ptAttrib->dwPlayMode = 3;
vChangeCCStatus( dwChannel, eFxo_play );
break;
case 0:
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.dwCallee = 0;//ptAttrib->dwAgentNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
default:
ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter] = ptEvent->chBuffer[0];
ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter ++;
vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
vChangeCCStatus( dwChannel, eFxo_dialing );
break;
}
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT102:
//if ( ptAttrib->boolFxoAcdZeroFail ) {
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
dwIdx = eFirstcall;
ptAttrib->eActiveCall = eFirstcall;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;//modify by lwd
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;
//}
dwIdx = eFirstcall;
ptAttrib->eActiveCall = eFirstcall;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
#if 0
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, vocWelcome );
ptAttrib->dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxo_play );
#endif
break;
}
break;
default:
break;
}
}
void CCallControl::vFxodialing( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
tCC_UA_MSG tCcUaMsg;
DWORD dwIdx;
eCodeParserResult eCodeRslt;
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("fxocallsetup44,%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:
printf("eEVENT_DTMF_CODE,%d\n",ptEvent->chBuffer[0]);
vKillTimer( dwChannel, eT204 );
if ( ptEvent->chBuffer[0] == 10 ) {
vPlayVoiceFile( dwChannel, eDisable );
ptAttrib->dwPlayMode = 3;
vChangeCCStatus( dwChannel, eFxo_play );
break;
}
if ( ptEvent->chBuffer[0] == 11 ) {//外线进来的号码允许拨软交换,且出现'#'时只能用于软交换
int dwIdx = mtFxxAttrib[dwChannel].eActiveCall;
char *ptr = mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord;
if(ptr[0]!=8)
{
vPlayVoiceFile( dwChannel, eDisable );
ptAttrib->dwPlayMode = 3;
vChangeCCStatus( dwChannel, eFxo_play );
break;
}
}
eCodeRslt = eCodeParser( dwChannel, ptEvent->chBuffer[0] );
printf("eCodeRslt,%d\n",eCodeRslt);
dwIdx = eFirstcall;
switch( eCodeRslt ) {
case eFuncVoip: // 软交换呼叫
#ifdef SOFT_PBX
ptAttrib->boolCallType = TRUE;
#endif
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.dwCallee = 1;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter - 1] = 0;
for( int i = 0; i < ptAttrib->mtCallInfo[dwIdx].dwDtmfCounter - 1; i ++ ) {
ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[i] += '0';
}
if ( ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord[0] == '8' ) {
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord + 1 );
} else {
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].mchDtmfRecord + 3 );
}
ptAttrib->mtCallInfo[dwIdx].dwDialNumber = tCcUaMsg.u.tSetup.dwCallee;
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
case eCalleeOk: // 被叫号码收全
#ifdef NEED_VERIFY
if ( ptAttrib->mtCallInfo[dwIdx].boolFxoCall ) {
// call 8xx, need verify user-number and password
vPlayVoiceFile( dwChannel, eInputPortNumber );
ptAttrib->dwPlayMode = 4;
vChangeCCStatus( dwChannel, eFxo_play );
break;
} else {
#endif
//printf("eCallOk,%d\n",ptAttrib->mtCallInfo[dwIdx].dwDialNumber);
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
dwIdx = eFirstcall;
ptAttrib->eActiveCall = eFirstcall;
tCcUaMsg.u.tSetup.dwCallee = ptAttrib->mtCallInfo[dwIdx].dwDialNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[ptAttrib->eActiveCall].tSetup = tCcUaMsg.u.tSetup;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vReportBill( dwChannel, eBillStart );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
#ifdef NEED_VERIFY
}
#endif
break;
case eCalleeContinue: // 被叫号码不全
vSetTimer( dwChannel, eT204, mdwTimeoutLength[eT204] );
break;
case eCallLimited:
printf("eCallLimited \n");
vPlayVoiceFile( dwChannel, eDisable );
ptAttrib->dwPlayMode = 3;
vChangeCCStatus( dwChannel, eFxo_play );
break;
default:
break;
}
break;
}
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT204:
if ( ptAttrib->boolFxoAcdZeroFail ) {
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;
}
dwIdx = eFirstcall;
ptAttrib->eActiveCall = eFirstcall;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
ptAttrib->mtCallInfo[dwIdx].boolFxoCall = FALSE;
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.dwCallee = ptAttrib->dwAgentNumber;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
ptAttrib->mtCallInfo[dwIdx].dwDialNumber = 0;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
#if 0
ptAttrib->dwPromptCounter ++;
if ( ptAttrib->dwPromptCounter >= MAX_DIAL_RETRY ) {
vPutDriver( dwChannel, eACTION_FXO_ONHOOK );
vSetTimer( dwChannel, eT114, mdwTimeoutLength[eT114] );
vChangeCCStatus( dwChannel, eFxo_end );
break;
}
vPlayVoiceFile( dwChannel, vocWelcome );
ptAttrib->dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxo_play );
#endif
break;
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -