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

📄 taichen_yuntai.c

📁 1、监控行业云台控制代码 2、对Pelco-P,Pelco-D进行解析
💻 C
字号:
TCBASELIB(void) TCDivString(LPCTSTR lpStr, LPCTSTR lpSubStr, CStringArray* lpaDiv)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	int Pos, OldPos = 0;

	lpaDiv->RemoveAll();
	
	CString Str, SubStr;
	Str = lpStr;

	while(TRUE){
		//抽取数据库信息,以“,”号分割
		Pos = Str.Find(lpSubStr,OldPos);
		if(Pos==-1){  //最后的信息
			SubStr = Str.Right(Str.GetLength()-OldPos);
			SubStr.TrimLeft();
			SubStr.TrimRight();
			if(SubStr!="")
				lpaDiv->Add(SubStr);
			break;
		}
		//中间的信息
		SubStr = Str.Mid(OldPos,Pos-OldPos);
		SubStr.TrimLeft();
		SubStr.TrimRight();
		if(SubStr!="")
			lpaDiv->Add(SubStr);
		OldPos = Pos+1;
	}
}

void TCVSSendYTCommand(int Index, CString &Address, CString &Command, TCYTCtrlInfo* YTInfo)
{
	int i,j;
	int Value,Sum,sumIndex,Xor,xorIndex,Count;
	int Address_count = 0;
	int Command_count = 0;
	char Address_buf[TCVYTCodeLength];
	char Command_buf[TCVYTCodeLength];
	CStringArray DataList,TempList;
	CString Info,Temp;

	memset(Address_buf,0,TCVYTCodeLength);
	memset(Command_buf,0,TCVYTCodeLength);

	TCDivString(Address,",",&DataList);
	for(i=0;i<DataList.GetSize();i++){
		Info = DataList[i];
		if(Info.GetLength()==3&&Info.Left(1)=="["&&Info.Right(1)=="]"){
			Temp = Info.Mid(1,Info.GetLength()-2);
			sscanf(Temp,"%c",&Value);
		}
		else{
			sscanf(Info,"%x",&Value);
		}
		Address_buf[Address_count] = Value;
		Address_count++;
	}

	BYTE Mod = 0;
	BYTE Mask = 0xFF;
	BYTE Dec = 0;
	int Wait = 20;
	int WaitThread = 0;

	TCDivString(Command,",",&DataList);
	for(i=0;i<DataList.GetSize();i++){
		Info = DataList[i];
		if(Info.Left(1)=="%"){  //取模
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			Mod = Value;
		}
		else if(Info.Left(1)=="~"){  //减处理(减校验和)
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			Dec = Value;
		}
		else if(Info.Left(1)=="M"){  //Mask处理(与操作)
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			Mask = Value;
		}
		else if(Info.Left(1)=="#"){  //连续指令间隔时间
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			Wait = Value;
		}
		else if(Info.Left(1)=="&"){  //连续发码间隔时间
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			WaitThread = Value;
		}
		else if(Info=="^"){  //解码器地址
			for(j=0;j<Address_count;j++){
				Command_buf[Command_count] = Address_buf[j];
				Command_count++;
			}
		}
		else if(Info=="!"){  //云台预置点
			Command_buf[Command_count] = YTInfo->PointID;
			Command_count++;
		}
		else if(Info.Left(1)=="+"){  //求校验和
			Temp = Info.Right(Info.GetLength()-1);
			TCDivString(Temp,".",&TempList);
			Count = TempList.GetSize();
			if(Count==1){
				sscanf(TempList[0],"%x",&Value);
				Sum = 0;
				for(j=0;j<Value;j++){
					sumIndex = Command_count-j-1;
					if(sumIndex<0){
						TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
						return;
					}
					Sum+=Command_buf[sumIndex];
				}
				if(Mod!=0)
					Command_buf[Command_count] = Sum%Mod;
				else
					Command_buf[Command_count] = Sum;
				if(Mask!=0xFF)
					Command_buf[Command_count] &= Mask;
				if(Dec!=0)
					Command_buf[Command_count] = Dec - Command_buf[Command_count];
				Command_count++;
			}
			else{  //计算固定位校验值
				Sum = 0;
				for(j=0;j<Count;j++){
					//计算固定累加值(2004-07-20)
					if(TempList[j].Right(1)=="+"){
						Temp = TempList[j].Left(TempList[j].GetLength()-1);
						sscanf(Temp,"%x",&Value);
						Sum+=Value;
					}
					else{
						sscanf(TempList[j],"%x",&Value);
						sumIndex = Command_count-Value;
						if(sumIndex<0){
							TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
							return;
						}
						Sum+=Command_buf[sumIndex];
					}
				}
				if(Mod!=0)
					Command_buf[Command_count] = Sum%Mod;
				else
					Command_buf[Command_count] = Sum;
				if(Mask!=0xFF)
					Command_buf[Command_count] &= Mask;
				if(Dec!=0)
					Command_buf[Command_count] = Dec - Command_buf[Command_count];
				Command_count++;
			}
		}
		else if(Info.Left(1)=="-"){  //求校验和(取反)
			Temp = Info.Right(Info.GetLength()-1);
			TCDivString(Temp,".",&TempList);
			Count = TempList.GetSize();
			if(Count==1){
				sscanf(TempList[0],"%x",&Value);
				Sum = 0;
				for(j=0;j<Value;j++){
					sumIndex = Command_count-j-1;
					if(sumIndex<0){
						TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
						return;
					}
					Sum+=Command_buf[sumIndex];
				}
				if(Mod!=0)
					Command_buf[Command_count] = ~(Sum%Mod);
				else
					Command_buf[Command_count] = ~(Sum);
				if(Mask!=0xFF)
					Command_buf[Command_count] &= Mask;
				if(Dec!=0)
					Command_buf[Command_count] = Dec - Command_buf[Command_count];
				Command_count++;
			}
			else{  //计算固定位校验和取反
				Sum = 0;
				for(j=0;j<Count;j++){
					sscanf(TempList[j],"%x",&Value);
					sumIndex = Command_count-Value;
					if(sumIndex<0){
						TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
						return;
					}
					Sum+=Command_buf[sumIndex];
				}
				if(Mod!=0)
					Command_buf[Command_count] = ~(Sum%Mod);
				else
					Command_buf[Command_count] = ~(Sum);
				if(Mask!=0xFF)
					Command_buf[Command_count] &= Mask;
				if(Dec!=0)
					Command_buf[Command_count] = Dec - Command_buf[Command_count];
				Command_count++;
			}
		}
		else if(Info.Left(1)=="="){  //求异或校验值
			Temp = Info.Right(Info.GetLength()-1);
			sscanf(Temp,"%x",&Value);
			xorIndex = Command_count-Value;
			if(xorIndex<0){
				TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
				return;
			}
			Xor = Command_buf[xorIndex];
			for(j=1;j<Value;j++){
				xorIndex++;
				if(xorIndex>=Command_count){
					TCVSErrLog(_LL("解码器协议错误!","PTZ command code error!"));
					return;
				}
				Xor^=Command_buf[xorIndex];
			}
			Command_buf[Command_count] = Xor;
			Command_count++;
		}
		else if(Info=="|"){  //连续指令
			//确保当前操作线程已经结束(2004-03-20)
			if(g_YTThread.IsRunning()){
				g_YTThread.Break();
				for(j=0;j<500;j++){
					if(!g_YTThread.IsRunning())
						break;
					Sleep(1);
				}
				if(g_YTThread.IsRunning())
					g_YTThread.Delete();
			}
			ASSERT(Index>=0&&Index<TCVS_MAX_YUNTAI);
			ASSERT(uCfg.YunTai.YTCommInfo[Index]>=0&&uCfg.YunTai.YTCommInfo[Index]<TCVS_MAX_COMM);
			g_SerialPort[uCfg.YunTai.YTCommInfo[Index]].Send(Command_buf,Command_count);
#ifdef _DEBUG
			TCVSMakeCommBufferInfo(Command_buf,Command_count);
#endif

			memset(Command_buf,0,TCVYTCodeLength);
			Command_count = 0;
			Sleep(Wait);
		}
		//ASCII数值处理(2004-08-21)
		else if(Info.GetLength()>=3&&Info.Left(1)=="["&&Info.Right(1)=="]"){
			Temp = Info.Mid(1,Info.GetLength()-2);
			if(Temp=="STX"){
				Value = 0x02;
			}
			else if(Temp=="ETX"){
				Value = 0x03;
			}
			else{
				sscanf(Temp,"%c",&Value);
			}
			Command_buf[Command_count] = Value;
			Command_count++;
		}
		//直接转换成16进制数值
		else{
			sscanf(Info,"%x",&Value);
			Command_buf[Command_count] = Value;
			Command_count++;
		}
	}

	//确保当前操作线程已经结束(2004-03-20)
	if(g_YTThread.IsRunning()){
		g_YTThread.Break();
		for(i=0;i<500;i++){
			if(!g_YTThread.IsRunning())
				break;
			Sleep(1);
		}
		if(g_YTThread.IsRunning())
			g_YTThread.Delete();
	}
	//发送云台控制命令
	if(WaitThread==0){
		ASSERT(Index>=0&&Index<TCVS_MAX_YUNTAI);
		ASSERT(uCfg.YunTai.YTCommInfo[Index]>=0&&uCfg.YunTai.YTCommInfo[Index]<TCVS_MAX_COMM);
		if(g_SerialPort[uCfg.YunTai.YTCommInfo[Index]].Send(Command_buf,Command_count)!=(UINT)Command_count){
			TCVSWarnLog(_LL("云台控制命令发送错误!","PTZ command send failed!"));
		}
#ifdef _DEBUG
		TCVSMakeCommBufferInfo(Command_buf,Command_count);
#endif
	}
	else{
		static TCVSSendYTCommandInfo YTCI;
		YTCI.Index = Index;
		YTCI.Wait = WaitThread;
		YTCI.Command_count = Command_count;
		memcpy(YTCI.Command_buf,Command_buf,Command_count);
		g_YTThread.BeginThread(TCVSSendYTCommandProc,&YTCI);
	}
}

⌨️ 快捷键说明

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