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

📄 faketolcanview.cpp

📁 功能主要是串口通信和网络通信方面的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// FakeTolcanView.cpp : implementation of the CFakeTolcanView class
//

#include "stdafx.h"
#include "FakeTolcan.h"

#include "FakeTolcanDoc.h"
#include "FakeTolcanView.h"
#include "PackInfo.h"
#include "SerialPortConfig.h"
#include "ADOConn.h"
//#include <WinSock2.h>
//#pragma comment(lib, "Ws2_32.lib")
#include "NodeInfoDlg.h"
#include <io.h>
#define DATA_FILE _T("ParamInfo.dat")
#include "ServerDlg.h"
#include "SetDataDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DWORD CFakeTolcanView::m_dwPackNo = 0;

/////////////////////////////////////////////////////////////////////////////
// CFakeTolcanView

IMPLEMENT_DYNCREATE(CFakeTolcanView, CFormView)

BEGIN_MESSAGE_MAP(CFakeTolcanView, CFormView)
	//{{AFX_MSG_MAP(CFakeTolcanView)
	ON_MESSAGE(WM_COMM_RXCHAR, OnComm)
	ON_COMMAND(IDM_CONFIG_SERIAL_PORT, OnConfigSerialPort)
	ON_COMMAND(IDM_PACK_INFO_CONFIG, OnPackInfoConfig)
	ON_BN_CLICKED(IDC_BTN_SAVE, OnBtnSave)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_TIMER()
	ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickNodeList)
	ON_COMMAND(IDM_ADD_NODE, OnAddNode)
	ON_COMMAND(IDM_DELETE_NODE, OnDeleteNode)
	ON_COMMAND(IDM_MODIFY_NODE, OnModifyNode)
	ON_UPDATE_COMMAND_UI(IDM_ADD_NODE, OnUpdateAddNode)
	ON_UPDATE_COMMAND_UI(IDM_DELETE_NODE, OnUpdateDeleteNode)
	ON_UPDATE_COMMAND_UI(IDM_MODIFY_NODE, OnUpdateModifyNode)
	ON_BN_CLICKED(IDC_BTN_ADD_NODE, OnBtnAddNode)
	ON_BN_CLICKED(IDC_BTN_DELETE_ALL_NODES, OnBtnDeleteAllNodes)
	ON_BN_CLICKED(IDC_BTN_CLERAR_RECVDATA, OnBtnClerarRecvdata)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkNodeList)
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	ON_COMMAND(IDC_NET_WORK_CONFIG, OnNetWorkConfig)
	ON_BN_CLICKED(IDC_BTN_START_SERVICE, OnBtnStartService)
	ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)
	ON_BN_CLICKED(IDC_BTN_MODIFY_NODE, OnBtnModifyNode)
	ON_BN_CLICKED(IDC_BTN_DELETE_NODE, OnBtnDeleteNode)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_VALIDATE, OnEndLabelEditVariableCriteria)
	ON_MESSAGE(WM_SET_ITEMS, PopulateComboList)
	ON_MESSAGE(WM_VALIDATE_EDIT, OnEndItemEdit)
//	ON_MESSAGE(WM_RECVDATA, OnRecvData)
	ON_MESSAGE(WM_SOCKET, OnSocket)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFakeTolcanView construction/destruction

CFakeTolcanView::CFakeTolcanView()
	: CFormView(CFakeTolcanView::IDD)
{
	//{{AFX_DATA_INIT(CFakeTolcanView)
	m_strCmd = _T("");
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	m_nBaud=115200;
	m_nCom=1;
	m_cParity='N';
	m_nDatabits=8;
	m_nStopbits=1;
	m_nBufferSize = 1024;
	m_bConfig = FALSE;
	m_bPortOpened = FALSE;
	m_bClosePort = FALSE;
	
	m_iIndex = -1;
	m_NodeNum = 0;
	m_strRecvData = _T("");
	m_dwPackId = 0x19891009;
	m_PackType = 0;
	m_PackCheck = 0;
	m_PackInterval = 1000;
	m_PackHeadLen = 128;
	m_DataLen = 0;
	m_NodeType = 0;
	m_BaseVal = 10;
	m_Bound = 2;
	m_Max = 3900;
	m_Min = 0;
	m_Step = 100;
	m_bNodeChange = FALSE;
	m_strNodeInfo = "";
	m_iItem = -1;
	m_bCollectData = FALSE;
	m_nCollectCmd = 0;

	m_nCollectNum = 0;
	m_bCollectFirst = TRUE;
	m_SampleDot = 0;
	m_SVal = 0;
	m_iNodeNum = 0;
	m_bModifyNode = FALSE;
	m_FirstValue = 0;

	m_PumpBaseValue = 0;
	m_PumpBound = 0;
	m_PumpDot = 0;
	m_iPort = 6000;
	m_bSP = FALSE;
	m_bNW = FALSE;
	m_nClient = 0;
	m_socket = INVALID_SOCKET;
	m_CurrenVal = 0;
}

CFakeTolcanView::~CFakeTolcanView()
{
//	DeleteCriticalSection(&g_csA);
}

void CFakeTolcanView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFakeTolcanView)
	DDX_Control(pDX, IDC_LIST1, m_NodeList);
	DDX_Text(pDX, IDC_EDIT_RECV_DATA, m_strCmd);
	//}}AFX_DATA_MAP
}

BOOL CFakeTolcanView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CFormView::PreCreateWindow(cs);
}

void CFakeTolcanView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	CenterWindow(GetDesktopWindow());
	LoadParamInfo();
	SetWinchCurrentData();
	m_NodeNoArray.RemoveAll();

	if(m_SerialPort.InitPort(this,m_nCom, m_nBaud,m_cParity,\
		m_nDatabits,m_nStopbits,EV_RXFLAG | EV_RXCHAR,m_nBufferSize))
	{
		m_SerialPort.StartMonitoring();
		m_bPortOpened = TRUE;
	}
	else
	{
		AfxMessageBox("没有发现此串口或被占用");
		m_bPortOpened = FALSE;
	}
		
	m_NodeList.InsertColumn(0, "节点标识", LVCFMT_CENTER, 60);//LVCFMT_LEFT
	m_NodeList.InsertColumn(1, "节点编号", LVCFMT_CENTER, 60);
	m_NodeList.InsertColumn(2, "生产月数", LVCFMT_CENTER, 60);
	m_NodeList.InsertColumn(3, "节点分类", LVCFMT_CENTER, 90);
	m_NodeList.InsertColumn(4, "字节数/道", LVCFMT_CENTER, 70);
	m_NodeList.InsertColumn(5, "节点序号", LVCFMT_CENTER, 60);
	m_NodeList.InsertColumn(6, "小采间隔(ms)", LVCFMT_CENTER, 90);
	m_NodeList.InsertColumn(7, "大采间隔(ms)", LVCFMT_CENTER, 90);
	m_NodeList.InsertColumn(8, "节点使用道数", LVCFMT_CENTER, 90);
	m_NodeList.InsertItem(0,0);

	CString strValidChars;//	
//	m_NodeList.SetReadOnlyColumns(0);//read only
	m_NodeList.SetReadOnlyColumns(5);//read only
	
	strValidChars = "";
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,1);//none control edit 
	
	strValidChars = "0123456789.";
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,0);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,1);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,2);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,4);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,6);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,7);//digital only edit	
	m_NodeList.SetColumnValidEditCtrlCharacters(strValidChars,8);//digital only edit	
	
	m_NodeList.SetComboColumns(3,TRUE);
//	m_NodeList.SetReadOnlyColumns(3);
	m_NodeList.EnableVScroll(); 			
	m_NodeList.ModifyStyle(0,LVS_REPORT);
	m_NodeList.ModifyStyle(0,LVS_SHOWSELALWAYS);
	m_NodeList.SetExtendedStyle(LVS_EX_FLATSB
		|LVS_EX_FULLROWSELECT
		|LVS_EX_HEADERDRAGDROP
		|LVS_EX_ONECLICKACTIVATE
		|LVS_EX_TWOCLICKACTIVATE
		|LVCFMT_CENTER
		|LVS_EX_GRIDLINES);

	UpdateNodeList();
	CString strNum;
	m_iNodeNum = ReturnNodeNum();
	strNum.Format("%d", m_iNodeNum);
	SetDlgItemText(IDC_STATIC_NODE_NUM, strNum);

	CString strTitle;
	strTitle = "模拟器-FakeTolCan";
	strTitle += "   (";
	strTitle += "当前节点个数:";
	strTitle += strNum;
	strTitle += ")";
	GetParent()->SetWindowText(strTitle);

	GetLocalIP();
/*
	// 创建监听套节字,使它进入监听状态
	if(!CreateAndListen(m_iPort))
	{
		MessageBox("启动服务出错!");
		return;
	}*/
}

/////////////////////////////////////////////////////////////////////////////
// CFakeTolcanView diagnostics

#ifdef _DEBUG
void CFakeTolcanView::AssertValid() const
{
	CFormView::AssertValid();
}

void CFakeTolcanView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CFakeTolcanDoc* CFakeTolcanView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFakeTolcanDoc)));
	return (CFakeTolcanDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFakeTolcanView message handlers

void CFakeTolcanView::OnConfigSerialPort() 
{
	// TODO: Add your command handler code here
	CSerialPortConfig dlg;
	dlg.m_nCom = m_nCom;
	dlg.m_cParity = m_cParity;
	dlg.m_nBaud = m_nBaud;
	dlg.m_nStopbits = m_nStopbits;
	dlg.m_nDatabits = m_nDatabits;
	dlg.m_nBufferSize = m_nBufferSize;
	
	int retval = dlg.DoModal();
	if (IDOK == retval)
	{
		m_nCom = dlg.m_nCom;
		m_cParity = dlg.m_cParity;
		m_nBaud = dlg.m_nBaud;
		m_nStopbits = dlg.m_nStopbits;
		m_nDatabits = dlg.m_nDatabits;
		m_bClosePort = dlg.m_bClosePort;
		m_nBufferSize = dlg.m_nBufferSize;
		SaveParamInfo();
	}
	else if (2000 == retval)
	{
		m_bClosePort = dlg.m_bClosePort;
		m_nCollectCmd = 0;
	}
	else if (IDCANCEL == retval)
	{
		return;
	}

	if (m_bClosePort)
	{
		if (m_bPortOpened)
		{
			try{
				m_SerialPort.ClosePort();
				if (m_bSP)
				{
					m_bSP = FALSE;
					if (m_bNW == FALSE)
					{
						KillTimer(1);
					}
				}
			}
			catch(...)
			{
				MessageBox("串口被关闭", "学学提醒", MB_ICONASTERISK | MB_ICONINFORMATION);
			}
			m_bPortOpened = FALSE;
		}
		m_bClosePort = FALSE;
	}
	else
	{
		if (m_bPortOpened)
		{
			m_SerialPort.ClosePort();
			if (m_bSP)
			{
				m_bSP = FALSE;
				if (m_bNW == FALSE)
				{
					KillTimer(1);
				}
			}
			m_bPortOpened = FALSE;
		}
		if(!m_bPortOpened)
		{
			if(m_SerialPort.InitPort(this,m_nCom, m_nBaud,m_cParity,\
				m_nDatabits,m_nStopbits,EV_RXFLAG | EV_RXCHAR,m_nBufferSize))
			{
				m_SerialPort.StartMonitoring();
				m_bPortOpened = TRUE;
/*				CString strCmd;
				GetDlgItemText(IDC_EDIT_RECV_DATA, strCmd);
				if (strCmd.Right(6) == "8900\r\n")
				{
					SetTimer(1, m_PackInterval, NULL);
					m_bCollectData = TRUE;
				}*/
			}
			else
			{
				AfxMessageBox("没有发现此串口或被占用");
				m_bPortOpened = FALSE;
			}
		}
	}
}

void CFakeTolcanView::OnPackInfoConfig() 
{
	// TODO: Add your command handler code here
	CPackInfo dlg;
	int retval = dlg.DoModal();
	if (IDOK == retval)
	{
		m_dwPackId = strtoul(dlg.m_strPackId, NULL, 16);
		int iType = strtol(dlg.m_strPackType, NULL, 16);
		m_PackType = iType;
		m_PackInterval = atoi(dlg.m_PackInterval);
		m_PackHeadLen = atoi(dlg.m_strPackHeadLen);
/*		m_BaseVal = atoi(dlg.m_strBaseValue);
		m_Bound = atoi(dlg.m_strBound);
		m_Min = atoi(dlg.m_strMinValue);
		m_Max = atoi(dlg.m_strMaxValue);
		m_FirstValue = atoi(dlg.m_strFirstValue);
		m_Step = atoi(dlg.m_strStep);
		m_PumpBaseValue = atoi(dlg.m_strPumpBaseValue);
//		m_PumpStep = atoi(dlg.m_strPumpStepValue);
		m_PumpBound = atoi(dlg.m_strPumpBound);
*/		
		//这里似乎比放在外面效率更高
		SaveParamInfo();
		ModifyBigInterval();
	}
}

void CFakeTolcanView::OnBtnSave() 
{
	// TODO: Add your control notification handler code here
	SaveNodes();
}

void CFakeTolcanView::UpdateNodeList()
{
	ADOConn m_AdoConn;
	m_AdoConn.OnInitADOConn();
	CString sql;
	sql.Format("select * from Nodes order by NodeId desc");
//	sql.Format("select * from Nodes order by NodeId");
	_RecordsetPtr m_pRecordset;
	m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);
	int iOrder = 0;
	m_NodeList.DeleteAllToolTips();
	m_NodeList.EnableToolTips(TRUE);	
	m_NodeList.SetRedraw(FALSE);
	
	while(!m_pRecordset->adoEOF)
	{
		m_NodeList.InsertItem(0,0);
		m_NodeList.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("NodeId"));
		m_NodeList.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("NodeNo"));
		m_NodeList.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("Month"));
		m_NodeList.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("NodeType"));
		m_NodeList.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect("ByteNum"));
		m_NodeList.SetItemText(0,5,(char*)(_bstr_t)m_pRecordset->GetCollect("NodeOrder"));
		m_NodeList.SetItemText(0,6,(char*)(_bstr_t)m_pRecordset->GetCollect("SInterval"));
		m_NodeList.SetItemText(0,7,(char*)(_bstr_t)m_pRecordset->GetCollect("BInterval"));
		m_NodeList.SetItemText(0,8,(char*)(_bstr_t)m_pRecordset->GetCollect("ChannelNum"));

		m_pRecordset->MoveNext();
	}
	m_AdoConn.ExitConnect();

	m_NodeTypes.RemoveAll();
	int num = m_NodeList.GetItemCount();
	for(int i=0;i<num;i++)
	{
		CString str3=m_NodeList.GetItemText(i,3);
		m_NodeTypes.Add(str3);
		CString str1=m_NodeList.GetItemText(i,1);
		if (!str1.IsEmpty())
		{
			CNodeData *pNodeData;
//			ASSERT(m_NodeDatas.Lookup(str1, pNodeData));
			m_NodeDatas.Lookup(str1, pNodeData);
			CString strTip(""), strTemp;
			if (str3 == "深度节点")
			{
				strTip = str3;
				strTip += "(最小值:";
				strTemp.Format("%d", pNodeData->m_iMinValue);
				strTip += strTemp;
				strTip += "***";
				strTip += "最大值:";
				strTemp.Format("%d", pNodeData->m_iMaxValue);
				strTip += strTemp;
				strTip += "***";
				strTip += "初始值:";
				strTemp.Format("%d", pNodeData->m_iFirstValue);
				strTip += strTemp;
				strTip += "***";
				strTip += "步长:";
				strTemp.Format("%d", pNodeData->m_iStep);
				strTip += strTemp;
				strTip += ")";			
			}
			else if (str3 == "泵冲节点" || str3 == "4-20mA模拟节点")
			{
				strTip = str3;
				strTip += "(基值:";
				strTemp.Format("%d", pNodeData->m_iBase);
				strTip += strTemp;
				strTip += "***";
				strTip += "范围:";
				strTemp.Format("%d", pNodeData->m_iBound);
				strTip += strTemp;
				strTip += ")";
			}
			for (int k = 0; k < 9; k++)
			{
				m_NodeList.SetItemToolTipText(i, k, strTip);
			}
		}
	}
	m_NodeTypes.Add("");
	m_NodeList.SetRedraw(TRUE);
}

BOOL CFakeTolcanView::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
/*	if((pMsg->message == WM_KEYUP)&&(pMsg->hwnd == m_NodeList.edit.m_hWnd))
	{
		CString str;
		m_NodeList.edit.GetWindowText(str);
		m_NodeList.SetItemText(m_NodeList.row,m_NodeList.col,str);
		if(m_NodeList.col==8 && m_NodeList.GetItemCount() == m_NodeList.row+1)
		{
			m_NodeList.InsertItem(m_NodeList.row+1,0);
		}
	}*/
	return CFormView::PreTranslateMessage(pMsg);
}

LONG CFakeTolcanView::OnComm(WPARAM ch, LPARAM port)
{
	CString str;
	str.Format("%02X", ch);
	m_strRecvData += str;
//	PumpData(); //can also work well 
	PumpData(0); //0 为通过串口发送数据
	
	return 0;
}

void CFakeTolcanView::ReturnNodeId(int flag /* = 0 */)
{
	USHORT rcmd = htons(0x0007);
	ADOConn m_AdoConn;
	m_AdoConn.OnInitADOConn();
	CString sql;
//	sql.Format("select * from Nodes order by NodeId desc");
	sql.Format("select * from Nodes order by NodeId");
	CString vSQL = "select count(*) as cn from Nodes";
	_RecordsetPtr m_pRecordset;
	m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)vSQL);	
	BYTE num = m_pRecordset->GetCollect("cn");
	if (num == 0)
	{
		return;
	}

	BYTE *buf = new BYTE[2 + 1 + num * 4];

	memcpy(buf, &rcmd, 2);
	memcpy(buf + 2, &num, 1);
	int i = 0;
	m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);
	while(!m_pRecordset->adoEOF)
	{

		CString str = (char*)(_bstr_t)m_pRecordset->GetCollect("NodeId");
		DWORD dwVal = strtoul(str, NULL, 16);
		memcpy(buf + 3 + 4 * i, &dwVal, 4);
		i++;
		m_pRecordset->MoveNext();
	}
	m_AdoConn.ExitConnect();

//	m_SerialPort.WriteToPort((LPCTSTR)buf, 2 + 1 + num * 4);//发送数据
//	m_SerialPort.WriteToPort(buf, 2 + 1 + num * 4);//发送数据
	if (flag == 0)
	{
		m_SerialPort.WriteToPort(buf, 2 + 1 + num * 4);//发送数据
	}
	if (flag == 1)
	{
		int nCount = m_SockArray7.GetSize();
		for (int i = 0; i < nCount; i++)
		{
			CString str;
			str = m_SockArray7.GetAt(i);
			SOCKET sock = strtoul(str, NULL, 10);
			send(sock,(const char*)buf, 2 + 1 + num * 4,0);
		}
		m_SockArray7.RemoveAll();
	}

	delete [] buf;
}

void CFakeTolcanView::ReturnNodeInfo(int flag /* = 0 */)
{
	ADOConn m_AdoConn;
	m_AdoConn.OnInitADOConn();
	CString sql;
//	sql.Format("select * from Nodes order by NodeId desc");
	sql.Format("select * from Nodes order by NodeId");
	_RecordsetPtr m_pRecordset;	
	CString vSQL = "select count(*) as cn from Nodes";
	m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)vSQL);	
	BYTE num = m_pRecordset->GetCollect("cn");
	if (num == 0)
	{
		return;
	}
	m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);
	USHORT rcmd = htons(0x0009);
	BYTE *buf = new BYTE[2 + 1 + num * 16];
	BYTE buf2[16];
	memset(buf, 0, 2 + 1 + num * 16);
	memcpy(buf, &rcmd, 2);
	memcpy(buf + 2, &num, 1);
	int i = 0;
	BYTE buf3[5];
	memset(buf3, 0, 5);
	while(!m_pRecordset->adoEOF)
	{
		CString strNodeId = (char*)(_bstr_t)m_pRecordset->GetCollect("NodeId");

⌨️ 快捷键说明

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