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

📄 mysal.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 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 + -