📄 faketolcanview.cpp
字号:
DWORD dwVal = htonl(strtoul(strNodeId, NULL, 16));
CString strByteNum = (char*)(_bstr_t)m_pRecordset->GetCollect("ByteNum");
BYTE byteNum = atoi(strByteNum);
BYTE nodeOrder = i;
CString strSmallInterval = (char*)(_bstr_t)m_pRecordset->GetCollect("SInterval");
USHORT sInteval = htons(atoi(strSmallInterval));
CString strBigInterval = (char*)(_bstr_t)m_pRecordset->GetCollect("BInterval");
USHORT bInterval = htons(atoi(strBigInterval));
CString strChannelNum = (char*)(_bstr_t)m_pRecordset->GetCollect("ChannelNum");
BYTE channelNum = atoi(strChannelNum);
memcpy(buf2, &dwVal, 4);
memcpy(buf2+4, &byteNum,1);
memcpy(buf2+5, &nodeOrder,1);
memcpy(buf2+6, &sInteval,2);
memcpy(buf2+8, &bInterval,2);
memcpy(buf2+10, &channelNum,1);
memcpy(buf2+11, buf3,5);
memcpy(buf + 3 + 16 * i, buf2, 16);
i++;
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
if (flag == 0)
{
m_SerialPort.WriteToPort(buf, 2 + 1 + num * 16);//发送数据*/
}
if (flag == 1)
{
int nCount = m_SockArray9.GetSize();
for (int i = 0; i < nCount; i++)
{
CString str;
str = m_SockArray9.GetAt(i);
SOCKET sock = strtoul(str, NULL, 10);
send(sock,(const char*)buf, 2 + 1 + num * 16,0);
}
m_SockArray9.RemoveAll();
}
delete [] buf;
}
void CFakeTolcanView::SendCollectionData(int flag /* = 0 */)
{
if(m_bCollectFirst || m_bNodeChange)
{
m_nCollectNum = ReturnNodeNum();
if ((m_nCollectNum == 0) && (m_bCollectData))
{
KillTimer(1);
m_bSP = FALSE;
m_bNW = FALSE;
MessageBox("这边还没有任何节点呢");
return;
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select * from Nodes order by NodeId");
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);
m_DataLen = 0;
m_SampleNum.RemoveAll();
m_NodeNoArray.RemoveAll();
while(!m_pRecordset->adoEOF)
{
CString strNodeId = (char*)(_bstr_t)m_pRecordset->GetCollect("NodeId");
DWORD dwVal2 = strtoul(strNodeId, NULL, 16);
DWORD dwVal = htonl(strtoul(strNodeId, NULL, 16));
CString strByteNum = (char*)(_bstr_t)m_pRecordset->GetCollect("ByteNum");
BYTE byteNum = atoi(strByteNum);
CString strSmallInterval = (char*)(_bstr_t)m_pRecordset->GetCollect("SInterval");
USHORT sInteval = atoi(strSmallInterval);
CString strBigInterval = (char*)(_bstr_t)m_pRecordset->GetCollect("BInterval");
USHORT bInterval = atoi(strBigInterval);
CString strChannelNum = (char*)(_bstr_t)m_pRecordset->GetCollect("ChannelNum");
BYTE channelNum = atoi(strChannelNum);
m_DataLen += bInterval / sInteval * byteNum * channelNum;
memcpy(&m_NodeType, &dwVal, 1);
USHORT NodeNo;
CopyMemory(&NodeNo, &dwVal2, 2);
CString strNodeNo;
strNodeNo.Format("%d", NodeNo);
m_NodeNoArray.Add(strNodeNo);
int dotNum = bInterval / sInteval * channelNum;
CString str1, str2;
str1.Format("%d", m_NodeType);
str2.Format("%d", dotNum);
m_SampleNum.Add(str1);
m_SampleNum.Add(str2);
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();//
m_bCollectFirst = FALSE;
m_bNodeChange = FALSE;
}
srand((unsigned)time(NULL));
USHORT rcmd = htons(0x0000);
BYTE *buf = new BYTE[2 + m_PackHeadLen + m_DataLen];
BYTE *dataBuf = new BYTE[m_DataLen];
memcpy(buf, &rcmd, 2);
DWORD piden = htonl(m_dwPackId);
DWORD packnum = htonl(m_dwPackNo++);
BYTE packtype = m_PackType;
BYTE packcheck = m_PackCheck;
USHORT packint = htons(m_PackInterval);//
USHORT packlen = htons(m_PackHeadLen + m_DataLen);//
USHORT headlen = htons(m_PackHeadLen);//
BYTE * headdatBuf = new BYTE[m_PackHeadLen - 16];
memset(headdatBuf, 0, m_PackHeadLen - 16);
memcpy(buf + 2, &piden, 4);
memcpy(buf + 6, &packnum, 4);
memcpy(buf + 10, &packtype, 1);
memcpy(buf + 11, &packcheck, 1);
memcpy(buf + 12, &packint, 2);
memcpy(buf + 14, &packlen, 2);
memcpy(buf + 16, &headlen, 2);
memcpy(buf + 18, headdatBuf, m_PackHeadLen - 16);
int arrayLen = m_nCollectNum * 2;
int iFlag = 0; //标记拷贝数据时缓冲区的位置
for (int x = 0; x < arrayLen; x += 2)
{
int iType = atoi(m_SampleNum.GetAt(x));
int dotNum = atoi(m_SampleNum.GetAt(x + 1));
CString strNodeNo = m_NodeNoArray.GetAt(x / 2);
if (iType == 0) //深度节点
{
CNodeData *pNodeData;
// ASSERT(m_NodeDatas.Lookup(strNodeNo, pNodeData));
m_NodeDatas.Lookup(strNodeNo, pNodeData);
m_Min = pNodeData->m_iMinValue;
m_Max = pNodeData->m_iMaxValue;
m_CurrenVal = pNodeData->m_iCurrentValue;
m_SampleDot = pNodeData->m_iCurrentStep;
for (int k = 0; k < dotNum; k++)
{
CopyMemory(dataBuf +iFlag + 2 * k, &m_SampleDot, 2);
m_CurrenVal += m_SampleDot;
if (m_CurrenVal >= m_Max)
{
m_CurrenVal = m_Max;
m_SampleDot = 0 - m_SampleDot;
}
if (m_CurrenVal <= m_Min)
{
m_CurrenVal = m_Min;
m_SampleDot = 0 - m_SampleDot;
}
}
pNodeData->m_iCurrentValue = m_CurrenVal;//
pNodeData->m_iCurrentStep = m_SampleDot;
}
else if (iType == 1) //泵冲节点
{
CNodeData *pNodeData;
// ASSERT(m_NodeDatas.Lookup(strNodeNo, pNodeData));
m_NodeDatas.Lookup(strNodeNo, pNodeData);
m_PumpBaseValue = pNodeData->m_iBase;
m_PumpBound = pNodeData->m_iBound;
for (int k = 0; k < dotNum; k++)
{
while (1)
{
m_PumpDot = rand()%(m_PumpBaseValue + m_PumpBound + 1);
if (m_PumpDot >= (m_PumpBaseValue - m_PumpBound))
{
CopyMemory(dataBuf + iFlag + k * 2, &m_PumpDot, 2);
break;
}
}
}
}
else if (iType == 2) //4-20mA模拟节点
{
CNodeData *pNodeData;
// ASSERT(m_NodeDatas.Lookup(strNodeNo, pNodeData));
m_NodeDatas.Lookup(strNodeNo, pNodeData);
m_BaseVal = pNodeData->m_iBase;
m_Bound = pNodeData->m_iBound;
for (int k = 0; k < dotNum; k++)
{
while (1)
{
m_SVal = rand()%(m_BaseVal + m_Bound + 1);
if (m_SVal >= (m_BaseVal - m_Bound))
{
CopyMemory(dataBuf + iFlag + k * 2, &m_SVal, 2);
break;
}
}
}
}
iFlag += dotNum * 2;
}
m_PackCheck = 0;
memcpy(buf + 2 + m_PackHeadLen, dataBuf, m_DataLen);
for (int i = 0; i < m_PackHeadLen + m_DataLen; i++)
{
m_PackCheck ^= buf[i + 2];
}
memcpy(buf + 11, &m_PackCheck, 1);
if (m_bSP)
{
m_SerialPort.WriteToPort(buf, 2 + m_PackHeadLen + m_DataLen);//发送数据
}
if (m_bNW)
{
int nCount = m_SockArray0.GetSize();
for (int i = 0; i < nCount; i++)
{
CString str;
str = m_SockArray0.GetAt(i);
SOCKET sock = strtoul(str, NULL, 10);
send(sock,(const char*)buf, 2 + m_PackHeadLen + m_DataLen,0);
}
}
delete [] buf;
delete [] dataBuf;
delete [] headdatBuf;
}
int CFakeTolcanView::ReturnNodeNum()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_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"); // int类型的num通不过
m_AdoConn.ExitConnect();
return num;
}
void CFakeTolcanView::OnButton1()
{
// TODO: Add your control notification handler code here
m_bSP = TRUE;
SendCollectionData();
}
void CFakeTolcanView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
SendCollectionData();
CFormView::OnTimer(nIDEvent);
}
void CFakeTolcanView::OnDblclkNodeList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
// NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
int iItem = phdn->iItem;
if (iItem >= 0)
{
m_iItem = iItem;
ModifyNode();
}
*pResult = 0;
}
void CFakeTolcanView::OnRclickNodeList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
// ASSERT(phdn->iButton == 0);
int iItem = phdn->iItem;
m_iItem = iItem;
if (iItem >= 0)
{
CMenu menu, *pMenu;
VERIFY(menu.LoadMenu(IDR_MENU1));
pMenu = menu.GetSubMenu(0);
ASSERT(pMenu != NULL);
CPoint point;
GetCursorPos(&point);
pMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
point.y, this);
}
*pResult = 0;
}
void CFakeTolcanView::OnAddNode()
{
// TODO: Add your command handler code here
AddNode();
}
void CFakeTolcanView::OnDeleteNode()
{
// TODO: Add your command handler code here
int iItem = m_NodeList.GetItemCount() - 1;
if (iItem == m_iItem)
{
return;
}
if (m_iItem >= 0)
{
CString strNodeId;
strNodeId=m_NodeList.GetItemText(m_iItem,0);
if (IDCANCEL == MessageBox("确实要删除节点号为" + strNodeId + "的节点吗",\
"温馨提醒", MB_ICONQUESTION | MB_OKCANCEL))
{
return;
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql= "delete from Nodes where NodeId=";
sql += "'" + strNodeId + "'";
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_AdoConn.ExitConnect();
CString strNodeNo;
strNodeNo = m_NodeList.GetItemText(m_iItem, 1);
CNodeData *pNodeData;
BOOL bFind = m_NodeDatas.Lookup(strNodeNo, pNodeData);
if (bFind)
{
m_NodeDatas.RemoveKey(strNodeNo);
if (pNodeData)
{
delete pNodeData;
}
}
}
m_bNodeChange = TRUE;
ModifyNodesOrder();
m_NodeList.DeleteAllItems();
UpdateNodeList();
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::OnModifyNode()
{
// TODO: Add your command handler code here
ModifyNode();
}
void CFakeTolcanView::ModifyNode()
{
CString strNodeId;
CString strNodeNo;
CString strMonth;
CString strNodeType;
CString strByteNum;
CString strNodeOrder;
CString strSmallInterval;
CString strBigInterval;
CString strWayNum;
int m = 0;
int num = m_NodeList.GetItemCount();
if(m_iItem >= 0)
{
strNodeId=m_NodeList.GetItemText(m_iItem,m);
strNodeNo=m_NodeList.GetItemText(m_iItem,m+1);
strMonth=m_NodeList.GetItemText(m_iItem,m+2);
strNodeType=m_NodeList.GetItemText(m_iItem,m+3);
strByteNum=m_NodeList.GetItemText(m_iItem,m+4);
strNodeOrder=m_NodeList.GetItemText(m_iItem,m+5);
strSmallInterval=m_NodeList.GetItemText(m_iItem,m+6);
strBigInterval=m_NodeList.GetItemText(m_iItem,m+7);
strWayNum=m_NodeList.GetItemText(m_iItem,m+8);
CNodeInfoDlg dlg;
dlg.m_bModify = TRUE;
dlg.m_PackInterval = m_PackInterval;
dlg.strNodeId = strNodeId;
dlg.strNodeNo = strNodeNo;
dlg.strMonth = strMonth;
dlg.strNodeType = strNodeType;
dlg.strByteNum = strByteNum;
// dlg.strNodeOrder = strNodeOrder;
dlg.strSmallInterval = strSmallInterval;
dlg.strBigInterval = strBigInterval;
dlg.strWayNum = strWayNum;
if (strNodeType == "深度节点")
{
CNodeData *pNodeData;
// ASSERT(m_NodeDatas.Lookup(strNodeNo, pNodeData));
m_NodeDatas.Lookup(strNodeNo, pNodeData);
CString str1, str2, str3, str4;
str1.Format("%d", pNodeData->m_iFirstValue);
str2.Format("%d", pNodeData->m_iMaxValue);
str3.Format("%d", pNodeData->m_iMinValue);
str4.Format("%d", pNodeData->m_iStep);
dlg.m_strFirstValue = str1;
dlg.m_strMaxValue = str2;
dlg.m_strMinValue = str3;
dlg.m_strStep = str4;
}
if (strNodeType == "泵冲节点" || strNodeType == "4-20mA模拟节点")
{
CNodeData *pNodeData;
// ASSERT(m_NodeDatas.Lookup(strNodeNo, pNodeData));
m_NodeDatas.Lookup(strNodeNo, pNodeData);
CString str1, str2;
str1.Format("%d", pNodeData->m_iBase);
str2.Format("%d", pNodeData->m_iBound);
dlg.m_strBase = str1;
dlg.m_strBound = str2;
}
int retval = dlg.DoModal();
if (IDOK == retval)
{
m_NodeList.SetItemText(m_iItem, 0, dlg.m_strNodeId2);
m_NodeList.SetItemText(m_iItem, 1, dlg.m_strNodeNo);
m_NodeList.SetItemText(m_iItem, 2, dlg.m_strMonth);
m_NodeList.SetItemText(m_iItem, 3, dlg.m_strNodeType);
m_NodeList.SetItemText(m_iItem, 4, dlg.m_strByteNum);
// m_NodeList.SetItemText(m_iItem, 5, dlg.m_strNodeOrder);
m_NodeList.SetItemText(m_iItem, 6, dlg.m_strSmallInterval);
m_NodeList.SetItemText(m_iItem, 7, dlg.m_strBigInterval);
m_NodeList.SetItemText(m_iItem, 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;
}
}
if (m_iItem == num - 1)
{
// m_NodeList.InsertItem(m_NodeList.row+1,0);
}
SaveNodes();
}
void CFakeTolcanView::OnUpdateAddNode(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!(m_iItem == -1));
}
void CFakeTolcanView::OnUpdateDeleteNode(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
int iItem = m_NodeList.GetItemCount() - 1;
pCmdUI->Enable(!(m_iItem == iItem));
}
void CFakeTolcanView::OnUpdateModifyNode(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
int iItem = m_NodeList.GetItemCount() - 1;
pCmdUI->Enable(!(m_iItem == iItem));
}
void CFakeTolcanView::SaveNodes()
{
int num = m_NodeList.GetItemCount();
CString strLastNodeNo = m_NodeList.GetItemText(num - 1,1);
CString strLastMonth = m_NodeList.GetItemText(num - 1,2);
CString strLastNodeType = m_NodeList.GetItemText(num - 1,3);
if ((!strLastNodeNo.IsEmpty()) && (!strLastMonth.IsEmpty()) &&\
!(strLastNodeType.IsEmpty()))
{
CString strTemp = "100";
CNodeData *pNodeData = new CNodeData;
BOOL bFind = m_NodeDatas.Lookup(strTemp, pNodeData);
if (bFind)
{
m_NodeDatas.SetAt(strLastNodeNo, pNodeData);
m_NodeDatas.RemoveKey(strTemp);
}
else
{
delete pNodeData;
}
}
SaveParamInfo();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql,str,str1,str2, str3, str4, str5, str6, str7, str8;
sql.Format("delete from Nodes");
m_AdoConn.ExecuteSQL((_bstr_t)sql);
int m=0;
for(int i=0;i<num;i++)
{
str = "";
str1=m_NodeList.GetItemText(i,m+1);
str2=m_NodeList.GetItemText(i,m+2);
str3=m_NodeList.GetItemText(i,m+3);
if (str1.IsEmpty() || str2.IsEmpty() || str3.IsEmpty())
{
continue;
}
if (!str.IsEmpty())
{
DWORD dwNodeId = strtoul(str, NULL, 16);
CopyMemory(&m_NodeNO, &dwNodeId, 2);
CString strNodeNo;
strNodeNo.Format("%d", m_NodeNO);
CString strMonth = str.Mid(2, 2);
int iMonth = strtoul(strMonth, NULL, 16);
strMonth.Format("%d", iMonth);
CString strNodeType = str.Mid(0, 2);
m_iNodeType = strtoul(strNodeType, NULL, 16);
//strNodeType.Format("%d", m_iNodeType);
if (m_iNodeType == 0)
{
strNodeType = "深度节点";
}
else if (m_iNodeType == 1)
{
strNodeType = "泵冲节点";
}
else if (m_iNodeType == 2)
{
strNodeType = "4-20mA模拟节点";
}
else if (m_iNodeType == 3)
{
strNodeType = "色谱节点";
}
str1 = strNodeNo;
str2 = strMonth;
str3 = strNodeType;
}
else
{ //通过节点编号、生产月数、节点类型应该可以确定
if ((!str1.IsEmpty()) && (!str2.IsEmpty()) && (!str3.IsEmpty()))
{
if (atoi(str1) < 1000)
{
continue;
}
BYTE m_cNodeType = 0;
if (str3 == "深度节点")
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -