📄 faketolcanview.cpp
字号:
// 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 + -