📄 pbxdlg.cpp
字号:
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmSetDtmfStopPlay");
}
ChInfo[nCh].nTimer = SsmStartTimer(15000,1);
ChInfo[nCh].nStatus = TRUNK_WAIT_SELECTION;
}
else
{
//clear DTMF
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmHangup");
}
memset(ChInfo[nCh].szCallerId,'\0',sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId,'\0',sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_DIALING:
switch(nChState)
{
case S_CALL_WAIT_REMOTE_PICKUP:
//retrieve CalledId
strcpy(ChInfo[nCh].szCalleeId, ChInfo[nCh].szPhoneNumBuf);
ChInfo[nCh].nStatus = TRUNK_WAIT_REMOTE_PICKUP;
//send E_TK_DIAL_OK
SendMessage(WM_USER+E_TK_DIAL_OK, ChInfo[nCh].nLinkToCh, nCh);
break;
case S_CALL_TALKING:
//retrieve calledId
strcpy(ChInfo[nCh].szCalleeId, ChInfo[nCh].szPhoneNumBuf);
ChInfo[nCh].nStatus = TRUNK_CONNECTED;
//send E_TK_REMOTE_PICKUP
SendMessage(WM_USER+E_TK_REMOTE_PICKUP, ChInfo[nCh].nLinkToCh, nCh);
break;
case S_CALL_PENDING:
//send E_TK_DIAL_FAIL
SendMessage(WM_USER+E_TK_DIAL_FAIL, ChInfo[nCh].nLinkToCh, nCh);
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_DIALING", "SsmHangup");
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_DIALING", "SsmClearRxDtmfBuf");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //Clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
break;
default:
break;
}
break;
case TRUNK_WAIT_REMOTE_PICKUP:
if(nChState == S_CALL_TALKING) //called trunk channel answer the call
{
ChInfo[nCh].nStatus = TRUNK_CONNECTED;
//send E_TK_REMOTE_PICKUP
SendMessage(WM_USER+E_TK_REMOTE_PICKUP, ChInfo[nCh].nLinkToCh, nCh);
}
else //called trunk channel does not answer the call
{
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_REMOTE_PICKUP", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_REMOTE_PICKUP", "SsmHangup");
}
//send E_TK_REMOTE_NOANSWER
SendMessage(WM_USER+E_TK_REMOTE_NOANSWER, ChInfo[nCh].nLinkToCh, nCh);
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //callerId
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_REQ_USER:
if(nChState == S_CALL_PENDING)
{
//clear DTmf buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_REQ_USER", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_REQ_USER", "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_RING_BACK:
if(nChState == S_CALL_PENDING)
{
//stop background music
nPlayResult = SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmCheckPlay");
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmHangup");
}
//send E_US_RELEASE
SendMessage(WM_USER+E_US_RELEASE, ChInfo[nCh].nLinkToCh, nCh);
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_CONNECTED:
if(nChState ==S_CALL_PENDING)
{
//send E_MSG_RELEASE to channel connected
SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nLinkToCh, nCh);
//tear down bus connection
if(SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmStopTalkWith");
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_WAIT_SELECTION:
if(nChState ==S_CALL_PENDING)
{
//close T1:8 seconds
if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmStopTimer");
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
}
break;
case TRUNK_FLASHING:
if(nChState ==S_CALL_PENDING)
{
//stop background music
nPlayResult = SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_CHG_ChState", "TRUNK_FLASHING", "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_CHG_ChState", "TRUNK_FLASHING", "SsmCheckPlay");
}
SendMessage(WM_USER+E_MSG_HANGUP, ChInfo[nCh].nLinkToCh, nCh);
}
break;
default:
break;
}
break;
case E_CHG_RcvDTMF:
dwDtmfLen = lParam >> 16;
dwDtmfNum = lParam & 0xFFFF;
switch(ChInfo[nCh].nStatus)
{
case TRUNK_WAIT_ACTUAL_PICKUP:
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmClearRxDtmfBuf");
}
break;
case TRUNK_WAIT_SELECTION:
//close T1
if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmStopTimer");
}
if(dwDtmfLen == MAX_USER_DTMFLEN)
{
ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
ChInfo[nCh].szPhoneNumBuf[MAX_USER_DTMFLEN] = '\0';
for(int i=0; i<nMaxCh; i++)
{
if( (ChInfo[i].nChType == 2)
&& (strcmp(ChInfo[nCh].szPhoneNumBuf, ChInfo[i].CUserNum) == 0) && i != nCh )
{
ChInfo[nCh].nLinkToCh = i;
}
}
if(ChInfo[nCh].nLinkToCh == -1) //invalid extension number
{
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmClearRxDtmfBuf");
}
GetCurrentDirectory(MAX_PATH, szVoicePath);
strcat(szVoicePath, "\\Error.pcm");
//play message indicating invalid extension is dialed.
if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmPlayFile");
}
ChInfo[nCh].nTimer = SsmStartTimer(15000, 1);
}
else
{
ChInfo[nCh].nStatus = TRUNK_REQ_USER;
SendMessage(WM_USER+E_US_SEIZURE, ChInfo[nCh].nLinkToCh, nCh);
}
}
else //clear Timer T1 to wait for next number
{
ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmStartTimer");
}
}
break;
case TRUNK_CONNECTED:
break;
default:
break;
}
break;
case E_SYS_TIMEOUT:
//close T1
if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmStopTimer");
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
break;
/*+++++++++define trunk channel message +++++++++*/
case E_US_SEIZURE_TK:
ChInfo[nCh].nLinkToCh = lParam;
//go off-hook successfully?
if( SsmPickup(nCh) == 0 )
{
//send E_TK_SEIZURE_TK_ACK_IDLE
SendMessage(WM_USER+E_TK_SEIZURE_TK_ACK_IDLE, ChInfo[nCh].nLinkToCh, nCh);
ChInfo[nCh].nStatus = TRUNK_WAIT_1STNUM;
}
else
{
//send E_TK_SEIZURE_TK_ACK_BUSY
SendMessage(WM_USER+E_TK_SEIZURE_TK_ACK_BUSY, ChInfo[nCh].nLinkToCh, nCh);
}
break;
case E_TK_RELEASE:
ChInfo[nCh].nLinkToCh = lParam;
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_TK_RELEASE", NULL, "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_TK_RELEASE", NULL, "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nStatus = TRUNK_IDLE;
break;
case E_US_DTMF2TK:
dwDtmfLen = lParam >> 16;
dwDtmfNum = lParam & 0xFFFF;
switch(ChInfo[nCh].nStatus)
{
case TRUNK_WAIT_1STNUM: //auto dial
//clean szPhoneNumBuf
memset(ChInfo[nCh].szPhoneNumBuf, '\0', sizeof(char)*NUM_LENGTH);
//retrieve DTMF
ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
//retrieve length of DTMF
ChInfo[nCh].nPhoNumLen = dwDtmfLen;
//audo dial
if(SsmAutoDial(nCh, ChInfo[nCh].szPhoneNumBuf) == -1)
{
ShowErrMsg("E_US_DTMF2TK", "TRUNK_WAIT_1STNUM", "SsmAutoDial");
}
ChInfo[nCh].nStatus = TRUNK_DIALING;
break;
case TRUNK_DIALING:
//retrieve DTMF
ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
ChInfo[nCh].szPhoneNumBuf[dwDtmfLen] = '\0';
if(dwDtmfLen > (DWORD)ChInfo[nCh].nPhoNumLen) //append number
{
//append number
if(SsmAppendPhoNum(nCh, &ChInfo[nCh].szPhoneNumBuf[ChInfo[nCh].nPhoNumLen]) == -1)
{
ShowErrMsg("E_US_DTMF2TK", "TRUNK_DIALING", "SsmAppendPhoNum");
}
ChInfo[nCh].nPhoNumLen = dwDtmfLen;
}
break;
default:
break;
}
break;
case E_US_SEIZURE_ACK_IDLE:
ChInfo[nCh].nLinkToCh = lParam;
GetCurrentDirectory(MAX_PATH, szVoicePath);
strcat(szVoicePath, "\\bgmusic.wav");
//play background music
if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
{
ShowErrMsg("E_US_SEIZURE_ACK_IDLE", NULL, "SsmPlayFile");
}
ChInfo[nCh].nStatus = TRUNK_RING_BACK;
break;
case E_US_SEIZURE_ACK_BUSY:
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_US_SEIZURE_ACK_BUSY", NULL, "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_US_SEIZURE_ACK_BUSY", NULL, "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nLinkToCh = -1;
ChInfo[nCh].nStatus = TRUNK_IDLE;
break;
case E_US_PICKUP: //called station go off-hook
//stop playback of background music
nPlayResult = SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_US_PICKUP", NULL, "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_US_PICKUP", NULL, "SsmCheckPlay");
}
//build bus connection
if(SsmTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
{
ShowErrMsg("E_US_PICKUP", NULL, "SsmTalkWith");
}
ChInfo[nCh].nStatus = TRUNK_CONNECTED;
break;
case E_MSG_RELEASE:
if(ChInfo[nCh].nStatus == TRUNK_FLASHING)
{
//stop playback of background music
nPlayResult = SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_MSG_RELEASE", "TRUNK_FLASHING", "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_MSG_RELEASE", "TRUNK_FLASHING", "SsmCheckPlay");
}
}
//clear DTMF buffer
if(SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_MSG_RELEASE", NULL, "SsmClearRxDtmfBuf");
}
//go on-hook
if(SsmHangup(nCh) == -1)
{
ShowErrMsg("E_MSG_RELEASE", NULL, "SsmHangup");
}
memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH); //clear CallerId
memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH); //clear CalledId
ChInfo[nCh].nLinkToCh = -1;
ChInfo[nCh].nStatus = TRUNK_IDLE;
break;
case E_MSG_FLASH:
GetCurrentDirectory(MAX_PATH, szVoicePath);
strcat(szVoicePath, "\\bgmusic.wav");
//play background music in call transfer waiting
if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
{
ShowErrMsg("E_MSG_FLASH", NULL, "SsmPlayFile");
}
ChInfo[nCh].nStatus = TRUNK_FLASHING;
break;
case E_MSG_CONNECT:
//stop playback of background music
ChInfo[nCh].nLinkToCh = lParam;
nPlayResult = SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_MSG_CONNECT", NULL, "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_MSG_CONNECT", NULL, "SsmCheckPlay");
}
ChInfo[nCh].nStatus = TRUNK_CONNECTED;
break;
default:
break;
}
}
void CPbxDlg::ShowErrMsg(LPCTSTR lpszEventText, LPCTSTR lpszStatusText, LPCTSTR lpszFunctionText)
{
char szErrMsg[300];
if(lpszStatusText == NULL)
{
wsprintf(szErrMsg,"In event%s, call of %s failed",lpszEventText,lpszFunctionText);
}
else
{
wsprintf(szErrMsg,"In event %s, in state %s ,call of %s failed",lpszEventText,lpszStatusText,lpszFunctionText);
}
AfxMessageBox(szErrMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -