📄 device.cpp~
字号:
#include "Device.h"#include "103Device.h"#include <pthread.h>#include "baseclass/publicclass.h"#include "devmoduledlg.h"extern CPublicClass g_PublicClass;//启动顶级设备,包括点对点设备,总线,管理机等void* DeviceCommunicateMainThread(void* lp){ long threadid = (long)pthread_self(); CDeviceNode* pDevNode = (CDeviceNode*)lp; printf("---@@@@@is:%d\n",1223); //置巡检标志为0 pDevNode->ResetXunJianFlag(); CCommunication myComm(COM, pDevNode->m_deviceinfo.m_Port, FindSpeed(pDevNode->m_deviceinfo.m_Speed), pDevNode->m_deviceinfo.m_DataBit, pDevNode->m_deviceinfo.m_StopBit, (paritytype_t)pDevNode->m_deviceinfo.m_Parity, pDevNode->m_deviceinfo.m_IPAddress, CSocket::TCP, pDevNode->m_deviceinfo.m_IPAddress, pDevNode->m_deviceinfo.m_Port); communication_t type = myComm.GetType(); if (type == NIL) return NULL;//通信口打开错误 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("--@@Com103 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("--@@Com103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo); delete pcom103dev; return NULL; } if (pcom103dev->InitClass()) { pcom103dev->m_iThreadId = threadid; pcom103dev->m_pComm = &myComm; devlist.append(pcom103dev); (*it).m_ThreadId = threadid; } else { printf("--@@Com103 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); if (pDataNode != NULL) { 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("--@@Com103 Init Error deviceno=%d @@--\n", (*it).m_EquipNo); delete pcom103dev; return NULL; } if (pcom103dev->InitClass()) { pcom103dev->m_iThreadId = threadid; pcom103dev->m_pComm = &myComm; 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);//删除数据接点 usleep(1); continue; } g_PublicClass.m_NodeManage.DeleteRecvDataNode(pDataNode);//删除数据接点 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->m_pComm = NULL; devlist.remove(iDevIndex); it = pDevNode->m_ChildDevList.at(iDevIndex); printf("--@@Com103 停止%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; } printf("--@@Com103 命令完成 @@--\n"); continue; } iDevIndex = pDevNode->FindDeviceByFlag(0); if (iDevIndex >= 0) { pDev = devlist.at(iDevIndex); int isecs = pDev->m_GITime.secsTo(currtime); if (isecs > 15*60)//大于15分钟后进行总召唤 { pDev->m_GITime = QDateTime::currentDateTime(); } 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); } } if (pDev->m_bCommError)//通信口错误,重新打开 { myComm.Open(COM, pDevNode->m_deviceinfo.m_Port, FindSpeed(pDevNode->m_deviceinfo.m_Speed), pDevNode->m_deviceinfo.m_DataBit, pDevNode->m_deviceinfo.m_StopBit, (paritytype_t)pDevNode->m_deviceinfo.m_Parity, pDevNode->m_deviceinfo.m_IPAddress, CSocket::TCP, pDevNode->m_deviceinfo.m_IPAddress, pDevNode->m_deviceinfo.m_Port); type = myComm.GetType(); if (type == NIL) return NULL;//通信口打开错误 else pDev->m_bCommError = false; } else { DeviceInfoListType::iterator it = pDevNode->m_ChildDevList.at(iDevIndex); (*it).m_PlFlag = 1;//置巡检标志为1 } usleep(10); continue; } else { //重新置巡检标志为0 pDevNode->ResetXunJianFlag(); usleep(10); } } 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 + -