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

📄 testicandlldlg.cpp

📁 iCAN主站库[windows平台DLL],用于开发iCAN系统windows平台程序[上位机程序]
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==TIMERID_REFRESHDATA)
	{
		LISTDATA* pdata;
		int sz=m_ctlListData.GetItemCount();
		DWORD len=32;
		BYTE buff[32];
		CString strtm=m_global.ConvertTimeToStr(m_global.GetTime());
		CString strtmp1;
		for(int i=0;i<sz;i++)
		{
			pdata=(LISTDATA*)m_ctlListData.GetItemData(i);
			len=32;
			if(pdata->bai==1)
			{
				Slave_GetAIData(pdata->hSlave,buff,&len);
				if(len>0)
				{
					m_ctlListData.SetItemText(i,2,strtm);
					m_ctlListData.SetItemText(i,3,m_global.DatatoStr(buff,len));
				}
			}
			else if(pdata->bai==0)
			{
				Slave_GetDIData(pdata->hSlave,buff,&len);
				if(len>0)
				{
					m_ctlListData.SetItemText(i,2,strtm);
					m_ctlListData.SetItemText(i,3,m_global.DatatoStr(buff,len));
				}	
			}
			else
			{
				if(!Slave_IsConnected(pdata->hSlave))
				{
					DisconnectItem(i);
					return;
				}
			}
		}
	}

	CDialog::OnTimer(nIDEvent);
}

void CTesticandllDlg::ClearList()
{
	int sz=m_ctlListData.GetItemCount();
	for(int i=0;i<sz;i++)
	{
		delete (LISTDATA*)m_ctlListData.GetItemData(i);
	}
	m_ctlListData.DeleteAllItems();
}

void CTesticandllDlg::OnButtonConnect() 
{
	// TODO: Add your control notification handler code here
	int isel=m_ctlComboDisconnectSlaveID.GetCurSel();
	int slaveid=m_ctlComboDisconnectSlaveID.GetItemData(isel);

	HANDLE hSlave;
	int ret=Route_AddSlave(m_global.m_hRoute,slaveid,&hSlave);
	if(ret==ICANOK||ret==ICANERR_ITEMEXIST)
	{
		Route_GetSlavebyID(m_global.m_hRoute,slaveid,&hSlave);
		if(Slave_Connect(hSlave)==ICANOK)
		{
			m_ctlComboDisconnectSlaveID.DeleteString(isel);
			AddConnectedItem(hSlave);
		}
		else
			MessageBox("连接从站失败");
	}
	else
	{
		MessageBox("添加从站失败");
	}
}

void CTesticandllDlg::AddConnectedItem(HANDLE hSlave)
{
	AddItemToCombo(m_ctlComboConnectedSlaveID,Slave_GetID(hSlave));
	AddItemToList(hSlave);
}

void CTesticandllDlg::DelItemFromCombo(CComboBox &combo,int ind)
{
	CString str1;
	str1.Format("%d",ind);
	int ifind=combo.FindStringExact(0,str1);
	if(ifind!=-1)
		combo.DeleteString(ifind);
	if(combo.GetCurSel()==-1)
		combo.SetCurSel(0);
}

void CTesticandllDlg::AddItemToCombo(CComboBox &combo,int ind)
{
	CString str1;
	str1.Format("%d",ind);
	int sz=combo.GetCount();
	for(int i=0;i<sz;i++)
	{
		if(combo.GetItemData(i)>ind)
		{
			combo.SetItemData(combo.InsertString(i,str1),ind);
			break;
		}
		else if(combo.GetItemData(i)==ind)
			break;
	}
	if(i==sz)
		combo.SetItemData(combo.AddString(str1),ind);
}

void CTesticandllDlg::AddItemToList(HANDLE hSlave)
{
	CString str1;
	LISTDATA* pdata=new LISTDATA;
	pdata->hSlave=hSlave;
	pdata->bai=2;
	str1.Format("%d",Slave_GetID(hSlave));
	int ind=m_ctlListData.InsertItem(m_ctlListData.GetItemCount(),str1);
	m_ctlListData.SetItemText(ind,1,"设备信息");
	m_ctlListData.SetItemText(ind,2,"00:00:00");
	DWORD iolen[4];
	Slave_GetIODataLen(hSlave,iolen,iolen+1,iolen+2,iolen+3);
	str1.Format("DI=%d DO=%d AI=%d AO=%d\n",iolen[0],iolen[1],iolen[2],iolen[3]);
	m_ctlListData.SetItemText(ind,3,str1);
	m_ctlListData.SetItemData(ind,(DWORD)pdata);


	pdata=new LISTDATA;
	pdata->hSlave=hSlave;
	pdata->bai=0;
	str1.Format("%d",Slave_GetID(hSlave));
	ind=m_ctlListData.InsertItem(m_ctlListData.GetItemCount(),str1);
	m_ctlListData.SetItemText(ind,1,"DI");
	m_ctlListData.SetItemText(ind,2,"00:00:00");
	m_ctlListData.SetItemData(ind,(DWORD)pdata);

	pdata=new LISTDATA;
	pdata->hSlave=hSlave;
	pdata->bai=1;
	str1.Format("%d",Slave_GetID(hSlave));
	ind=m_ctlListData.InsertItem(m_ctlListData.GetItemCount(),str1);
	m_ctlListData.SetItemText(ind,1,"AI");
	m_ctlListData.SetItemText(ind,2,"00:00:00");
	m_ctlListData.SetItemData(ind,(DWORD)pdata);

}

void CTesticandllDlg::OnRclickListData(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CMenu menu;
	menu.LoadMenu(IDR_MENU1);
	CMenu* psub=menu.GetSubMenu(0);

	CPoint pt;
	GetCursorPos(&pt);
	psub->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);
	
	*pResult = 0;
}

void CTesticandllDlg::OnMenuDisconnect() 
{
	// TODO: Add your command handler code here
	int* parr;
	int len=0;
	GetSelItemArr(parr,len);
	if(len==0)
		return;
	LISTDATA* pdata;
	vector<HANDLE> vecslave;
	for(int i=len-1;i>=0;i--)
	{
		pdata=(LISTDATA*)m_ctlListData.GetItemData(parr[i]);
		for(int j=0;j<vecslave.size();j++)
		{
			if(vecslave[j]==pdata->hSlave)
				break;
		}
		if(vecslave.size()==j)
			vecslave.push_back(pdata->hSlave);
	}
	for(i=0;i<vecslave.size();i++)
	{
		Slave_Disconnect(vecslave[i]);
		DelItemFromCombo(m_ctlComboConnectedSlaveID,Slave_GetID(vecslave[i]));
		AddItemToCombo(m_ctlComboDisconnectSlaveID,Slave_GetID(vecslave[i]));
		int sz=m_ctlListData.GetItemCount();
		for(int j=sz-1;j>=0;j--)
		{
			pdata=(LISTDATA*)m_ctlListData.GetItemData(j);
			if(pdata->hSlave==vecslave[i])
			{
				delete pdata;
				m_ctlListData.DeleteItem(j);
			}
		}
	}
	delete []parr;
}

void CTesticandllDlg::OnUpdateMenuDisconnect(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_ctlListData.GetSelectedCount()>0);
}
int CTesticandllDlg::GetSelItemArr(int *& parr, int &len)
{
	len=m_ctlListData.GetSelectedCount();
	if(len==0)
		return 0;
	parr=new int[len];
	POSITION pos=m_ctlListData.GetFirstSelectedItemPosition();
	int ind=0;
	while(pos!=NULL)
	{
		parr[ind++]=m_ctlListData.GetNextSelectedItem(pos);
	}
	return len;
}

void CTesticandllDlg::DelAllFromList()
{
	int sz=m_ctlListData.GetItemCount();
	for(int i=0;i<sz;i++)
	{
		LISTDATA* pdata=(LISTDATA*)m_ctlListData.GetItemData(i);
		delete pdata;
	}
	m_ctlListData.DeleteAllItems();

	m_ctlComboConnectedSlaveID.ResetContent();
	m_ctlComboDisconnectSlaveID.ResetContent();
	WORD wMasterid=m_global.m_syscfg.routecfg.wMasterID;
	CString str1;
	for(i=0;i<wMasterid;i++)
	{
		str1.Format("%d",i);
		m_ctlComboDisconnectSlaveID.SetItemData(m_ctlComboDisconnectSlaveID.AddString(str1),i);
	}
	for(i=wMasterid+1;i<0xff;i++)
	{
		str1.Format("%d",i);
		m_ctlComboDisconnectSlaveID.SetItemData(m_ctlComboDisconnectSlaveID.AddString(str1),i);
	}
	m_ctlComboDisconnectSlaveID.SetCurSel(0);
}

int CTesticandllDlg::GetByteArr(BYTE* pbyte, int &len)
{
	CString str;
	GetDlgItem(IDC_EDIT_DATA)->GetWindowText(str);
	if(str.GetLength()>len*3)
		return 0;
	len=str.GetLength()/3;
	if(len==0)
		return 0;

	char* p=str.GetBuffer(len*3+1);
	char sztmp1[3]={0};
	int itmp1;
	for(int i=0;i<len;i++)
	{
		memcpy(sztmp1,p,2);
		sscanf(sztmp1,"%x",&itmp1);
		pbyte[i]=(BYTE)itmp1;
		p+=3;
	}
	str.ReleaseBuffer();

	return 1;
}

void CTesticandllDlg::OnButtonSenddata() 
{
	// TODO: Add your control notification handler code here
	int ind=m_ctlComboConnectedSlaveID.GetCurSel();
	if(ind==-1)
	{
		MessageBox("请选择从站");
		return;
	}
	int id=m_ctlComboConnectedSlaveID.GetItemData(ind);
	HANDLE hSlave;
	Route_GetSlavebyID(m_global.m_hRoute,id,&hSlave);
	BYTE addrarr[2]={0x20,0x60};
	BYTE buf[32];
	int len=32;
	GetByteArr(buf,len);
	if(len==0)
	{
		MessageBox("请输入发送数据");
		return;
	}
	
	if(Slave_SendData(hSlave,addrarr[m_ctlComboDataType.GetCurSel()],buf,len)!=
		ICANOK)
	{
		MessageBox("发送数据失败");
	}
}

void CTesticandllDlg::OnSelchangeComboMasterid() 
{
	// TODO: Add your control notification handler code here
}

void CTesticandllDlg::DisconnectItem(int ind)
{
	LISTDATA* pdata=(LISTDATA*)m_ctlListData.GetItemData(ind);
	HANDLE hSlave=pdata->hSlave;
	Slave_Disconnect(hSlave);
	DelItemFromCombo(m_ctlComboConnectedSlaveID,Slave_GetID(hSlave));
	AddItemToCombo(m_ctlComboDisconnectSlaveID,Slave_GetID(hSlave));
	int sz=m_ctlListData.GetItemCount();
	for(int j=sz-1;j>=0;j--)
	{
		LISTDATA* ptmpdata=(LISTDATA*)m_ctlListData.GetItemData(j);
		if(ptmpdata->hSlave==hSlave)
		{
			m_ctlListData.DeleteItem(j);
			delete ptmpdata;
		}
	}
}


⌨️ 快捷键说明

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