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

📄 cscmal.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					delete pfn;//	printf("0 %04x\n",awBuf[0]);//	printf("1 %04x\n",awBuf[1]);					bRet = true;					if (byType == dt_eCSC246)						wSize = (16*2+30)*sizeof(struFVData);					else wSize = (16*2+37)*sizeof(struFVData);					pbyBuf = new BYTE[wSize];					struFVData* pFVData = (struFVData *)pbyBuf;					WORD wA = 0x1;					for (WORD ww=0; ww<wSize/sizeof(struFVData); ww++)					{						(pFVData+ww)->m_dwID = ww;						if (ww<32)						{							(pFVData+ww)->m_vt = VT_BOOL;							(pFVData+ww)->m_bValue = bool((ww<16)?(awBuf[0]&wA):(awBuf[1]&wA))?0xff:0;							if (ww == 15) wA = 1;							else wA <<= 1;						}						else						{							(pFVData+ww)->m_vt = VT_R4;							(pFVData+ww)->m_fValue = wtf(awBuf[ww+2-32]);//	                                         cout<<    (pFVData+ww)->m_fValue <<endl;						}                                   }					break;				}		/*		CFrameNode FNSendx;				FNSendx.m_byCID = 0x26;				FNSendx.m_wDAddr = byAddr;				FNSendx.SetSize(0);				m_dlsvr.REQ(0,&FNSendx,0,true);                 */			}			delete pfn;		} 	}		pthread_mutex_unlock(&m_mutex);	return bRet;}bool CCSCMas::PutFV(WORD wDevNo,BYTE* pFixVal,WORD wSize,WORD wFuncCode){	bool bRet = false;	pthread_mutex_lock(&m_mutex);	BYTE byAddr = m_subdevmgr.GetAddrFrmDevNo(wDevNo);	if (byAddr == 0xff)	{		pthread_mutex_unlock(&m_mutex);		return false;		}	BYTE byType = m_subdevmgr.GetTypeFrmAddr(byAddr);	struFVData* pFVData = (struFVData *)pFixVal;	WORD awBuf[39];	awBuf[0] = awBuf[1] = 0;	for (WORD ww=0; ww<wSize/sizeof(struFVData); ww++)	{		if ((pFVData+ww)->m_dwID<16)			awBuf[0] |= (((pFVData+ww)->m_bValue==0xff)?(1<<(pFVData+ww)->m_dwID):0);		else if ((pFVData+ww)->m_dwID<32)			awBuf[1] |= (((pFVData+ww)->m_bValue==0xff)?(1<<((pFVData+ww)->m_dwID-16)):0);		else if ((pFVData+ww)->m_dwID < 69)			awBuf[(pFVData+ww)->m_dwID+2-32] = ftw((pFVData+ww)->m_fValue);//if (ww < 32)	//	printf("FV ID=%d. %s\n",(pFVData+ww)->m_dwID,(pFVData+ww)->m_bValue?"TRUE":"FALSE");	}//printf("0 %04x\n",awBuf[0]);//printf("1 %04x\n",awBuf[1]);	awBuf[0] = CW(awBuf[0]);	awBuf[1] = CW(awBuf[1]);	WORD wCRC = (byType == dt_eCSC246) ? cal_crc((BYTE *)awBuf,32*2) : cal_crc((BYTE *)awBuf,39*2);	BYTE byFrameCount = (byType == dt_eCSC246) ? 32/5+1 : 39/5+1;	for (BYTE bb=1,bbb=0;bbb<byFrameCount; bbb++)	{		CFrameNode FNSend;		FNSend.m_byCID = 0x89;		FNSend.m_wDAddr = byAddr;		WORD ws=0;		if (bbb+1 == byFrameCount)			ws = 4* (((byType == dt_eCSC246) ? 32 : 39)%5) + 4 ;		else ws = 4*5 + ((bbb == 0)?4:2);				FNSend.SetSize(ws);		BYTE* pData = FNSend.m_pbyData;		*pData++ = bbb + 1;		*pData++ = (bbb==(byFrameCount-1))? 0x80:0;		if (bbb == 0)				{			*pData++ = 0x0; //current fixed_value no.			if (byType == dt_eCSC246)			       *pData++ = 0x9b;			else *pData++ = 0x90;		}		for (BYTE b=0; (b<5) && (bb <= ((byType == dt_eCSC246) ? 32 : 39)); b++)		{			*pData++ = bb++;			*pData++ = ((bbb==0) && (b<2))?2:0;			WORD *pw = (WORD *)pData;			*pw++ = awBuf[bbb*5+b];			if ((bbb*5+b +1) == ((byType == dt_eCSC246) ? 32 : 39))			{				*pw =  wCRC;				break;			}			pData = (BYTE *)pw;		}		if (m_dlsvr.REQ(0,&FNSend,0,true) == 1)//Send - Respond		{			CFrameNode* pfn = NULL;			if (m_queResp.Get(pfn,200))			{				if (pfn->m_byCID == 0x15)				{					delete pfn;					break;				}				else if (pfn->m_byCID == 0x26)					bRet = true;				delete pfn;			}		}	}	if (bRet)		bRet = Fixing(byAddr,0x0);		pthread_mutex_unlock(&m_mutex);	return bRet;}bool CCSCMas::Fixing(BYTE byAddr,BYTE byArea){	bool bRet = false;		CFrameNode FNSend;	FNSend.m_byCID = 0x1e; //select	FNSend.m_wDAddr = byAddr;//GGG	FNSend.SetSize(2);	BYTE* pData = FNSend.m_pbyData;	pData[0] = ~byArea;	pData[1] = ~0x63;	if (m_dlsvr.REQ(0,&FNSend,0,true) == 1)//Send - Respond	{		CFrameNode* pfn=NULL;		if (m_queResp.Get(pfn,200))		{			if (pfn->m_byCID == 0x3c) //success			{				FNSend.m_byCID = 0x1a; ////execute				pData[0] = byArea;				pData[1] = 0x63;				if (m_dlsvr.REQ(0,&FNSend,0,true) == 1)//Send - Respond				{					CFrameNode* pfn1=NULL;					if (m_queResp.Get(pfn1,200))					{						if (pfn1->m_byCID == 0x26)							bRet = true;						delete pfn1;					}				}			}			delete pfn;		}	}	return bRet;}void CCSCMas::Explain(CFrameNode* pfn){	if (pfn->m_byCID == 0x30)	{		BYTE* pbyTemp = pfn->m_pbyData;		WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(pfn->m_wSAddr);		if (wDevNo == 0xffff) return;		switch (*pbyTemp++)		{		case 0x30: //YC ana16-h 10个			{				WORD* pwTemp = (WORD *)pbyTemp;				BYTE byNum = (pfn->m_wSize-1)/2;				if (byNum >10) byNum = 10;				YCData* pData = new YCData [byNum];				for (BYTE b=0; b<byNum; b++,pwTemp++)				{					pData[b].m_wDevNo = wDevNo;					pData[b].m_wDevPtNo = b+1;					WORD wValue = *pwTemp;					float ffValue = wValue& 0xfff;					if (wValue & 0x1000)						ffValue = -ffValue;					pData[b].m_fValue = ffValue/4096;					}				m_pAllMgr->YC(pData,byNum);				delete [] pData;			}			break;		case 0x0b: //YE 4字节I32 11 start 6			{				DWORD* pdwTemp = (DWORD *)(pbyTemp+2);				BYTE byNum = pfn->m_wSize/4 ;				YCData* pData = new YCData [byNum];				for (BYTE b=0;(b<10) && b<byNum; b++,pdwTemp++)				{					pData[b].m_wDevNo = wDevNo;					pData[b].m_wDevPtNo = b+11;					pData[b].m_fValue = *pdwTemp;				}				m_pAllMgr->YC(pData,byNum);				delete [] pData;			}			break;		case 0x07: //Yx 24 bytes			{				BYTE byNum = 15*8;//(pfn->m_wSize-2)*8;								pbyTemp++;				YXData* pYXData = new YXData [byNum+1];				for (BYTE by=0; by<byNum/8; by++)				{					BYTE byA = 1;					BYTE byValue = *pbyTemp++;		//printf("%02X ",byValue);					for (BYTE b=0; b<8; b++,byA<<=1)					{						pYXData[b+8*by].m_wDevNo = wDevNo;						pYXData[b+8*by].m_wDevPtNo =b+8*by + 1 ;						pYXData[b+8*by].m_bValue = (byValue & byA)?0xff00:0xff;					}				}		//cout << endl;					pYXData[byNum].m_wDevNo = wDevNo;				pYXData[byNum].m_wDevPtNo =200 ;				pYXData[byNum].m_bValue = ((pYXData[46].m_bValue == 0xff00) || (pYXData[47].m_bValue == 0xff00))?0xff00:0xff;								m_pAllMgr->YX(pYXData, byNum+1);				delete [] pYXData;			}			break;		case 0x11: //soe 7字节绝对时标			{				BYTE byEventCount = (pfn->m_wSize-1)/12;		//		pbyTemp++;				for (BYTE b=0; b<byEventCount; b++,pbyTemp+=12)				{					BYTE byGroupNo = *pbyTemp;					struct tm gt;					gt.tm_year = 100+ *(pbyTemp+7);					gt.tm_mon = *(pbyTemp+6)-1;					gt.tm_mday = *(pbyTemp+5);					gt.tm_hour = *(pbyTemp+4);					gt.tm_min = (*(pbyTemp+3)) & 0x7f;					WORD* pwTemp = (WORD *)(pbyTemp+1);					DWORD dwms = *pwTemp + (((*(pbyTemp+3)) & 0x80) ?65536:0);					gt.tm_sec = dwms/1000 % 60;					gt.tm_min += dwms/1000/60;					CTimeVal tvg(&gt,dwms%1000*1000);					WORD wEventAddr = (byGroupNo-1)*16;					WORD wA = 1;					pwTemp = (WORD *)(pbyTemp+8);					WORD wValue = *pwTemp++;					WORD wStatus = *pwTemp;					for (BYTE b=0; b<16; b++,wA<<=1)					{						if (wStatus & wA)						{							SOEData aSOEData;							aSOEData.m_ctv = tvg;							struct tm t;							tvg.GetTime(&t);							aSOEData.m_bValue = ((wValue & wA) == 0) ?0xff:0xff00;							aSOEData.m_wDevNo = wDevNo;							aSOEData.m_wDevPtNo = wEventAddr+1+b;							SendSOEData(&aSOEData,1);						}					}				}			}			break;		default:			break;		}	}		/*	BYTE* pbyTemp = pbyData + 1;		WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr);	YCData* pData = new YCData [bySize/2];//	short* pshOrigValue = (short *)pbyData;	WORD* pwOrigValue = (WORD *)pbyTemp;	for (WORD w=0; w<bySize/2; w++)	{		pData[w].m_wDevNo = wDevNo;		pData[w].m_wDevPtNo = w+1;		float ffValue = CW(*pwOrigValue++);		if ((w == 10) || (w == 11) || (w == 12) || (w == 13) || (w == 14))			ffValue -= 0x8000;		pData[w].m_fValue = ffValue;	}	m_pAllMgr->YC(pData,(WORD)bySize/2);	delete pData;*/}/*void CCSCMas::ExpYXData(BYTE byAddr,BYTE* pbyData,BYTE bySize,BYTE byOrder){	if ((pbyData == NULL) || (bySize < 2)) return;	BYTE* pbyTemp = pbyData+1;	WORD* pw = (WORD *)pbyTemp;	for (BYTE b=0; b<bySize/2;b++)		*pw++ = CW(*pw);	YXData* pYXData = new YXData [(bySize-1)*8];	WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr);	for (BYTE by=0; by<(bySize-1); by++)	{		BYTE byA = 1;		BYTE byValue = *pbyTemp++;		for (BYTE b=0; b<8; b++,byA<<=1)		{			pYXData[b+8*by].m_wDevNo = wDevNo;			WORD ptno = pYXData[b+8*by].m_wDevPtNo =b+8*by + 1 + ((byOrder == 1) ? 80 : 0);			pYXData[b+8*by].m_bValue = bool(byValue & byA);			if (ptno == 9) m_b9[wDevNo] = pYXData[b+8*by].m_bValue;			if (ptno == 10) m_b10[wDevNo] = pYXData[b+8*by].m_bValue;			if (ptno == 15) m_b15[wDevNo] = pYXData[b+8*by].m_bValue;			if (ptno == 17) m_b17[wDevNo] = pYXData[b+8*by].m_bValue;		}	}		m_pAllMgr->YX(pYXData, (bySize-1)*8);			delete [] pYXData;}void CCSCMas::ExpEventData(BYTE byAddr,BYTE* pbyData,BYTE bySize){//	ASSERT(bySize == 67);	BYTE byEventCount;	m_byExchanged = pbyData[1];	byEventCount = pbyData[2];	WORD* pw = (WORD *)&pbyData[3];//	if (byEventCount > 0)//	{//		m_bIsAck = TRUE;//	}	WORD wDevNo = m_subdevmgr.GetDevNoFrmAddr(byAddr);	for (BYTE b=0; b<byEventCount; b++)	{		struct tm gt;//		CString ss;//		SYSTEMTIME st;		gt.tm_year = CW(*(pw + 4 + 8*b));		if (gt.tm_year<50) gt.tm_year += 100;		gt.tm_mon = ((CW(*(pw + 5 + 8*b)) & 0xff00) >> 8) - 1;		gt.tm_mday = CW(*(pw + 5 + 8*b)) & 0xff;		gt.tm_hour = (CW(*(pw + 6 + 8*b)) & 0xff00) >> 8;		gt.tm_min = CW(*(pw + 6 + 8*b)) & 0xff;		gt.tm_sec = CW(*(pw + 7 + 8*b)) /1000;		CTimeVal tvg(&gt,(CW(*(pw + 7 + 8*b)) % 1000)*1000);		WORD wEventAddr = CW(*(pw + 1 + 8*b));//		BYTE byDeviceNo = m_subdevmgr.GetDeviceNo(byNo);		if (wEventAddr < 0xc8f0)			wEventAddr = wEventAddr - 0xc100 + 80;		else wEventAddr -= 0xc8f0;		//		cout <<	gt.tm_year<<"/"<<gt.tm_mon<<"/"<<gt.tm_mday<<"  "<<gt.tm_hour<<":"<<gt.tm_min<<":"<<gt.tm_sec<<"."<< CW(*(pw + 7 + 8*b)) % 1000<< "/" <<wEventAddr<<endl;		if ((wEventAddr != 39) && (wEventAddr != 18))		{		SOEData aSOEData;		aSOEData.m_ctv = tvg;		aSOEData.m_bValue = (*(pw + 3 + 8*b) == 0) ?false:true;		aSOEData.m_wDevNo = wDevNo;		aSOEData.m_wDevPtNo = wEventAddr+1;		SendSOEData(&aSOEData,1);		}	}}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -