📄 yd20mas.cpp
字号:
#include "msystem.h"#include "YD20Mas.h"void* YD20Master(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CYD20Mas *pAS = (CYD20Mas *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); sleep(2); while (1) { pAS->Query(); }}CYD20Mas::~CYD20Mas(){ if (m_hThread > 0) { cout << "CYD20Mas" << m_hThread << endl; pthread_cancel(m_hThread); }}bool CYD20Mas::Init(){ bool bRet = false; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThread,&attr,YD20Master,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CYD20Mas::Query(){ while (!m_subdevmgr.HasOn()) sleep(1);/* for (BYTE byA=1;byA<20;byA++) cout << m_subdevmgr.GetDevNoFrmAddr(byA) <<endl;*/// while ((m_subdevmgr.GetNum() != 8) && (m_subdevmgr.GetNum() != 9)) sleep(1);/* CTimeVal tmCurrent; CTimeValSpan tvs; if (tmCurrent > m_tmRectify) tvs = tmCurrent - m_tmRectify; else tvs = m_tmRectify - tmCurrent;// CTimeValSpan tvs = tmCurrent - m_tmRectify; if (m_bFirst || (tvs.GetMinute() >= 1)) { m_bFirst = false; SyncClock(); m_tmRectify = tmCurrent; } else*/ { if((m_bySendOrder++>=1) || (m_bySendNo == 0xff)) { m_bySendOrder = 0; m_bySendNo = m_subdevmgr.GetNextNo(m_bySendNo); } BYTE byAddr = m_subdevmgr.GetAddrFrmNo(m_bySendNo); if (byAddr == 0xff) return; switch(m_bySendOrder) { case 0: GetYC(byAddr); break; case 1: GetYE(byAddr); break; default: break; } } usleep(m_dwIntervalMS * 1000);}//void CYD20Mas::SyncClock(/*BYTE byAddr,BYTE byType*/)/*{ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x10; FNSend.m_byDesAddr =0;//byAddr; //广播地址 FNSend.SetSize(9); WORD *pwTemp = (WORD *)FNSend.m_pbyData; *pwTemp++ = CW(1200); *pwTemp++ = CW(2); BYTE* pby = (BYTE * ) pwTemp; *pby++ = 4; CTimeVal tv; DWORD *pdwTemp = (DWORD *)pby; *pdwTemp = CHDW(tv.Get_sec()+8*3600); m_DLService.REQ(0,&FNSend,FNRecv,0,false);//Send - No Respond pthread_mutex_unlock(&m_mutex);}*/bool CYD20Mas::YK(WORD wDevNo,BYTE byRoute,bool bIsOn){ bool bRet = false;/* pthread_mutex_lock(&m_mutex); BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo); if (byAddr != 0xff) { BYTE byRoadNo = byRoute - 1; CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x5; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(byRoadNo); //select pData[1] = bIsOn ? CW(0xff00) : 0; m_DLService.SetEchoLen(8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_byCID == 0x5) bRet = true; } } pthread_mutex_unlock(&m_mutex);*/ return bRet;}void CYD20Mas::GetYC(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = 0; pData[1] = CW(0x20); m_DLService.SetEchoLen(5+0x20*2); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_wSize == 65) ExpYC(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); if (m_wBreakCount[FNRecv.m_bySrcAddr] > 0) { YXData d; d.m_wDevNo = m_subdevmgr.GetDevNoFrmAddr(FNRecv.m_bySrcAddr); d.m_wDevPtNo = 199; d.m_bValue = 0xff; m_pAllMgr->YX(&d, 1); } m_wBreakCount[FNRecv.m_bySrcAddr] = 0; } else { if (m_wBreakCount[byAddr] >= 5) { YXData d; d.m_wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); d.m_wDevPtNo = 199; d.m_bValue = 0xff00; m_pAllMgr->YX(&d, 1); m_wBreakCount[byAddr] = 0; } else m_wBreakCount[byAddr]++; } pthread_mutex_unlock(&m_mutex);}void CYD20Mas::ExpYC(BYTE byAddr,BYTE* pbyData,BYTE bySize){ BYTE* pbyTemp = pbyData + 1; bool bUZ = false; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); BYTE byType = m_subdevmgr.GetTypeFrmAddr(byAddr); YCData* pData = new YCData [bySize/2]; WORD* pwOrigValue = (WORD *)pbyTemp; WORD w =0,w1=0; for (; w<bySize/2; w++) { pData[w1].m_wDevNo = wDevNo; pData[w1].m_wDevPtNo = w+1; if (((w >= 0x8/2) && (w<= 0xc/2)) || ((w >= 0x18/2) && (w<= 0x1c/2)) || ((w >= 0x28/2) && (w<= 0x2c/2)) || ((w >= 0x38/2) && (w<= 0x3c/2))) //short { WORD www = CW(*pwOrigValue++); short* pInt = (short *)&www; float ffValue = *pInt; pData[w1++].m_fValue = ffValue; } else if ((w == 0x6/2) || (w == 0x16/2) || (w == 0x26/2)) { if ((byType == dt_eYD2100) && (w == 0x6/2)) { YXData aYXData[6];//8+6 WORD wStatus = CW(*pwOrigValue); BYTE byA = 1; for (BYTE b=0; b<6; b++,byA<<=1) { aYXData[b].m_wDevNo = wDevNo; aYXData[b].m_wDevPtNo = b + 1; aYXData[b].m_bValue = (wStatus & byA)?0xff00:0xff; } m_pAllMgr->YX(aYXData, 6); } pwOrigValue++; //else m_pAllMgr->YX(pYXData, 3); } else //word { float ffValue = CW(*pwOrigValue++); pData[w1++].m_fValue = ffValue;/* if (((w+1) == 26) && (ffValue < 28)) bUZ = true; if (((w+1) == 28) && ( ffValue == 0) && !bUZ) { delete [] pData; return; }*/ } } m_pAllMgr->YC(pData,w1); delete [] pData;}void CYD20Mas::GetYE(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0x42); pData[1] = CW(8*2); m_DLService.SetEchoLen(5+2*2*8); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { if (FNRecv.m_wSize == 33) ExpYE(FNRecv.m_bySrcAddr,FNRecv.m_pbyData,FNRecv.m_wSize); } pthread_mutex_unlock(&m_mutex);}void CYD20Mas::ExpYE(BYTE byAddr,BYTE* pbyData,BYTE bySize){// WORD wSOENum = 0; BYTE* pbyTemp = pbyData + 1; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); YCData* pData = new YCData [bySize/4]; DWORD* pdw = (DWORD *)pbyTemp; WORD w =0; for (; w<bySize/4; w++,pdw++) { pData[w].m_wDevNo = wDevNo; pData[w].m_wDevPtNo = w+34; float ffValue = CHDW(*pdw); pData[w].m_fValue = ffValue; } m_pAllMgr->YC(pData,w); delete [] pData;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -