📄 callcontrol.oldc
字号:
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 {
if ( giAutoTalk ) {
vPutDriver( dwChannel, eACTION_TALK, NULL, 0 );
}
}
} else {
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, meChannelStatus[dwChannel] );
switch( meChannelStatus[dwChannel] ) {
case eFxx_null:
vFxxnull( dwChannel, eMsgType, pchMsg );
break;
case eFxs_idle:
vFxsidle( dwChannel, eMsgType, pchMsg );
break;
case eFxs_waitdial:
vFxswaitdial( dwChannel, eMsgType, pchMsg );
break;
case eFxs_dialing:
vFxsdialing( dwChannel, eMsgType, pchMsg );
break;
case eFxs_waitonhook:
vFxswaitonhook( dwChannel, eMsgType, pchMsg );
break;
case eFxs_ringing:
vFxsringing( dwChannel, eMsgType, pchMsg );
break;
case eFxs_connecting:
vFxsconnecting( dwChannel, eMsgType, pchMsg );
break;
case eFxs_calling:
vFxscalling( dwChannel, eMsgType, pchMsg );
break;
case eFxs_waitconnect:
vFxswaitconnect( dwChannel, eMsgType, pchMsg );
break;
case eFxs_disconnect:
vFxsdisconnect( dwChannel, eMsgType, pchMsg );
break;
case eFxs_talking:
vFxstalking( dwChannel, eMsgType, pchMsg );
break;
case eFxs_replace:
vFxsreplace( dwChannel, eMsgType, pchMsg );
break;
case eFxs_followme:
vFxsfollowme( dwChannel, eMsgType, pchMsg );
break;
case eFxs_waitcmdans:
vFxswaitcmdans( dwChannel, eMsgType, pchMsg );
break;
case eFxs_playing:
vFxsplaying( dwChannel, eMsgType, pchMsg );
break;
case eFxo_idle:
vFxoidle( dwChannel, eMsgType, pchMsg );
break;
case eFxo_calling:
vFxocalling( dwChannel, eMsgType, pchMsg );
break;
case eFxo_disconnect:
vFxodisconnect( dwChannel, eMsgType, pchMsg );
break;
case eFxo_end:
vFxoend( dwChannel, eMsgType, pchMsg );
break;
case eFxo_waitconnect: // fxocallsetup.c
vFxowaitconnect( dwChannel, eMsgType, pchMsg );
break;
case eFxo_connecting: // fxocallsetup.c
vFxoconnecting( dwChannel, eMsgType, pchMsg );
break;
case eFxo_waitdial: // fxocallsetup.c
vFxowaitdial( dwChannel, eMsgType, pchMsg );
break;
case eFxo_dialing: // fxocallsetup.c
vFxodialing( dwChannel, eMsgType, pchMsg );
break;
case eFxo_talking:
vFxotalking( dwChannel, eMsgType, pchMsg );
break;
case eFxo_getpasswd:
vFxogetpasswd( dwChannel, eMsgType, pchMsg );
break;
case eFxo_getnumber:
vFxogetnumber( dwChannel, eMsgType, pchMsg );
break;
case eFxo_waitinfo:
vFxowaitinfo( dwChannel, eMsgType, pchMsg );
break;
case eFxo_play:
vFxoplay( dwChannel, eMsgType, pchMsg );
break;
}
//printf( "out of Channel is %d, Status is %d\n", dwChannel, meChannelStatus[dwChannel] );
sem_post( &m_smCallControl );
}
void CCallControl::vSendMsgToUA( ptCC_UA_MSG ptCcUaMsg )
{
if ( gboolTraceEnable && ptCcUaMsg->hdr.eMsgType != eAudioData ) {
ptCcUaMsg->hdr.dwDirection = 1;
ptCcUaMsg->hdr.dwStatus = goCC.dwGetStatus( ptCcUaMsg->hdr.dwChannel );
iQXput( &gqxQueueTrace, (UCHAR *)ptCcUaMsg );
}
// call function of HEGS
//printf( "Before vReceiveCCMesg\n" );
vReceiveCCMesg( ptCcUaMsg );
//printf( "After vReceiveCCMesg\n" );
}
BOOL CCallControl::boolTalk( DWORD dwChannel )
{
if ( meChannelStatus[dwChannel] == eFxs_talking
|| meChannelStatus[dwChannel] == eFxo_talking ) {
return TRUE;
}
return FALSE;
}
#if 0
void vThreadReadFromDriver()
{
tFXEVENTMESSAGE tEvent;
//driver init
if ( goIppbxfx.dwGetLastError() ){
return ;
}
goIppbxfx.vEnableInterrupt();
tCC_UA_MSG tCcUaMsg;
while( 1 ) {
#ifdef DEBUG
memset(&tEvent, 0, sizeof(tEvent)-sizeof(tEvent.chBuffer));
#endif
if ( FALSE == goIppbxfx.boolReadFile( &tEvent ) ) {
continue;
}
if ( tEvent.dwChannel < 0 || tEvent.dwChannel >= MAX_LINE_NUM ) {
continue;
}
if ( eEVENT_VOICE_MSG == tEvent.dwEventType && goCC.boolTalk( tEvent.dwChannel ) ) {
// 语音,直接给UA
//printf( "Tone Packet, %d\n", tEvent.dwChannel );
tCcUaMsg.hdr.eMsgType = eAudioData;
tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tVoiceMsg);
if ( giAutoTalk ) {
tCcUaMsg.u.tVoiceMsg.dwCallee = goCC.dwGetCallee( tEvent.dwChannel );
tCcUaMsg.u.tVoiceMsg.dwCaller = goCC.dwGetCaller( tEvent.dwChannel );
}
tCcUaMsg.hdr.dwCcIdx = goCC.dwGetCCIdx( tEvent.dwChannel );
tCcUaMsg.u.tVoiceMsg.dwLength = tEvent.dwVoiceLength;
tCcUaMsg.u.tVoiceMsg.pVoiceMessage = tEvent.chBuffer;
tCcUaMsg.u.tVoiceMsg.dwTime = tEvent.dwTime;
goCC.vSendMsgToUA( &tCcUaMsg );
continue;
}
if ( eEVENT_FAX_MSG == tEvent.dwEventType && goCC.boolTalk( tEvent.dwChannel ) ) {
// 语音,直接给UA
tCcUaMsg.hdr.eMsgType = eFaxData;
tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
tCcUaMsg.hdr.length = sizeof(tCcUaMsg.hdr) + sizeof(tCcUaMsg.u.tVoiceMsg);
if ( giAutoTalk ) {
tCcUaMsg.u.tVoiceMsg.dwCallee = goCC.dwGetCallee( tEvent.dwChannel );
tCcUaMsg.u.tVoiceMsg.dwCaller = goCC.dwGetCaller( tEvent.dwChannel );
}
tCcUaMsg.hdr.dwCcIdx = goCC.dwGetCCIdx( tEvent.dwChannel );
tCcUaMsg.u.tVoiceMsg.dwLength = tEvent.dwVoiceLength;
tCcUaMsg.u.tVoiceMsg.pVoiceMessage = tEvent.chBuffer;
tCcUaMsg.u.tVoiceMsg.dwTime = tEvent.dwTime;
goCC.vSendMsgToUA( &tCcUaMsg );
continue;
}
if ( eEVENT_VOICE_MSG == tEvent.dwEventType || eEVENT_FAX_MSG == tEvent.dwEventType ) {
continue;
}
if ( eEVENT_FXS_DTMF_CODE == tEvent.dwEventType ) {
goCC.vDirectLineCallOver( tEvent.dwChannel );
}
if ( gboolTraceEnable ) {
tCcUaMsg.hdr.eMsgType = eMsgToDriver;
tCcUaMsg.hdr.dwDirection = 0;
tCcUaMsg.hdr.dwChannel = tEvent.dwChannel;
tCcUaMsg.hdr.dwStatus = goCC.dwGetStatus( tEvent.dwChannel );
memcpy( (char *)&(tCcUaMsg.u), &tEvent, sizeof(tCcUaMsg.u) );
iQXput( &gqxQueueTrace, (UCHAR *)&tCcUaMsg );
}
goCC.vCallControl( tEvent.dwChannel, eMsgFromDriver, (char *)&tEvent );
}
}
#endif
void vThreadSignalProc( void )
{
tCC_UA_MSG tCcUaMsg;
//yy tTraceResultMessage tTrace;
gblnvThreadSignalProc = TRUE;
printf( "vThreadSignalProc is up\n" );
while( gblnShutdown == FALSE ) {
sem_wait( &( gqxQueueUaMsg.smSemaphore ) );
if ( iQXget( &gqxQueueUaMsg, (BYTE *)&tCcUaMsg ) != 0 ) {
continue;
}
if ( gboolTraceEn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -