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

📄 venb.c

📁 H.261图像压缩芯片控制软件
💻 C
📖 第 1 页 / 共 4 页
字号:
*  函数名称:void ParseCommand(void)                                          *
*  简要描述:解析从串口接收到的命令                                           *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void ParseCommand(void)
{
        //定义临时变量
        byte data temp1;
        byte data temp2;
        byte data temp3;
        byte data temp4;
        byte data temp5;
        byte data temp6;
        byte data temp7;
        byte data temp8;
	byte data i;

	WATCHD=!WATCHD;

	//解析接收到的命令
	if(m_bEndFlag==TRUE)	//接收到有效命令,解析并处理
	{
		m_bEndFlag=FALSE;	//置标志位
		
		if(m_bSwitchFlag==1)    //需处理缓冲区1
                {
                       	temp1=m_nReceiveBuffer1[1];
                       	temp2=m_nReceiveBuffer1[2];
                       	temp3=m_nReceiveBuffer1[3];
                       	temp4=m_nReceiveBuffer1[4];
                       	temp5=m_nReceiveBuffer1[5];
                       	temp6=m_nReceiveBuffer1[6];
                       	temp7=m_nReceiveBuffer1[7];
                       	temp8=m_nReceiveBuffer1[8];
	        }
	        else	//需处理缓冲区2
                {
                       	temp1=m_nReceiveBuffer2[1];
                       	temp2=m_nReceiveBuffer2[2];
                       	temp3=m_nReceiveBuffer2[3];
                       	temp4=m_nReceiveBuffer2[4];
                      	temp5=m_nReceiveBuffer2[5];
                       	temp6=m_nReceiveBuffer2[6];
                       	temp7=m_nReceiveBuffer2[7];
                       	temp8=m_nReceiveBuffer2[8];
	        }
	                  
		m_nSendBuffer[1]=temp1;	//StationID

                if(temp2==VENB)         //目标地址为VENB的命令才处理
                {
                	switch(temp4)   //命令类型
                       	{
                        	case 0x03:      
					if(temp5<0x04)
					{
						//回送应答
						m_nSendBuffer[2]=temp3;	//DestDevice
						m_nSendBuffer[4]=0x03;	//CmdType/Rtn
						m_nSendBuffer[5]=temp5;	//Para1
						m_nSendBuffer[6]=temp6;	//Para2
       						SendToSP();		//发送
					}
					
					switch(temp5)
					{	
						case 0x00:	//饱和度
							//改变饱和度值
 							m_nSaturation=temp6;
 							ChangeVideoParameter(SATURATION);
                        	        		break;
						case 0x01:	//亮度
							//改变亮度值
 							m_nBright=temp6;
 							ChangeVideoParameter(BRIGHT);
                        	        		break;
						case 0x02:	//色调
							//改变色调值
 							m_nHue=temp6;
 							ChangeVideoParameter(HUE);
                        	        		break;
						case 0x03:	//对比度
							//改变对比度值
 							m_nContrast=temp6;
 							ChangeVideoParameter(CONTRAST);
                        	        		break;
						case 0x06:	//选择视频源
							//通知VTB保存该参数
 							m_nSendBuffer[2]=VTBE;	//DestDevice
 							m_nSendBuffer[4]=0x0c;	//CmdType/Rtn
 							if (temp3==PC)
 							{	//配置PC发来的命令
 								m_nSendBuffer[5]=0x03;	//Para1
 							}
 							else if (temp3==TXT)
 							{	//图象台发来的命令
 								m_nSendBuffer[5]=0x04;	//Para1
 							}
 							else
 							{	//VDEB发来的命令
 								m_nSendBuffer[5]=0x02;	//Para1
 							}
 							m_nSendBuffer[6]=temp6;	//Para2
               						SendToSP();		//发送

		               				//调整视频源
               						ChangeVideoSource(temp6);
                        	        		break;
						case 0x07:	//带宽更改
							//回送应答
 							m_nSendBuffer[2]=VTBE;	//DestDevice
 							m_nSendBuffer[4]=0x0e;	//CmdType/Rtn
 							m_nSendBuffer[5]=temp6;	//Para1
 							m_nSendBuffer[6]=0x00;	//Para2
               						SendToSP();		//发送
               						
               						//带宽更改
							SetRate(temp6);		//temp6
                        	        		break;
                        	        	default:
                        	        		break;
                        	        }	
					
					break;
                        	case 0x05:	//复位
					//回送应答
					m_nSendBuffer[2]=temp3;	//DestDevice
					m_nSendBuffer[4]=0x05;	//CmdType/Rtn
					m_nSendBuffer[5]=0x00;	//Para1
					m_nSendBuffer[6]=0x00;	//Para2
					SendToSP();		//发送
               						
					//复位
					for(;;);
                        	        break;
                        	case 0x07:	//解冻
					//回送应答
					m_nSendBuffer[2]=temp3;	//DestDevice
					m_nSendBuffer[4]=0x07;	//CmdType/Rtn
					m_nSendBuffer[5]=0x01;	//Para1
					m_nSendBuffer[6]=0x00;	//Para2
					SendToSP();		//发送
               						
					//解冻操作
					RATE_CS=1;	//地址锁存逻辑使能
					BUTTON_CS=1;
		
					VP2612_CS=0;	//片选有效
					
					SetRegister(0x00,0x3c);	//选择命令0:Freeze picture release on
					for(i=0;i<250;i++) Delay();
					SetRegister(0x00,0x38);	//选择命令0:Freeze picture release off

					RATE_CS=1;	//地址锁存逻辑使能
					BUTTON_CS=1;
	
					VP2612_CS=1;	//片选无效

                        	        break;
                        	case 0x0a:	//扫描
					//回送应答
					m_nSendBuffer[2]=temp3;	//DestDevice
					m_nSendBuffer[4]=0x0a;	//CmdType/Rtn
					m_nSendBuffer[5]=temp5;	//Para1
					m_nSendBuffer[6]=temp6;	//Para2
					m_nSendBuffer[7]=temp7; //Para3
					SendToSP();		//发送
               						
					//扫描设置
					m_nScanPeriod=temp5;		//扫描周期
					m_nScanChannel=temp6+temp7*256;	//扫描控制字
					if(m_nScanPeriod==0)
					{
						ChangeVideoSource(1);
					}
                        	        break;
                        	case 0x11:			//VTB板复位后发过来的配置
               				//调整视频源
					ChangeVideoSource(temp5);
					//带宽更改
					SetRate(temp6);		//temp6
			
 					//回送应答
					m_nSendBuffer[2]=temp3;	//DestDevice
					m_nSendBuffer[4]=0x11;	//CmdType/Rtn
					m_nSendBuffer[5]=0x00;	//Para1
					m_nSendBuffer[6]=0x00;	//Para2
					SendToSP();		//发送
               						
             	        		break;
                        	case 0x12:      		//VTB板复位后发过来的配置
					//回送应答
					m_nSendBuffer[2]=temp3;	//DestDevice
					m_nSendBuffer[4]=0x12;	//CmdType/Rtn
					m_nSendBuffer[5]=0x00;	//Para1
					m_nSendBuffer[6]=0x00;	//Para2
					m_nSendBuffer[7]=0x00;	//Para1
					m_nSendBuffer[8]=0x00;	//Para2
					SendToSP();		//发送
					
					//改变参数

                        	case 0x13:      		//VTB板发回的读取亮度等参数的应答
					//不需回送应答

					//改变亮度值
 					m_nBright=temp5;
					ChangeVideoParameter(BRIGHT);
 					//改变对比度值
					m_nContrast=temp6;
					ChangeVideoParameter(CONTRAST);
					//改变饱和度值
					m_nSaturation=temp7;
					ChangeVideoParameter(SATURATION);
					//改变色调值
					m_nHue=temp8;
					ChangeVideoParameter(HUE);
					
					break;
                        	default:
                        	        break;        
                        }
                }
		m_bEndFlag==FALSE;
	}

	return;
}


/*****************************************************************************
*  函数名称:void BufferControl(void)                                         *
*  简要描述:缓冲区控制                                                       *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void BufferControl(void)
{
        //定义临时变量
        byte data temp1;
        byte data temp2;
        byte data temp3;
        byte data temp4;

	//定义编码算法中用到的变量
	long data lWriteAddress;
	long data lReadAddress;
	long data lBufferFullness;
	
	WATCHD=!WATCHD;

	m_nBufferCount++;

	//H261编码算法
	RATE_CS=1;	//地址锁存逻辑使能
	BUTTON_CS=1;
	VP2612_CS=0;	//VP2612片选有效
	
	//读取缓冲区读写指针
	temp1=ReadRegister(0x8);//TX-buffer Write Address MSB 
	temp2=ReadRegister(0x9);//TX-buffer Write Address LSB 
	temp3=ReadRegister(0xa);//TX-buffer Read  Address MSB 
	temp4=ReadRegister(0xb);//TX-buffer Read  Address LSB 

	VP2612_CS=1;	//VP2612片选无效

	lWriteAddress=temp1*256+temp2;	
	lReadAddress=temp3*256+temp4;
	//计算缓冲区占用量
	lBufferFullness=lWriteAddress-lReadAddress;
	//检测缓冲区状况
	if(lBufferFullness<0)
	{
		lBufferFullness=lBufferFullness+65535;
	}


	//计算量化器值,根据缓冲区状态选择不同编码控制策略					
	VP2611_CS=0;	//VP2611片选有效
	switch(m_nRate)
	{
		case 3:	
			//计算量化器值
			temp1=(lBufferFullness/4800)+3;

			//检测缓冲区状态
			if(lBufferFullness<480)	//过低				
			{
				STATUS_LED=1;		//工作状态指示灯灭
				temp1=temp1-2;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x00);	//NO SKIP FRAME
			}
			else if(m_nBufferCount>45)	//隔一段时间便强制性作帧内编码,主要用于控制解码端复位时刷屏,并导致三级自环刷屏				
			{
				STATUS_LED=0;		//工作状态指示灯亮
//				STATUS_LED=!STATUS_LED;		//工作状态指示灯亮
				//temp1=temp1+1;
				m_nBufferCount=0;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0xa0);	//FASTUPDATE next frame and all block intra coded
			}		
			else if(lBufferFullness>2880)	//过高				
			{
				STATUS_LED=1;		//工作状态指示灯灭
				temp1=temp1+2;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x40);	//SKIP FRAME
			}
			else 	//正常
			{
				STATUS_LED=1;		//工作状态指示灯灭
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x00);	//NO SKIP FRAME
			}

			break;
		case 6:
			//计算量化器值
			temp1=(lBufferFullness/9600)+5;
			//检测缓冲区状态
			if(lBufferFullness<960)	//过低				
			{
				STATUS_LED=1;		//工作状态指示灯灭
				temp1=temp1-2;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x00);	//NO SKIP FRAME
			}
			else if(m_nBufferCount>30)	//隔一段时间便强制性作帧内编码,主要用于控制解码端复位时刷屏,并导致三级自环刷屏				
			{
				STATUS_LED=!STATUS_LED;	//工作状态指示灯闪烁
				m_nBufferCount=0;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0xa0);	//FASTUPDATE next frame and all block intra coded
			}		
			else if(lBufferFullness>6720)		//过高				
			{
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x40);	//SKIP FRAME
			}
			else 	//正常
			{
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x00);	//NO SKIP FRAME
			}

			break;
		case 26:
			//26B时缓冲区读写速度很快,读寄存器及串口中断会引入误差,32为补偿数
			lBufferFullness=lBufferFullness+32;
			
			//计算量化器值
			temp1=(lBufferFullness/4160)+1;	
			//检测缓冲区状态
			if(lBufferFullness<208)	//过低				
			{
				STATUS_LED=1;		//工作状态指示灯灭
			}
			else if(m_nBufferCount>10)	//隔一段时间便强制性作帧内编码,主要用于控制解码端复位时刷屏,并导致三级自环刷屏				
			{
				STATUS_LED=!STATUS_LED;	//工作状态指示灯闪烁
				m_nBufferCount=0;
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0xa0);	//FASTUPDATE next frame and all block intra coded
			}
			else if(lBufferFullness>33280)	//过高				
			{
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x40);	//SKIP FRAME
			}		
			else 	//正常
			{
				SetRegister(0x00,0x05);	//选择命令5: 输入控制功能
				SetRegister(0x01,0x00);	//NO SKIP FRAME
			}

			break;
		default:
			break;
	}
	
	//确保量化器当前值在有效范围内
	if(temp1>0x1f)	
	{
		temp1=0x1f;
	}
	if(temp1<0x02)
	{
		temp1=0x02;
	}

	//更新量化器值
	SetRegister(0x00,0x02);	//选择命令2: 输入帧间量化系数
	SetRegister(0x01,temp1);

	VP2611_CS=1;	//VP2611片选无效

	return;
}

⌨️ 快捷键说明

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