📄 callcontrol.c
字号:
vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
vChangeCCStatus( dwChannel, eFxs_replace );
break;
case eFuncModifyPassword: // 修改密码
if ( mtFxxAttrib[dwChannel].dwNewPasswordFirst != mtFxxAttrib[dwChannel].dwNewPasswordSecond ) {
vPlayVoiceFile( dwChannel, eNewPasswdInvalid );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
if ( mtFxxAttrib[dwChannel].dwOldPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
vPlayVoiceFile( dwChannel, eOldPasswdError );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eModifyPassword;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tModifyPasswd );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tModifyPasswd.dwChannel = dwChannel;
tCcUaMsg.u.tModifyPasswd.dwNewPassword = mtFxxAttrib[dwChannel].dwNewPasswordFirst;
vSendMsgToUA( &tCcUaMsg );
m_tModuleInfo.port.dwPwd[dwChannel] = mtFxxAttrib[dwChannel].dwNewPasswordFirst;
vPlayVoiceFile( dwChannel, eModifyPasswdOk );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
case eFuncConference: // 三方通话
break;
case eFuncChangeAgentArgs:
printf("eFuncChangeAgentArgs %d,%d,%d,%d\n",mtFxxAttrib[dwChannel].dwAgentPassword , m_tModuleInfo.port.dwPwd[dwChannel]
, m_tModuleInfo.port.dwTelno[dwChannel] ,m_tGlobalInfo.ctg.admin.dwTelno[0]);
if ( mtFxxAttrib[dwChannel].dwAgentPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
vPlayVoiceFile( dwChannel, eOldPasswdError );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
for( dwTmp = 0; dwTmp < MAX_CTG_ADMIN_NUMBER; dwTmp ++ ) {
if ( m_tModuleInfo.port.dwTelno[dwChannel] == m_tGlobalInfo.ctg.admin.dwTelno[dwTmp] ) {
break;
}
}
if ( dwTmp >= MAX_CTG_ADMIN_NUMBER ) {
vPlayVoiceFile( dwChannel, eOldPasswdError );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetAgentArgs;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetAgentArgsValue );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetAgentArgsValue.dwChannel = m_tModuleInfo.port.dwTelno[dwChannel];
tCcUaMsg.u.tSetAgentArgsValue.boolAutoAgentService = mtFxxAttrib[dwChannel].boolAutoAgentService;
tCcUaMsg.u.tSetAgentArgsValue.dwAgentNumber = mtFxxAttrib[dwChannel].dwAgentNumber;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
vChangeCCStatus( dwChannel, eFxs_waitcmdans );
break;
case eFuncChangeAgentStatus:
printf("eFuncChangeAgentStatus %d,%d\n",mtFxxAttrib[dwChannel].dwAgentPassword , m_tModuleInfo.port.dwPwd[dwChannel]);
if ( mtFxxAttrib[dwChannel].dwAgentPassword != m_tModuleInfo.port.dwPwd[dwChannel] ) {
vPlayVoiceFile( dwChannel, eOldPasswdError );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
for( dwTmp = 0; dwTmp < MAX_CTG_ADMIN_NUMBER; dwTmp ++ ) {
if ( m_tModuleInfo.port.dwTelno[dwChannel] == m_tGlobalInfo.ctg.admin.dwTelno[dwTmp] ) {
break;
}
}
if ( dwTmp >= MAX_CTG_ADMIN_NUMBER ) {
vPlayVoiceFile( dwChannel, eOldPasswdError );
mtFxxAttrib[dwChannel].dwPlayMode = 1;
vChangeCCStatus( dwChannel, eFxs_playing );
break;
}
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetAgentMode;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetAgentModeValue );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetAgentModeValue.dwChannel = m_tModuleInfo.port.dwTelno[dwChannel];
tCcUaMsg.u.tSetAgentModeValue.boolAutoAgentService = mtFxxAttrib[dwChannel].boolAutoAgentService;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT108, mdwTimeoutLength[eT108] );
vChangeCCStatus( dwChannel, eFxs_waitcmdans );
break;
}
}
void CCallControl::vPlayVoiceFile( DWORD dwChannel, eToneFileId eFileId)
{
boolStopFilePlay( dwChannel );
vPutDriver( dwChannel, eACTION_CHANGE_CODEC, NULL, eG_711_A_LAW );
vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
mtFxxAttrib[dwChannel].eLastVoiceID = eFileId;
if ( boolStartFilePlay( dwChannel, eFileId) == FALSE ) {
printf( "StartFilePlay 5\n" );
vPlayFileEnd( dwChannel );
}
}
void CCallControl::vChangeCCStatus( DWORD dwChannel, eCCStatus eStatus )
{
DWORD dwIdx;
dwIdx = mtFxxAttrib[dwChannel].eActiveCall;
meChannelStatus[dwChannel] = eStatus;
// need add more functions here
if ( eStatus == eFxs_playing || eStatus == eFxo_play ) {
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord[0] = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter = 0;
}
if ( eStatus == eFxo_end ) {
// if ( mtFxxAttrib[dwChannel].dwBillSn ) {
vReportBill( dwChannel, eBillEnd );
mtFxxAttrib[dwChannel].dwBillSn = 0;
// }
#if 0
goIppbxfx.vSetCoder( dwChannel, eG_711_A_LAW );
#endif
}
if ( eStatus == eFxo_idle ) {
vPutDriver( dwChannel, eACTION_SCE_OFF, NULL, 0 );
mtFxxAttrib[dwChannel].boolInConference = FALSE;
#ifdef SOFT_PBX
mtFxxAttrib[dwChannel].boolCallType = FALSE;
//goIppbxfx.vSetCallType( dwChannel, 0 );
#endif
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwReceivePtr = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwReceivePtr = 0;
if ( mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDirectCall == 0 ) {
mtFxxAttrib[dwChannel].mchCallidNumber[0] = 0;
mtFxxAttrib[dwChannel].dwRingCounter = 0;
}
mtFxxAttrib[dwChannel].dwInputFxsNumber = 0;
mtFxxAttrib[dwChannel].dwInputFxsGrade = 0;
mtFxxAttrib[dwChannel].boolSendDtmfEnable = FALSE;
if ( m_tModuleInfo.port.isUsed[dwChannel] == FALSE || m_tModuleInfo.port.dwTelno[dwChannel] == 0 ) {
// disable
meChannelStatus[dwChannel] = eFxx_null;
}
}
if ( eStatus == eFxs_idle ) {
#if 0
goIppbxfx.vSetCoder( dwChannel, eG_711_A_LAW );
#endif
mtFxxAttrib[dwChannel].boolInConference = FALSE;
#ifdef SOFT_PBX
mtFxxAttrib[dwChannel].boolCallType = FALSE;
//goIppbxfx.vSetCallType( dwChannel, 0 );
#endif
mtFxxAttrib[dwChannel].dwCallCounter = 0;
mtFxxAttrib[dwChannel].eActiveCall = eFirstcall;
mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallNull;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwDirectCall = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwUaIdx = (DWORD)-1;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwDirectCall = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwUaIdx = (DWORD)-1;
mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
mtFxxAttrib[dwChannel].boolTransfer = FALSE;
mtFxxAttrib[dwChannel].boolSendDtmfEnable = FALSE;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].tSetup.dwCallee = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].tSetup.dwCaller = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].tSetup.dwCallee = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].tSetup.dwCaller = 0;
mtFxxAttrib[dwChannel].boolRedialLast = FALSE;
if ( m_tModuleInfo.port.isUsed[dwChannel] == FALSE || m_tModuleInfo.port.dwTelno[dwChannel] == 0 ) {
// disable
meChannelStatus[dwChannel] = eFxx_null;
}
}
if ( eStatus == eFxs_waitdial || eStatus == eFxo_waitdial ) {
// clear dtmf buffer
mtFxxAttrib[dwChannel].dwCurrentDialNumberCounter = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfPtr = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchDtmfRecord[0] = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwDtmfCounter = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].boolAcdCall = FALSE;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].boolAcdCall = FALSE;
if ( eStatus == eFxs_waitdial ) {
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].tSetup.cDispName[0] = 0;
}
}
if ( eStatus == eFxs_calling || eStatus == eFxo_calling ) {
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolAcdCall = FALSE;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwCallNumber = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwCallNumberPtr = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchCallNumber[0] = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].boolDtmfTransferReady = FALSE;
if ( eStatus == eFxo_calling ) {
mtFxxAttrib[dwChannel].eActiveCall = eFirstcall;
}
}
if ( eStatus == eFxs_ringing ) {
mtFxxAttrib[dwChannel].boolCallidSend = FALSE;
mtFxxAttrib[dwChannel].dwRingOffStartTime = 0;
}
if ( eStatus == eFxs_talking ) {
mtFxxAttrib[dwChannel].dwFuncCodePtr = 0;
// memset( mtFxxAttrib[dwChannel].mchFuncCode, 0, sizeof(mtFxxAttrib[dwChannel].mchFuncCode) );
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].dwReceiveNumber = 0;
mtFxxAttrib[dwChannel].mtCallInfo[dwIdx].mchReceiveNumber[0] = 0;
if ( mtFxxAttrib[dwChannel].dwCallCounter == 1 ) {
mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallNull;
mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
mtFxxAttrib[dwChannel].boolTransfer = FALSE;
} else {
mtFxxAttrib[dwChannel].e2ndCallStatus = e2ndCallTalk;
}
}
if ( eStatus == eFxs_talking || eStatus == eFxo_talking ||
eStatus == eFxs_playing || eStatus == eFxo_play ) {
// if ( eStatus == eFxs_talking || eStatus == eFxo_talking ) {
// vChangeCodec( dwChannel );
// } else {
// vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
// }
if ( eStatus == eFxs_playing || eStatus == eFxo_play ) {
vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
} else {
//printf("giAutoTalk=%d\n",giAutoTalk);
if ( giAutoTalk ) {
vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
}
}
} else {
//printf("eACTION_TALK_DENY,dwChannel=%d,eStatus=%d\n",dwChannel,eStatus);
vPutDriver( dwChannel, eACTION_TALK_DENY, NULL, 0 );
}
if ( eStatus != eFxs_playing && eStatus != eFxo_play ) {
boolStopFilePlay( dwChannel );
}
if ( eStatus == eFxs_waitonhook ) {
mtFxxAttrib[dwChannel].boolHoldActive = FALSE;
mtFxxAttrib[dwChannel].boolTransfer = FALSE;
mtFxxAttrib[dwChannel].mtCallInfo[eFirstcall].dwAcdRetry = 0;
mtFxxAttrib[dwChannel].mtCallInfo[eSecondcall].dwAcdRetry = 0;
}
vReportCCStatus( dwChannel );
}
// channel 定时器
// eType, type of timer
// dwTimelength, timeout of timer, in milisec
void CCallControl::vSetTimer( DWORD dwChannel, eChannelTimer eType, DWORD dwTimelength )
{
if ( gboolTraceEnable ) {
tCC_UA_MSG tCcUaMsg;
tCcUaMsg.hdr.eMsgType = eSetTimer;
tCcUaMsg.hdr.dwDirection = 1;
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( dwChannel );
tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tTimerMsg);
tCcUaMsg.u.tTimerMsg.dwChannel = dwChannel;
tCcUaMsg.u.tTimerMsg.dwTimerType = eType;
iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
}
dwTimelength *= 1000;
if ( mtFxxAttrib[dwChannel].mdwTimeID[eType] != 0 ) {
mtFxxAttrib[dwChannel].mdwTimeID[eType] =
uSetUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[eType], dwTimelength, eType, mtFxxAttrib[dwChannel].tmProc );
} else {
mtFxxAttrib[dwChannel].mdwTimeID[eType] =
uSetUFTimer( 0, dwTimelength, eType, mtFxxAttrib[dwChannel].tmProc );
}
}
void CCallControl::vKillAllTimer( DWORD dwChannel )
{
DWORD dwTmp;
for( dwTmp = 0; dwTmp < MAX_TIMEOUT_TYPE; dwTmp ++ ) {
if ( mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] > 0 ) {
KillUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] );
mtFxxAttrib[dwChannel].mdwTimeID[dwTmp] = 0;
}
}
}
void CCallControl::vKillTimer( DWORD dwChannel, eChannelTimer eType )
{
if ( gboolTraceEnable ) {
tCC_UA_MSG tCcUaMsg;
tCcUaMsg.hdr.eMsgType = eKillTimer;
tCcUaMsg.hdr.dwDirection = 1;
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( dwChannel );
tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tTimerMsg);
tCcUaMsg.u.tTimerMsg.dwChannel = dwChannel;
tCcUaMsg.u.tTimerMsg.dwTimerType = eType;
iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
}
if ( mtFxxAttrib[dwChannel].mdwTimeID[eType] > 0 ) {
KillUFTimer( mtFxxAttrib[dwChannel].mdwTimeID[eType] );
mtFxxAttrib[dwChannel].mdwTimeID[eType] = 0;
}
}
void CCallControl::vCallControl( DWORD dwChannel, eFxxMsgType eMsgType, char *pchMsg )
{
if ( dwChannel >= MAX_LINE_NUM ) {
printf( "ERR: %d\n", dwChannel );
return;
}
sem_wait( &m_smCallControl );
//printf( "Channel is %d, Status is %d\n", dwChannel, meCh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -