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

📄 device.cpp

📁 为电力系统开发保护设备装置通讯的源代码 采用串口通讯, ret hat 9下 QT开发
💻 CPP
字号:
#include "Device.h"
#include "103Device.h"
#include <pthread.h>
#include "baseclass/publicclass.h"
#include "devmoduledlg.h"
#include "CommonMutex.h"

extern CPublicClass g_PublicClass;
extern CCommonMutex g_CommMutex;

//启动顶级设备,包括点对点设备,总线,管理机等
void* DeviceCommunicateMainThread(void* lp)
{
	long threadid = (long)pthread_self();
	CDeviceNode* pDevNode = (CDeviceNode*)lp;
	char buf[1024];string msg = "";
	memset(buf, 0x00, sizeof(buf));
	sprintf(buf, "Self ThreadID is:%d", threadid);
	msg = string(buf);
	C103Device::Debug(msg);
   	//printf("---@@@@@Self ThreadID is:%d\n@@@------",threadid);   
    	//置巡检标志为0
   	pDevNode->ResetXunJianFlag();
  	QPtrList<C103Device> devlist;
   	devlist.setAutoDelete(true);
   	C103Device* pDev = NULL;
   	DeviceInfoListType::iterator it;
   	while (pDevNode->m_ModuleState != 1) usleep(100);

   	for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++)
    	{
    		it = pDevNode->m_ChildDevList.at(i);
    		printf("--@@Csc103 begin %d device cmd %d @@--\n", (*it).m_EquipNo, (int)(*it).m_SupportCmd);
        	C103Device* pcom103dev = new C103Device(*pDevNode->m_ChildDevList.at(i));
        	pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile);
      		if (pcom103dev->m_pxml == NULL)
        	{
        		printf("--@@Csc103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo);
        		delete pcom103dev;
        		return NULL;
        	}
      		if (pcom103dev->InitClass())
        	{
        		pcom103dev->m_iThreadId = threadid;
        		devlist.append(pcom103dev);
        		(*it).m_ThreadId = threadid;
	        }
	      	else
	        {
	        	printf("--@@Csc103 init %d error @@--\n", (*it).m_EquipNo);
	        	delete pcom103dev;
	          	//第i个设备无法正常启动,把设备列表也删除
	        	pDevNode->m_ChildDevList.remove(it);
	        }
    	}
    	CDataNode* pDataNode = NULL;
    	int iDevIndex = -1;
    	QDateTime currtime;
    	bool bstop = false;
    	while (!g_PublicClass.m_Stop && !bstop)
    	{
    		
        	currtime = QDateTime::currentDateTime();
       		pDataNode = g_PublicClass.m_NodeManage.FindCmdFromRDN(threadid);
       		//have node start
      		if (pDataNode != NULL)
        	{
        		g_CommMutex.Lock();
          		iDevIndex = pDevNode->FindDeviceByEquipNo(pDataNode->m_nodeinfo.m_MachineNo);
          		if (iDevIndex >= 0)
            		{
                		pDev = devlist.at(iDevIndex);
                		memcpy(&pDev->m_CmdInfo, &pDataNode->m_nodeinfo, sizeof(st_nodeinfo));
            		}
          		else
            		{
             			if (pDataNode->m_nodeinfo.m_DataType == WM_RUN_A_DEVICE)
                		{
                    			st_deviceinfo Dev;
                    			memcpy(&Dev, (void*)pDataNode->m_nodeinfo.m_SegmentPid, 
                            		pDataNode->m_nodeinfo.m_iSize);
                    			C103Device* pcom103dev = new C103Device(Dev);
                    			pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile);
                    			if (pcom103dev->m_pxml == NULL)
                    			{
                        			printf("--@@Csc103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo);
                        			delete pcom103dev;
                        			g_CommMutex.Unlock();
                        			return NULL;
                    			}
                    			if (pcom103dev->InitClass())
			                {
			                	pcom103dev->m_iThreadId = threadid;
			                        devlist.append(pcom103dev);
			                        Dev.m_ThreadId = threadid;
			                        Dev.m_SupportCmd = InstallMenu(QString(Dev.m_MachineType));
			                        pDevNode->m_ChildDevList.append(Dev);
			                                            
			                        st_deviceinfo di[1+pDevNode->m_ChildDevList.count()];
			                        memcpy(&di[0], &pDevNode->m_deviceinfo, sizeof(st_deviceinfo));
			                        if ((int)pDevNode->m_ChildDevList.count() > 0)
			                        {
			                            	DeviceInfoListType::iterator it;
			                            	for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++)
			                                {
				                                it = pDevNode->m_ChildDevList.at(i);
				                                memcpy(&di[1+i], &(*it), sizeof(st_deviceinfo));
			                                }
			                        }
			                        g_PublicClass.m_NodeManage.AddSendDataNode(g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 
			                        	0, WM_SENDDEVTHREADID,(void*)&di,
			                        	(1+pDevNode->m_ChildDevList.count())*sizeof(st_deviceinfo));
			                }
		                    	else
		                    	{
		                        	delete pcom103dev;
		                    	}
		                    	((DevModuleDlg*)g_PublicClass.m_MainForm)->Clear();
		                    	for (int j=0; j<(int)g_PublicClass.m_NodeManage.m_DeviceNode.count(); j++)
		                    	{
		                        	CDeviceNode* pDN = g_PublicClass.m_NodeManage.m_DeviceNode.at(j);
		                        	((DevModuleDlg*)g_PublicClass.m_MainForm)->AddTopLevelDevice((void*)pDN);
		                        	((DevModuleDlg*)g_PublicClass.m_MainForm)->AddChildDevice((void*)pDN);
		                    	}
                		}
                		g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点
                		g_CommMutex.Unlock();
	            		usleep(100);
	              		continue;
            		}
	            	g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点
	            	//switch start
	            	switch (pDev->m_CmdInfo.m_DataType)
	            	{
	            	case WM_REQUESTPARAMVALUE://申请定值
		                printf("--@@Com103 申请定值 @@--\n");
	                	pDev->GetDingZhi();
	                	break;
	            	case WM_REQUESTPVSECTOR://申请定值区号
		                printf("--@@Com103 申请定值区号 @@--\n");
	                	pDev->GetSector();
	                	break;
	            	case WM_MODIFYTIME://申请修改时钟
	                	printf("--@@Com103 申请修改时钟 @@--\n");
	                	pDev->CheckTime();
	                	break;
	            	case WM_REQUESTANLOGVALUE://申请采样值
		                printf("--@@Com103 申请采样值 @@--\n");
	                	pDev->GetAnalog();
	                	break;
	            	case WM_REQUESTSWITCHVALUE://申请开关量
	                	printf("--@@Com103 申请开关量 @@--\n");
	                	pDev->GetSwitch();
	                	break;
	            	case WM_REQUESTSHUVALUE://申请压板状态
		                printf("--@@Com103 申请压板状态 @@--\n");
	                	pDev->GetYaBan();
	                	break;
	            	case WM_REQUESTDISTURBDATA://申请扰动数据
	                	printf("--@@Com103 申请扰动数据 @@--\n");
	                	pDev->RequireDistrubt();
	                	break;
	            	case WM_MODIFYPARAMVALUE://申请修改定值
		                break;
	            	case WM_REQUESTCHGPVSECTOR://申请切换定值区号
		                break;
	            	case WM_SERIESANLOGBEGIN://开始连续采样
		                break;
	            	case WM_SERIESANLOGEND://停止连续采样
	                	break;
	            	case WM_MODIFYSWITCHVALUE://申请修改开关量
	                	break;
	            	case WM_SHUTTERSTATEON://申请投压板
			                break;
	            	case WM_SHUTTERSTATEOFF://申请退压板
	                	break;
	            	case WM_ACTIONSIGNALRESET://动作信号复归
	                	break;
	            	case WM_REQUESTHFEXCHG://申请高频交换
	                	break;
	            	case WM_REQUESTCOMMSTATE://申请通信状态
		                break;
	            	case WM_REQUESTCOMMRESET://申请通信复位
	                	break;
	            	case WM_REQUESTHFRESET://申请高频复归
	                	break;
	            	case WM_STOP_A_DEVICE://设备停?	
	            		{
		            		pDev->ReleaseSocket();
		                	devlist.remove(iDevIndex);
		                	it = pDevNode->m_ChildDevList.at(iDevIndex);
		                	printf("--@@Csc103 停止%d 设备 DevIndex=%d @@--\n", (*it).m_EquipNo,iDevIndex);
		                	g_PublicClass.m_NodeManage.AddSendDataNode(g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 
		                        	0, WM_STOP_A_DEVICE,(void*)&(*it), sizeof(st_deviceinfo));	
		              		pDevNode->m_ChildDevList.remove(it);
		              		if ((int)pDevNode->m_ChildDevList.count() == 0)
		              		{
		                    		g_PublicClass.m_NodeManage.DeleteDeviceNode((void*)pDevNode);
		                    		if ((int)g_PublicClass.m_NodeManage.m_DeviceNode.count() == 0)
		                    		{
		                        		g_PublicClass.m_NodeManage.AddSendDataNode(g_PublicClass.m_MainModuleNode.m_deviceinfo.mtype, 
		                        			0, WM_STOP_A_MODULE,NULL, 0);
		                    		}
		                    		bstop = true;
		                	}
		                	if ((int)g_PublicClass.m_NodeManage.m_DeviceNode.count() != 0)
		              		{
		                    		((DevModuleDlg*)g_PublicClass.m_MainForm)->Clear();
		                    		for (int j=0; j<(int)g_PublicClass.m_NodeManage.m_DeviceNode.count(); j++)
		                    		{
		                        		CDeviceNode* pDN = g_PublicClass.m_NodeManage.m_DeviceNode.at(j);
		                        		((DevModuleDlg*)g_PublicClass.m_MainForm)->AddTopLevelDevice((void*)pDN);
		                        		((DevModuleDlg*)g_PublicClass.m_MainForm)->AddChildDevice((void*)pDN);
		                    		}
		                	}
		                }
	                	break;
	                default :
	                	break;
	            	}//switch end
	            	printf("--@@Csc103 命令完成 @@--\n");
	            	g_CommMutex.Unlock();
	            	usleep(100);
	            	continue;
	        }//have node end
	        
	        //XunJian
        	iDevIndex = pDevNode->FindDeviceByFlag(0);
        	if (iDevIndex >= 0)
        	{
        		g_CommMutex.Lock();
        		pDev = devlist.at(iDevIndex);
        		if (!pDev->CheckComm()) 
	             	{
	              		g_CommMutex.Unlock();
	            		usleep(100);
	              		continue;
	             	}
            		
            		int isecs = pDev->m_GITime.secsTo(currtime);
            		if (isecs > 15*60)//大于15分钟后进行总召唤
            		{
            			pDev->GI();
                		pDev->m_GITime = QDateTime::currentDateTime();
            		}
	          	DeviceInfoListType::iterator it = pDevNode->m_ChildDevList.at(iDevIndex);
	          	(*it).m_PlFlag = 1;//置巡检标志为1

	          	if (pDev->XunJian())
	            	{
	                	if (pDev->m_bSendState3 == true)
	                	{
	                    		pDev->m_bSendState3 = false;
	                    		pDev->m_bSendState0 = true;
	                    		pDev->SendCommStateToMain(3);
	                	}
	            	}
	            	else
	            	{
		                if (pDev->m_bSendState0 == true)
		                {
		                    	pDev->m_bSendState0 = false;
		                    	pDev->m_bSendState3 = true;
		                    	pDev->SendCommStateToMain(0);
		                }
	            	}
	            	g_CommMutex.Unlock();
	            	usleep(100);
	            	continue;
	        }
	        else
	        {
	            //重新置巡检标志为0
	            pDevNode->ResetXunJianFlag();
	            usleep(100);
	        }
	        usleep(100);
    	}//while end
    	printf("--@@@Csc exit@@@---\n");
    	return NULL;
}


int FindSpeed(int ispeed)
{
	int itmp = 0;
	switch (ispeed)
	{
	case 9600:
		itmp = 13;
		break;
	case 4800:
		itmp = 12;
		break;
	case 2400:
		itmp = 11;
		break;
	default : break;
    	}
	return itmp;
}

int InstallMenu(QString szfilename)
{
    	QString xmlfile = "";
	xmlfile.sprintf("%s", szfilename.data());
	if (xmlfile == "" || xmlfile.isEmpty()) return 0;
	xmlfile = g_PublicClass.GetWorkPath()+"/devconfig/"+xmlfile+".xml";
	CXMLReader xml(xmlfile);
	xml.OpenDomXMLFile();
	QDomNode node, cnode;
	node = xml.GetDomNode("body", "CONFIG");
	cnode = xml.GetChildNode(node, "MENU", "", "");
	QString sztmp = "";
	xml.GetNodeAttr(cnode, "value", sztmp);
	printf("menu %s\n",sztmp.data());
	return sztmp.toInt();
}

⌨️ 快捷键说明

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