⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isamas.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -