📄 faketolcanview.cpp
字号:
m_cNodeType = 0;
}
else if (str3 == "泵冲节点")
{
m_cNodeType = 1;
}
else if (str3 == "4-20mA模拟节点")
{
m_cNodeType = 2;
}
else if (str3 == "色谱节点")
{
m_cNodeType = 3;
}
BYTE m_cMonth = atoi(str2);
USHORT m_uNodeNo = atoi(str1);
BYTE NodeId[4];
DWORD dwNodeId;
memcpy(NodeId, &m_uNodeNo, 2);
memcpy(NodeId + 2, &m_cMonth, 1);
memcpy(NodeId + 3, &m_cNodeType, 1);
memcpy(&dwNodeId, NodeId, 4);
str.Format("%08X", dwNodeId);
}
}
str4=m_NodeList.GetItemText(i,m+4);
if (str4.IsEmpty())
{
str4 = "2";
}
str5=m_NodeList.GetItemText(i,m+5); //序号
str6=m_NodeList.GetItemText(i,m+6);
if (str6.IsEmpty())
{
str6 = "100";
}
str7=m_NodeList.GetItemText(i,m+7);
CString strPackInterval;
strPackInterval.Format("%d", m_PackInterval);
if (str7 != strPackInterval)
{
str7 = strPackInterval;
}
str8=m_NodeList.GetItemText(i,m+8);
if (str8.IsEmpty())
{
str8 = "1";
}
if(!str.IsEmpty() || !str1.IsEmpty() || !str2.IsEmpty())
{
//sql.Format("INSERT INTO lwx(NodeId,NodeNo,Month,NodeType,ByteNum,NodeOrder,SInterval,BInterval,ChannelNum) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",str,str1,str2,str3,str4,str5,str6,str7,str8);
sql.Format("INSERT INTO Nodes VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",str,str1,str2,str3,str4,str5,str6,str7,str8);
m_AdoConn.ExecuteSQL((_bstr_t)sql);
}
}
m_AdoConn.ExitConnect();
ModifyNodesOrder();
m_bNodeChange = TRUE;
m_NodeList.DeleteAllItems();
UpdateNodeList();
// m_NodeList.InsertItem(m_NodeList.row+1,0);
int iNodeNum = ReturnNodeNum();
m_NodeList.InsertItem(iNodeNum+1,0);
CString strNum;
strNum.Format("%d", iNodeNum);
SetDlgItemText(IDC_STATIC_NODE_NUM, strNum);
CString strTitle;
strTitle = "模拟器-FakeTolCan";
strTitle += " (";
strTitle += "当前节点个数:";
strTitle += strNum;
strTitle += ")";
GetParent()->SetWindowText(strTitle);
}
void CFakeTolcanView::OnBtnAddNode()
{
// TODO: Add your control notification handler code here
AddNode();
}
void CFakeTolcanView::AddNode()
{
int num = m_NodeList.GetItemCount();
num = num - 1;
CNodeInfoDlg dlg;
dlg.m_bModify = FALSE;
dlg.m_PackInterval = m_PackInterval;
int retval = dlg.DoModal();
if (IDOK == retval)
{
m_NodeList.SetItemText(num, 0, dlg.m_strNodeId2);
m_NodeList.SetItemText(num, 1, dlg.m_strNodeNo);
m_NodeList.SetItemText(num, 2, dlg.m_strMonth);
m_NodeList.SetItemText(num, 3, dlg.m_strNodeType);
m_NodeList.SetItemText(num, 4, dlg.m_strByteNum);
// m_NodeList.SetItemText(num, 5, dlg.m_strNodeOrder);
m_NodeList.SetItemText(num, 6, dlg.m_strSmallInterval);
m_NodeList.SetItemText(num, 7, dlg.m_strBigInterval);
m_NodeList.SetItemText(num, 8, dlg.m_strWayNum);
CNodeData *pNodeData = new CNodeData;
pNodeData->m_strNodeType = dlg.m_strNodeType;
pNodeData->m_iBase = atoi(dlg.m_strBase);
pNodeData->m_iBound = atoi(dlg.m_strBound);
pNodeData->m_iMinValue = atoi(dlg.m_strMinValue);
pNodeData->m_iMaxValue = atoi(dlg.m_strMaxValue);
pNodeData->m_iFirstValue = atoi(dlg.m_strFirstValue);
pNodeData->m_iStep = atoi(dlg.m_strStep);
pNodeData->m_iCurrentValue = pNodeData->m_iFirstValue;
pNodeData->m_iCurrentStep = pNodeData->m_iStep;
m_NodeDatas.SetAt(dlg.m_strNodeNo, pNodeData);
// SaveParamInfo();
}
else if (IDCANCEL == retval)
{
return;
}
SaveNodes();
}
void CFakeTolcanView::ModifyNodesOrder()
{
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 i = 0;
while(!m_pRecordset->adoEOF)
{
CString str = (char*)(_bstr_t)m_pRecordset->GetCollect("NodeId");
CString strOrder;
strOrder.Format("%d", i);
sql = "UPDATE Nodes set NodeOrder=";
sql += "'"+strOrder+"'";
sql += "where NodeId=";
sql += "'"+str+"'";
i++;
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
}
void CFakeTolcanView::ModifyBigInterval()
{
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 i = 0;
while(!m_pRecordset->adoEOF)
{
CString str = (char*)(_bstr_t)m_pRecordset->GetCollect("NodeId");
// CString strOrder;
// strOrder.Format("%d", i);
CString strPackInterval;
strPackInterval.Format("%d", m_PackInterval);
sql = "UPDATE Nodes set BInterval=";
sql += "'"+strPackInterval+"'";
sql += "where NodeId=";
sql += "'"+str+"'";
// i++;
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
m_NodeList.DeleteAllItems();
UpdateNodeList();
m_NodeList.InsertItem(ReturnNodeNum()+1,0);
}
void CFakeTolcanView::OnBtnDeleteAllNodes()
{
// TODO: Add your control notification handler code here
int iNodeNum = ReturnNodeNum();
if (iNodeNum == 0)
{
MessageBox("没有任何节点可删除!", "提示");
return;
}
if (IDCANCEL == MessageBox("确实要删除所有的节点吗",\
"温馨提醒", MB_ICONEXCLAMATION | MB_ICONWARNING | MB_OKCANCEL))
{
return;
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql= "delete from Nodes";
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_AdoConn.ExitConnect();
m_NodeList.DeleteAllItems();
UpdateNodeList();
m_NodeList.InsertItem(1,0);
m_bNodeChange = TRUE;
CString strNum;
strNum.Format("%d", 0);
SetDlgItemText(IDC_STATIC_NODE_NUM, strNum);
CString strTitle;
strTitle = "模拟器-FakeTolCan";
strTitle += " (";
strTitle += "当前节点个数:";
strTitle += strNum;
strTitle += ")";
GetParent()->SetWindowText(strTitle);
POSITION pos;
CString strKey;
CNodeData *pNodeData;
pos = m_NodeDatas.GetStartPosition();
while(NULL != pos)
{
m_NodeDatas.GetNextAssoc(pos, strKey, pNodeData);
if (pNodeData)
{
m_NodeDatas.RemoveKey(strKey);
delete pNodeData;
}
}
ASSERT(NULL == m_NodeDatas.GetCount());
}
void CFakeTolcanView::OnBtnClerarRecvdata()
{
// TODO: Add your control notification handler code here
m_strCmd.Empty();
UpdateData(FALSE);
}
void CFakeTolcanView::Serialize(CArchive& ar)
{
// m_NodeDatas.Serialize(ar);
if (ar.IsStoring())
{ // storing code
ar << m_nBaud;
ar << m_nCom;
ar << m_cParity;
ar << m_nDatabits;
ar << m_nStopbits;
ar << m_nBufferSize;
ar << m_dwPackId;
ar << m_PackType;
ar << m_PackInterval;
ar << m_PackHeadLen;
ar << m_iPort;
}
else
{ // loading code
ar >> m_nBaud;
ar >> m_nCom;
ar >> m_cParity;
ar >> m_nDatabits;
ar >> m_nStopbits;
ar >> m_nBufferSize;
ar >> m_dwPackId;
ar >> m_PackType;
ar >> m_PackInterval;
ar >> m_PackHeadLen;
ar >> m_iPort;
}
m_NodeDatas.Serialize(ar);
}
BOOL CFakeTolcanView::CanSerialize()
{
return (0 == _access(DATA_FILE, 6));
}
void CFakeTolcanView::LoadParamInfo()
{
if (CanSerialize())
{
try
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE, CFile::typeBinary | CFile::modeRead, &fe))
{
CArchive ar(&file, CArchive::load);
Serialize(ar);
}
}
catch (CFileException* e)
{
e->ReportError();
e->Delete();
}
}
}
void CFakeTolcanView::SaveParamInfo()
{
BOOL bCanSave = FALSE;
UINT nFlags = CFile::typeBinary | CFile::modeWrite;
//if file doesn't exist, we create it
if (_access(DATA_FILE, 0))
{
nFlags |= CFile::modeCreate;
bCanSave = TRUE;
}
else
{
bCanSave = CanSerialize();
}
if (bCanSave)
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE, nFlags, &fe))
{
CArchive ar(&file, CArchive::store);
Serialize(ar);
}
}
}
void CFakeTolcanView::OnDestroy()
{
CFormView::OnDestroy();
// TODO: Add your message handler code here
if (m_bCollectData)
{
KillTimer(1);
m_bCollectData = FALSE;
}
if (m_bPortOpened)
{
m_SerialPort.ClosePort();
}
/*
if (m_bSP || m_bNW)
{
KillTimer(1);
}*/
CloseAllSocket();
POSITION pos;
CString strKey;
CNodeData *pNodeData;
pos = m_NodeDatas.GetStartPosition();
while(NULL != pos)
{
m_NodeDatas.GetNextAssoc(pos, strKey, pNodeData);
if (pNodeData)
{
m_NodeDatas.RemoveKey(strKey);
delete pNodeData;
}
}
ASSERT(NULL == m_NodeDatas.GetCount());
}
void CFakeTolcanView::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (m_bCollectData)
{
KillTimer(1);
m_bCollectData = FALSE;
}
if (m_bPortOpened)
{
m_SerialPort.ClosePort();
}
CFormView::OnClose();
}
LRESULT CFakeTolcanView::OnEndLabelEditVariableCriteria(WPARAM wParam, LPARAM lParam)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)lParam;
// TODO: Add your control notification handler code here
// SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, pDispInfo->item.pszText);
int i = pDispInfo->item.iItem;
int j = pDispInfo->item.iSubItem;
if (j == 3)
{
CString str = pDispInfo->item.pszText;
CString str2 = m_NodeTypes.GetAt(i);//p
if (str != str2)
{
CSetDataDlg dlg;
dlg.m_strNodeType = str;
int retval = dlg.DoModal();
if (IDOK == retval)
{
CString strNodeNo = m_NodeList.GetItemText(i, 1);
int num = m_NodeList.GetItemCount();
num -= 1;
// if (strNodeNo == "")
if (num == i)
{
strNodeNo ="100";
}
CNodeData *pNodeData = NULL;
if (!m_NodeDatas.Lookup(str, pNodeData))
{
pNodeData = new CNodeData;
m_NodeDatas.SetAt(strNodeNo, pNodeData);
}
if (pNodeData)
{
pNodeData->m_strNodeType = dlg.m_strNodeType;//
pNodeData->m_iBase = atoi(dlg.m_strBase);
pNodeData->m_iBound = atoi(dlg.m_strBound);
pNodeData->m_iMinValue = atoi(dlg.m_strMinValue);
pNodeData->m_iMaxValue = atoi(dlg.m_strMaxValue);
pNodeData->m_iFirstValue = atoi(dlg.m_strFirstValue);
pNodeData->m_iStep = atoi(dlg.m_strStep);
pNodeData->m_iCurrentValue = pNodeData->m_iFirstValue;
pNodeData->m_iCurrentStep = pNodeData->m_iStep;
}
// SaveParamInfo();
}
else if (IDCANCEL == retval)
{
m_NodeList.SetItemText(i, j, str2);
return 1;
}
}
}
return 1;
}
LRESULT CFakeTolcanView::PopulateComboList(WPARAM wParam, LPARAM lParam)
{
// Get the Combobox window pointer
CComboBox* pInPlaceCombo = static_cast<CComboBox*> (GetFocus());
// Get the inplace combbox top left
CRect obWindowRect;
pInPlaceCombo->GetWindowRect(&obWindowRect);
CPoint obInPlaceComboTopLeft(obWindowRect.TopLeft());
// Get the active list
// Get the control window rect
// If the inplace combobox top left is in the rect then
// The control is the active control
m_NodeList.GetWindowRect(&obWindowRect);
int iColIndex = (int )wParam;
CStringList* pComboList = reinterpret_cast<CStringList*>(lParam);
pComboList->RemoveAll();
if (obWindowRect.PtInRect(obInPlaceComboTopLeft))
{
if(iColIndex==3)
{
pComboList->AddTail(_T("深度节点"));
pComboList->AddTail(_T("泵冲节点"));
pComboList->AddTail(_T("4-20mA模拟节点"));
pComboList->AddTail(_T("色谱节点"));
}
}
return true;
}
void CFakeTolcanView::GetLocalIP()
{
/* char szHost[256];
// 取得本地主机名称
::gethostname(szHost, 256);
// 通过主机名得到地址信息
hostent *pHost = ::gethostbyname(szHost);
// 打印出所有IP地址
in_addr addr;
for(int i = 0; ; i++)
{
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
}
char *ch = pHost->h_addr_list[0];
in_addr addr;
memmove(&addr.S_un.S_addr, ch, pHost->h_length);
char *szIp = inet_ntoa(addr);
MessageBox(szIp);*/
char *ip;
char szHost[256];
memset(szHost, 0, 256);
gethostname(szHost, sizeof(szHost));
HOSTENT *pHost = gethostbyname(szHost);
ip = pHost->h_addr_list[0];
in_addr addr;
addr.S_un.S_addr = *((DWORD *)ip);
//memmove(&addr.S_un.S_addr, ip, pHost->h_length); // the same as above.
ip = inet_ntoa(addr);
m_strLocalIp = ip;
// MessageBox(m_strLocalIp);
}
BOOL CFakeTolcanView::InitSocket()
{
m_socket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("套接字创建失败!");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(m_iPort);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int retval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox("绑定失败!");
return FALSE;
}
listen(m_socket, 5);//
return TRUE;
}
void CFakeTolcanView::PumpData(int flag /* = 0 */)
{
if (m_strRecvData.Left(2) != "89")
{
m_strRecvData.Empty();
return ;
}
if (m_strRecvData == "8900")
{
if (flag == 0)
{
if (m_bSP == FALSE)
{
m_bSP = TRUE;
if (m_bNW == FALSE)
{
SetTimer(1, m_PackInterval, NULL);
}
}
}
if (flag == 1)
{
if (m_bNW == FALSE)
{
m_bNW = TRUE;
if (m_bSP == FALSE)
{
SetTimer(1, m_PackInterval, NULL);
}
}
}
m_bCollectData = TRUE;
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData = "";
}
if (m_strRecvData == "8901")
{
if (flag == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -