📄 isamas.cpp
字号:
#include "isamas.h"void* ISAMaster(void *pVoid)//Period and Cycle for PRM=1; Wait IND for PRM=0{ CISAMAS *pAS = (CISAMAS *)pVoid; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); while (1) { pAS->Run(); usleep(500000); }}////////////////////////////////////////////////////////////////////CISAMAS::CISAMAS(CAllMgr* pAllMgr,bool bBalance,BYTE byMaxReportTimes,CSerialPortDef* pChannel) : CMAppService(pAllMgr,pChannel->m_wChannelNo) , m_DLService(pChannel){ { m_bySendOrder = 0; m_bIsACK = m_bIsNAK = FALSE; g_bPortWarning = FALSE; g_nPortWarningCount = 0; } m_bySendOrder = 0; m_tmRectify.GetCurrentTime(); m_tmRectify += CTimeValSpan(0,0,-2,0);// for (BYTE b=0; b<18; b++) m_BreakNo[b]=0;// m_bySendNo = 0; m_hThread = 0;}CISAMAS::~CISAMAS(){ if (m_hThread > 0) { cout << "ISA" << m_hThread << endl; pthread_cancel(m_hThread); }}bool CISAMAS::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,ISAMaster,(void *)this) == 0) bRet = true; pthread_attr_destroy(&attr); return bRet;}void CISAMAS::Run(){ while (m_DLService.Status() != 0) sleep(1); CFrameNode FNSend; CFrameNode FNRecv; int nEcho = GetPeriod(FNSend); pthread_mutex_lock(&m_mutex); //nEcho=0:Send no reply;=1:Send - Respond;=-1:No send; if ((nEcho!=-1) && (m_DLService.REQ((BYTE) nEcho,&FNSend,FNRecv,(BYTE) 0,true) == 1)) { if (ExplainRESP(&FNRecv)) { CFrameNode fnR; ACK(FNRecv.m_bySrcAddr,fnR); m_DLService.RESP(&fnR); } } else if (nEcho==1) { CFrameNode fnR; NAK(FNSend.m_byDesAddr,fnR); m_DLService.RESP(&fnR); } pthread_mutex_unlock(&m_mutex);}int CISAMAS::GetPeriod(CFrameNode& fn) //-1:failure;0:no echo; 1:have echo//BOOL CISADev::GetSendData(CMailNode& mn){ int nRet = -1; static BYTE byYCNo = 0; static BYTE byQueryAddr = 0xff;// while (!m_protmgr.HasOn()) Sleep(50); while (!m_subdevmgr.HasOn()) sleep(1); BYTE byAddr;/* if (m_bIsACK) { if (m_bySendOrder%3 == 0) byAddr = m_protmgr.GetAddr(byYCNo); else byAddr = byQueryAddr; ACK(byAddr,mn); m_bIsACK = FALSE; bRet = TRUE; } else if (m_bIsNAK) { if (m_bySendOrder%3 == 0) byAddr = m_protmgr.GetAddr(byYCNo); else byAddr = byQueryAddr; NAK(byAddr,mn); m_bIsNAK = FALSE; bRet = TRUE; } else*/ { CTimeVal tmCurrent; CTimeValSpan tvs = tmCurrent - m_tmRectify; if (tvs.GetMinute() >= 2) { m_tmRectify = tmCurrent; nRet = 0; RectifyTime(fn); } else { if (++m_bySendOrder%5 == 0) { byYCNo = m_subdevmgr.GetNextNo(byYCNo); byAddr = m_subdevmgr.GetAddrFrmNo(byYCNo); if (byAddr != 0xff) { BYTE byProtNo = m_subdevmgr.GetLocalNoFrmNo(byYCNo);// cout <<(WORD)byAddr <<" "<<(WORD)byProtNo <<endl; GetYC(byAddr,byProtNo,fn); nRet = 1; } } else { byQueryAddr = m_subdevmgr.GetNextAddr(byQueryAddr); Query(byQueryAddr,fn); nRet = 1; } } } return nRet;}/*void CISAMAS::ExplainRecvData(BYTE* pbyInBuf,WORD wInSize){ CFrame* pEchoFrame = GetEchoFrame(); if (pEchoFrame->BufferToFrame(pbyInBuf,wInSize)) { BYTE byFrameType = pEchoFrame->GetCID(); BYTE* pbyData = pEchoFrame->GetDataPtr(); if (pbyData == NULL) return; BYTE bySize = BYTE(pEchoFrame->GetDataSize()); BYTE byAddr = pEchoFrame->GetAddr(); m_wCHKSUM=((CISAFrame *)pEchoFrame)->GetCHKSUM(); switch (byFrameType) { case 0x4d: ExplainYCData(byAddr,pbyData,bySize); break; case 0x51: ExplainDiagData(byAddr,pbyData,bySize); break; case 0x40: ExplainEventData(byAddr,pbyData,bySize); case 0x53: break; default: break; } m_bIsACK = TRUE; } } else m_bIsNAK = TRUE;}*/bool CISAMAS::ExplainRESP(CFrameNode* pFNRecv){ bool bRet = false; BYTE* pbyData = pFNRecv->m_pbyData; BYTE bySize = (BYTE) pFNRecv->m_wSize; if (pbyData && bySize) { BYTE byAddr = pFNRecv->m_bySrcAddr;// BYTE byType = m_subdevmgr.GetType(byAddr); switch (pFNRecv->m_byCID) { case 0x4d: ExpYCData(byAddr,pbyData,bySize); break; case 0x51: ExpDiagData(byAddr,pbyData,bySize); break; case 0x40: ExpEventData(byAddr,pbyData,bySize); case 0x53: default: break; } bRet = true; } return bRet;}void CISAMAS::GetYC(BYTE byAddr,BYTE byProtNo,CFrameNode& fn){ fn.m_byDesAddr = byAddr; fn.m_pbyData[0] = byProtNo; fn.m_wSize = 1; fn.m_byCID = 0x4d;}void CISAMAS::RectifyTime(CFrameNode& fn){ fn.m_byDesAddr = 0;//广播地址 fn.m_byCID = 4; fn.m_wSize = 9; CTimeVal ctv; struct tm st; ctv.GetTime(&st); BYTE* pbyTemp = fn.m_pbyData; st.tm_year += 1900; st.tm_mon +=1; *pbyTemp++ = (((st.tm_year)%100/10) << 4) + (st.tm_year) % 10; *pbyTemp++ = (((st.tm_year) / 1000) << 4) + (st.tm_year) % 1000 / 100; *pbyTemp++ = ((st.tm_mon%100/10) << 4) + st.tm_mon % 10; *pbyTemp++ = ((st.tm_mday%100/10) << 4) + st.tm_mday % 10; *pbyTemp++ = ((st.tm_hour%100/10) << 4) + st.tm_hour % 10; *pbyTemp++ = ((st.tm_min%100/10) << 4) + st.tm_min % 10; *pbyTemp++ = ((st.tm_sec%100/10) << 4) + st.tm_sec % 10; WORD wMilliseconds = ctv.GetMilliSecs(); *pbyTemp++ = ((wMilliseconds%100/10) << 4) + wMilliseconds % 10; *pbyTemp = wMilliseconds % 1000 / 100;}void CISAMAS::Query(BYTE byAddr,CFrameNode& fn){ fn.m_byCID = 0x48; fn.m_wSize = 0; fn.m_byDesAddr = byAddr;}void CISAMAS::ACK(BYTE byAddr,CFrameNode& fn){ fn.m_byCID = 6; fn.m_wSize = 0; fn.m_byDesAddr = byAddr;}void CISAMAS::NAK(BYTE byAddr,CFrameNode& fn){ fn.m_byCID = 0x15; fn.m_wSize = 0; fn.m_byDesAddr = byAddr;}/*cmd_echo CISADev::GetFixVal(BYTE byProtNo,CFixVal* pFixVal){ cmd_echo ce; m_bIsNormal = FALSE; CISAFrame frameGFV,frameEcho; BYTE byAddr = m_protmgr.GetAddr(byProtNo); BYTE* pTemp = new BYTE[1]; *pTemp = m_protmgr.GetProtNo(byProtNo); frameGFV.SetupFrame(byAddr,0x53,pTemp,1); BYTE* pbyData; WORD wFrameSize = frameGFV.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp; pmqRecv->GetHeadNode(mnTemp); if ((mnTemp.m_lSize == 1) && (mnTemp.m_pBuf[0] == 0x0d)) ce = ce_eTimeout; else if (frameEcho.BufferToFrame(mnTemp.m_pBuf,WORD(mnTemp.m_lSize))) { if (frameEcho.GetCID() == 0x53) { BYTE* pbyValue = frameEcho.GetDataPtr(); WORD wSize = frameEcho.GetDataSize(); BYTE* pByte; WORD* pWord = (WORD *)(pbyValue+1); for (WORD w=0; w<wSize/3; w++) { pByte = (BYTE *)pWord; BYTE byType = *pByte++; pWord = (WORD *)pByte; pFixVal->AddNode(byType,*pWord++); } ce = ce_eOK; } else ce = ce_eFail; } m_bIsNormal = TRUE; return ce;}cmd_echo CISADev::PutFixVal(BYTE byNo,BYTE* pFixVal,BYTE bySize){ cmd_echo ce; m_bIsNormal = FALSE; CISAFrame framePFV,frameEcho; BYTE byAddr = m_protmgr.GetAddr(byNo); BYTE* pData = new BYTE[bySize+1]; pData[0] = m_protmgr.GetProtNo(byNo); memcpy(&pData[1],pFixVal,bySize); framePFV.SetupFrame(byAddr,0x54,pData,bySize+1); BYTE* pbyData; WORD wFrameSize = framePFV.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp; pmqRecv->GetHeadNode(mnTemp); if ((mnTemp.m_lSize == 1) && (mnTemp.m_pBuf[0] == 0x0d)) ce = ce_eTimeout; else { frameEcho.BufferToFrame(mnTemp.m_pBuf,WORD(mnTemp.m_lSize)); if (frameEcho.GetCID() == 0x54) { CMailNode mn; ACK(byAddr,mn); pmqSend->AddMailTail(mn.m_pBuf,mn.m_lSize); ce = ce_eOK; } else ce = ce_eFail; } m_bIsNormal = TRUE; return ce;}*/bool CISAMAS::SReset(WORD wDevNo)//cmd_echo CISADev::SReset(BYTE byNo){ bool bRet = false; CFrameNode fnSend; CFrameNode fnRecv; pthread_mutex_lock(&m_mutex);// cmd_echo ce;// m_bIsNormal = FALSE;// CISAFrame frameSReset,frameEcho; CSubdev* pSubdev = m_subdevmgr.GetDevFrmDevNo(wDevNo); fnSend.m_byDesAddr = pSubdev->m_byAddr;//m_subdevmgr.GetAddrFrmDevNo(wDevNo); fnSend.m_byCID = 0x4f;// fnSend.m_pbyData[0] = pSubdev->m_byLocalNo;//m_subdevmgr.GetLocalNoFrmDevNo(wDevNo); fnSend.m_wSize = 1;// BYTE byAddr = m_protmgr.GetAddr(wDevNo);// BYTE* pTemp = new BYTE[1];// *pTemp = m_protmgr.GetProtNo(byNo);// frameSReset.SetupFrame(byAddr,0x4f,pTemp,1); if (m_DLService.REQ(1,&fnSend,fnRecv,0,true) == 1) { if (fnRecv.m_byCID == 6) bRet = true; }/* BYTE* pbyData; WORD wFrameSize = frameSReset.FrameToBuffer(pbyData); CMailQueue* pmqSend = m_mail.GetSendMailQueue(); CMailQueue* pmqRecv = m_mail.GetRecvMailQueue(); pmqSend->AddMailTail(pbyData,wFrameSize); delete pbyData; CMailNode mnTemp; pmqRecv->GetHeadNode(mnTemp); if ((mnTemp.m_lSize == 1) && (mnTemp.m_pBuf[0] == 0x0d)) ce = ce_eTimeout; else { frameEcho.BufferToFrame(mnTemp.m_pBuf,WORD(mnTemp.m_lSize)); if (frameEcho.GetCID() == 0x6) ce = ce_eOK; else ce = ce_eFail; } m_bIsNormal = TRUE;*/ pthread_mutex_unlock(&m_mutex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -