📄 device.cpp
字号:
//device.cpp#include "Device.h"#include <pthread.h>#include "baseclass/publicclass.h"extern CPublicClass g_PublicClass;CDevice::CDevice(){}CDevice::~CDevice(){}bool CDevice::InitDevices(void* ppNode,long threadid,void* pCom){ CDeviceNode* pDevNode=(CDeviceNode*)ppNode; Communicate* pmyComm=(Communicate*)pCom; if(!pDevNode) { printf("ppnode=NULL\n"); return false; } DeviceInfoListType::iterator it; CDataProcess dp; for (int i=0; i<(int)pDevNode->m_ChildDevList.count(); i++) { it = pDevNode->m_ChildDevList.at(i); if((*it).m_Wild>0) //再次初始化时,必须删除原来的类指针 { delete (CNRLan103*)((*it).m_Wild); (*pDevNode->m_ChildDevList.at(i)).m_Wild=0; } CNRLan103* pcom103dev = new CNRLan103(*pDevNode->m_ChildDevList.at(i)); pcom103dev->m_pxml = g_PublicClass.FindXmlFile(pcom103dev->m_szConFile); if (pcom103dev->m_pxml == NULL) { printf("[来自NRLAN103]%d设备的XML文件%s未找到......\n", (*it).m_MachineNo,pcom103dev->m_szConFile.data()); delete pcom103dev; return false; } if (pcom103dev->InitClass()) { pcom103dev->m_iThreadId = threadid; pcom103dev->m_pComm = pmyComm; pcom103dev->communicator.pComm(pmyComm); (*pDevNode->m_ChildDevList.at(i)).m_Wild=(long)pcom103dev; (*pDevNode->m_ChildDevList.at(i)).m_ThreadId = threadid; //注册设备 long hdbc=-1; dp.InsertToDeviceInfo(hdbc,g_PublicClass.m_ModuleName,g_PublicClass.m_StationNo,(*it).m_MachineNo, threadid,1,QString("00"),QString((*it).m_RecordIndex),QString((*it).m_ParentIndex)); } else { printf("[来自NRLAN103]初始化 %d 出错......\n", (*it).m_MachineNo); delete pcom103dev; return false; } } return true;}//启动顶级设备,包括点对点设备,总线,管理机等void* DeviceCommunicateMainThread(void* lp){ long threadid = (long)pthread_self(); CDeviceNode* pDevNode = (CDeviceNode*)lp; //接收设备接点 pDevNode->ResetXunJianFlag(); //置巡检标志为0 CNRLan103* pDev = NULL; while (pDevNode->m_ModuleState != 1) usleep(100*1000); //初始化完成后才可以开始下面的线程 Communicate myComm; CDataNode* pDataNode = NULL; int iDevIndex = -1; QDateTime currtime; bool bstop = false; CDevice cd; bool bInitOk=false; //连接数据库 long hdbc=-1; CDataProcess dp; //dp.ConnectDatabase(hdbc); bool resetCU = false ; while (!g_PublicClass.m_Stop && !bstop) { //打开通讯端口 if(!myComm.IsConnected()) { //读写加锁,不允许读或写端口 printf("open comm port\n");// myComm.m_ReadLocker.lock();// myComm.m_WriteLocker.lock(); myComm.beginComm(Communicate::CLIENT, pDevNode->m_deviceinfo.m_IPAddress, pDevNode->m_deviceinfo.m_SocketPort); //如果打开失败// myComm.m_ReadLocker.unlock();// myComm.m_WriteLocker.unlock(); //打开成功后,解锁允许读,写 printf("open success\n"); resetCU = true ; } if(!myComm.IsConnected()) { sleep(1); continue; } //初始化设备 if(!bInitOk) { bInitOk=cd.InitDevices((void*)pDevNode,threadid,&myComm); if(!bInitOk) { pthread_yield(); continue; } } //处理命令 currtime = QDateTime::currentDateTime(); pDataNode = g_PublicClass.m_NodeManage.FindCmdFromRDN(threadid);//查找一个属于本线程的命令 if (pDataNode != NULL && !pDev->m_bCmding && !pDev->m_bWaving) { pDev = (CNRLan103*)pDevNode->FindDeviceWildByEquipNo(pDataNode->m_nodeinfo.m_MachineNo); if (pDev) { memcpy(&pDev->m_CmdInfo, &pDataNode->m_nodeinfo, sizeof(st_nodeinfo)); if (pDataNode->m_nodeinfo.m_SegmentPid > 0) { BYTE* pbuff = new BYTE[pDataNode->m_nodeinfo.m_iSize]; memcpy(pbuff, (BYTE*)pDataNode->m_nodeinfo.m_SegmentPid, pDataNode->m_nodeinfo.m_iSize); pDev->m_CmdInfo.m_SegmentPid = (long)pbuff; } pDev->SetHdbc(hdbc); } else {/* if (pDataNode->m_nodeinfo.m_DataType == WM_CHANGECOMMPARAM) { long hdbctmp = -1; // dp.GetDevCommFromMachineNo(hdbctmp, pDataNode->m_nodeinfo.m_MachineNo, pDev->m_DevInfo); myComm.m_ForceReOpen = true; }*/ g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点 pthread_yield(); continue; } g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点 switch (pDev->m_CmdInfo.m_DataType) { case WM_REQUESTPARAMVALUE://申请定值 { printf("--@@Com103 申请定值 @@--\n"); pDev->GetDingZhi(); hdbc=pDev->GetHdbc(); //重新取得数据库句柄 break; } case WM_REQUESTPVSECTOR://申请定值区号 { printf("--@@Com103 申请定值区号 @@--\n"); pDev->GetSector(); hdbc=pDev->GetHdbc(); break; } case WM_MODIFYTIME://申请修改时钟 { printf("--@@Com103 申请修改时钟 @@--\n"); pDev->AdjustClock(); 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://设备停止 // { // g_PublicClass.m_Stop=true; // bstop=true; // break; // } default : break; } pthread_yield(); continue; } pDev = (CNRLan103*)pDevNode->FindDeviceWildByFlag(0,iDevIndex); if (pDev) { pDev->SetHdbc(hdbc); if(myComm.IsConnected()) { pDev->m_bCommError=false;/* if (resetCU) { pDev->InitDevice() ; resetCU = false ; }*/ } //int isecs = pDev->m_GITime.secsTo(currtime); //if (isecs > 15*60)//大于15分钟后进行总召唤 //{ //pDev->m_GITime = QDateTime::currentDateTime(); //} #ifdef NRLAN_DEBUG printf("entering mainloop.pDev\t%p\n",pDev); #endif if (pDev->XunJian()) {/* if (pDev->m_bSendState1 == true) { pDev->m_bSendState1 = false; pDev->m_bSendState0 = true; pDev->SendCommStateToMain(1); }*/ } else {/* if (pDev->m_bSendState0 == true) { pDev->m_bSendState0 = false; pDev->m_bSendState1 = true; pDev->SendCommStateToMain(0); }*/ } if (pDev->m_bCommError)//通信口错误,重新打开 { printf("commerror=true\n"); pDevNode->ResetXunJianFlag();// myComm.m_ForceReOpen=true; } else { DeviceInfoListType::iterator it = pDevNode->m_ChildDevList.at(iDevIndex); (*it).m_PlFlag = 1;//置巡检标志为1 } pthread_yield(); #ifdef NRLAN_DEBUG printf("main loop will continue\n"); #endif continue; } else { //重新置巡检标志为0 pDevNode->ResetXunJianFlag(); pthread_yield(); } pthread_yield(); } pDevNode->m_deviceinfo.m_ThreadId=0; myComm.Close(); 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(QString("body"), QString("CONFIG")); cnode = xml.GetChildNode(node, "MENU", NULL, NULL); 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 + -