📄 device.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 + -