📄 mysal.cpp
字号:
#include "allmgr.h"#include "mysal.h"CMySal::CMySal(CAllMgr* pAllMgr){ m_pAllMgr = pAllMgr; m_hThrdGet = 0; m_hThrdCDT = 0; m_bAllYXSend = false; m_bAllYCSend = false; pthread_mutex_init(&m_mutexSOE,NULL);// PTHREAD_MUTEX_INITIALIZER) pthread_mutex_init(&m_mutexEvent,NULL);// PTHREAD_MUTEX_INITIALIZER)}CMySal::~CMySal(void){ pthread_mutex_destroy(&m_mutexSOE); pthread_mutex_destroy(&m_mutexEvent); Destroy();}void* thrdGet(void* pVoid){ CMySal *pAS = (CMySal *)pVoid; while (1) { pAS->GetIND(); usleep(10000); }}void* thrdCDT(void* pVoid){ CMySal *pAS = (CMySal *)pVoid; sleep(5); BYTE i=0; for (; ;i++) { pAS->CDT(i); usleep(100000); }}void CMySal::Destroy(){ if (m_hThrdGet > 0) { cout << "CMySal Get :" << m_hThrdGet << endl; pthread_cancel(m_hThrdGet); } if (m_hThrdCDT > 0) { cout << "CMySal -CDT:" << m_hThrdCDT << endl; pthread_cancel(m_hThrdCDT); } m_tlsvr.Destroy();}bool CMySal::Init(){ bool bRet = false; if (m_tlsvr.Init()) { pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThrdGet,&attr,thrdGet,(void *)this) == 0) { pthread_attr_t attr1; pthread_attr_init(&attr1); pthread_attr_setdetachstate(&attr1,PTHREAD_CREATE_DETACHED); if (pthread_create(&m_hThrdCDT,&attr1,thrdCDT,(void *)this) == 0) { bRet = true; } else { pthread_cancel(m_hThrdGet); m_hThrdGet = 0; m_hThrdCDT = 0; } pthread_attr_destroy(&attr1); } else m_hThrdGet = 0; pthread_attr_destroy(&attr); } return bRet;}static BYTE s_abyData[20480];void CMySal::SendYXChanged(){ CFrameNode fn; fn.m_byCID = 0x80; int nSize=0; m_pAllMgr->GetAllYXChanged(s_abyData,nSize); if (nSize >0) { fn.SetSize(nSize); memcpy(fn.m_pbyData, s_abyData, nSize); m_tlsvr.REQ(0,&fn,0,true);/*for (int i=0;i<nSize;i++){ printf("%02X| ",s_abyData[i]);}printf("\n");*/ }}void CMySal::SendYCChanged(){ CFrameNode fn; fn.m_byCID = 0x81; int nSize=0; m_pAllMgr->GetAllYCChanged(s_abyData,nSize); if (nSize >0) { fn.SetSize(nSize); memcpy(fn.m_pbyData, s_abyData, nSize); m_tlsvr.REQ(0,&fn,0,true); }}void CMySal::SendYX(){ CFrameNode fn; fn.m_byCID = 0x80; int nSize=0; m_pAllMgr->GetAllYX(s_abyData,nSize); fn.SetSize(nSize); memcpy(fn.m_pbyData, s_abyData, nSize); m_tlsvr.REQ(0,&fn,0,true);}void CMySal::SendYC(){ CFrameNode fn; fn.m_byCID = 0x81; int nSize=0; m_pAllMgr->GetAllYC(s_abyData,nSize); fn.SetSize(nSize); memcpy(fn.m_pbyData, s_abyData, nSize); m_tlsvr.REQ(0,&fn,0,true);}bool CMySal::SendSOE(){ bool bRet = false; WORD wSize=0; while (m_quSOEData.size() > 0) { pthread_mutex_lock(&m_mutexSOE); SOEData soe = m_quSOEData.front(); BYTE* pTemp = s_abyData+wSize; memcpy(pTemp,(BYTE *)&soe,sizeof(soe)); wSize += sizeof(soe); m_quSOEData.pop(); pthread_mutex_unlock(&m_mutexSOE); if (wSize > 4096) break; } if (wSize>0) { CFrameNode fn; fn.m_byCID = 0x82; fn.SetSize(wSize); memcpy(fn.m_pbyData, s_abyData, wSize); m_tlsvr.REQ(0,&fn,0,true); bRet = true; } return bRet;}bool CMySal::SendEvent(){ bool bRet = false; if (m_quEvent.Size() > 0) { pthread_mutex_lock(&m_mutexEvent); char* p; m_quEvent.Get(p); BYTE* pTemp = s_abyData; memcpy(pTemp,p,strlen(p)); WORD wSize = strlen(p); delete p; pthread_mutex_unlock(&m_mutexEvent); CFrameNode fn; fn.m_byCID = 0x83; fn.SetSize(wSize); memcpy(fn.m_pbyData, s_abyData, wSize); m_tlsvr.REQ(0,&fn,0,true); bRet = true; } return bRet;}void CMySal::CDT(BYTE u){ if (m_bAllYXSend) { SendYX();// cout << "SendYX" <<endl; m_bAllYXSend = false; } else if (m_bAllYCSend) { SendYC();// cout << "SendYC" <<endl; m_bAllYCSend = false; } else { switch (u%4) { case 3://SOE// cout << "SendSOE" <<endl; SendSOE(); break; case 2://changed yc// cout << "SendYCChanged" <<endl; SendYCChanged(); break; case 1://Event// cout << "SendEvent" <<endl; SendEvent(); break; case 0://changed yx// cout << "SendYXChanged" <<endl; SendYXChanged(); break; default: break; } }}void CMySal::GetIND(){ CFrameNode* pfn = NULL; if (m_tlsvr.IND(pfn) == 1) { ExpIND(pfn); delete pfn; }}void CMySal::ExpIND(CFrameNode* pfn){ WORD* pw = (WORD *)pfn->m_pbyData; switch(pfn->m_byCID) { case 1://all m_bAllYXSend = true; m_bAllYCSend = true; break; case 2: //sync clock { struct tm t; BYTE* pby = pfn->m_pbyData; t.tm_year = *pby++; t.tm_mon = *pby++-1; t.tm_mday = *pby++; t.tm_hour = *pby++; t.tm_min = *pby++; pw = (WORD *)pby; t.tm_sec = *pw/1000; CTimeVal tv(&t,((*pw) %1000)*1000); m_pAllMgr->RectifyTime(&tv); break; } case 5://YK { WORD wDevNo = *pw++; WORD wAddr = *pw++; bool bOn = (*pw==0xff00)?true:false; CFrameNode fn; if (m_pAllMgr->YK(wDevNo,wAddr,bOn)) fn.m_byCID = 0x15; else fn.m_byCID = 0x25; fn.SetSize(6); pw = (WORD *)fn.m_pbyData; *pw++ = (WORD) wDevNo; *pw++ = wAddr; *pw = bOn?0xff00:0xff; m_tlsvr.REQ(0,&fn,0,true); } break; case 6://Read Fixedvalue { WORD wDevNo = *pw++; WORD wFunc = *pw; WORD wFVSize = 0; BYTE* pbyFV = NULL; CFrameNode fn; if (m_pAllMgr->GetFV(wDevNo,pbyFV,wFVSize,wFunc)) { fn.m_byCID = 0x16; fn.SetSize(6+wFVSize); pw = (WORD *)fn.m_pbyData; *pw++ = (WORD) wDevNo; *pw++ = wFunc; *pw++ = wFVSize/sizeof(struFVData); memcpy(pw,pbyFV,wFVSize); delete [] pbyFV; } else { fn.SetSize(4); fn.m_byCID = 0x26; pw = (WORD *)fn.m_pbyData; *pw++ = (WORD) wDevNo; *pw = wFunc; } m_tlsvr.REQ(0,&fn,0,true); } break; case 7://Write Fixedvalue if ((pfn->m_wSize>5) && (pfn->m_wSize == 6+ *(pw+2)*sizeof(struFVData))) { WORD wDevNo = *pw++; WORD wFunc = *pw++; WORD wCount = *pw++; CFrameNode fn; fn.SetSize(4); if (m_pAllMgr->PutFV(wDevNo,(BYTE *)pw,wCount*sizeof(struFVData),wFunc)) fn.m_byCID = 0x17; else fn.m_byCID = 0x27; pw = (WORD *)fn.m_pbyData; *pw++ = (WORD) wDevNo; *pw = wFunc; m_tlsvr.REQ(0,&fn,0,true); } break; default: break; }/* for (WORD w=0;w<pfn->m_wSize;w++) TRACE("%02X ",BYTE(pfn->m_pbyData[w])); TRACE("\n");*//* if ((wSize == 5) && (pchBuffer[6] == 5) && (iToRead == 11)) //YK { WORD wDevNo = pchBuffer[7]; WORD wAddr = *(WORD *)&pchBuffer[8]; bool bOn = (pchBuffer[10]==0x40)?true:false;// *pw = 5; if (m_pAllMgr->YK(wDevNo,wAddr,bOn)) pchBuffer[6] = 0x15;//success else pchBuffer[6] = 0x25;//failure stTcpStream.write(pchBuffer,11); } else if ((wSize == 5) && (pchBuffer[6] == 6) && (iToRead == 11)) //Read FixValue { WORD wDevNo = pchBuffer[7]; WORD wFC = *(WORD *)&pchBuffer[8]; WORD wFVSize = (WORD)pchBuffer[10]; BYTE* pbyFV; if (m_pAllMgr->GetFV(wDevNo,pbyFV,wFVSize,wFC)) { *pw = wFVSize+4; pchBuffer[6] = 0x16;//success memcpy(&pchBuffer[10],pbyFV,wFVSize); delete pbyFV; stTcpStream.write(pchBuffer,10+wFVSize); } else { pchBuffer[6] = 0x26;//failure stTcpStream.write(pchBuffer,10); } } else if ((pchBuffer[6] == 7) && (iToRead == (6+wSize))) //Write FixValue { WORD wDevNo = pchBuffer[7]; WORD wFC = *(WORD *)&pchBuffer[8]; BYTE* pbyFV = (BYTE *)&pchBuffer[10]; WORD wFVSize = wSize -4 ; if (m_pAllMgr->PutFV(wDevNo,pbyFV,wFVSize,wFC)) pchBuffer[6] = 0x17;//success else pchBuffer[6] = 0x27;//failure *pw = 4; stTcpStream.write(pchBuffer,10); }*/}/*bool CMySal::LoadPara(DWORD dwDevID,BYTE byAUCAddr,struPara* pPara,BYTE byCount){ bool bRet = false; m_cs.Lock(); m_cs.Unlock(); return bRet;}*/void CMySal::AddSOE(SOEData* pSOEValue,WORD wCount){ pthread_mutex_lock(&m_mutexSOE); for (WORD www=0;www<wCount;www++) { SOEData soe = pSOEValue[www]; m_quSOEData.push(soe); } while (m_quSOEData.size() > 100) m_quSOEData.pop(); pthread_mutex_unlock(&m_mutexSOE);}void CMySal::AddEvent(WORD wDevNo,char* pszEvent){ pthread_mutex_lock(&m_mutexEvent); char* p = new char[strlen(pszEvent)+1]; memcpy(p,pszEvent,strlen(pszEvent)+1); m_quEvent.Add(p); while (m_quEvent.Size() > 200) { char* p; m_quEvent.Get(p); delete p;// m_quEvent.pop(); } pthread_mutex_unlock(&m_mutexEvent);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -