📄 cdt.h
字号:
#ifndef CDT_H#define CDT_H #include "iostream.h" #include "msystem.h"#include "cdtycset.h"#include "cdtyxset.h"#include "cdtykset.h"#include "cdtddset.h"/** *@author *//*struct struCDTInfo{ WORD m_wPubAddr; //group:function code //yx>=0 and yx<512 BYTE m_byType; //YC1=1,YC2=2,YC3=3 //ZJ(总加遥测) &= 0x10,F=0x20,Water=0x30。即:0x11,0x12,0x13;0x21,0x22,0x23;0x31,0x32,0x33 //DD=6,Work Info=7,SOE=8,YX=9,YK=10,YT=11,SetValue=12 WORD m_wDevNo; //=0: m_nType = YX ,系统信息 WORD m_wDevPubAddr; bool m_bValid; //备用=:true; 采集=:false};*/class CCDTYKInfo{public: CCDTYKInfo(BYTE byIndex) { m_byIndex = byIndex; }/* CCDTYKInfo(struCDTInfo* pstruCDT) { m_byIndex = pstruCDT->m_wPubAddr&0xff; m_wDevNo = pstruCDT->m_wDevNo; m_wDevPubAddr = pstruCDT->m_wDevPubAddr; m_bSelected = false; }*/ CCDTYKInfo(CCDTYKSet& setYK) { m_byIndex = setYK.m_wRouteNo&0xff; m_wDevNo = setYK.m_wDevNo; m_wDevPubAddr = setYK.m_wPointNo; m_bSelected = false; } bool operator<(CCDTYKInfo info) const { bool bRet = false; if (m_byIndex< info.m_byIndex) bRet = true; return bRet; } bool operator ==(CCDTYKInfo info) const { bool bRet = false; if (m_byIndex == info.m_byIndex) bRet = true; return bRet; } bool operator !=(CCDTYKInfo info) const { bool bRet = false; if (m_byIndex != info.m_byIndex) bRet = true; return bRet; } BYTE m_byIndex;//<=255 WORD m_wDevNo; WORD m_wDevPubAddr; bool m_bSelected; bool m_bOn; CTimeVal m_tv; void Cancel() { m_bSelected = false; } void Select(bool bOn) { m_bSelected = true; m_bOn = bOn; m_tv.GetCurrentTime(); } bool Operate(WORD& wDevNo,WORD& wDevPubAddr,bool& bOn) { bool bRet = false; if (m_bSelected) { CTimeVal tv; CTimeValSpan tvs = tv-m_tv; if (tvs.GetASecs() < 20) { wDevNo = m_wDevNo; wDevPubAddr = m_wDevPubAddr; bOn = m_bOn; bRet = true; } } m_bSelected = false; return bRet; }};typedef vector<CCDTYKInfo> CCDTYKVector;class CCDTYKInfos{public: CCDTYKInfos(bool bIsYK = true) { m_bIsYK = bIsYK; } void Load(); void Sort() { sort(m_setYKInfo.begin(),m_setYKInfo.end()); } void Select(BYTE byIndex,bool bOn,BYTE* pbyData) { pbyData[0] = m_bIsYK?0xe1:0xe5; pbyData[2] = pbyData[4] = byIndex; pbyData[1] = pbyData[3] = 0xff; CCDTYKVector::iterator pCDTYKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CCDTYKInfo(byIndex)); if ((pCDTYKInfo != m_setYKInfo.end()) && (pCDTYKInfo->m_byIndex == byIndex)) { pbyData[1] = pbyData[3] = bOn?0xcc:0x33; pCDTYKInfo->Select(bOn); } } bool Operate(BYTE byIndex,WORD& wDevNo,WORD& wDevPubAddr,bool& bOn) { bool bRet = false; CCDTYKVector::iterator pCDTYKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CCDTYKInfo(byIndex)); if ((pCDTYKInfo != m_setYKInfo.end()) && (pCDTYKInfo->m_byIndex == byIndex)) bRet = pCDTYKInfo->Operate(wDevNo,wDevPubAddr,bOn); return bRet; } void Cancel(BYTE byIndex) { CCDTYKVector::iterator pCDTYKInfo = lower_bound(m_setYKInfo.begin(),m_setYKInfo.end(),CCDTYKInfo(byIndex)); if ((pCDTYKInfo != m_setYKInfo.end()) && (pCDTYKInfo->m_byIndex == byIndex)) pCDTYKInfo->Cancel(); }/* void Add(struCDTInfo* pstruCDT) { CCDTYKInfo d(pstruCDT); m_setYKInfo.push_back(d); }*/ void Add(CCDTYKSet& setYK) { CCDTYKInfo d(setYK); m_setYKInfo.push_back(d); }protected: CCDTYKVector m_setYKInfo; bool m_bIsYK;};class CCDTYXInfo{public: CCDTYXInfo(BYTE byPubAddr, BYTE byIndex) { m_byPubAddr = byPubAddr; m_byIndex = byIndex; }/* CCDTYXInfo(struCDTInfo* pstruCDT) { m_byPubAddr = (pstruCDT->m_wPubAddr&0xff00)>>8; m_byIndex = pstruCDT->m_wPubAddr&0xff; m_wDevNo = pstruCDT->m_wDevNo; m_wDevPubAddr = pstruCDT->m_wDevPubAddr; m_bValid = pstruCDT->m_bValid; m_bValue = false; }*/ CCDTYXInfo(CCDTYXSet& setYX) { m_byPubAddr = setYX.m_wLocalNo/32;//+0xf0;// (pstruCDT->m_wPubAddr&0xff00)>>8; m_byIndex = setYX.m_wLocalNo%32;//pstruCDT->m_wPubAddr&0xff; m_wDevNo = setYX.m_dwYXNo/1000; m_wDevPubAddr = setYX.m_dwYXNo%1000; m_bValid = setYX.m_bValid; m_bValue = false; } bool operator <(CCDTYXInfo info) const { bool bRet = false; if ((m_byPubAddr < info.m_byPubAddr) || ((m_byPubAddr == info.m_byPubAddr) && (m_byIndex < info.m_byIndex))) bRet = true; return bRet; } bool operator ==(CCDTYXInfo info) const { bool bRet = false; if ((m_byPubAddr == info.m_byPubAddr) && (m_byIndex == info.m_byIndex)) bRet = true; return bRet; } bool operator !=(CCDTYXInfo info) const { bool bRet = false; if ((m_byPubAddr != info.m_byPubAddr) || (m_byIndex != info.m_byIndex)) bRet = true; return bRet; } BYTE m_byPubAddr; //>=0xf0 and <=0xff BYTE m_byIndex;//<32 WORD m_wDevNo; WORD m_wDevPubAddr; bool m_bValue; bool m_bValid; //set value bool SetValue(bool bValue)//ret==true:产生变位遥信 { bool bRet = false; if (m_bValid && (m_bValue != bValue)) bRet = true; m_bValid = true; m_bValue = bValue; return bRet; } BYTE Group() const { return m_byPubAddr + 1; }};typedef vector<CCDTYXInfo> CCDTYXVector;typedef map<CDevFactor,CCDTYXVector::iterator,less<CDevFactor> > CCDTYXMap;class CCDTYXInfos{public: CCDTYXInfos() { SetPRM(0,false); } void Sort() { sort(m_setYXInfo.begin(),m_setYXInfo.end()); CCDTYXVector::iterator p = m_setYXInfo.begin(); for ( ;p != m_setYXInfo.end(); p++) { CDevFactor df(p->m_wDevNo,p->m_wDevPubAddr); m_mapYXInfo.insert(CCDTYXMap::value_type(df,p)); } } void Load(); void SetValue(WORD wDevNo,WORD wDevPubAddr,bool bValue) { CCDTYXVector::iterator pCDTYXInfo = m_setYXInfo.end(); CCDTYXMap::iterator p = m_mapYXInfo.find(CDevFactor(wDevNo,wDevPubAddr)); if (p != m_mapYXInfo.end()) { pair<CDevFactor,CCDTYXVector::iterator> temp = *p; pCDTYXInfo = temp.second; } if (pCDTYXInfo != m_setYXInfo.end()) { if (pCDTYXInfo->SetValue(bValue)) {//has PRM data SetPRM(pCDTYXInfo->Group(),true); } } } bool GetPRMYXData(BYTE* pData,WORD& wSize) { wSize = 0; for (BYTE byG=0; byG<16;byG++) { if (m_bHasPRM[byG] && GetYXData(byG+1,pData,wSize)) break; } return wSize>0; } bool GetYXData(BYTE byGroupNo,BYTE* pData,WORD& wSize)//0:=all; 1:=0xf0; ... { wSize = 0; if (byGroupNo == 0) { for (BYTE byG = 1;byG<=16;byG++) { WORD wS; if (GetYXData(byG,pData,wS)) { pData += wS; wSize += wS; } } } else if (byGroupNo <= 16) { m_bHasPRM[byGroupNo -1]= false; //clear PRM SOEData DWORD dwValue = 0; BYTE byIndex; bool bHasData = false; for (byIndex=0;byIndex<32;byIndex++) { CCDTYXInfo x(byGroupNo-1,byIndex); CCDTYXVector::iterator pCDTYXInfo = lower_bound(m_setYXInfo.begin(),m_setYXInfo.end(),x); if ((pCDTYXInfo != m_setYXInfo.end()) && (*pCDTYXInfo == x)) { bHasData = true; if (pCDTYXInfo->m_bValid == false) break; dwValue |= ((DWORD)(pCDTYXInfo->m_bValue?1:0) << byIndex); } } if ((byIndex == 32) && bHasData) { pData[0] = byGroupNo-1+0xf0; DWORD* pdw = (DWORD *)&pData[1]; *pdw = dwValue; wSize += 6; } } return (wSize > 0); } void SetPRM(BYTE byGroupNo,bool bHasPRM) { if (byGroupNo == 0) { for (BYTE byG=1;byG<=16;byG++) SetPRM(byG,bHasPRM); } else if (byGroupNo <= 16) { m_bHasPRM[byGroupNo-1] = bHasPRM; } }/* void Add(struCDTInfo* pstruCDT) { CCDTYXInfo d(pstruCDT); m_setYXInfo.push_back(d); }*/ void Add(CCDTYXSet& set) { CCDTYXInfo d(set); m_setYXInfo.push_back(d); } bool HasYXChanged() { bool bRet = false; for (int iii=0; iii<16;iii++) { if (m_bHasPRM[iii]) { bRet = true; break; } } return bRet; }protected: CCDTYXVector m_setYXInfo; CCDTYXMap m_mapYXInfo;private: bool m_bHasPRM[16];};class CCDTYCInfo{public: CCDTYCInfo(BYTE byType,BYTE byPubAddr, BYTE byIndex) { m_byPubAddr = byPubAddr; m_byIndex = byIndex; m_byType = byType; }/* CCDTYCInfo(struCDTInfo* pstruCDT) { m_byPubAddr = (pstruCDT->m_wPubAddr&0xff00)>>8; m_byIndex = pstruCDT->m_wPubAddr&0xff; m_byType = pstruCDT->m_byType; m_wDevNo = pstruCDT->m_wDevNo; m_wDevPubAddr = pstruCDT->m_wDevPubAddr; m_fCoef = 0.001; m_wValue = 0x8000; }*/ CCDTYCInfo(CCDTYCSet& setYC) { m_byPubAddr = setYC.m_wLocalNo/2;//m_dwYCNo;//(pstruCDT->m_wPubAddr&0xff00)>>8; m_byIndex = setYC.m_wLocalNo%2;//pstruCDT->m_wPubAddr&0xff; m_byType = setYC.m_byType; m_wDevNo = setYC.m_dwYCNo/1000; m_wDevPubAddr = setYC.m_dwYCNo%1000; m_fCoef = setYC.m_fCoef; m_wValue = 0x8000; if (setYC.m_dwYCNo == 0) m_bValid = true; else m_bValid = false; } bool operator <(CCDTYCInfo info) const { bool bRet = false; if ((m_byType&0xf) < (info.m_byType&0xf)) bRet = true; else if ((m_byType&0xf) == (info.m_byType&0xf)) { if ((m_byPubAddr < info.m_byPubAddr) || ((m_byPubAddr == info.m_byPubAddr) && (m_byIndex < info.m_byIndex))) bRet = true; } return bRet; } bool operator ==(CCDTYCInfo info) const { bool bRet = false; if (((m_byType&0xf) == (info.m_byType&0xf)) && (m_byPubAddr == info.m_byPubAddr) && (m_byIndex == info.m_byIndex)) bRet = true; return bRet; } BYTE m_byPubAddr; //<0x7f; BYTE m_byIndex;//0,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -