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

📄 faketolcanview.cpp

📁 功能主要是串口通信和网络通信方面的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -