?? signalprocess.cpp~
字號:
//signalprocess.cpp#include "signalprocess.h"#include "devmoduledlg.h"#include "Device.h"#include <qtabwidget.h> #include <qtextbrowser.h> #include "baseclass/publicclass.h"extern CPublicClass g_PublicClass;////////////////////////////////////////////設備啟動方案////////////////////////////////////////////*主模塊傳送來的是一個結構數組:st_deviceinfo[count]1.先找出ParentIndex=""的設備,這種設備是獨立的或是總線,管理機,啟動這些設備的線程, 并產生設備的接點,接點中:m_deviceinfo存放當前設備信息.2.按照設備接點在結構數組中查找:ParentIndex=當前接點的RecordIndex的設備,這些設備 是總線或管理機下的設備,這些設備的信息添加到接點中的:m_ChildDevList中,并填入線 程號3.簡單地說就是獨立設備產生一個接點,其m_ChildDevList為空,每個總線或管理機產生一 個接點,其m_ChildDevList中存放其下級設備*//////////////////////////////////////////////////////////////////////////////////////////////////////CSystemInit::CSystemInit(){}CSystemInit::~CSystemInit(){ }void CSystemInit::SendMsgTextToMain(int flag, QString sMsg){ QDateTime t = QDateTime::currentDateTime(); QString s1 = ""; s1 = "["+t.toString("yyyy-MM-dd hh:mm:ss")+"]:"; s1 = s1+_T(sMsg); ((DevModuleDlg*)g_PublicClass.m_MainForm)->SetLogText(flag, s1);}bool CSystemInit::StartDevices(void* ppNode){ CDataNode* pNode = (CDataNode*)ppNode; if (!pNode) return false; int count = pNode->m_nodeinfo.m_iSize/sizeof(st_deviceinfo); st_deviceinfo dst[count]; memcpy(&dst, (void*)pNode->m_nodeinfo.m_SegmentPid, pNode->m_nodeinfo.m_iSize); //啟動一級保護通訊線程 for (int i=0; i<count; i++) { if (StartSomeTopDevice(&dst, i, count) == 0) continue; } return true;}//////////////////////////啟動設備列表中的獨立或頂級設備線程//////////////////////////////////int CSystemInit::StartSomeTopDevice(void* dlist, int pi, int count){ CDeviceNode* pNode = NULL; st_deviceinfo DevBuff; memcpy(&DevBuff, (char*)dlist+pi*sizeof(st_deviceinfo), sizeof(st_deviceinfo)); //判斷是否是總線或管理機 if (DevBuff.m_ParentIndex[0] != '\0') return 0; //按設備編號查找 int index = 0, ret = 0; pthread_t threadid = 0; pNode = g_PublicClass.m_NodeManage.FindDevicebyEquipNo(DevBuff.m_EquipNo, 0, index); if (!pNode) { //產生頂級設備接點 pNode = new CDeviceNode(); pNode->m_ModuleState = 0; pNode->m_Level = 0; memcpy(&pNode->m_deviceinfo, &DevBuff, sizeof(st_deviceinfo)); g_PublicClass.m_NodeManage.m_DeviceNode.append(pNode); //啟動設備通訊線程 usleep(1); ret = pthread_create(&threadid, NULL, DeviceCommunicateMainThread, pNode); pNode->m_deviceinfo.m_ThreadId = threadid;//線程號付給接點線程號 pNode->AddChildDevices(dlist, count, threadid); printf("---------------@@This Thread Id:%d\n",threadid); pNode->m_deviceinfo.m_SupportCmd = InstallDeviceMenu(pNode); //當是點對點通信時,也考慮成總線方式,只不過該總線下只有一個設備而已 if (pNode->m_ChildDevList.count() == 0) { pNode->m_ChildDevList.append(pNode->m_deviceinfo); } pNode->m_ModuleState = 1; //產生發送數據接點 st_deviceinfo di[1+pNode->m_ChildDevList.count()]; memcpy(&di[0], &pNode->m_deviceinfo, sizeof(st_deviceinfo)); if ((int)pNode->m_ChildDevList.count() > 0) { DeviceInfoListType::iterator it; for (int i=0; i<(int)pNode->m_ChildDevList.count(); i++) { it = pNode->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+pNode->m_ChildDevList.count())*sizeof(st_deviceinfo)); //設備加入界面 ((DevModuleDlg*)g_PublicClass.m_MainForm)->AddTopLevelDevice((void*)pNode); ((DevModuleDlg*)g_PublicClass.m_MainForm)->AddChildDevice((void*)pNode); } else//總線設備已經啟動,現有新的設備啟動 { CDeviceNode* pDevNode = NULL; st_deviceinfo Dev; for (int i=0; i<count; i++) { memcpy(&Dev, (char*)dlist+i*sizeof(st_deviceinfo), sizeof(st_deviceinfo)); if (Dev.m_ParentIndex[0] == '\0') continue; if (QString(Dev.m_ParentIndex) != QString(pNode->m_deviceinfo.m_RecordIndex)) continue; pDevNode = g_PublicClass.m_NodeManage.FindDevicebyEquipNo(Dev.m_EquipNo, 1, index); if (!pDevNode)//在設備列表中添加該設備 { st_nodeinfo st; memset(&st, 0x00, sizeof(st_nodeinfo)); st.m_CurrentThread = pNode->m_deviceinfo.m_ThreadId; st.m_MachineNo = Dev.m_EquipNo; st.m_DataType = WM_RUN_A_DEVICE;//設備啟動命令 st_deviceinfo* pDev = new st_deviceinfo; memcpy(pDev, &Dev, sizeof(st_deviceinfo)); st.m_SegmentPid = (long)pDev; st.m_iSize = sizeof(st_deviceinfo); CDataNode* pMsgNode = new CDataNode(); memcpy(&pMsgNode->m_nodeinfo, &st, sizeof(st_nodeinfo)); g_PublicClass.m_NodeManage.m_RecvNode.append(pMsgNode); } } } return 1;}//******************安裝設備操作菜單的函數**************************////*從XML文件中讀取菜單 int CSystemInit::InstallDeviceMenu(CDeviceNode* pNode){ DeviceInfoListType::iterator it; QString xmlfile; QDomNode node, cnode; for (int i=0; i<(int)pNode->m_ChildDevList.count(); i++) { it = pNode->m_ChildDevList.at(i); xmlfile.sprintf("%s", (*it).m_MachineType); if (xmlfile == "" || xmlfile.isEmpty()) continue; xmlfile = g_PublicClass.GetWorkPath()+"/devconfig/"+xmlfile+".xml"; CXMLReader xml(xmlfile); xml.OpenDomXMLFile(); node = xml.GetDomNode("body", "CONFIG"); cnode = xml.GetChildNode(node, "MENU", "", ""); QString sztmp = ""; xml.GetNodeAttr(cnode, "value", sztmp); (*it).m_SupportCmd = sztmp.toInt(); } xmlfile.sprintf("%s", pNode->m_deviceinfo.m_MachineType); if (xmlfile == "" || xmlfile.isEmpty()) return 0; xmlfile = g_PublicClass.GetWorkPath()+"/devconfig/"+xmlfile+".xml"; CXMLReader xml(xmlfile); xml.OpenDomXMLFile(); node = xml.GetDomNode("body", "CONFIG"); cnode = xml.GetChildNode(node, "MENU", "", ""); QString sztmp = ""; xml.GetNodeAttr(cnode, "value", sztmp); return sztmp.toInt();}void SignalProcessDef1x(int signum, siginfo_t* info, void* myact){ CSystemInit csi; QString s1 = ""; if (signum == 0 || !info || !myact) return; if (info->si_int >= 0) //主模塊送的是消息隊列號 { s1.sprintf("收到主模塊發送隊列號:%d;接收隊列號:%d", g_PublicClass.m_SendMsgQueueID, g_PublicClass.m_ReceMsgQueueID); } else if (info->si_int < 0)//主模塊的測試信號 { ((DevModuleDlg*)g_PublicClass.m_MainForm)->FlashLamp(); g_PublicClass.m_MainModuleNode.m_LastTime = QDateTime::currentDateTime(); g_PublicClass.m_Signal.SendSignal(info->si_pid, SIGUSR1, 0, NULL, 0); s1.sprintf("收到主模塊測試信號:%d", info->si_pid); } csi.SendMsgTextToMain(0, s1); return;}void SignalProcessDef2x(int signum, siginfo_t* info, void* myact){ if (signum == 0 || !info || !myact) return; return;}/////////////////////////////////////常駐接收信息線程//////////////////////////////////////void* RecvMsgQueueThread(void* lp){ lp = NULL; CMessageQueue cm; st_nodeinfo st; CSegment cs; while (!g_PublicClass.m_Stop) { //當沒有收到消息號時,等待 if (g_PublicClass.m_ReceMsgQueueID == 0) { usleep(100); continue; } if (!cm.ReadMessage(g_PublicClass.m_ReceMsgQueueID, g_PublicClass.m_SelfPid, &st)) { usleep(100); continue; } CDataNode* pNode = new CDataNode(); memcpy(&pNode->m_nodeinfo, &st, sizeof(st_nodeinfo)); g_PublicClass.m_NodeManage.m_RecvNode.append(pNode); usleep(10); } return NULL;}/////////////////////////////////////常駐發送信息線程//////////////////////////////////////void* SendMsgQueueThread(void* lp){ lp = NULL; CMessageQueue cm; CSegment cs; CDataNode* pNode = NULL; while (!g_PublicClass.m_Stop) { //當發送隊列沒有形成時,等待 if (g_PublicClass.m_SendMsgQueueID == 0) { usleep(10); continue; } pNode = g_PublicClass.m_NodeManage.FindSendDataNode(); if (!pNode) { usleep(10); continue; } if (pNode->m_nodeinfo.m_DataType == WM_STOP_A_MODULE) { g_PublicClass.m_Stop = true; sleep(2); } cm.SendMessage(g_PublicClass.m_SendMsgQueueID, (void*)pNode); //刪除數據接點 g_PublicClass.m_NodeManage.DeleteSendDataNode(pNode); usleep(10); } return NULL;}////////////////////////////////////常駐處理接收信息線程//////////////////////////////////////void* ProcessRecvMsgThread(void* lp){ lp = NULL; CDataNode* pNode = NULL; CSystemInit csi; while (!g_PublicClass.m_Stop) { pNode = g_PublicClass.m_NodeManage.FindRecvDataNode(0); if (!pNode) { usleep(10); continue; } switch (pNode->m_nodeinfo.m_DataType) { case WM_STARTDEVICETHREAD://啟動設備線程 csi.StartDevices((void*)pNode); // printf("--@@Com103 start device @@--\n"); break; case WM_MONITORSET: if (pNode->m_nodeinfo.m_SegmentPid > 0 && pNode->m_nodeinfo.m_iSize > 0) { memcpy(&g_PublicClass.m_MonitorSrc, (char*)pNode->m_nodeinfo.m_SegmentPid, sizeof(st_monitorsrc)); } break; } //刪除數據接點 g_PublicClass.m_NodeManage.DeleteRecvDataNode(pNode); } return NULL;}void* DispDataThread(void* lp){ lp = NULL; while (g_PublicClass.m_MainForm == NULL) usleep(100); CDataNode* pNode = NULL; DevModuleDlg* pDlg = (DevModuleDlg*)g_PublicClass.m_MainForm; QTextBrowser* pBrower = NULL; while (!g_PublicClass.m_Stop) { pNode = g_PublicClass.m_NodeManage.FindDispDataNode(); if (pNode) { QString dispstr = "", tmpstr = ""; uchar* pData = (uchar*)pNode->m_nodeinfo.m_SegmentPid; int iSize = pNode->m_nodeinfo.m_iSize; QDateTime dt = QDateTime::currentDateTime(); if (pNode->m_nodeinfo.m_DataType == DATA_SENDDATA) { tmpstr.sprintf("[%s]-Send:%d Dev:%d", dt.toString("yyyy-MM-dd-hh:mm:ss.zzz").data(), iSize, pNode->m_nodeinfo.m_MachineNo); pBrower = (QTextBrowser*)pDlg->GetTextBrower(2); } else if (pNode->m_nodeinfo.m_DataType == DATA_RECVDATA) { tmpstr.sprintf("[%s]-Recv:%d Dev:%d", dt.toString("yyyy-MM-dd-hh:mm:ss.zzz").data(), iSize, pNode->m_nodeinfo.m_MachineNo); pBrower = (QTextBrowser*)pDlg->GetTextBrower(1); } pBrower->setColor(QColor::QColor(255,0,0)); pBrower->append(tmpstr); for (int i=0; i<iSize; i++) { tmpstr.sprintf("%02X ", pData[i]); dispstr += tmpstr; } pBrower->setColor(QColor::QColor(0,0,255)); pBrower->append(dispstr); if (pBrower->lines() > 1000) pBrower->clear(); g_PublicClass.m_NodeManage.DeleteDispDataNode(pNode); usleep(10); continue; } usleep(100); } return NULL;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -