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

📄 gsm_ctrl_prjdlg.cpp

📁 tc35i(GSM模块)的控制程序VC源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GSM_Ctrl_PrjDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GSM_Ctrl_Prj.h"
#include "GSM_Ctrl_PrjDlg.h"
#include "ClueOnDlg.h"
#include "SCommDlg.h"
#include "Common.h"
#include "STMComShowThread.h"
#include "MsgThread.h"
#include <stdlib.h>
#include "afxmt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CEvent g_eventTM;
extern CEvent g_eventMsg;
CSTMComShowThread* g_pTMComProcess;
CMsgThread* g_pMsgComProcess;
SerialThread* g_pSerialProcess;
//extern CClueOnDlg clueDlg;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGSM_Ctrl_PrjDlg dialog
UINT CGSM_Ctrl_PrjDlg::m_ATCmdStatus = AT_FREE;
UINT CGSM_Ctrl_PrjDlg::m_ATCallStatus = AT_FREE;
UINT CGSM_Ctrl_PrjDlg::m_CallInCnt = 0;
CGSM_Ctrl_PrjDlg::CGSM_Ctrl_PrjDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGSM_Ctrl_PrjDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGSM_Ctrl_PrjDlg)
		// NOTE: the ClassWizard will add member initialization here
	m_pCurDlg = NULL;
	
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGSM_Ctrl_PrjDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGSM_Ctrl_PrjDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGSM_Ctrl_PrjDlg, CDialog)
	//{{AFX_MSG_MAP(CGSM_Ctrl_PrjDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_SCOMM, OnScomm)
	ON_COMMAND(ID_TELBOOK, OnTelbook)
	ON_COMMAND(ID_RECMBOX, OnRecmbox)
	ON_COMMAND(ID_SENDMBOX, OnSendmbox)
	ON_WM_TIMER()
	ON_COMMAND(ID_CALL, OnCall)
	ON_WM_DESTROY()
	ON_COMMAND(IDC_APPABOUT, OnAppabout)
	//}}AFX_MSG_MAP
	ON_MESSAGE(MSG_UPDATA,OnUpdataCommRpnsMsg)
	ON_MESSAGE(MSG_DLG_SWITCH,OnDlgSwitch)
	ON_MESSAGE(MSG_CALL_OR_MSG_IN,OnCallIn)
    ON_MESSAGE(MSG_CALL_OR_MSG_BACK,OnCallOrMsgBack)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGSM_Ctrl_PrjDlg message handlers

BOOL CGSM_Ctrl_PrjDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
//    CString  s="111";
//	int i=atoi(s);
	Init();

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CGSM_Ctrl_PrjDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CGSM_Ctrl_PrjDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CGSM_Ctrl_PrjDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


//ShellExecute(m_hWnd   ,NULL,"TEST1.CHM",NULL,NULL,1); 
LRESULT CGSM_Ctrl_PrjDlg::OnUpdataCommRpnsMsg(WPARAM wParam, LPARAM lParam){
	PTBYTE pByte = new TBYTE[read_buffer_length];
	PUINT pLen = new UINT;
	long len;
	switch(wParam){
	case UPDATAMSG_TYPE_COMM_OPEN:
		m_commStatus = TRUE;
		SetDlgItemText(IDC_SCOMMSTATUS,g_pSerialProcess->GetMsgStr(UPDATAMSG_TYPE_COMM_OPEN));
// 		g_pSerialProcess->SuspendThread();
		CATCmd::AT_Test();
		break;
	case UPDATAMSG_TYPE_COMM_OPEN_FAILED:
		SetDlgItemText(IDC_SCOMMSTATUS,g_pSerialProcess->GetMsgStr(UPDATAMSG_TYPE_COMM_OPEN_FAILED));

		break;
	case UPDATAMSG_TYPE_COMM_CLOSE:
		SetDlgItemText(IDC_SCOMMSTATUS,g_pSerialProcess->GetMsgStr(UPDATAMSG_TYPE_COMM_CLOSE));
// 		g_pSerialProcess->SuspendThread();
		m_commStatus = FALSE;
		break;
	case UPDATAMSG_TYPE_COMM_CLOSE_FAILED:
		SetDlgItemText(IDC_SCOMMSTATUS,g_pSerialProcess->GetMsgStr(UPDATAMSG_TYPE_COMM_CLOSE_FAILED));
// 		g_pSerialProcess->SuspendThread();
		break;
	case UPDATAMSG_TYPE_COMM_DATA_ARRIVE:
        g_pSerialProcess->ReadRpns(pByte,pLen);
		len = m_richEdit.GetTextLength();
	    m_richEdit.SetSel(len,len);
		pByte[*pLen]=0;
	    m_richEdit.ReplaceSel((LPCTSTR)pByte);
		m_richEdit.LineScroll(m_richEdit.GetLineCount()-5);
		Analyse(pByte,*pLen);	
		break;
	}
	delete(pByte);
	delete(pLen);
    return 0L;
}
LRESULT CGSM_Ctrl_PrjDlg::OnCallOrMsgBack(WPARAM wParam, LPARAM lParam){
	switch(wParam) {
	case BACK_MSG:
        OnSendmbox();
		if(m_pCurDlg == &m_sendMsgDlg)
		{
			if(lParam!=NULL)
			{
				m_sendMsgDlg.m_desTelNo = *(CString*)lParam;
			    m_sendMsgDlg.m_msgContent = "";
			    m_sendMsgDlg.UpdateData(false);
			}
		}
		break;
	case BACK_CALL:
		OnCall();
		if(m_pCurDlg == &m_callDlg)
		{
			if(lParam!=NULL)
			{
			    m_callDlg.m_desTelNo = *(CString*)lParam;
			    m_callDlg.UpdateData(false);
			}
		}
		//m_callDlg.GetDlgItem(ID_)
		break;
	default:
		break;
	}
	return 0L;
}
void CGSM_Ctrl_PrjDlg::Analyse(PTBYTE pByte,UINT len){
	CString tempStr(pByte);
		//来电呼叫
	int start;
	int end ;
	CString showStr;
	CClueOnDlg clueDlg;
	SM_PARAM sm_para;
	// CATCmd::AT_ReadMsg(5);
	//首先判断是否新信息到来
	if(tempStr.Find("+CMTI:") >= 0)//收到短消息
	{
		start = tempStr.Find(',');
		end = tempStr.ReverseFind('\r');
		if((start >= 0) && (end >= 0))
		{
			//取出短信在sim卡中的索引值
			tempStr = tempStr.Mid(start+1,end-start);
			CATCmd::AT_ReadMsg(atoi(tempStr));
			m_msgIndexStr = tempStr;
		}
	}else if(tempStr.Find("+CMGR:") >= 0)
	{
		start = tempStr.Find("+CMGR:");
		tempStr = tempStr.Mid(start,tempStr.GetLength()-start);
		
		start = tempStr.GetLength();
		start = strlen(tempStr);

		start = tempStr.Find('\n');
		end = tempStr.ReverseFind('\r');
		if((start >= 0) && (end >= 0))
		{
			//取出短信在sim卡中的索引值
			tempStr = tempStr.Mid(start+1,end-start);
		    CATCmd::AT_MsgDecode(tempStr,&sm_para);
			m_receiveMsgMBoxDlg.SetSaveStr(sm_para.TP_UD,sm_para.TP_SCTS,sm_para.TPA);
			m_receiveMsgMBoxDlg.PostMessage(MSG_SAVE_SHORT_MSG,0,0L);
			g_pMsgComProcess->SetShowMsg(sm_para.TP_UD,sm_para.TP_SCTS,sm_para.TPA);
			CATCmd::AT_DelMsg(atoi(m_msgIndexStr));
			
		    if(!g_pMsgComProcess->IsDlgShow())
			{
			    g_eventMsg.SetEvent();
                    
			}
		}
		
	}

	switch(m_ATCallStatus) {
	case AT_FREE:      
		if(tempStr.Find("CLIP") >= 0){
			//m_ATCallStatus = AT_CALLIN;
			start = tempStr.Find('\"');
			end = tempStr.ReverseFind('\"');
			if((start >= 0) && (end >= 0))
			{
				tempStr = tempStr.Mid(start,end-start);
				showStr = "有来电,自: " ;
				showStr += tempStr;
                
				m_ATCallStatus = AT_CALLIN;
				m_CallInCnt++;
				SetTimer(2,5000,NULL);
//				if(CClueOnDlg::m_isShow)
//				    clueDlg.SetDlgItemText(IDC_TELCLUE,showStr);
//				else
				g_pTMComProcess->SetShowMsg(showStr);
				if(!g_pTMComProcess->IsDlgShow())
				{
					g_eventTM.SetEvent();
                    
				}else	
				{
					g_pTMComProcess->EnableDlgOK(true);
				}
				

			}
        
		}
		break;
	case AT_CALLIN://在来电情况下,如果收到“OK”和"ATH"说明本机执行挂断
        if ((tempStr.Find("OK")>=0)&&(tempStr.Find("ATH")>=0))
		{
			m_ATCallStatus = AT_FREE;
			KillTimer(2);
		}
		//在来电情况下,如果收到“OK”和"ATA"说明本机执行接听
		if((tempStr.Find("OK")>=0)&&(tempStr.Find("ATA")>=0))
		{
		    m_ATCallStatus = AT_ACCEPT;
			g_pTMComProcess->SetShowMsg("通话中...");
			g_pTMComProcess->EnableDlgOK(false);
			KillTimer(2);
		}
		if(tempStr.Find("CLIP") >= 0){
		    start = tempStr.Find("\"");
			end = tempStr.ReverseFind('\"');
			if((start >= 0) && (end >= 0))
			{
				m_CallInCnt++;
			}
		}
		break;
	case AT_ACCEPT://在接听情况下,如果收到“OK”和"ATH"说明本机执行挂断
		if ((tempStr.Find("OK")>=0)&&(tempStr.Find("ATH")))
		{
			m_ATCallStatus = AT_FREE;
		}
		//在接听情况下,如果收到“OK”和"CARRIER"说明对方执行挂断
		if ((tempStr.Find("NO")>=0)&&(tempStr.Find("CARRIER")))
		{
			m_ATCallStatus = AT_FREE;
			//SendMessage(MSG_CALL_OR_MSG_IN,CALL_HUNGUP,0L);
			g_pTMComProcess->SetShowMsg("对方已挂机");
		}
	default:
		break;
	}
	
	switch(m_ATCmdStatus)
    {
	case AT_SEND_MSG_STEP0:
		if (tempStr.Find("OK")>=0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -