📄 fsk_event_vcdlg.cpp
字号:
int nEventCode;
int nNewState;
int nCheckResult;
//Adopt windows message mechanism
// windows message code:event code + 0x0400(WM_USER)
if(message > WM_USER)
{
nEventCode = message - WM_USER;
nCh = wParam;
switch(nEventCode)
{
case E_CHG_RcvDTMF:
{
cNewDtmf = (char)lParam & 0xFFFF; //Newly received DTMF
ChInfo[nCh].szDTMF[ChInfo[nCh].nIndex++] = cNewDtmf;
if(cNewDtmf == '*') //Send FSK
{
if(ChInfo[nCh].nChState == TRK_TALKING)
{
Sleep(5000);
SendFSK(m_nRcvFSKMode, nCh);
ChInfo[nCh].nChState = TRK_CHECK_SEND;
}
}
else if(cNewDtmf == '#') //Receive FSK
{
if(ChInfo[nCh].nChState == TRK_TALKING)
{
ReceiveFSK(m_nRcvFSKMode, nCh);
ChInfo[nCh].nChState = TRK_CHECK_RCV;
}
}
}
break;
case E_CHG_ChState:
{
nNewState = (int)lParam & 0xFFFF; //The new state
switch(nNewState)
{
case S_CALL_RINGING: //Ringing
if(ChInfo[nCh].nChState == TRK_IDLE)
{
if(SsmPickup(nCh) == -1)
MessageBox("Fail to call SsmPickup");
if(ChInfo[nCh].nLinkToCh == -1) //Not self-loop test
ChInfo[nCh].nChState = TRK_TALKING;
else
ChInfo[nCh].nChState = TRK_CONNECT;
}
break;
case S_CALL_PENDING: //Remote hangup
switch(ChInfo[nCh].nChState)
{
case TRK_TALKING:
ClearUp(nCh);
break;
case TRK_CHECK_RCV:
if(SsmStopRcvFSK(nCh) == -1)
MessageBox("Fail to call SsmStopRcvFSK");
if(SsmClearRcvFSKBuf(nCh) == -1)
MessageBox("Fail to call SsmClearRcvFSKBuf");
ClearUp(nCh);
break;
case TRK_CHECK_SEND:
if(SsmStopSendFsk(nCh) == -1)
MessageBox("Fail to call SsmStopSendFsk");
ClearUp(nCh);
break;
}
break;
case S_CALL_STANDBY: //Idle
if(ChInfo[nCh].nChState == USER_WAIT_HANGUP)
ChInfo[nCh].nChState = USER_IDLE;
break;
case S_CALL_PICKUPED: //Picked up
if(ChInfo[nCh].nChState == USER_IDLE)
{
ReceiveFSK(m_nRcvFSKMode, nCh);
if(ChInfo[nCh].nLinkToCh != -1)
SendMessage(WM_USER+E_MSG_PICKUP_RCV, ChInfo[nCh].nLinkToCh, 0);
ChInfo[nCh].nChState = USER_CHK_RCV;
}
break;
}
}
break;
case E_MSG_AUTODIAL:
{
if(ChInfo[nCh].nChState == TRK_IDLE)
{
if(SsmPickup(nCh) == -1)
MessageBox("Fail to call SsmPickup");
if(SsmAutoDial(nCh, ChInfo[nCh].szPhoNum) == -1)
MessageBox("Fail to call SsmAutoDial");
ChInfo[nCh].nChState = TRK_CHECK_DIAL;
}
}
break;
case E_MSG_START:
{
if(ChInfo[nCh].nChState == TRK_IDLE)
{
ChInfo[nCh].nSelfFlag = 1; //Self-loop test
if(SsmPickup(nCh) == -1)
MessageBox("Fail to call SsmPickup");
if(SsmAutoDial(nCh, ChInfo[nCh].szPhoNum) == -1)
MessageBox("Fail to call SsmAutoDial");
ChInfo[nCh].nChState = TRK_CHECK_DIAL;
}
}
break;
case E_PROC_AutoDial: //Check the result of autodial
{
if(ChInfo[nCh].nChState == TRK_CHECK_DIAL)
{
nCheckResult = lParam; //The result of autodial
if(nCheckResult == 2 || nCheckResult == 7) //Ringback tone detected or called-party is off-hook
{
if(ChInfo[nCh].nSelfFlag == 1)
{
ChInfo[nCh].nChState = TRK_TALKING;
SendMessage(WM_USER+E_MSG_CONNECT, ChInfo[nCh].nLinkToCh, 0);
}
else
ChInfo[nCh].nChState = TRK_TALKING;
}
else if(nCheckResult != 1)//Dial failed
{
ClearUp(nCh);
}
}
}
break;
case E_MSG_CONNECT:
{
if(ChInfo[nCh].nChState = TRK_CONNECT)
{
SendMessage(WM_USER+E_MSG_RCV, ChInfo[nCh].nLinkToCh, 0);
ReceiveFSK(m_nRcvFSKMode, nCh);
ChInfo[nCh].nChState = TRK_CHECK_RCV;
}
}
break;
case E_MSG_RCV:
{
if(ChInfo[nCh].nChState == TRK_TALKING)
{
SendFSK(m_nRcvFSKMode, nCh);
ChInfo[nCh].nChState = TRK_CHECK_SEND;
}
}
break;
case E_MSG_HANGUP:
if(ChInfo[nCh].nChState == TRK_TALKING)
ClearUp(nCh);
break;
case E_PROC_SendFSK:
if(ChInfo[nCh].nChState == TRK_CHECK_SEND)
ChInfo[nCh].nChState = TRK_TALKING;
else if(ChInfo[nCh].nChState == TRK_CHK_SEND)
ChInfo[nCh].nChState = TRK_USER_RCV_END;
break;
case E_PROC_RcvFSK:
//Task ends upon reception of specific termination characters
if((m_nRcvFSKMode == RcvFSK_I) && (lParam == 2))
{
//CHS:取得收到的数据内容和长度
//ENG:Obtain received data content and length
nDataLen = SsmGetRcvFSK(nCh, (PUCHAR)szBuf);
if(nDataLen == -1)
MessageBox("Fail to call SsmGetRcvFSK");
szBuf[nDataLen] = 0;
SetDlgItemText(IDC_EDIT_RCV_DATA, szBuf);
SetDlgItemInt(IDC_EDIT_RCVD_BYTES, nDataLen);
}
//Task ends upon reception of characters of specific data format
else if((m_nRcvFSKMode == RcvFSK_II) && (lParam == 4))
{
nDataLen = SsmGetRcvFSK(nCh, (PUCHAR)szBuf);
if(nDataLen == -1)
MessageBox("Fail to call SsmGetRcvFSK");
szTemp = szBuf+2;
SetDlgItemText(IDC_EDIT_RCV_DATA, szTemp);
SetDlgItemInt(IDC_EDIT_RCVD_BYTES, nDataLen - 3);
}
//Clean FSK receiving buffer
if(SsmClearRcvFSKBuf(nCh) == -1)
MessageBox("Fail to call SsmClearRcvFSKBuf");
SetDlgItemInt(IDC_EDIT_RCVING_STATUS, lParam);
if(ChInfo[nCh].nChState == TRK_CHECK_RCV)
{
if(ChInfo[ChInfo[nCh].nLinkToCh].nSelfFlag == 0)
ChInfo[nCh].nChState = TRK_TALKING;
else
{
ClearUp(nCh);
SendMessage(WM_USER+E_MSG_HANGUP, ChInfo[nCh].nLinkToCh, 0);
}
}
else if(ChInfo[nCh].nChState == USER_CHK_RCV)
{
SendMessage(WM_USER+E_MSG_RCV_END, ChInfo[nCh].nLinkToCh, 0);
ChInfo[nCh].nChState = USER_WAIT_HANGUP;
}
break;
case E_MSG_TRK_START:
if(ChInfo[nCh].nChState == TRK_IDLE)
{
if(SsmPickup(nCh) == -1)
MessageBox("Fail to call SsmPickup");
ChInfo[nCh].nChState = TRK_PICKUP;
}
break;
case E_MSG_PICKUP_RCV:
if(ChInfo[nCh].nLinkToCh != -1)
{
SendFSK(m_nRcvFSKMode, nCh);
ChInfo[nCh].nChState = TRK_CHK_SEND;
}
break;
case E_MSG_RCV_END:
ClearUp(nCh);
break;
}//end of switch nEventCode
UpdateChListCtrl();
}
return CDialog::WindowProc(message, wParam, lParam);
}
//Dial out
void CFSK_Event_VCDlg::OnButtonAutoDial()
{
// TODO: Add your control notification handler code here
int nCh;
nCh = GetDlgItemInt(IDC_EDIT_CH);
GetDlgItemText(IDC_EDIT_PHO_NUM, ChInfo[nCh].szPhoNum, 20);
SendMessage(WM_USER+E_MSG_AUTODIAL, nCh, 0);
}
//Self-loop test
void CFSK_Event_VCDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
int nCh;
int nCheck;
nCh = GetDlgItemInt(IDC_EDIT_SEND_CH);
ChInfo[nCh].nLinkToCh = GetDlgItemInt(IDC_EDIT_RCV_CH);
ChInfo[ChInfo[nCh].nLinkToCh].nLinkToCh = nCh;
nCheck = SsmGetChType(ChInfo[nCh].nLinkToCh);
if(nCheck == -1)
MessageBox("Fail to call SsmGetChType");
else if(nCheck == 2) //Station channel
SendMessage(WM_USER+E_MSG_TRK_START, nCh, 0);
else
{
GetDlgItemText(IDC_EDIT_PHO_NUM, ChInfo[nCh].szPhoNum, 20);
SendMessage(WM_USER+E_MSG_START, nCh, 0);
}
}
//Zero-Stripping
void CFSK_Event_VCDlg::ClearUp(int nCh)
{
if(SsmHangup(nCh) == -1)
MessageBox("Fail to call SsmHangup");
if(ChInfo[nCh].nLinkToCh != -1)
{
ChInfo[nCh].nSelfFlag = 0;
ChInfo[ChInfo[nCh].nLinkToCh].nSelfFlag = 0;
ChInfo[ChInfo[nCh].nLinkToCh].nLinkToCh = -1;
ChInfo[nCh].nLinkToCh = -1;
}
ChInfo[nCh].nChState = TRK_IDLE;
}
//Receiving FSK
void CFSK_Event_VCDlg::ReceiveFSK(int nRcvMode, int nCh)
{
char sz[2] = {'F'};
if(nRcvMode == RcvFSK_I)
{
if(SsmStartRcvFSK(nCh, 60000, 255, 'F', 3) == -1)
MessageBox("Fail to call SsmStartRcvFSK");
}
else if(nRcvMode == RcvFSK_II)
{
if(SsmStartRcvFSK_II(nCh, 60000, 255, (PUCHAR)sz, 3) == -1)
MessageBox("Fail to call SsmStartRcvFSK_II");
}
}
//Sending FSK
void CFSK_Event_VCDlg::SendFSK(int nSendMode, int nCh)
{
char str[260];
char szTemp[5000];
int nLen;
int nMaxBit;
if(nSendMode == RcvFSK_I)
{
//FSK accepts only data no longer than 255 bytes,
// with the last three bytes being termination characters.
// Sends a maximum of 252 effective characters
GetDlgItemText(IDC_EDIT_SEND_DATA, str, 252);
nLen = strlen(str);
if(nLen == 0)
{
MessageBox("No data to be sent. Please input data");
return;
}
str[nLen] = 'F';
str[nLen+1] = 'F';
str[nLen+2] = 'F';
str[nLen+3] = '\0';
//Modulate FSK data
nMaxBit = SsmTransFskData((unsigned char *)str, nLen+3, 12*8, 2*8, (unsigned char *)szTemp);
if(nMaxBit == -1)
MessageBox("Fail to call SsmTransFskData");
//Activate sending of FSK
if(SsmStartSendFSK(nCh, szTemp, (DWORD)nMaxBit) == -1)
MessageBox("Fail to call SsmStartSendFSK");
SetDlgItemInt(IDC_EDIT_SENT_BYTES, nLen);
}
else if(nSendMode == RcvFSK_II)
{
GetDlgItemText(IDC_EDIT_SEND_DATA, str+2, 252);
nLen = strlen(str+2);
if(nLen == 0)
{
MessageBox("No data to be sent. Please input data");
return;
}
str[0] = 'F';
str[1] = nLen;
str[nLen+2] = '\0';
nMaxBit = SsmTransFskData((unsigned char *)str, nLen+3, 12*8, 2*8, (unsigned char *)szTemp);
if(nMaxBit == -1)
MessageBox("Fail to call SsmTransFskData");
if(SsmStartSendFSK(nCh, szTemp, (DWORD)nMaxBit) == -1)
MessageBox("Fail to call SsmStartSendFSK");
SetDlgItemInt(IDC_EDIT_SENT_BYTES, nLen);
}
}
void CFSK_Event_VCDlg::OnRadioI()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
}
void CFSK_Event_VCDlg::OnRadioIi()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
}
void CFSK_Event_VCDlg::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -