www.pudn.com > GSMTest1.rar > TransJS.cpp


// TransJS.cpp : implementation file 
//变压器监视界面 
 
#include "stdafx.h" 
#include "GSMTest.h" 
#include "TransJS.h" 
#include "QueryDlg.h" 
#include "pdu.h" 
#include "winsock.h" 
#include  
#include "database.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CTransJS dialog 
 
 
CTransJS::CTransJS(CWnd* pParent /*=NULL*/) 
	: CDialog(CTransJS::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CTransJS) 
	m_sCurTime = _T(""); 
	m_sStatus1 = _T(""); 
	m_sStatus2 = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void CTransJS::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CTransJS) 
	DDX_Control(pDX, IDC_TRANS_LIST, m_ctrTrans); 
	DDX_Text(pDX, IDC_CUR_TIME, m_sCurTime); 
	DDX_Text(pDX, IDC_STATUS1, m_sStatus1); 
	DDX_Text(pDX, IDC_STATUS, m_sStatus2); 
	DDX_Control(pDX, IDC_GSMCOMM, m_ctrGsm); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CTransJS, CDialog) 
	//{{AFX_MSG_MAP(CTransJS) 
	ON_BN_CLICKED(IDC_REFRESH, OnRefresh) 
	ON_BN_CLICKED(IDC_QUERY_BUTTON, OnQuery) 
	ON_BN_CLICKED(IDC_CHECK, OnCheck) 
	ON_WM_PAINT() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_CFG_STAND, OnCfgStand) 
	ON_BN_CLICKED(IDC_PRE_PAGE, OnPrePage) 
	ON_BN_CLICKED(IDC_NEXT_PAGE, OnNextPage) 
	ON_BN_CLICKED(IDC_START2, OnStart) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
  
 
///////////////////////////////////////////////////////////////////////////// 
// CTransJS message handlers 
 
BOOL CTransJS::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	ShowWindow(SW_MAXIMIZE); 
 
	//设置控件大小,位置等. 
	CRect rcClient; 
	GetWindowRect(&rcClient); 
	int cx = rcClient.Width(); 
	int cy = rcClient.Height(); 
 
	GetDlgItem(IDC_TRANS_LIST)->MoveWindow(120,20,cx-150,cy-200,true); 
	GetDlgItem(IDC_FOOTER)->MoveWindow(0,cy-60,300,20,TRUE); 
	GetDlgItem(IDC_PRE_PAGE)->MoveWindow(350,cy-60,50,20,TRUE); 
	GetDlgItem(IDC_NEXT_PAGE)->MoveWindow(450,cy-60,50,20,TRUE); 
	GetDlgItem(IDC_CUR_TIME)->MoveWindow(650,cy-60,180,20,TRUE); 
	// TODO: Add extra initialization here 
	m_nNumofPage=5; 
	m_nCurPage=1; 
	GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); 
    m_ctrTrans.InsertColumn(0,"ID",LVCFMT_CENTER,30,0); 
	m_ctrTrans.InsertColumn(1,"变压器TEL",LVCFMT_CENTER,120,1);	 
	m_ctrTrans.InsertColumn(2,"电流(A相)",LVCFMT_LEFT,80,2); 
	m_ctrTrans.InsertColumn(3,"电流(B相)",LVCFMT_LEFT,80,2); 
	m_ctrTrans.InsertColumn(4,"电流(C相)",LVCFMT_LEFT,80,2); 
	m_ctrTrans.InsertColumn(5,"电压(A相)",LVCFMT_LEFT,80,3); 
	m_ctrTrans.InsertColumn(6,"电压(B相)",LVCFMT_LEFT,80,3); 
	m_ctrTrans.InsertColumn(7,"电压(C相)",LVCFMT_LEFT,80,3); 
	m_ctrTrans.InsertColumn(8,"功率因数",LVCFMT_LEFT,80,4); 
	m_ctrTrans.InsertColumn(9,"三相功率",LVCFMT_LEFT,100,5); 
	m_ctrTrans.InsertColumn(10,"温度",LVCFMT_LEFT,50,6); 
	m_ctrTrans.InsertColumn(11,"状态",LVCFMT_CENTER,50,6); 
 
	m_ctrTrans.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES); 
	ShowTrans(); 
	 
	OnStart(); //{AfxMessageBox("监控系统启动失败!");CDialog::OnCancel();} 
 
	SetTimer(1,1000,NULL);//时间显示 
	SetTimer(2,5000,NULL);//定时检查短信 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CTransJS::ShowTrans() 
{ 
	CDatabase database; 
	 
	try 
	{	 
		database.ConnectDB(); 
		//AfxMessageBox("连接服务器成功!");			 
		 
		CString charset="set charset gb2312;";//使之正常显示中文,或用set character_set_results=gb2312; 
		database.ExecuteSQL(charset,charset.GetLength());//执行语句. 
		 
 
		CString limit; 
		limit.Format("trans_info limit %d,%d",(m_nCurPage-1)*m_nNumofPage,m_nCurPage*m_nNumofPage); 
		Data_Param result;		 
		 
		result.tab_name=limit.GetBuffer(40); 
		result.select_exp="trans_id,trans_TEL,Ia,Ib,Ic,Ua,Ub,Uc,F,Temp,remark"; 
		 
		if(database.SelectAll(&result)) 
		{ 
			int count=(int)database.GetRowNum(); 
			if(count<=0) 
			{ 
				m_nCurPage-=1; 
				GetDlgItem(IDC_NEXT_PAGE)->EnableWindow(FALSE); 
				return; 
			} 
			else 
			{ 
				m_ctrTrans.DeleteAllItems(); 
				GetDlgItem(IDC_PRE_PAGE)->EnableWindow(TRUE); 
			} 
 
			CImageList list; 
			list.Create(IDB_NORMAL,16, 1, RGB(255, 0, 255)); 
			for(int i=0;iGetWindowRect(rect); 
	ScreenToClient(&rect); 
	//dc.FillSolidRect(rect,RGB(150,210,240)); 
	dc.DrawText("重庆大学电工技术研究所,重庆..科技有限公司",&rect,DT_CENTER|DT_BOTTOM); 
	 
	dc.SelectObject(pOldFont);	 
	// Do not call CDialog::OnPaint() for painting messages 
} 
#include "alarmdlg.h" 
void CTransJS::OnTimer(UINT nIDEvent)  
{ 
	if(nIDEvent==1) 
	{ 
		CTime time=CTime::GetCurrentTime(); 
		m_sCurTime=time.Format("%Y年%m月%d日 %H:%M:%S"); 
		UpdateData(FALSE);	 
	} 
	if(nIDEvent==2) 
	{ 
		DecodeData(); 
	} 
	 
	CDialog::OnTimer(nIDEvent); 
} 
#include "standdlg.h" 
void CTransJS::OnCfgStand() //设置标准 
{ 
	 
	//检查变压器状态 
	POSITION pos = m_ctrTrans.GetFirstSelectedItemPosition();	 
	if (pos == NULL) 
	{ 
		AfxMessageBox("请选择变压器!"); 
		return; 
	} 
	int nItem =m_ctrTrans.GetNextSelectedItem(pos); 
 
	CStandDlg dlg; 
	dlg.m_sTransID=m_ctrTrans.GetItemText(nItem,0); 
	dlg.DoModal(); 
} 
 
void CTransJS::OnPrePage() //向前翻页 
{ 
	if(m_nCurPage==1) 
	{ 
		GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); 
		return; 
	} 
	m_nCurPage-=1; 
	GetDlgItem(IDC_NEXT_PAGE)->EnableWindow(TRUE); 
	ShowTrans(); 
} 
 
void CTransJS::OnNextPage() //向后翻页 
{ 
	m_nCurPage+=1; 
	//GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); 
	ShowTrans(); 
} 
 
BOOL CTransJS::OnStart() 
{ 
	try 
	{ 
		if(!InitCom())  
			return FALSE; 
		m_sStatus2=""; 
		m_ctrGsm.SetOutput(COleVariant("AT\r"));	 
		Sleep(1000); 
		OnOnCommGsmcomm(); 
		m_ctrGsm.SetOutput(COleVariant("AT+CNMI=2,2,0,1,1\r")); 
		m_ctrGsm.SetOutput(COleVariant("AT+CMGF=1\r")); 
		//得到SIM卡基本信息 
		//短信中心 
		//卡号 
		m_sStatus2=""; 
		if(m_sStatus1.Find("OK")>=0) 
		{m_sStatus1="连接成功";UpdateData(FALSE);return TRUE;} 
		else {m_sStatus1="连接失败";UpdateData(FALSE);return FALSE;} 
	} 
	catch (...)  
	{ 
		//AfxMessageBox(ex.what()); 
		return FALSE; 
	} 
} 
 
BEGIN_EVENTSINK_MAP(CTransJS, CDialog) 
    //{{AFX_EVENTSINK_MAP(CTransJS) 
	ON_EVENT(CTransJS, IDC_GSMCOMM, 1 /* OnComm */, OnOnCommGsmcomm, VTS_NONE) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
void CTransJS::OnOnCommGsmcomm()  
{ 
	VARIANT variant_inp; 
	COleSafeArray safearray_inp; 
	LONG len,k; 
	BYTE rxdata[2048]; 
	CString strtemp; 
	 
	switch(m_ctrGsm.GetCommEvent())  
	{ 
	case 1: //comEvSend发送数据 
		break; 
	case 2: //comEvReceive读取数据 
		variant_inp=m_ctrGsm.GetInput();//读缓冲区 
		safearray_inp=variant_inp;//VARIANT型变量转换为COleSafeArray型变量 
		len=safearray_inp.GetOneDimSize();//得到有效数据长度 
		//接收数据		 
		for(k=0;k=0) 
			m_sStatus1="成功"; 
		UpdateData(FALSE);//回显	 
		 
		break; 
	default: 
		m_ctrGsm.SetOutBufferCount(0); 
		break; 
	}	 
} 
 
BOOL CTransJS::InitCom() 
{ 
	if (m_ctrGsm.GetPortOpen())  
		m_ctrGsm.SetPortOpen(false);//如果是打开的,则先关闭串口 
	 
	 
	m_ctrGsm.SetCommPort(1); //选择COM1 
	m_ctrGsm.SetInBufferSize(1024);//设置输入缓冲区大小 
	m_ctrGsm.SetOutBufferSize(1024);//设置输出缓冲区大小 
	m_ctrGsm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取 
	m_ctrGsm.SetInputMode(1);//以二进制方式读写数据 
	m_ctrGsm.SetRThreshold(1);//当接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件 
	m_ctrGsm.SetSettings("9600,n,8,1");//波特率9600,无校验位,8个数据位,1个停止位 
	 
	if(!m_ctrGsm.GetPortOpen()) 
		m_ctrGsm.SetPortOpen(TRUE); 
	else 
		m_ctrGsm.SetInBufferCount(0); 
	 
	 
	//	SetTimer(1,10,NULL); 
	//	InBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; 
	//	OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; 
	//	OutBuffer.vt=VT_BSTR; 
	 
	 
	 
	//m_ctrGsm.SetCommPort(1);//设置为com1 
	 
	//	m_ctrGsm.SetOutput(COleVariant("AT\r")); 
	 
	return true;	 
} 
 
 
void CTransJS::DecodeData() 
{ 
	UpdateData(TRUE); //赋值 
	if(m_sStatus2.Find("+CMT:")>=0)//处理消息内容 
	{ 
 
		PDU p; 
		int index=m_sStatus2.Find("+CMT:"); 
 
		CString str=m_sStatus2.Mid(index); 
		index=str.Find("\r"); 
		string content=str.Mid(index+2); 
		 
		 
		string strTime=p.GetDataTime(content); 
		string strNum=p.GetTelphone(content).substr(2); 
		CString sAlarm; 
		sAlarm.Format("时间:%s\r\n",strTime.c_str()); 
		string strCont; 
		if(p.IsPDU(content)) 
			strCont=p.GetContent(content); 
		else 
			strCont=p.GetTextContent(content); 
		 
		sAlarm+=str; 
		str.Format("内容:%s",strCont.c_str()); 
 
		 
		if(str.Find("lost")>=0) 
		{ 
			CAlarmDlg dlg; 
			dlg.m_sContent=m_sStatus2; 
			m_sStatus2=""; 
			UpdateData(FALSE); 
			dlg.DoModal(); 
		} 
		 
	} 
}