⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsk_event_vcdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -