// DlgSelectDev.cpp : 实现文件 // #include "stdafx.h" #include "IDE.h" #include "DlgSelectDev.h" #include ".\dlgselectdev.h" #include "MainFrm.h" #include "Serial.h" #include "Network.h" #include "Wizard.h" #include "DlgDevice.h" #include "DlgComPort.h" // CDlgSelectDev 对话框 IMPLEMENT_DYNAMIC(CDlgSelectDev, CDialog) CDlgSelectDev::CDlgSelectDev(CWnd* pParent /*=NULL*/) : CDialog(CDlgSelectDev::IDD, pParent) { } CDlgSelectDev::~CDlgSelectDev() { } void CDlgSelectDev::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE_DEVICE, m_wndTree); } BEGIN_MESSAGE_MAP(CDlgSelectDev, CDialog) ON_BN_CLICKED(IDC_BTN_CANCEL, OnBnClickedBtnCancel) ON_BN_CLICKED(IDC_BTN_CONFIRM, OnBnClickedBtnConfirm) ON_BN_CLICKED(IDC_BTN_DEV_ADD, OnBnClickedBtnDevAdd) ON_BN_CLICKED(IDC_BTN_DEV_EDIT, OnBnClickedBtnDevEdit) ON_BN_CLICKED(IDC_BTN_DEV_DEL, OnBnClickedBtnDevDel) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_DEVICE, OnTvnSelchangedTreeDevice) ON_NOTIFY(NM_DBLCLK, IDC_TREE_DEVICE, OnNMDblclkTreeDevice) END_MESSAGE_MAP() // CDlgSelectDev 消息处理程序 BOOL CDlgSelectDev::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 在此添加额外的初始化 InitTreeInfo(); MyExpandTree( m_wndTree.GetRootItem() ); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CDlgSelectDev::MyExpandTree(HTREEITEM hTreeItem) { if(!m_wndTree.ItemHasChildren(hTreeItem)) { return; } HTREEITEM hNextItem = m_wndTree.GetChildItem(hTreeItem); while (hNextItem != NULL) { MyExpandTree(hNextItem); hNextItem = m_wndTree.GetNextItem(hNextItem, TVGN_NEXT); } m_wndTree.Expand(hTreeItem,TVE_EXPAND); } void CDlgSelectDev::InitTreeInfo(void) { m_wndTree.ModifyStyle(0, TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS); m_wndTree.DeleteAllItems(); m_wndTree.SetItemHeight(20); m_wndImageList.DeleteImageList(); m_wndImageList.Create(IDB_LEFT, 16, 1, RGB(255, 0, 255)); m_wndTree.SetImageList(&m_wndImageList, LVSIL_NORMAL); //插入串口和设备 HTREEITEM hRoot = m_wndTree.InsertItem(g_strAllDev, 0, 0); int nComportSize = pDevicesManager->m_channels.GetSize(); for (int i = 0; i < nComportSize; i++) { CChannel* pComport = pDevicesManager->m_channels[i]; if( pComport->m_nCommunicateType == 1 ) { m_hSerialGroup[i] = m_wndTree.InsertItem(g_strEthernet,5,5,hRoot); } else { m_hSerialGroup[i] = m_wndTree.InsertItem(pComport->m_strName,5,5,hRoot); } int nDeviceSize = pComport->m_Devices.GetSize(); for (int j = 0; j < nDeviceSize; j++) { CDevice* pDev = pComport->m_Devices[j]; m_hSerialDev[i][j] = m_wndTree.InsertItem(pDev->m_strName,4,4,m_hSerialGroup[i]); } } } void CDlgSelectDev::ShowDevProperty(HTREEITEM hSelectedItem) { #if 0 CString strOldUid, strNewUid; CMainFrame *pMainFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd; int i, j; int nChannelIndex = -1, nDeviceIndex = -1; int nChannelSize = pDevicesManager->m_channels.GetSize(); // 串口设备属性设置 for (i = 0; i < nChannelSize; i++) { if( nChannelIndex != -1 && nDeviceIndex != -1 ) break; int nDeviceSize = pDevicesManager->m_channels[i]->m_Devices.GetSize(); for( j = 0; j < nDeviceSize; j++) { if (m_hSerialDev[i][j]==hSelectedItem) { nChannelIndex = i; nDeviceIndex = j; break; } if( m_hNetworkDev[j] == hSelectedItem && pDevicesManager->m_channels[i]->m_nCommunicateType == 1 ) { nChannelIndex = i; nDeviceIndex = j; break; } } } CChannel* pChannel = pDevicesManager->m_channels[nChannelIndex]; CDevice* pDev = pChannel->m_Devices[nDeviceIndex]; //CSerial* pSerial = (CSerial *)pChannel; CNetwork *pNetwork = (CNetwork *)pChannel; CWizard MyWizard(g_strMywizard,this,1); // 通信方式 pMainFrm->m_wndDevice.m_nCommuniteType = pChannel->m_nCommunicateType; // 设备驱动名称 pMainFrm->m_wndDevice.m_strDevDriveName = pDev->m_strDevDriveName; // 设备厂家名称 pMainFrm->m_wndDevice.m_strDevFactoryName = pDev->m_strDevFactoryName; // 设备型号 pMainFrm->m_wndDevice.m_strDevTypeName = pDev->m_strType; // 通信协议(例:Modbus rtu, modbus ascii, modbus tcp) pMainFrm->m_wndDevice.m_nProtocolType = pDev->m_nProtocolType; // 协议驱动动态库名称 pMainFrm->m_wndDevice.m_strProtocolName = pDev->m_strProtocolName; // 是否为采集设备 pMainFrm->m_wndDevice.m_nCollectDev = pDev->m_nIsCollectDev; // 是否启用设备 pMainFrm->m_wndDevice.m_nDevEnable = (int)pDev->m_bUsed; // 设备UID pMainFrm->m_wndComport.m_strUID = pDev->m_strUID; // 设备名称 pMainFrm->m_wndComport.m_strDevName = pDev->m_strName; // 设备所属区域 pMainFrm->m_wndComport.m_strDevArea = pDev->m_strDevArea; // 通讯超时 pMainFrm->m_wndComport.m_nTimeout = pDev->m_nTimeout; // 设备地址 pMainFrm->m_wndComport.m_nDevAddr = (int)pDev->m_Address; // 串行端口 pMainFrm->m_wndComport.m_nCommPort = atoi(pSerial->m_strPort.Mid(3)); // 数据位 pMainFrm->m_wndComport.m_nDataBit = pSerial->m_nByteSize; // 波特率 pMainFrm->m_wndComport.m_nRate = pSerial->m_nBaudRate; // 停止位 pMainFrm->m_wndComport.m_nStopBit = pSerial->m_nStopBits; // 校验位 pMainFrm->m_wndComport.m_nCheckCode = pSerial->m_nParity; if( pChannel->m_nCommunicateType == 1 ) { // 设备IP pMainFrm->m_wndComport.m_nNetIP = htonl(inet_addr(pDev->m_strDevIP)); // 通讯端口 pMainFrm->m_wndComport.m_nNetPort = pDev->m_nNetPort; } pMainFrm->m_wndDevice.m_operation = CDlgDevice::EDIT; MyWizard.AddPage( &pMainFrm->m_wndDevice ); MyWizard.AddPage( &pMainFrm->m_wndComport ); MyWizard.SetWizardMode(); MyWizard.SetActivePage( &pMainFrm->m_wndDevice ); int nTmpChannelIndex = -1, nTmpDeviceIndex = -1; if( MyWizard.DoModal() == ID_WIZFINISH ) { if( !pMainFrm->m_wndComport.m_strDevName.Compare("") ) { MessageBox(g_strDevNumCannotBlank, g_strTip, MB_ICONINFORMATION); return; } else if( pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strName != pMainFrm->m_wndComport.m_strDevName ) { if( pDevicesManager->FindDev(pMainFrm->m_wndComport.m_strDevName, nTmpChannelIndex, nTmpDeviceIndex) ) { MessageBox(g_strDevNameInUse, g_strTip, MB_ICONINFORMATION); return; } } if( pMainFrm->m_wndDevice.m_nCommuniteType == 0 ) { CString strName; strName.Format("COM%d", pMainFrm->m_wndComport.m_nCommPort); //TRACE("串口名称=%s\r\n", pDevicesManager->m_channels[nChannelIndex]->m_strName); if( pDevicesManager->m_channels[nChannelIndex]->m_strName.Compare("") && pDevicesManager->m_channels[nChannelIndex]->m_strName != strName ) { int nIndex; nIndex = pDevicesManager->FindCommPort(strName); if( nIndex == -1 ) { if( pMainFrm->FinishedAddDevice() == 1 ) { DeleteDevInfo((char *)(LPCTSTR)pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strUID); pDevicesManager->m_channels[nChannelIndex]->m_Devices.RemoveAt(nDeviceIndex); //InitTreeInfo(); } return; } else { if( pDevicesManager->FindCommPort(strName, pMainFrm->m_wndComport.m_nDevAddr, nTmpChannelIndex, nTmpDeviceIndex) ) { MessageBox(g_strSerialPortInUse, g_strTip, MB_ICONINFORMATION); return; } if( pDevicesManager->FindDev(strName, nTmpChannelIndex, nTmpDeviceIndex) ) { MessageBox(g_strDevNameInUse, g_strTip, MB_ICONINFORMATION); return; } //nChannelIndex = nIndex; if( pMainFrm->FinishedAddDevice() == 1 ) { DeleteDevInfo((char *)(LPCTSTR)pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strUID); pDevicesManager->m_channels[nChannelIndex]->m_Devices.RemoveAt(nDeviceIndex); //InitTreeInfo(); } Invalidate(FALSE); return; //nDeviceIndex = pDevicesManager->m_channels[nChannelIndex]->m_Devices.GetSize(); } } else { if( pDevicesManager->FindDev(strName, nTmpChannelIndex, nTmpDeviceIndex) ) { MessageBox(g_strDevNameInUse, g_strTip, MB_ICONINFORMATION); return; } } } else { CString strIP = inet_ntoa(*(struct in_addr *)&pMainFrm->m_wndComport.m_nNetIP); if( pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strDevIP != strIP ) { if( pDevicesManager->FindDev(strIP, pMainFrm->m_wndComport.m_nNetPort, nTmpChannelIndex, nTmpDeviceIndex) ) { MessageBox(g_strIPComoccupy, g_strTip, MB_ICONINFORMATION); return; } } } // 通信方式 pDevicesManager->m_channels[nChannelIndex]->m_nCommunicateType = pMainFrm->m_wndDevice.m_nCommuniteType; // 设备驱动名称 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strDevDriveName = pMainFrm->m_wndDevice.m_strDevDriveName; // 设备厂家名称 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strDevFactoryName = pMainFrm->m_wndDevice.m_strDevFactoryName; // 设备型号 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strType = pMainFrm->m_wndDevice.m_strDevTypeName; // 通信协议(例:Modbus rtu, modbus ascii, modbus tcp) pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_nProtocolType = pMainFrm->m_wndDevice.m_nProtocolType; // 协议驱动动态库名称 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strProtocolName = pMainFrm->m_wndDevice.m_strProtocolName; // 是否为采集设备 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_nIsCollectDev = pMainFrm->m_wndDevice.m_nCollectDev; // 是否启用设备 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_bUsed = (BOOL)pMainFrm->m_wndDevice.m_nDevEnable; // 设备UID pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strUID = pMainFrm->m_wndComport.m_strUID; strNewUid = pMainFrm->m_wndComport.m_strUID; // 设备名称 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strName = pMainFrm->m_wndComport.m_strDevName; // 设备所属区域 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strDevArea = pMainFrm->m_wndComport.m_strDevArea; // 通讯超时 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_nTimeout = pMainFrm->m_wndComport.m_nTimeout; // 设备地址 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_Address = (BYTE)pMainFrm->m_wndComport.m_nDevAddr; int nIP = htonl(pMainFrm->m_wndComport.m_nNetIP); if( pMainFrm->m_wndDevice.m_nCommuniteType == 0 ) { pDevicesManager->m_channels[nChannelIndex]->m_strName.Format("COM%d", pMainFrm->m_wndComport.m_nCommPort); // 串行端口 pDevicesManager->m_channels[nChannelIndex]->m_strPort.Format("COM%d", pMainFrm->m_wndComport.m_nCommPort); // 数据位 pDevicesManager->m_channels[nChannelIndex]->m_nByteSize = pMainFrm->m_wndComport.m_nDataBit; // 波特率 pDevicesManager->m_channels[nChannelIndex]->m_nBaudRate = pMainFrm->m_wndComport.m_nRate; // 停止位 pDevicesManager->m_channels[nChannelIndex]->m_nStopBits = pMainFrm->m_wndComport.m_nStopBit; // 校验位 pDevicesManager->m_channels[nChannelIndex]->m_nParity = pMainFrm->m_wndComport.m_nCheckCode; } else if( pMainFrm->m_wndComport.m_nCommunicateMode == 1 ) { // 设备IP pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strDevIP = inet_ntoa(*(struct in_addr *)&nIP); // 通讯端口 pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_nNetPort = pMainFrm->m_wndComport.m_nNetPort; } CHAR szDevTypeID[MAX_ID + 1] = {0}; // 获取设备类型ID GetDevTypeID( (char *)(LPCTSTR)pMainFrm->m_wndDevice.m_strDevTypeName, szDevTypeID ); // 修改设备信息 //EditDevInfo( (char *)(LPCTSTR)strOldUid, // (char *)(LPCTSTR)strNewUid, // pMainFrm->m_wndComport.m_nCommPort, // pMainFrm->m_wndComport.m_nDevAddr, // (char *)(LPCTSTR)pMainFrm->m_wndComport.m_strDevName, // atoi(szDevTypeID), // pMainFrm->m_wndComport.m_nRate, // pMainFrm->m_wndComport.m_nDataBit, // pMainFrm->m_wndComport.m_nStopBit, // pMainFrm->m_wndComport.m_nCheckCode, // 0, // inet_ntoa(*(struct in_addr *)&nIP), // pMainFrm->m_wndComport.m_nNetPort, // pMainFrm->m_wndComport.m_nCommunicateMode, // pMainFrm->m_wndDevice.m_nCollectDev, // pMainFrm->m_wndDevice.m_nProtocolType, // pMainFrm->m_wndComport.m_nTimeout, // pMainFrm->m_wndDevice.m_nDevEnable, // (char *)(LPCTSTR)pMainFrm->m_wndDevice.m_strProtocolName, // (char *)(LPCTSTR)pMainFrm->m_wndComport.m_strDevArea); } pMainFrm->m_wndTree.SetItemText(pMainFrm->m_hSerialDev[nChannelIndex][nDeviceIndex], pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strName); m_wndTree.SetItemText(hSelectedItem, pDevicesManager->m_channels[nChannelIndex]->m_Devices[nDeviceIndex]->m_strName); Invalidate(FALSE); #endif } void CDlgSelectDev::DeleteDev() { CMainFrame *pMainFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd; int i, j; CString strMessage, strSelect; HTREEITEM hSelectedItem = m_wndTree.GetSelectedItem(); strSelect = m_wndTree.GetItemText( hSelectedItem ); int nChannelNo = -1, nDeviceNo = -1; int nChannelSize = pDevicesManager->m_channels.GetSize(); // 串口设备属性设置 for (i = 0; i < nChannelSize; i++) { if( nChannelNo != -1 && nDeviceNo != -1 ) break; int nDeviceSize = pDevicesManager->m_channels[i]->m_Devices.GetSize(); for( j = 0; j < nDeviceSize; j++) { if (m_hSerialDev[i][j]==hSelectedItem) { nChannelNo = i; nDeviceNo = j; break; } if( m_hNetworkDev[j] == hSelectedItem && pDevicesManager->m_channels[i]->m_nCommunicateType == 1 ) { nChannelNo = i; nDeviceNo = j; break; } } } CChannel* pChannel = pDevicesManager->m_channels[nChannelNo]; CDevice* pDev = pChannel->m_Devices[nDeviceNo]; strMessage.Format(g_strDelDev,pDev->m_strName); if (MessageBox(strMessage,g_strConfirm,MB_YESNO|MB_ICONQUESTION) == IDNO) return; m_wndTree.DeleteItem(hSelectedItem); if( pChannel->m_nCommunicateType == 0 ) { for( j = nDeviceNo; j < MAX_DEVICE_NUM; j++ ) { m_hSerialDev[nChannelNo][j] = m_hSerialDev[nChannelNo][j+1]; } } else if( pChannel->m_nCommunicateType = 1 ) { for( j = nDeviceNo; j < MAX_DEVICE_NUM; j++ ) { m_hNetworkDev[j] = m_hNetworkDev[j+1]; } } CDBInterface::GetInstancePtr()->DeleteDevInfo( (char *)(LPCTSTR)pChannel->m_Devices[nDeviceNo]->m_strUID ); delete pChannel->m_Devices[nDeviceNo]; pChannel->m_Devices.RemoveAt(nDeviceNo); pMainFrm->InitTreeInfo(); } void CDlgSelectDev::OnBnClickedBtnCancel() { // TODO: 在此添加控件通知处理程序代码 OnCancel(); } void CDlgSelectDev::OnBnClickedBtnConfirm() { // TODO: 在此添加控件通知处理程序代码 // 选择设备完成 OnOK(); } void CDlgSelectDev::OnBnClickedBtnDevAdd() { // TODO: 在此添加控件通知处理程序代码 CMainFrame *pMainFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd; pMainFrm->AddDevice(); InitTreeInfo(); } void CDlgSelectDev::OnBnClickedBtnDevEdit() { // TODO: 在此添加控件通知处理程序代码 HTREEITEM hSelectedItem = m_wndTree.GetSelectedItem(); // 设备属性设置 ShowDevProperty(hSelectedItem); } void CDlgSelectDev::OnBnClickedBtnDevDel() { // TODO: 在此添加控件通知处理程序代码 DeleteDev(); } void CDlgSelectDev::SelChangedTreeDeviceFolder(HTREEITEM hItemSelect) { m_strDevName = m_wndTree.GetItemText( hItemSelect ); HTREEITEM hItemParent = m_wndTree.GetParentItem( hItemSelect ); if( hItemParent != NULL ) { hItemParent = m_wndTree.GetParentItem( hItemParent ); if( hItemParent != NULL ) { GetDlgItem(IDC_BTN_CONFIRM)->EnableWindow(TRUE); } else { GetDlgItem(IDC_BTN_CONFIRM)->EnableWindow(FALSE); return; } } else { GetDlgItem(IDC_BTN_CONFIRM)->EnableWindow(FALSE); return; } } void CDlgSelectDev::OnTvnSelchangedTreeDevice(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 HTREEITEM hItemSelect = pNMTreeView->itemNew.hItem; SelChangedTreeDeviceFolder( hItemSelect ); *pResult = 0; } void CDlgSelectDev::OnNMDblclkTreeDevice(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 int i; HTREEITEM hSelectedItem = m_wndTree.GetSelectedItem(); for (i = 0; i < MAX_SERIAL_NUM; i++) { for( int j = 0; j < MAX_DEVICE_NUM; j++) { if (m_hSerialDev[i][j]==hSelectedItem) { OnOK(); return; } } } *pResult = 0; }