📄 nrlan103.cpp
字号:
//// C++ Implementation: nrlan103//// Description:////// Author: root <root@localhost.localdomain>, (C) 2006//// Copyright: See COPYING file that comes with this distribution////#include "nrlan103.h"#include "smart_ptr.hpp"#include "xmlwrapper.hpp"extern CPublicClass g_PublicClass;CNRLan103::CNRLan103(st_deviceinfo DevInfo) : CBaseDevice(DevInfo){ m_bCmding=false; m_bWaving=false; m_iWavingTimes=0; m_Sector=0; collecting=false; this->m_pComm=NULL; this->m_iThreadId=0; this->m_CmdInfo.m_MachineNo=this->m_DevInfo.m_MachineNo; this->m_szConFile=g_PublicClass.GetWorkPath()+static_cast<QString>("/devconfig/")+QString(m_DevInfo.m_MachineType)+static_cast<QString>(".xml"); g_PublicClass.m_MonitorData.m_MachineNo[0]=m_DevInfo.m_MachineNo; g_PublicClass.m_MonitorData.m_SendFlag=1; g_PublicClass.m_MonitorData.m_RecvFlag=1; g_PublicClass.m_MonitorData.m_OutFile=1; g_PublicClass.m_MonitorData.m_OutCon=1; g_PublicClass.m_MonitorData.m_SendOper=0; g_PublicClass.m_MonitorData.m_Sums=1000; this->m_iFaultNo=-1; m_iLPort = m_DevInfo.m_SocketPort; this->m_iUPort=6060;}CNRLan103::~CNRLan103(){}/*! \fn CNRLan103::InitClass() */bool CNRLan103::InitClass(){ /// @todo implement me m_szSysPath =g_PublicClass.GetWorkPath () + "/data/" + m_DevInfo.m_MachineName + "/"; mkdir (m_szSysPath, 0666); QString sztmp = "", szaaa = "";#ifndef USE_LIBXML2 //BEGIN QDomNode node, cnode; node = m_pxml->GetDomNode (QString("body"),QString("DEVCONFIG")); if (node.isNull ()) { printf("CNRLan103::InitClass()\n\tcan not locate <DEVCONFIG/> in xml tree,return false;\n"); return false; } cnode = m_pxml->GetChildNode (node, "CPUNUM", NULL, NULL); if (!m_pxml->GetNodeAttr (cnode, "value", sztmp)) { printf("CNRLan103::InitClass()\n\t can not locate <DEVCONFIG/CPUNUM> in xml tree,return false\n"); return false; } m_iCpuNum = sztmp.toInt (); cnode = m_pxml->GetChildNode (node, "NEEDDISTRUBT", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); m_iWaveFlag = sztmp.toInt (); } else m_iWaveFlag = 0; cnode = m_pxml->GetChildNode (node, "NEEDINIT", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); m_bNeedInit = (sztmp.toInt () == 1); //for debug; if (m_bNeedInit) { printf("will collect info\n"); CollectGroupInfo (); m_bNeedInit = false; } } else { m_bNeedInit = false; } cnode = m_pxml->GetChildNode (node, "NEEDSAVEDATA", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); m_bSaveData = (sztmp.toInt () == 1); } else { m_bSaveData = false; } if (m_bSaveData == true) { QString szfilename = m_szSysPath + m_DevInfo.m_MachineName + ".txt"; m_File.setName (szfilename); if (!m_File.open (IO_WriteOnly)) { printf ("--@@NRLan103 create save file error! @@--\n"); return false; } } cnode = m_pxml->GetChildNode (node, "DEBUGLEVEL", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); communicator.debugLevel = sztmp.toInt (); } else communicator.debugLevel = 0; cnode = m_pxml->GetChildNode (node, "PRIMARY", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); m_iPrimary = sztmp.toInt (); } else { m_iPrimary = 0; } cnode = m_pxml->GetChildNode (node, "DPI1", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", m_szDpi1); } else { m_szDpi1 = "复归"; } cnode = m_pxml->GetChildNode (node, "DPI2", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", m_szDpi2); } else { m_szDpi2 = "动作"; } cnode = m_pxml->GetChildNode (node, "SDPI1", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", m_szSDpi1); } else { m_szSDpi1 = "合"; } cnode = m_pxml->GetChildNode (node, "SDPI2", NULL, NULL); if (!cnode.isNull ()) { m_pxml->GetNodeAttr (cnode, "value", m_szSDpi2); } else { m_szSDpi2 = "开"; } cnode = m_pxml->GetChildNode (node, "STATIONADDR", NULL, NULL); if(!cnode.isNull()) { m_pxml->GetNodeAttr (cnode, "value", sztmp); m_StaAddr=atoi(sztmp.data()); } else { m_StaAddr=100; } //END#else m_pConfDoc=this->getDocument(m_szConFile.data()); XMLWrapper::XPathProcessor xprc(*m_pConfDoc); XMLWrapper::Element rootElem=m_pConfDoc->getRootElement(); XMLWrapper::Node devcNode=xprc.selectSingleNode(rootElem,"/schema/body/DEVCONFIG");#ifdef NR_LIBXML2_DEBUG // cout<<*this<<"[DEBUG]document root element name="<<rootElem.name()<<endl; // cout<<*this<<"[DEBUG]document encoding="<<doc.encoding()<<endl; // cout<<*this<<"[DEBUG]devcNode value="<<devcNode.value()<<endl;#endif if(devcNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG"<<endl; return false; } XMLWrapper::Node attrNode=xprc.selectSingleNode(devcNode,"CPUNUM/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/CPUNUM/@value"<<endl; return false; } m_iCpuNum=atoi(attrNode.value().c_str());#ifdef NR_LIBXML2_DEBUG cout<<*this<<"[DEBUG][CNRLan103::InitClass()]load from xml file,m_iCpuNum ="<<m_iCpuNum<<endl;#endif attrNode=xprc.selectSingleNode(devcNode,"NEEDINIT/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/NEEDINIT/@value"<<endl; return false; } m_bNeedInit=atoi(attrNode.value().c_str()); if (m_bNeedInit) { CollectGroupInfo (); m_bNeedInit = false; } attrNode=xprc.selectSingleNode(devcNode,"DEBUGLEVEL/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DEBUGLEVEL/@value"<<endl; return false; } communicator.debugLevel=atoi(attrNode.value().c_str()); attrNode=xprc.selectSingleNode(devcNode,"PRIMARY/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/PRIMARY/@value"<<endl; return false; } this->m_iPrimary=atoi(attrNode.value().c_str()); attrNode=xprc.selectSingleNode(devcNode,"DPI1/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DPI1/@value"<<endl; return false; } this->m_szDpi1=attrNode.value().c_str(); attrNode=xprc.selectSingleNode(devcNode,"DPI2/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/DPI2/@value"<<endl; return false; } this->m_szDpi2=attrNode.value().c_str(); attrNode=xprc.selectSingleNode(devcNode,"SDPI1/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/SDPI1/@value"<<endl; return false; } this->m_szSDpi1=attrNode.value().c_str(); attrNode=xprc.selectSingleNode(devcNode,"SDPI2/@value"); if(attrNode.isNull()) { cout<<*this<<"[ERROR][CNRLan103::InitClass()]can not locate /schema/body/DEVCONFIG/SDPI2/@value"<<endl; return false; } this->m_szSDpi2=attrNode.value().c_str();#endif sztmp.sprintf ("%s", m_DevInfo.m_MachineName); m_iFaultNo = g_PublicClass.m_Ini.GetKeyIntValue (sztmp, "FAULTNO", 0); m_LastFan= g_PublicClass.m_Ini.GetKeyIntValue (sztmp, "LASTFAN", 0); QString szkey; szkey.sprintf ("CPU%d-LASTWAVETIME", m_DevInfo.m_MachineAddr); m_szLastWaveTime=g_PublicClass.m_Ini.GetKeyStringValue (sztmp, szkey,"00000000000000000"); assert(m_pxml!=NULL); m_DistrubData.m_pXml = m_pxml; communicator.CommStart(m_DevInfo.m_IPAddress,m_DevInfo.m_SocketPort,m_DevInfo.m_MachineAddr,m_StaAddr); return true;}/*! \fn CNRLan103::ReceData(CByteArray& rData) */bool CNRLan103::ReceData(CByteArray& rData){ /// @todo implement me NRLAN103::ASDUbuff asdu; if (!communicator.CommRecv (asdu)) return false; rData.SetSize (asdu.size); memcpy (rData.GetData (), asdu.buff, asdu.size); //for debug communicator.printData(rData.GetData(),asdu.size,"CNRLan103::Recive Asdu",2); if (rData.GetSize () > 0) { //char buff[100]; //bzero (buff, 100); //sprintf (buff, "NRLan103 device %d receive", m_DevInfo.m_MachineNo); //communicator.printData (rData.GetData (), rData.GetSize (), buff, 2); ///@todo print debug info,datagram info here return true; } return false;}/*! \fn CNRLan103::SendAsdu10() */bool CNRLan103::SendAsdu10(){ /// @todo implement me CAsdu10 a10; a10.m_Addr = (*cmdit).addr; a10.m_INF = (*cmdit).inf; a10.m_NGD.byte = (*cmdit).num; a10.m_iNum = (*cmdit).num; a10.m_bSuccess = true; if (a10.m_NGD.byte > 0) { DataSet *pDataSet = m_CmdDataSets.at (0); a10.m_DataSets.append (pDataSet); m_CmdDataSets.remove(0); } m_CmdParam.remove (cmdit); CByteArray sData; a10.BulidArray (sData); if (!SendData (sData)) return false; return true;}/*! \fn CNRLan103::SendData(const CByteArray& sData) */bool CNRLan103::SendData(CByteArray& sData){ /// @todo implement me char buff[100]; bzero (buff, 100); sprintf (buff, "NRLan103 device %d send", m_DevInfo.m_MachineNo); communicator.printData (sData.GetData (), sData.GetSize (), buff, 2); if (m_bSaveData == true) { QString szdata = "", sztmp = ""; szdata.sprintf ("Send %d\n", sData.GetSize ()); for (int i = 0; i < sData.GetSize (); i++) { sztmp.sprintf ("%02x ", sData.GetAt (i)); szdata += sztmp; } szdata += "\n\n"; m_File.writeBlock ((unsigned char *) szdata.data (), szdata.length ()); } NRLAN103::ASDUbuff asdu; asdu.size = sData.GetSize (); memcpy (asdu.buff, sData.GetData (), asdu.size); if (!communicator.CommSend (asdu)) { ///printf ("--@@NRLan103 send failed @@--\n"); return false; } ///@todo print datagram here sData.SetSize (0); return true;}/*! \fn CNRLan103::ExplainAsdu(CByteArray& Data) */void CNRLan103::ExplainAsdu(CByteArray& Data){ /// @todo implement me CAsdu a; a.m_ASDUData.SetSize (0); a.SaveAsdu (Data); if (a.m_iResult == 0) return; switch (a.m_TYP) { case 0x0a: ProcessAsdu10 (a); break; case 0x0b: ProcessAsdu11 (a); break; case 0x17: ProcessAsdu23 (a); break; case 0x1a: ProcessAsdu26 (a); break; case 0x1b: ProcessAsdu27 (a); break; case 0x1c: ProcessAsdu28 (a); break; case 0x1d: ProcessAsdu29 (a); break; case 0x1e: ProcessAsdu30 (a); break; case 0x1f: ProcessAsdu31 (a); break; default: break; }#ifdef NRLAN_DEBUG printf("ProcessAsdu end\n");#endif}/*! \fn CNRLan103::ProcessAsdu10(CAsdu& a) */void CNRLan103::ProcessAsdu10(CAsdu& a){ /// @todo implement me if (a.m_COT == 0x01) {/* QString msg; msg.sprintf ("bust ASDU10 DUMP"); communicator.printData (a.m_ASDUData.GetData (), a.m_ASDUData.GetSize (), msg.data (), 1);*/ } CAsdu10 a10 (a); a10.ExplainAsdu(); QString msg; if (collecting)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -