📄 venb.c
字号:
* 函数名称: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 + -