Files
smod_atsc_app/atsc_app/task/dryloop.c
T

1284 lines
39 KiB
C
Executable File

/********************************************************************
**dryloop通讯模块文件
********************************************************************/
#include "type.h"
#include "config.h"
#include "lcd_task.h"
#include "i2c_drv.h"
#include "delay.h"
#include "eeprom.h"
#include "dryloop.h"
#include "fpga.h"
#if USE_DRY_LOOP
#include "os_task.h"
extern S_ATSC_PARA atsc_para;
extern uint32 update_flag;
extern uint8 off_rf;
BOOL dryloop_version_flag = FALSE;
extern S_DRYLOOP dryloop_status;
#if USE_DRYLOOP_I2C==0 //串口模式
static void dryloop_uart_init_send_buf(uint8 cmd);
static uint8 dryloop_sendbuf[DRYLOOP_UART_BUF_MAX_LEN];
extern uint8 get_check_sum(void * p, uint32 len);
extern uint32 uart_com_init(uint32 com_num,uint32 baud,UART_PARITY verify,uint32 int_sw);
extern void uart_send_string(uint32 port,const uint8 *pbuf,uint32 len);
void dryloop_uart_send_cmd(DRYLOOP_CMD_TYPE cmd,void *pdata)
{
pS_DRYLOOP_UART_PROTOCOL puart_send = (pS_DRYLOOP_UART_PROTOCOL)dryloop_sendbuf;
uint32 len = 0;
dryloop_uart_init_send_buf((uint8)cmd);
switch(cmd)
{
case DRYLOOP_CMD_SET_TS: case DRYLOOP_CMD_SET_RF: case DRYLOOP_CMD_SET_SYS:case DRYLOOP_CMD_SET_FWD:
puart_send->data_len = 1;
puart_send->other[0] = *(uint8*)pdata;
break;
case DRYLOOP_CMD_GET_VER: case DRYLOOP_CMD_GET_RF: case DRYLOOP_CMD_GET_POWER: case DRYLOOP_CMD_GET_AMP:
puart_send->data_len = 0;
break;
default:
return;
}
GET_UART_LEN_BY_DATA_LEN(puart_send->data_len,len);
puart_send->other[puart_send->data_len] = get_check_sum((uint8*)puart_send,len-2);
puart_send->other[puart_send->data_len+1] = DRYLOOP_UART_COMM_HEAD;
if(len)
{
uart_send_string(DRYLOOP_UART_NUM,(uint8*)puart_send,len);
}
dryloop_printf("%s:Send cmd:%d\n",__FUNCTION__,cmd);
}
void dryloop_uart_get_version(void)
{
static uint32 tick_bak = 0;
if(check_delay_over(&tick_bak,DRYLOOO_CHECK_VERSION)==FALSE)
return;
dryloop_uart_send_cmd(DRYLOOP_CMD_GET_VER,NULL);
}
//由于串口的慢速性,每次只能发1条命令,本处只负责发
static uint32 dryloop_uart_get_status(void)
{
static uint32 tick_bak = 0;
static S_DRYLOOP_GET_STATUS dryloop_get_status ={FALSE,0,};
//判断条件: 1.100ms执行一次,2.当前tick内,没有执行send操作;
if(check_delay_over(&tick_bak,DRYLOOO_CHECK_CYCLE)==FALSE)
return 0;
if(dryloop_get_status.rf_need_get)
{
dryloop_get_status.rf_need_get = FALSE;
dryloop_get_status.rf_get_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_GET_RF,NULL);
return 1;
}
if(dryloop_get_status.power_need_get)
{
dryloop_get_status.power_need_get = FALSE;
dryloop_get_status.power_get_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_GET_POWER,NULL);
return 1;
}
if(dryloop_get_status.amp_need_get)
{
dryloop_get_status.amp_need_get = FALSE;
dryloop_get_status.amp_get_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_GET_AMP,NULL);
return 1;
}
//到此处,说明全部读取完, 检查延时,重新读取
if(dryloop_get_status.rf_get_tick+DRYLOOP_GET_CHECK_CYCLE*2<get_sys_tick())
dryloop_get_status.rf_need_get = TRUE;
if(dryloop_get_status.power_get_tick+DRYLOOP_GET_CHECK_CYCLE<get_sys_tick())
dryloop_get_status.power_need_get = TRUE;
if(dryloop_get_status.amp_get_tick+DRYLOOP_GET_CHECK_CYCLE*2<get_sys_tick())
dryloop_get_status.amp_need_get = TRUE;
return 0;
}
void dryloop_uart_send_status(void)
{
uint8 UC_temp21=0;
uint8 ts_ok = 0;
//uint8 asi_fpga;
uint8 off_ts = 0;
static uint32 tick_bak = 0;
static S_DRYLOOP_LED_STATUS dryloop_led_on = {FALSE,FALSE,0,FALSE,FALSE,0,FALSE,FALSE,0};
if(check_delay_over(&tick_bak,DRYLOOP_SEND_CYCLE)==FALSE)
return;
UC_temp21 = fpga_byte_read(0x1,0x26); //sys info
#if USE_NEW_DIO_MODE
if(atsc_para.ad3_para.mptv==1)
{
if(!atsc_para.mptv.alarm)
{ //TS IO口 用来表示功放告警状态 发生告警时,灯灭
if(dryloop_led_on.ts!=TRUE)
{
dryloop_led_on.ts=TRUE;
dryloop_led_on.ts_need_send =TRUE;
}
}
else
{
if(dryloop_led_on.ts!=FALSE)
{
dryloop_led_on.ts=FALSE;
dryloop_led_on.ts_need_send =TRUE;
}
}
}
else
{ //固定灭
if(dryloop_led_on.ts!=FALSE)
{
dryloop_led_on.ts=FALSE;
dryloop_led_on.ts_need_send =TRUE;
}
}
#else
asi_fpga = fpga_byte_read(0x1,0x50); //asi
ts = fpga_byte_read(0x1,0x54); //ts
if(dryloop_led_on.ts!=FALSE)
{
dryloop_led_on.ts=FALSE;
dryloop_led_on.ts_need_send =TRUE;
}
#endif
#if USE_NEW_DIO_MODE
if(atsc_para.ad3_para.mptv==1)
{ //MPTV模式下,该口表示为发射机的TX
if(atsc_para.mptv.tx_open==0)
{
if(dryloop_led_on.rf!=FALSE)
{
dryloop_led_on.rf=FALSE;
dryloop_led_on.rf_need_send =TRUE;
}
}
else
{
if(dryloop_led_on.rf!=TRUE)
{
dryloop_led_on.rf=TRUE;
dryloop_led_on.rf_need_send =TRUE;
}
}
}
else
#endif
{
if(atsc_para.wh_para.func==0) //TX
{
if(atsc_para.rf_para.tx==0)
{
if(dryloop_led_on.rf!=FALSE)
{
dryloop_led_on.rf=FALSE;
dryloop_led_on.rf_need_send =TRUE;
}
}
else
{
if(dryloop_led_on.rf!=TRUE)
{
dryloop_led_on.rf=TRUE;
dryloop_led_on.rf_need_send =TRUE;
}
}
//仅开机时有此操作
if(atsc_para.fpga_load_wait_flag==1)
{
//等待2秒
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
//在此处发送RF,因上电未发
//fpga_byte_write(0x0 ,0x01);
fpga_set_rf_output(atsc_para.rf_para.rf);
atsc_para.fpga_load_wait_flag = 0;
}
}
else
{
if(UC_temp21&0x40) //RF
{
if(dryloop_led_on.rf!=TRUE)
{
dryloop_led_on.rf=TRUE;
dryloop_led_on.rf_need_send =TRUE;
}
}
else
{
if(dryloop_led_on.rf!=FALSE)
{
dryloop_led_on.rf=FALSE;
dryloop_led_on.rf_need_send =TRUE;
}
}
}
}
//系统正常,或者ts输入正常时,亮灯,否则灭灯
//SYSERR OR ts err
ts_ok = atsc_para.log_para.input_ok_flag; //1:ok 0:err
if((UC_temp21&0x80)||(ts_ok==0))
{//bit7 1:err 0:ok
if(dryloop_led_on.sys_err!=FALSE)
{
dryloop_led_on.sys_err=FALSE;
dryloop_led_on.sys_need_send =TRUE;
}
}
else
{
if(dryloop_led_on.sys_err!=TRUE)
{
dryloop_led_on.sys_err=TRUE;
dryloop_led_on.sys_need_send =TRUE;
}
}
if(UC_temp21&0x40) //RF
{
if(atsc_para.wh_para.func==1)
{
off_rf = 0;
}
}
else
{
if(atsc_para.rf_para.rf)
{
off_rf = 0 ;//清错误
if((atsc_para.ad2_para.m_ts) && (off_ts))
{
setbit(off_rf,_MISS_TS);
}
if (!(atsc_para.ad2_para.m_ts ))
setbit(off_rf,_MISS_OTHER);
}
else
{
if(atsc_para.wh_para.func==1)
{
off_rf = 0;
}
}
}
if((off_rf==0) && (atsc_para.rf_para.rf==0))
setbit(off_rf,_KEY_RF);
//当前是否有未应答报文
//if(dryloop_uart_buf.un_resp_flag!=0)
// return;
//每次只发一个状态
if(dryloop_led_on.ts_need_send)
{
dryloop_led_on.ts_need_send = FALSE;
dryloop_led_on.ts_send_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_SET_TS,&dryloop_led_on.ts);
return;
}
if(dryloop_led_on.rf_need_send)
{
dryloop_led_on.rf_need_send = FALSE;
dryloop_led_on.rf_send_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_SET_RF,&dryloop_led_on.rf);
return;
}
if(dryloop_led_on.sys_need_send)
{
dryloop_led_on.sys_need_send = FALSE;
dryloop_led_on.sys_send_tick = get_sys_tick();
dryloop_uart_send_cmd(DRYLOOP_CMD_SET_SYS,&dryloop_led_on.sys_err);
return;
}
dryloop_uart_send_cmd(DRYLOOP_CMD_SET_FWD,&atsc_para.log_para.fwd); //周期发送fwd
//走到此处,说明3个状态均未发送 检查是否需要周期发送
if(dryloop_led_on.ts_send_tick+DRYLOOP_SEND_CHECK_CYCLE<get_sys_tick())
dryloop_led_on.ts_need_send = TRUE;
if(dryloop_led_on.rf_send_tick+DRYLOOP_SEND_CHECK_CYCLE<get_sys_tick())
dryloop_led_on.rf_need_send = TRUE;
if(dryloop_led_on.sys_send_tick+DRYLOOP_SEND_CHECK_CYCLE<get_sys_tick())
dryloop_led_on.sys_need_send = TRUE;
}
static uint8* dryloop_uart_protocol_valid(uint8 *pinbuf,uint32 len)
{
uint32 i = 0;
uint8 *prec_buf = NULL;
uint8 data_len = 0;
for(i=0,prec_buf = pinbuf;i<len;i++,prec_buf++)
{
if(*prec_buf==DRYLOOP_UART_COMM_HEAD) //find header
{
data_len = *(prec_buf+1);
if(DRYLOOP_UART_COMM_HEAD==*(prec_buf+data_len+4)) //find tail
{
if(get_check_sum(prec_buf,data_len+3)==*(prec_buf+data_len+3)) //check sum
{
return prec_buf;
}
}
}
}
return NULL;
}
static void dryloop_uart_init_send_buf(uint8 cmd)
{
pS_DRYLOOP_UART_PROTOCOL puart_send = (pS_DRYLOOP_UART_PROTOCOL)dryloop_sendbuf;
puart_send->header = DRYLOOP_UART_COMM_HEAD;
puart_send->data_len = 0;
puart_send->cmd = cmd&DRYLOOP_UART_PROTOCOL_ANS_CMD;
}
uint32 dryloop_proc_protocol(uint8* pbuf)
{
uint32 len = 0;
pS_DRYLOOP_UART_PROTOCOL puart_ptc = (pS_DRYLOOP_UART_PROTOCOL)pbuf;
uint8 cmd = 0;
uint8 rf_mute = 0,power = 0;
uint8 amp = 0;
if(pbuf==NULL)
return 0;
if(0==(puart_ptc->cmd &(DRYLOOP_UART_PROTOCOL_ANS_OK|DRYLOOP_UART_PROTOCOL_ANS_ERR))) //非应答命令
{
}
else //应答命令
{
//需判断错误与正常状态字
cmd = puart_ptc->cmd&DRYLOOP_UART_PROTOCOL_ANS_CMD;
switch(cmd)
{
case 0x01: //设置TS状态
dryloop_printf("%s:set TS ans ok!\n",__FUNCTION__);
break;
case 0x02: //设置RF状态
dryloop_printf("%s:set RF ans ok!\n",__FUNCTION__);
break;
case 0x03: //设置SYS状态
dryloop_printf("%s:set SYS LED ans ok!\n",__FUNCTION__);
break;
case 0x04: //查询版本号
if( ((puart_ptc->other[0]) == 0) || ((puart_ptc->other[2]) == 0) || ((puart_ptc->other[3]) == 0) )
{
dryloop_version_flag = FALSE;
dryloop_printf("%d\n",puart_ptc->other[0]);
}
else
{
atsc_para.rg_para.dryloop[0] = puart_ptc->other[0]; //版本号
if(atsc_para.rg_para.dryloop[0]==0x02)
atsc_para.rg_para.dryloop[0]=10;
atsc_para.rg_para.dryloop[1] = puart_ptc->other[1]; //年
atsc_para.rg_para.dryloop[2] = puart_ptc->other[2]; //月
atsc_para.rg_para.dryloop[3] = puart_ptc->other[3]; //日 返回的均为十进制模式
dryloop_printf("%d\n",puart_ptc->other[0]);
dryloop_printf("%d\n",puart_ptc->other[1]);
dryloop_printf("%d\n",puart_ptc->other[2]);
dryloop_printf("%d\n",puart_ptc->other[3]);
dryloop_version_flag = TRUE;
init_version_info(); //暂时直接调用
}
break;
case 0x10: //查询RF开关状态
rf_mute = puart_ptc->other[0];
dryloop_printf("TEST rf_mute %d\n", rf_mute );
if(rf_mute>=2) //0 1
{
dryloop_status.rf=INVALID_DATA;
break;
}
dryloop_status.rf=rf_mute;
#if USE_NEW_DIO_MODE
if(atsc_para.ad3_para.rc_cmd==0) //IO
{
if(atsc_para.ad3_para.mptv)
{//MPTV -> tx on/off 功放射频开关
if(atsc_para.mptv.tx_crm_is_dio){
atsc_para.mptv.dio_tx = rf_mute;
//dryloop_amp_on(rf_mute); //由send_status发送
}
}
else
{//LPTV ->本地激励器视频开关
if(rf_mute==1) //OFF->ON
{
if(rf_mute!=atsc_para.rf_para.rf)
{
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
dryloop_amp_on(TRUE);
//show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
atsc_para.rf_para.rf = 1;
off_rf = 0;
fpga_set_rf_output(atsc_para.rf_para.rf);
}
else
{
break;
}
}
else if(rf_mute==0) //ON->OFF
{
if(rf_mute!=atsc_para.rf_para.rf)
{
atsc_para.rf_para.rf = 0;
setbit(off_rf,_PIN_DRYLOOP);
fpga_set_rf_output(0);
//show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
dryloop_amp_on(FALSE);
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
}
else
{
break;
}
}
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
}
}
else
{
dryloop_status.rf=INVALID_DATA;
}
#else
if(atsc_para.wh_para.func==0) //TX模式
{
if(atsc_para.ad3_para.rc_cmd==0) //IO
{
if((atsc_para.rf_para.tx==0)&&(rf_mute==1)) //OFF->ON
{
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
dryloop_amp_on(TRUE);
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
if(atsc_para.wj_para.rf_dly>2)
{
delay_ms(2000);
}
else
{
delay_ms(1000*atsc_para.wj_para.rf_dly);
}
atsc_para.rf_para.rf = 1;
off_rf = 0;
fpga_set_rf_output(atsc_para.rf_para.rf);
}
else if((atsc_para.rf_para.tx==1)&&(rf_mute==0)) //ON->OFF
{
atsc_para.rf_para.rf = 0;
setbit(off_rf,_PIN_DRYLOOP);
fpga_set_rf_output(0);
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
if(atsc_para.wj_para.rf_dly>2)
{
delay_ms(2000);
}
else
{
delay_ms(1000*atsc_para.wj_para.rf_dly);
}
dryloop_amp_on(FALSE);
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
}
atsc_para.rf_para.tx = rf_mute;
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
c256_bytewrite(EEPROM_RF_TX,atsc_para.rf_para.tx);
}
}
else //EX模式 相比于TX 没有rf_dly
{
if(atsc_para.ad3_para.rc_cmd==0) //IO
{
if((atsc_para.rf_para.tx==0)&&(rf_mute==1)) //OFF->ON
{
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
dryloop_amp_on(TRUE);
atsc_para.rf_para.rf = 1;
off_rf = 0;
fpga_set_rf_output(atsc_para.rf_para.rf);
}
else if((atsc_para.rf_para.tx==1)&&(rf_mute==0)) //ON->OFF
{
atsc_para.rf_para.rf = 0;
setbit(off_rf,_PIN_DRYLOOP);
fpga_set_rf_output(0);
dryloop_amp_on(FALSE);
dryloop_printf("%s:GET TX:%d!\n",__FUNCTION__,rf_mute);
}
atsc_para.rf_para.tx = rf_mute;
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
c256_bytewrite(EEPROM_RF_TX,atsc_para.rf_para.tx);
}
}
#endif
break;
case 0x11: //查询功率按键状态
power = puart_ptc->other[0];
dryloop_printf("TEST power %d\n", power );
if(atsc_para.ad3_para.rc_cmd) //不是IO模式,不能修改功率
break;
#if USE_NEW_DIO_MODE //新的DIO逻辑,若功放处于REMOTE状态,且TX_CRM为IO模式,会返回1,否则返回0
if((atsc_para.mptv.tx_crm_is_dio!=1)&&(atsc_para.ad3_para.mptv)) //必须是在MPTV模式下,LPTV不考虑DIO模式
{
break;
}
#endif
if(power == 0) //dryloop代码处理功率按键时存在错误,此处power==1应为power_down power==0应为power_up
{
dryloop_printf("%s:GET POWER UP!\n",__FUNCTION__);
dryloop_status.power = 1;
if(atsc_para.wj_para.p_c)
{
if((atsc_para.rf_para.power<RF_POWER_P_C_ON)&&(atsc_para.rf_para.db<RF_POWER_DB_MAX) &&
(fpga_limit_power_target(&atsc_para.we_para, &atsc_para.rf_para,
atsc_para.rf_para.power+1)>atsc_para.rf_para.power))
{
atsc_para.rf_para.power++;
atsc_para.rf_para.db++;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
#if USE_NEW_DIO_MODE
atsc_para.mptv.power_diff++;
#endif
}
}
else
{
if((atsc_para.rf_para.power<RF_POWER_MAX)&&(atsc_para.rf_para.db<RF_POWER_DB_MAX) &&
(fpga_limit_power_target(&atsc_para.we_para, &atsc_para.rf_para,
atsc_para.rf_para.power+1)>atsc_para.rf_para.power))
{
atsc_para.rf_para.power++;
atsc_para.rf_para.db++;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
#if USE_NEW_DIO_MODE
atsc_para.mptv.power_diff++;
#endif
}
}
}
else if(power == 1)
{
dryloop_printf("%s:GET POWER DOWN!\n",__FUNCTION__);
dryloop_status.power = 0;
if((atsc_para.rf_para.power>0)&&(atsc_para.rf_para.db>0))
{
atsc_para.rf_para.power--;
atsc_para.rf_para.db--;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
#if USE_NEW_DIO_MODE
atsc_para.mptv.power_diff--;
#endif
}
}
else
{
dryloop_status.power = INVALID_DATA;
}
break;
case 0x12: //查询AMP按键状态'
//ATSC5000 COR 恒为1
amp = puart_ptc->other[0];
dryloop_printf("TEST amp %d\n", amp );
if(amp<2)
{
dryloop_status.amp=amp;
if(atsc_para.wh_para.func==0) //TX模式
{
dryloop_printf("%s:GET AMP %d!\n",__FUNCTION__,amp);
atsc_para.log_para.amp=amp;
}
}
else
{
atsc_para.log_para.amp=1;
dryloop_status.amp=INVALID_DATA;
}
break;
default: //未知命令
break;
}
}
return len;
}
//检查对应串口中是否有待处理报文
void dryloop_uart_buf_check(uint8* pbuf,uint32 len)
{
uint8 *pputbuf;
pputbuf = dryloop_uart_protocol_valid(pbuf,len);
if(pputbuf!=NULL) //假设每次只收到一个有效报文
{
dryloop_proc_protocol(pputbuf);
}
}
void dryloop_amp_on(BOOL flag)
{
int i;
BOOL rf = flag;
for(i=0; i<8; i++) //间隔发三次,确保成功亮灯
{
dryloop_uart_send_cmd(DRYLOOP_CMD_SET_RF,&rf);
delay_ms(35);
}
}
#endif
/*****************************************************************************
函 数 名 : dryloop_check
功能描述 : 周期性的读取dryloop的按键状态
输入参数 : void
输出参数 : 无
返 回 值 :
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2012年9月19日
作 者 : 郭金涛
修改内容 : 新生成函数
*****************************************************************************/
void dryloop_check(void)
{
#if USA_ATSC_5X
uint8 power_down = 0,power_up=0;
uint8 amp = 0;
uint8 cor_bak;
#endif
uint8 rf_mute;
//判断条件: 1.100ms执行一次,2.当前tick内,没有执行send操作;
#if AW_ATSC_5X
rf_mute = dryloop_read(0); //读取RF
//show_cycle_tick(tick_bak);
//0:off 1:on 2:异常 3:未连接
dryloop_status.rf=rf_mute;
if(rf_mute<2)
{
if(atsc_para.ad3_para.rc_cmd==0) //IO
{
if((rf_mute==1)&&(rf_mute!=atsc_para.rf_para.rf)) //OFF->ON
{
dryloop_write(DRYLOOP_I2C_RF_LED,1);
//show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
atsc_para.rf_para.rf = 1;
fpga_set_rf_output(atsc_para.rf_para.rf);
off_rf = 0 ;
}
else if((rf_mute==0) && (rf_mute!=atsc_para.rf_para.rf)) //ON->OFF
{
atsc_para.rf_para.rf = 0;
fpga_set_rf_output(0);
//show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
dryloop_write(DRYLOOP_I2C_RF_LED,0);
atsc_para.latch_para.rf = 1;
setbit(off_rf,_PIN_DRYLOOP);
}
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
}
}
#else
rf_mute = dryloop_read(0); //读取RF
power_up = dryloop_read(1); //读取power_down
power_down = dryloop_read(2); //读取power_up
amp = dryloop_read(7); //DPDsel OR amp
if(rf_mute<=2)
{
dryloop_status.rf=rf_mute;
if(rf_mute<2)
{
if(atsc_para.wh_para.func==0) //TX模式
{
if(atsc_para.ad3_para.rc_cmd==0) //IO 能通过dryloop改TX和RF
{
if((atsc_para.rf_para.tx==0)&&(rf_mute==1)) //OFF->ON
{
dryloop_write(DRYLOOP_I2C_RF_LED,1);
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
atsc_para.rf_para.rf = 1;
//fpga_byte_write(0x0 ,0x01);
fpga_set_rf_output(atsc_para.rf_para.rf);
off_rf = 0 ;
}
else if((atsc_para.rf_para.tx==1)&&(rf_mute==0)) //ON->OFF
{
atsc_para.rf_para.rf = 0;
//fpga_byte_write(0x0 ,0x01);
fpga_set_rf_output(0);
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
dryloop_write(DRYLOOP_I2C_RF_LED,0);
atsc_para.latch_para.rf = 1;
setbit(off_rf,_PIN_DRYLOOP);
}
atsc_para.rf_para.tx = rf_mute;
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
c256_bytewrite(EEPROM_RF_TX,atsc_para.rf_para.tx);
}
}
else //EX模式
{
atsc_para.rf_para.rf = rf_mute;
//printf("case it :%d\n",atsc_para.rf_para.rf);
fpga_set_rf_output(atsc_para.rf_para.rf);
c256_bytewrite(EEPROM_RF_ADDR,atsc_para.rf_para.rf);
}
}
}
else
{
dryloop_status.rf=INVALID_DATA;
}
if(amp<2)
{
dryloop_status.amp=amp;
cor_bak = atsc_para.ad3_para.cor;
if(atsc_para.wh_para.func==0) //TX模式
{
atsc_para.log_para.amp=amp;
}
else //EX模式 DPD
{
atsc_para.ad3_para.cor=amp; //保存新cor函数
if(cor_bak != amp)
{
save_new_cor(amp);
}
c256_bytewrite(EEPROM_AD3_TYPE,amp);
}
}
else
{
atsc_para.log_para.amp=1;
dryloop_status.amp=INVALID_DATA;
}
if((power_up==0)&&((power_down!=0)&&(power_down!=4)))
{
if(atsc_para.ad3_para.rc_cmd != 0)
return;
if(atsc_para.wj_para.p_c)
{
if((atsc_para.rf_para.power<RF_POWER_P_C_ON)&&(atsc_para.rf_para.db<RF_POWER_DB_MAX) &&
(fpga_limit_power_target(&atsc_para.we_para, &atsc_para.rf_para,
atsc_para.rf_para.power+1)>atsc_para.rf_para.power))
{
atsc_para.rf_para.power++;
atsc_para.rf_para.db++;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
}
}
else
{
if((atsc_para.rf_para.power<RF_POWER_MAX)&&(atsc_para.rf_para.db<RF_POWER_DB_MAX) &&
(fpga_limit_power_target(&atsc_para.we_para, &atsc_para.rf_para,
atsc_para.rf_para.power+1)>atsc_para.rf_para.power))
{
atsc_para.rf_para.power++;
atsc_para.rf_para.db++;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
}
}
#if SHOW_DEBUG_INFO
key_time++;
#endif
return;
}
if(((power_up!=0)&&(power_up!=4))&&(power_down==0))
{
if(atsc_para.ad3_para.rc_cmd != 0)
return;
if((atsc_para.rf_para.power>0)&&(atsc_para.rf_para.db>0))
{
atsc_para.rf_para.power--;
atsc_para.rf_para.db--;
e2rom_save_power(&atsc_para.rf_para);
fpga_save_power(&atsc_para.we_para,&atsc_para.rf_para);
if(atsc_para.rf_para.agc) //由OFF->ON时发送 判断有效标志
{
fpga_save_agc_vol();
}
}
return;
}
if((power_up==4)||(power_down==0)||(power_up==0)||(power_down==4))
dryloop_status.power = 2;
else
dryloop_status.power = INVALID_DATA;
#endif
}
/*****************************************************************************
函 数 名 : dryloop_send
功能描述 : 向dryloop发送当前系统状态(TS SYS,RF)
输入参数 : void
输出参数 : 无
返 回 值 :
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2012年9月19日
作 者 : 郭金涛
修改内容 : 新生成函数
*****************************************************************************/
void dryloop_send(void)
{
uint8 UC_temp21=0;
uint8 ts = 0;
S_ASI_INPUT asi_input;
uint8 tmp;
uint8 off_ts=0;
uint8 off_1pps=0;
uint8 off_10ms=0;
dryloop_write(DRYLOOP_I2C_FWD_ADDR,atsc_para.log_para.fwd);
#if AW_ATSC_5X
UC_temp21 = fpga_byte_read(0x1,0x26); //sys info
ts = fpga_byte_read(0x1,0x54); //ts
asi_input.input = (ASI_GRP_STATE)atsc_para.log_para.asi_input;
asi_input.status = (ASI_INPUT_STATE)(atsc_para.log_para.input_ok_flag?0:1);
if((asi_input.status!=ASI_ERR)&&((ts&1)==0)) //ASI ts
{
//Dryloop_Write(0x10,1);
off_ts = 0;
}
else
{
//Dryloop_Write(0x10,0);
off_ts = 1;
atsc_para.latch_para.ts = 1;
}
if(UC_temp21&0x40) //RF
{
dryloop_write(DRYLOOP_I2C_RF_LED,1);
}
else
{
dryloop_write(DRYLOOP_I2C_RF_LED,0);
}
tmp = fpga_byte_read(0x1,0x56);
if(tmp&0x08) //bit3
off_1pps = 1;
else
off_1pps = 0;
if(tmp&0x04) //bit2
atsc_para.log_para.use_gps = 1; //INT模式
else
atsc_para.log_para.use_gps = 0; //EXT模式
if(atsc_para.log_para.use_gps) //int模式
{
tmp = fpga_byte_read(0x1,0x8a);
atsc_para.log_para.gps_status = tmp&0x0f;
if(tmp&0x10)
{
off_10ms = 0;//locked;
}
else
{
off_10ms = 1;
}
}
else //ext
{
tmp = fpga_byte_read(0x1,0x56);
if(tmp&0x01)
{
off_10ms = 0; //locked;
}
else
{
off_10ms = 1;
}
}
//////////////////////////////
if(UC_temp21&0x40) //RF
{
if(atsc_para.wh_para.func==1)
{
off_rf = 0;
}
}
else
{
if(atsc_para.rf_para.rf)
{
off_rf = 0 ;//清错误
if((atsc_para.ad2_para.m_ts) && (off_ts))
{
setbit(off_rf,_MISS_TS);
}
if((atsc_para.ad2_para.m_10m) && (off_10ms))
{
if(off_rf)
{
setbits(off_rf,_MISS_10M) ;
}
else
{
setbit(off_rf,_MISS_10M) ;
}
}
if((atsc_para.ad2_para.m_1pps) && (off_1pps))
{
if(off_rf)
{
setbits(off_rf,_MISS_1PPS) ;
}
else
{
setbit(off_rf,_MISS_1PPS);
}
}
if (!(atsc_para.ad2_para.m_ts || atsc_para.ad2_para.m_10m || atsc_para.ad2_para.m_1pps))
setbit(off_rf,_MISS_OTHER);
}
atsc_para.latch_para.rf = 1;
}
if((off_rf==0) && (atsc_para.rf_para.rf==0))
setbit(off_rf,_KEY_RF);
//////////////////////////////
if(UC_temp21&0x80)
{
//Dryloop_Write(0x12,0); //SYS ERR
atsc_para.latch_para.sys = 1;
}
else
{
//Dryloop_Write(0x12,1); //正常
}
#else
UC_temp21 = fpga_byte_read(0x1,0x26); //sys info
ts = fpga_byte_read(0x1,0x54); //ts
asi_input.input = atsc_para.log_para.asi_input;
asi_input.status = atsc_para.log_para.input_ok_flag?0:1;
if((asi_input.status!=ASI_ERR)&&((ts&1)==0)) //ASI ts
{
dryloop_write(DRYLOOP_I2C_TS_LED,1);
off_ts = 0;
}
else
{
dryloop_write(DRYLOOP_I2C_TS_LED,0);
off_ts = 1;
atsc_para.latch_para.ts = 1;
}
if(atsc_para.wh_para.func==0) //TX
{
if(atsc_para.rf_para.tx==0)
{
dryloop_write(DRYLOOP_I2C_RF_LED,0); //AMP GND
atsc_para.latch_para.rf = 1;
}
else
{
dryloop_write(DRYLOOP_I2C_RF_LED,1); //AMP ENABLE
}
//仅开机时有此操作
if(atsc_para.fpga_load_wait_flag==1)
{
//等待2秒
show_wait_info_with_sec(atsc_para.wj_para.rf_dly);
//在此处发送RF,因上电未发
//fpga_byte_write(0x0 ,0x01);
fpga_set_rf_output(atsc_para.rf_para.rf);
atsc_para.fpga_load_wait_flag = 0;
}
}
else
{
if(UC_temp21&0x40) //RF
{
dryloop_write(DRYLOOP_I2C_RF_LED,1);
}
else
{
dryloop_write(DRYLOOP_I2C_RF_LED,0);
}
}
//fpga_byte_write(0x0 ,0x1 ); //段地址
tmp = fpga_byte_read(0x1,0x56);
if(tmp&0x08) //bit3
off_1pps = 1;
else
off_1pps = 0;
if(tmp&0x04) //bit2
atsc_para.log_para.use_gps = 1; //INT模式
else
atsc_para.log_para.use_gps = 0; //EXT模式
if(atsc_para.log_para.use_gps) //int模式
{
tmp = fpga_byte_read(0x1,0x8a);
atsc_para.log_para.gps_status = tmp&0x0f;
if(tmp&0x10)
{
off_10ms = 0;//locked;
}
else
{
off_10ms = 1;
}
}
else //ext
{
tmp = fpga_byte_read(0x1,0x56);
if(tmp&0x01)
{
off_10ms = 0; //locked;
}
else
{
off_10ms = 1;
}
}
//////////////////////////////
if(UC_temp21&0x40) //RF
{
if(atsc_para.wh_para.func==1)
{
off_rf = 0;
}
}
else
{
if(atsc_para.rf_para.rf)
{
off_rf = 0 ;//清错误
if((atsc_para.ad2_para.m_ts) && (off_ts))
{
setbit(off_rf,_MISS_TS);
}
if((atsc_para.ad2_para.m_10m) && (off_10ms))
{
if(off_rf)
{
setbits(off_rf,_MISS_10M) ;
}
else
{
setbit(off_rf,_MISS_10M) ;
}
}
if((atsc_para.ad2_para.m_1pps) && (off_1pps))
{
if(off_rf)
{
setbits(off_rf,_MISS_1PPS) ;
}
else
{
setbit(off_rf,_MISS_1PPS);
}
}
if (!(atsc_para.ad2_para.m_ts || atsc_para.ad2_para.m_10m || atsc_para.ad2_para.m_1pps))
setbit(off_rf,_MISS_OTHER);
}
else
{
if(atsc_para.wh_para.func==1)
{
off_rf = 0;
}
}
atsc_para.latch_para.rf = 1;
}
if((off_rf==0) && (atsc_para.rf_para.rf==0))
setbit(off_rf,_KEY_RF);
//////////////////////////////
if(UC_temp21&0x80)
{
dryloop_write(DRYLOOP_I2C_SYSERR_LED,0); //SYS ERR
atsc_para.latch_para.sys = 1;
}
else
{
dryloop_write(DRYLOOP_I2C_SYSERR_LED,1); //正常
}
#endif
}
void dryloop_reset(void)
{
#if USE_DRYLOOP_I2C
//GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 0<<6);
delay_ticks(10);
//GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 1<<6);
#endif
}
void dryloop_init(void)
{
#if USE_DRYLOOP_I2C==0
uart_com_init(DRYLOOP_UART_NUM,DRYLOOP_UART_BPS,PARITY_NO,INT_ON);
#endif
}
/*****************************************************************************
函 数 名 : dryloop_process
功能描述 : dryloop处理函数,需根据通讯模式(i2c或者uart)分别做处理
输入参数 : void
输出参数 : 无
返 回 值 :
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2012年9月19日
作 者 : 郭金涛
修改内容 : 新生成函数
*****************************************************************************/
void dryloop_process(void)
{
uint32 send_flag = 0;
if(update_flag)
return;
#if USE_DRYLOOP_I2C //dryloop为I2C通讯模式
if(atsc_para.system_para.ctrl==CTRL_REMOTE)
dryloop_check();
else
{
dryloop_status.rf = INVALID_DATA;
dryloop_status.power = INVALID_DATA;
}
dryloop_send();
#else //dryloop为串口通讯模式
if(atsc_para.system_para.ctrl==CTRL_REMOTE)
{
send_flag = dryloop_uart_get_status();
}
else
{
dryloop_status.rf = INVALID_DATA;
dryloop_status.power = INVALID_DATA;
}
if(dryloop_version_flag == FALSE)
{
dryloop_uart_get_version();
}
if(send_flag==0)
{
dryloop_uart_send_status();
}
#endif
}
#endif
/******************************************END**********************************/