📄 form1.cs
字号:
}
void UpdateChList(int nCh)
{
string CNewState=""; //new channel state
StringBuilder szTmpStr = new StringBuilder (201); //DTMF buffer
switch(ChInfo[nCh].nStatus)
{
case APP_USER_STATUS.USER_IDLE : CNewState = "Idle"; break;
case APP_USER_STATUS.USER_LOCAL_RING: CNewState = "Ringing"; break;
case APP_USER_STATUS.USER_GET_1STDTMF: CNewState = "Select call type"; break;
case APP_USER_STATUS.USER_GET_DTMF: CNewState = "Wait DTMF"; break;
case APP_USER_STATUS.USER_REQ_USER: CNewState = "Wait response"; break;
case APP_USER_STATUS.USER_RING_BACK: CNewState = "Ring back"; break;
case APP_USER_STATUS.USER_REQ_TRUNK: CNewState = "Station request trunk"; break;
case APP_USER_STATUS.USER_DIALOUT: CNewState = "Send Dtmf to trunk"; break;
case APP_USER_STATUS.USER_WAIT_REMOTE_PICKUP: CNewState = "Wait called party's answer"; break;
case APP_USER_STATUS.USER_TALKING: CNewState = "Talking"; break;
case APP_USER_STATUS.USER_WAIT_HANGUP: CNewState = "Wait hangup"; break;
case APP_USER_STATUS.TRUNK_IDLE: CNewState = "Idle"; break;
case APP_USER_STATUS.TRUNK_WAIT_1STNUM: CNewState = "Wait dialing"; break;
case APP_USER_STATUS.TRUNK_DIALING: CNewState = "Dialing"; break;
case APP_USER_STATUS.TRUNK_WAIT_REMOTE_PICKUP: CNewState = "Ring back"; break;
case APP_USER_STATUS.TRUNK_WAIT_ACTUAL_PICKUP: CNewState = "Ringing"; break;
case APP_USER_STATUS.TRUNK_WAIT_SELECTION: CNewState = "Dial extension"; break;
case APP_USER_STATUS.TRUNK_REQ_USER: CNewState = "Wait dial-up result"; break;
case APP_USER_STATUS.TRUNK_RING_BACK: CNewState = "Play backgroun music"; break;
case APP_USER_STATUS.TRUNK_CONNECTED: CNewState = "Talking"; break;
case APP_USER_STATUS.USER_F_GET_DTMF: CNewState = "Dial number of extension to be transferred"; break;
case APP_USER_STATUS.USER_F_REQ_USER: CNewState = "Wait extension's response"; break;
case APP_USER_STATUS.USER_F_RING_BACK: CNewState = "Ring back"; break;
case APP_USER_STATUS.USER_F_TALKING: CNewState = "Talking"; break;
case APP_USER_STATUS.USER_F_OPERATE: CNewState = "Wait next step"; break;
case APP_USER_STATUS.USER_F_WAIT_TALK: CNewState = "Wait connection with destination phone"; break;
case APP_USER_STATUS.TRUNK_FLASHING: CNewState = "wait connection with destination phone"; break;
default:
break;
}
//to retrieve DTMF, size of dtmf buffer can be set in configuration file, with default value of 200 characters
if(SsmGetDtmfStr(nCh, szTmpStr) == -1)
{
MessageBox.Show ("call of functino SsmGetDtmfStr() failed in function UpdateChList()");
}
//update channel information in list
ChList.set_TextMatrix (ChInfo[nCh].nIndex, 2, CNewState); //display channel number
ChList.set_TextMatrix (ChInfo[nCh].nIndex, 3, ChInfo[nCh].szCallerId.ToString ()); //display CallerId
ChList.set_TextMatrix (ChInfo[nCh].nIndex, 4, ChInfo[nCh].szCalleeId.ToString ()); //display CalledId
ChList.set_TextMatrix (ChInfo[nCh].nIndex, 5, szTmpStr.ToString ()); //显示DTMFdisplay DTMF
return;
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void WndProc(ref Message m)
{
int nEventCode; //event ID
int nCh=-1; //channel ID
int nCheckChNum;
if(m.Msg > WM_USER)
{
nEventCode = m.Msg - WM_USER;
switch(nEventCode)
{
case (int)Event.E_SYS_TIMEOUT:
//to identify channel number according to timer ID
for(nCheckChNum=0; nCheckChNum<nMaxCh; nCheckChNum++)
{
if(m.WParam.ToInt32 () == ChInfo[nCheckChNum].nTimer)
{
nCh = nCheckChNum;
switch(ChInfo[nCh].nChType)
{
case 0:
TrunkProc(nEventCode, nCh, m.LParam.ToInt32 () );
UpdateChList(nCh);
break;
case 2:
UserProc(nEventCode, nCh, m.LParam.ToInt32 () );
UpdateChList(nCh);
break;
default:
break;
}
break;
}
}
if(nCheckChNum == nMaxCh)
{
base.WndProc(ref m); //CDialog::WindowProc(message, wParam, lParam);
}
break;
case (int)Event.E_CHG_HookState:
case (int)Event.E_CHG_RcvDTMF:
case (int)Event.E_CHG_FlashCount:
case (int)Event.E_CHG_ChState:
case (int)EventMsg.E_US_SEIZURE:
case (int)EventMsg.E_US_RELEASE:
case (int)EventMsg.E_US_SEIZURE_ACK_IDLE:
case (int)EventMsg.E_US_SEIZURE_ACK_BUSY:
case (int)EventMsg.E_US_PICKUP:
case (int)EventMsg.E_US_SEIZURE_TK:
case (int)EventMsg.E_TK_SEIZURE_TK_ACK_IDLE:
case (int)EventMsg.E_TK_SEIZURE_TK_ACK_BUSY:
case (int)EventMsg.E_TK_RELEASE:
case (int)EventMsg.E_US_DTMF2TK:
case (int)EventMsg.E_TK_DIAL_OK:
case (int)EventMsg.E_TK_DIAL_FAIL:
case (int)EventMsg.E_TK_REMOTE_NOANSWER:
case (int)EventMsg.E_TK_REMOTE_PICKUP:
case (int)EventMsg.E_MSG_RELEASE:
case (int)EventMsg.E_MSG_FLASH:
case (int)EventMsg.E_MSG_CONNECT:
case (int)EventMsg.E_MSG_HANGUP:
case (int)EventMsg.F_US_SEIZURE:
nCh = m.WParam.ToInt32 () ;
//deal with station and trunk channels
switch(ChInfo[nCh].nChType)
{
case 0:
TrunkProc(nEventCode, nCh, m.LParam.ToInt32 () );
UpdateChList(nCh);
break;
case 2:
UserProc(nEventCode, nCh, m.LParam.ToInt32 () );
UpdateChList(nCh);
break;
default:
break;
}
break;
default:
base.WndProc(ref m);
break;
}
}
base.WndProc(ref m);
}
void UserProc(int event1, int wParam, int lParam)
{
int nCh; //number of station channel
int dwDtmfLen; //length of DTMF received
char dwDtmfNum; // DTMF received
int nHook; //nHook:0---station channel go on-hook; 1---station channel go off-hook
int nToneType = -2; //tone type
int nToneChResult; //tone detection result
int nPlayResult; //return value of function SsmCheckPlay()
nCh = wParam;
switch(event1)
{
/*+++++++++driver message+++++++++*/
case (int)Event.E_CHG_HookState: //station hook change event
nHook = lParam;
if(nHook == 0) //station channel go on-hook
{
switch(ChInfo[nCh].nStatus)
{
case APP_USER_STATUS.USER_GET_1STDTMF:
//close T1
if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_GET_1STDTMF", "SsmStopTimer");
}
break;
case APP_USER_STATUS.USER_GET_DTMF:
//close T2
if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_GET_DTMF", "SsmStopTimer");
}
break;
case APP_USER_STATUS.USER_REQ_USER:
//send E_US_RELEASE
SendMessage(hwnd ,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh,(IntPtr)nCh);
break;
case APP_USER_STATUS.USER_RING_BACK:
//send E_US_RELEASE to channel Ch-k
SendMessage(hwnd,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
case APP_USER_STATUS.USER_TALKING:
//tear down bus connection
if(ShDll.SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_TALKING", "SsmStopSendTone");
}
//to send E_MSG_RELEASE to channel connected
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
case APP_USER_STATUS.USER_WAIT_HANGUP:
break;
case APP_USER_STATUS.USER_REQ_TRUNK:
break;
case APP_USER_STATUS.USER_DIALOUT:
//close T3
if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_DIALOUT", "SsmStopTimer");
}
//send E_TK_RELEASE
SendMessage(hwnd,WM_USER+(int)EventMsg.E_TK_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
case APP_USER_STATUS.USER_WAIT_REMOTE_PICKUP:
//send E_TK_RELEASE
SendMessage(hwnd,WM_USER+(int)EventMsg.E_TK_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
case APP_USER_STATUS.USER_F_WAIT_TALK:
//stop playback of background music
nPlayResult = ShDll.SsmCheckPlay(nCh);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(ShDll.SsmStopPlayFile(nCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_F_WAIT_TALK", "SsmStopPlayFile");
}
}
}
else
{
ShowErrMsg("E_CHG_HookState", "USER_F_WAIT_TALK", "SsmCheckPlay");
}
//E_MSG_HANGUP→ch1
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_HANGUP, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
case APP_USER_STATUS.USER_F_GET_DTMF:
//close T4
if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_F_GET_DTMF", "SsmStopTimer");
}
//E_MSG_RELEASE→ch0
if(!ChInfo[nCh].bSubmiteChHookFlag)
{
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
}
break;
case APP_USER_STATUS.USER_F_REQ_USER:
//E_MSG_RELEASE→ch0
if(!ChInfo[nCh].bSubmiteChHookFlag)
{
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
}
break;
case APP_USER_STATUS.USER_F_RING_BACK:
//E_US_RELEASE→ch2
SendMessage(hwnd,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
//E_MSG_RELEASE→ch0
if(!ChInfo[nCh].bSubmiteChHookFlag)
{
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
}
break;
case APP_USER_STATUS.USER_F_TALKING:
//tear down bus connection between ch1 and ch2
if(ShDll.SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_F_TALKING", "SsmStopTalkWith");
}
if(!ChInfo[nCh].bSubmiteChHookFlag) //Ch0 go off-hook, Flag==0?
{
ChInfo[ChInfo[nCh].nLinkToCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
//E_MSG_CONNECT→ch0
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_CONNECT, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)ChInfo[nCh].nLinkToCh);
//to link original calling party and extenion transferred (ch0,ch2)
if(ShDll.SsmTalkWith(ChInfo[nCh].nSaveSubmiteCh, ChInfo[nCh].nLinkToCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_F_TALKING", "SsmTalkWith");
}
ChInfo[ChInfo[nCh].nLinkToCh].bPressFlag = false;
}
else
{
//E_MSG_RELEASE→ch2
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
}
break;
case APP_USER_STATUS.USER_F_OPERATE:
if(!ChInfo[nCh].bSubmiteChHookFlag)
{
//E_MSG_RELEASE→ch0
SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
}
break;
default:
break;
}//end of switch for ChInfo[nCh].nStatus
//clear DTMF buffer
if(ShDll.SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_F_OPERATE", "SsmClearRxDtmfBuf");
}
//initialize channel concerned parameters
ChInfo[nCh].nStatus = APP_USER_STATUS.USER_IDLE;
ChInfo[nCh].bPressFlag = false;
ChInfo[nCh].bSubmiteChHookFlag = false;
ChInfo[nCh].nSaveSubmiteCh = -1;
ChInfo[nCh].nTimer = -1;
ChInfo[nCh].nLinkToCh = -1;
ChInfo[nCh].szCallerId = new StringBuilder (20); //clear CallerId
ChInfo[nCh].szCalleeId = new StringBuilder (20); //clear CalledID
}
else if(nHook == 1) //station goes off-hook
{
switch(ChInfo[nCh].nStatus)
{
case APP_USER_STATUS.USER_IDLE:
ChInfo[nCh].szPhoneNumBuf = new StringBuilder (20);// char[20];
ChInfo[nCh].nStatus = APP_USER_STATUS.USER_GET_1STDTMF;
//clear DTMF buffer
if(ShDll.SsmClearRxDtmfBuf(nCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_IDLE", "SsmClearRxDtmfBuf");
}
//start T1: 7 seconds
if( (ChInfo[nCh].nTimer = ShDll.SsmStartTimer(7000, 1)) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_IDLE", "SsmStartTimer");
}
break;
case APP_USER_STATUS.USER_LOCAL_RING:
//stop ringing
if(ShDll.SsmStopRing(nCh) == -1)
{
ShowErrMsg("E_CHG_HookState", "USER_LOCAL_RING", "SsmStopRing");
}
ChInfo[nCh].nStatus = APP_USER_STATUS.USER_TALKING;
//send E_US_PICKUP
SendMessage(hwnd,WM_USER+(int)EventMsg.E_US_PICKUP, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
break;
default:
break;
}
}
break;
case (int)Event.E_CHG_RcvDTMF: //dtmf event is detected by station channel
dwDtmfLen = lParam >> 16;
int temp = lParam & 0xFFFF;
dwDtmfNum = (char)temp;//(lParam & 0xFFFF);
switch(ChInfo[nCh].nStatus)
{
case APP_USER_STATUS.USER_GET_1STDTMF:
//close T1
if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)
{
ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmStopTimer");
}
ChInfo[nCh].nTimer = -1;
//retrieve first DTMF
ChInfo[nCh].szPhoneNumBuf.Insert (dwDtmfLen-1,dwDtmfNum);//[dwDtmfLen-1] = dwDtmfNum;
switch(dwDtmfNum)
{
case '0':
ChInfo[nCh].szPhoneNumBuf = new StringBuilder (NUM_LENGTH);// char[NUM_LENGTH];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -