📄 bwdmas.cpp
字号:
#include "msystem.h"#include "BWDMas.h"void* BWDMaster(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CBWDMas *pAS = (CBWDMas *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); sleep(2); while (1) { pAS->Query();// usleep(500000); }}CBWDMas::~CBWDMas(){ if (m_hThread > 0) { cout << "CBWDMas" << m_hThread << endl; pthread_cancel(m_hThread); }}bool CBWDMas::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,BWDMaster,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CBWDMas::Query(){ while (!m_subdevmgr.HasOn()) sleep(1);// 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: GetData(byAddr); break; default: break; } } usleep(m_dwIntervalMS * 1000);}//void CBWDMas::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 CBWDMas::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 CBWDMas::GetData(BYTE byAddr){ pthread_mutex_lock(&m_mutex); CFrameNode FNSend,FNRecv; FNSend.m_byCID = 0x3; FNSend.m_byDesAddr = byAddr; FNSend.SetSize(4);// WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); WORD* pData = (WORD *)FNSend.m_pbyData; pData[0] = CW(0); pData[1] = CW(5); m_DLService.SetEchoLen(5+2*5); if (m_DLService.REQ(1,&FNSend,FNRecv,0,true) == 1)//Send - Respond { ExpData(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 CBWDMas::ExpData(BYTE byAddr,BYTE* pbyData,BYTE bySize){ BYTE* pbyTemp = pbyData + 1; WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr); YCData* pData = new YCData [bySize/2]; YXData* pYXData = new YXData [8];//8+6 WORD* pw = (WORD *)pbyTemp; WORD w =0; for (; w<bySize/2; w++,pw++) { if (w == 0) { WORD wStatus = CW(*pw); BYTE byA = 1; for (BYTE b=0; b<8; b++,byA<<=1) { pYXData[b].m_wDevNo = wDevNo; pYXData[b].m_wDevPtNo = b + 1; pYXData[b].m_bValue = (wStatus & byA)?0xff00:0xff; } m_pAllMgr->YX(pYXData, 8); } else { pData[w-1].m_wDevNo = wDevNo; pData[w-1].m_wDevPtNo = w; float ffValue = CW(*pw)-((w==4)?0:0x23); pData[w-1].m_fValue = ffValue; } } m_pAllMgr->YC(pData,w-1); delete [] pData; delete [] pYXData;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -