📄 rds.c
字号:
char * rds_get_ps(void)
{
return programServiceBuf;
}
char * rds_get_pty(void)
{
return programTypeBuf;
}
#ifdef SUPPORT_G2
char * rds_get_rt(BYTE type)
{
if(type == 0)
return radioTextBufA[0];
else if(type == 1)
return radioTextBufA[1];
else
return NULL;
}
#endif
char * rds_get_ct(void)
{
return clocktimeBuf;
}
char * rds_get_ptyn(void)
{
return programTypeNameBuf;
}
BYTE * rds_get_af(void)
{
return afTableBuf;
}
//add by Robbin
UINT16 rds_af_val2freq(BYTE val)
{
UINT16 freq=DEFAULT_FREQ;
if(val<=AF_1ST_TABLE_MAX)
{
freq = AF_1ST_FREQ_START+(val-1)*10;
}
if((val>=AF_2ND_TABLE_START) && (val<=AF_2ND_TABLE_MAX))
{
freq = AF_2ND_FREQ_START+(val-1)*10;
}
return freq;
}
//add by Robbin
void rds_ta_check(void)
{
if(!rdsEnable)
return;
if(!rdsTAEnable)
{
//rdsParam &= ~TA_SEEK;
rdsTASeek = 0;
return;
}
if(radioBand==AM)
return;
if(currentPower>_POWER_OFF) //if work in DISC or AUX
{
if(currentPower>_POWER_RADIO)//AUX && CD
{
if(radioBand==AM)//if work at AM, set to FM, ready for RDS
{
radio_set_band(FM);
//radioParam &= ~RA_BAND;//set to FM
radioBand = FM;
}
rds_is_ta_freq();//test is TA freq?
}
if(rdsTAEnable && (radioBand==FM)) //if FM TA ON
{
if(rdsTASeek) //如果需要搜索TA
{
if(currentPower==_POWER_RADIO) //当前工作在收音机状态
{
rdsTAGet = 0;
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
//disp_string(tmpDispBuff,"SEARCH",DISP_6CHAR_START,8);
disp_string_E(tmpDispBuff,strSearch,DISP_6CHAR_START,8);
display_buff(tmpDispBuff);
//sys_delay_loops(5000);
delay_ms(500);
if(radioBand==FM)
{
muteStart=OFF;
audio_set_mute(ON);
radio_ams(radioBand,ON,ON); //show freq when ta search
}else{
//rdsParam &= ~TA_SEEK;
rdsTASeek = 0;
}
bandSetTimeout = BAND_SET_TIMEOUT;
//rdsParam &= ~TA_SEEK; //搜索一遍,如果没有则不再搜索
rdsTASeek = 0;
}else{ //非收音机状态
rdsAFSeek = 0;//rdsParam &= ~AF_SEEK; //dont seek af
radio_ams(radioBand,ON,OFF);//隐蔽自动搜台
}
}
if(rdsTAGet && rdsTPGet) //如果正在播放交通信息
{
if((currentPower==_POWER_AUX) || (currentPower==_POWER_DISC))//如果处于其它模式
{
lastWorkPower = currentPower; //保存当前模式
preMediaType = currentMediaType;//保存当前媒体类型
// dvd_save_resume();
//setPower(_POWER_RADIO); //切换到收音机
audio_set_mute(ON);
delay_ms(200);
setDvdPow(OFF);
currentMode=_MODE_RADIO;
muteTimeout=MUTE_TIMEOUT;
muteStart=ON;//// 2006-07-04
//radio_set_band(FM); //波段FM
currentPower=_POWER_RADIO;
audio_sel_channel(AUDIO_CH_RADIO);
ta_freq=cur_freq;
disp_clr_cd_flag();
disp_radio(dispBuff,RADIO_TYPE_FM1,ta_freq);
//pll_set_station(FM,ta_freq); //有TA信息的频率
//rdsParam |= TA_SEND; //TA已切换
rdsTASend = 1;
//rdsParam &= ~TA_SEEK; //dont seek TA
rdsTASeek = 0;
disp_set_bit(dispBuff,LCD_BIT_TP,ON);
disp_st(radioParam&RA_ST);
}
}
if(rdsTASend && (!rdsTAGet))//交通信息播放完毕或没有交通信息
{
//rdsParam &= ~TA_SEND;
rdsTASend = 0;
disp_char(dispBuff,DISP_CHANNEL,' ');
if((lastWorkPower==_POWER_DISC)||(lastWorkPower==_POWER_AUX))
{
currentMediaType=preMediaType;
setPower(lastWorkPower);
}
}
}
}
}
//add by Robbin
void rds_af_flash(void)
{
if(rdsAFEnable && (radioBand==FM))
{
if(rdsAFFlash)
{
//if(rdsParam&AF_DISP) //flash display 'AF'
if(halfSecond&1)
{
//rdsParam &= ~AF_DISP;
disp_set_bit(dispBuff,LCD_BIT_AF,ON);
}else{
//rdsParam |= AF_DISP;
disp_set_bit(dispBuff,LCD_BIT_AF,OFF);
}
}
}else{
disp_set_bit(dispBuff,LCD_BIT_AF,OFF); //AF OFF
}
}
void rds_seek_ta(void)
{
if(rdsTAEnable && (radioBand==FM))
{
disp_set_bit(dispBuff,LCD_BIT_TA,ON);
rds_is_ta_freq();
}
}
void rds_seek_pty(void)
{
BYTE i;
if(rdsPTYSeek)
{
ptyLastFreq = cur_freq;
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
//disp_string(tmpDispBuff,"SEEK PTY",DISP_7CHAR_START,8);
disp_string_E(tmpDispBuff,strSeekPty,DISP_7CHAR_START,8);
disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
//disp_string_E(tmpDispBuff,*(strNameList+PTR_STR_SEEKPTY),DISP_7CHAR_START,8);
display_buff(tmpDispBuff);
delay_ms(500);
radio_ams(FM,ON,ON);
rdsPTYSeek = 0;//rdsParam &= ~PTY_SEEK;
if(bit_is_set(PIN_ACC_IN,ACC_IN))
{
if(!rdsPTYGet)//没有找到pty
{
disp_set_bit(dispBuff,LCD_BIT_PTY,OFF);
for(i=0;i<3;i++)
{
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
disp_string_E(tmpDispBuff,strPtyNone,DISP_7CHAR_START,8);
//disp_string(tmpDispBuff,"PTY NONE",DISP_7CHAR_START,8);
display_buff(tmpDispBuff);
delay_ms(400);
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
display_buff(tmpDispBuff);
delay_ms(400);
}
}else{
disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
//strcpy_E(dispStrBuff,*(ptyName+nCurrentPty));
//disp_string(tmpDispBuff,dispStrBuff,1,8);
disp_string_E(tmpDispBuff,*(ptyName+nCurrentPty),1,8);
display_buff(tmpDispBuff);
delay_ms(500);
}
}
cur_freq = ptyLastFreq;
pll_set_station(radioBand,cur_freq);
disp_radio(dispBuff,sub_band,cur_freq);
}
}
BYTE rds_is_af_freq(UINT16 freq)
{
BYTE i;
if((afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+8)))//AF exist
{
for(i=0;i<(afTableBuf[0]-AF_CNT_START);i++)
{
if(freq==rds_af_val2freq(afTableBuf[i+1]))//频率转换
return 1;
}
return 0;
}
return 1;
}
BYTE rds_get_af_max(UINT16 *ptrAfBuff,BYTE len)
{
UINT16 tmpVal=0;
BYTE i,index=0;
for(i=1;i<len;i++)
{
if(*(ptrAfBuff+i)>tmpVal)
{
tmpVal = *(ptrAfBuff+i);
index=i;
if(*(ptrAfBuff+i)>minRdsAfAdc)
rdsAFGetMax = 1;//rdsParam |= AF_GET_MAX;
}
*(ptrAfBuff+i)=0;
}
if(rdsAFGetMax)
return index;
else
return 0;
}
void rds_af_check(void) //1s运行一次
{
if(bRadioInPreview || bRadioInAMS)//预览过程中不检测AF
return;
if(bRadioSeeking)
return;
if((currentPower==_POWER_RADIO) && (radioBand==AM))//AM
return;
if(rdsTASeek) //in seeking not check
{
afDelayMs=AF_SEEK_DELAY;
return;
}
if(!rdsEnable)
return;
//if((currentPower>_POWER_OFF) && (radioBand==FM))//当使能AF
if((currentPower==_POWER_RADIO) && (radioBand==FM))//收音模式下使能AF
{
if(currentAFIndex<8)
afSignalMeter[currentAFIndex] = adcValue[AD_SMETER];//保存当前信号强度
if((adcValue[AD_SMETER]<minRdsAfAdc) && !bRadioSeeking) //如果信号过于弱
{
rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX; //AF需要重新对比
//rdsParam &= ~RDS_ACTIVE; //清除RDS
#if defined(LCD_BIT_ANT)
disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);
#endif
if(rdsAFEnable/* && (rdsParam&AF_ACTIVE)*/)
{
#ifdef USE_AF_SEEK_DELAY
if(afDelayMs)//等待5秒,如果没有信号则寻找新频率
{
afDelayMs--;
}else{
rdsTPGet = 0;
//rdsParam &= ~RDS_ACTIVE;
if(rdsAFActive)
{
rdsAFSeek = 1;//rdsParam |= AF_SEEK; //标记已经开始寻找新频率
if(rdsAFGetMax)
currentAFIndex=0;
}
}
#else
rdsTPGet = 0;
if(rdsAFActive)
rdsAFSeek = 1;//rdsParam |= AF_SEEK; //标记已经开始寻找新频率
#endif
}else{
rdsTPGet = 0;
}
if(!((afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+9))) ) //AF not exist
{
rdsTAGet = 0;
rdsTPGet = 0;
}
if(rdsAFActive) //当AF激活时启动查找
{
if(!rds_is_af_freq(cur_freq) && !(radioParam&RA_AM_WORK))//测试当前频率是否在AF表中存在
{
rdsAFSeek = 1;//rdsParam |= AF_SEEK; //如果不存在,标记已经开始寻找新频率
}
}
}else{//信号增益够
//rdsParam &= ~TA_SEEK;
#if defined(LCD_BIT_ANT)
if(currentPower==_POWER_RADIO)
disp_set_bit(dispBuff,LCD_BIT_ANT,ON);
#endif
bandSetTimeout = BAND_SET_TIMEOUT;
#ifdef USE_AF_SEEK_DELAY
afDelayMs=AF_SEEK_DELAY; //重新置延迟数
#endif
taSeekTimeout = TA_SEEK_DELAY;
if(rdsAFGetMax && rdsTPGet) //获得最大的AF频率才停止
{
rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX;
rdsAFSeek = 0;//rdsParam &= ~AF_SEEK; //一旦信号增益够,清除
//currentAFIndex=0;
}
currentAFIndex=0;
}
//AF表查找,判断是否存在AF表
if(rdsAFEnable && (afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+9)) && (radioBand==FM))//if af exist
{
rdsAFActive = 1;//rdsParam |= AF_ACTIVE;
if(taSeekTimeout==0)
{
if(rdsTAEnable)
{
rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
//rdsParam |= TA_SEEK;
rdsTASeek = 1;
//memset(afTableBuf,0,sizeof(afTableBuf));//清除AF表
taSeekTimeout = TA_SEEK_DELAY;
}else{ //SEEK PI
memset(tmpDispBuff,0,sizeof(tmpDispBuff));
//disp_string(tmpDispBuff,"SEEK PI",DISP_7CHAR_START,8);
disp_string_E(tmpDispBuff,strSeekPi,DISP_7CHAR_START,8);
//disp_string_E(tmpDispBuff,*(strNameList+PTR_STR_SEEKPI),DISP_7CHAR_START,8);
display_buff(tmpDispBuff);
//memset(afTableBuf,0,sizeof(afTableBuf));//清除AF表
delay_ms(500);
radio_ams(FM,ON,ON);
taSeekTimeout = TA_SEEK_DELAY;
}
}
if(currentPower==_POWER_DISC)
{
if(!rdsTPGet)
rdsAFSeek = 1;//rdsParam |= AF_SEEK;
}
if(rdsAFSeek) //正在AF查找
{
rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;//关闭搜索标志
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING; //如果正在搜索则停止
rdsAFFlash = 1;//rdsParam |= AF_FLASH;
psReadyFlag=0;
bandSetTimeout = BAND_SET_TIMEOUT;
if(currentAFIndex<8)
currentAFIndex++;//移到下一个AF
else
currentAFIndex=1;
rdsTPGet = 0;
rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX;
#ifdef LA1844
//disp_radio(dispBuff,sub_band,rds_af_val2freq(afTableBuf[currentAFIndex]));
#endif
if(currentAFIndex>(afTableBuf[0]-AF_CNT_START))//如果到最后一个
{
//currentAFIndex=1;//回到第一个,如果TA开启,重新搜索
currentAFIndex = rds_get_af_max(afSignalMeter,(afTableBuf[0]-AF_CNT_START));//获得最大值
if(currentAFIndex>0)
{
maxRdsFreq = rds_af_val2freq(afTableBuf[currentAFIndex]);//频率转换
#ifdef LA1844
rdsAFSeek = 0;
#endif
}else{
//psReadyFlag = 0;
if(rdsTASend)
{
//rdsParam &= ~TA_SEND;
//taSeekTimeout = 0;
rdsTAGet = 0;
}
currentAFIndex=1;
}
//rdsParam &= ~AF_SEEK; //停止搜索AF
}
rds_freq=rds_af_val2freq(afTableBuf[currentAFIndex]);//频率转换
cur_freq = rds_freq; //add 08-29
if(!(radioParam&RA_AM_WORK))
lastFreq = rds_freq;
if((currentMode==_MODE_RADIO) && (currentMode!=_MODE_MUTE))
{
muteStart=ON;
muteTimeout=MUTE_TIMEOUT2;
audio_set_mute(ON);
}
rds_clear_var();//切台,清除当前RDS信息
pll_set_station(radioBand,rds_freq);
cur_freq = rds_freq;
//切换AF是否显示频率
//if(!(radioParam&RA_IN_AMS))//如果台标没准备好
//disp_radio(dispBuff,sub_band/*RADIO_TYPE_FM1*/,cur_freq);
if(currentPower==_POWER_RADIO)
radio_is_preset(radioBand,rds_freq);
}else{//无须查找AF
if(radioBand==FM)
disp_set_bit(dispBuff,LCD_BIT_AF,ON);
rdsAFFlash = 0;//rdsParam &= ~AF_FLASH;//not flash AF
}
}else{
//rds_af_flash();
rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
rdsAFFlash = 1;//rdsParam |= AF_FLASH;
}
}else{
disp_set_bit(dispBuff,LCD_BIT_AF,OFF);
#ifdef USE_AF_SEEK_DELAY
afDelayMs=AF_SEEK_DELAY;//重新置延迟数
#endif
}
}
#ifdef PT6578 //只有点阵屏支持广播文本
#define RDS_RT_DISP_DELAY 6 //delay 6 char
void rds_disp_radio_text(void)
{
BYTE i=64;
if(rdsTAGet && rdsTAEnable)
return;
if((txtAreadyFlag == 0xffff))
{
//i = rds_get_radiotext_len(radioTextBufA[radio_text_type]);
// printf("RT0:%d %s\n",text_ab,radioTextBufA[text_ab]);
while(i--) //去除尾部空格或非字符
{
if(radioTextBufA[radio_text_type][i]<=' ' || radioTextBufA[radio_text_type][i]>'z')
radioTextBufA[radio_text_type][i]=0;
else
break;
// if(radioTextBufA[radio_text_type][i]!=' ' && radioTextBufA[radio_text_type][i]!=0)
// break;
}
if(nRadioTextStart<RDS_RT_DISP_DELAY)//等待3秒,6*500ms
{
disp_string(dispBuff,radioTextBufA[radio_text_type],1,12); //显示前12字符
}else{
disp_string(dispBuff,radioTextBufA[radio_text_type]+nRadioTextStart-RDS_RT_DISP_DELAY,1,12);
if(radioTextBufA[radio_text_type][nRadioTextStart-RDS_RT_DISP_DELAY]==0)//结束符
nRadioTextStart=0;
}
if(nRadioTextStart<64 && i<(64-12))
nRadioTextStart++;
else
nRadioTextStart=0;
}
}
#endif
void rds_thread(void)
{
if(!rdsEnable)
return;
if(bRadioInPreview || bRadioInAMS)//预览过程中不检测AF
return;
//任何时候都探测TP
if(rdsTPGet)
{
if(radioBand==FM)
disp_set_bit(dispBuff,LCD_BIT_TP,ON);
else
disp_set_bit(dispBuff,LCD_BIT_TP,OFF);
ta_freq = cur_freq; //如果获得TP,更新TA频率
//rdsParam &= ~TA_SEEK;//不重新搜索
rdsTASeek = 0;
}else{
disp_set_bit(dispBuff,LCD_BIT_TP,OFF);
}
if(rdsEONGet)
{
disp_set_bit(dispBuff,LCD_BIT_EON,ON);
}else{
disp_set_bit(dispBuff,LCD_BIT_EON,OFF);
}
if((currentMode==_MODE_RADIO) && (radioBand==FM))//radio mode
{
//如果当前频道有TA/TP且允许TA,弹出TRAFFIC警告
if(rdsTAGet && rdsTAEnable && rdsTPGet)
{
#if defined(PT6523) || defined(PT6524)
disp_set_bit(dispBuff,LCD_BIT_DOT,OFF);
#endif
disp_clr_led(dispBuff);
//disp_string(dispBuff,"TRAFFIC ",DISP_8CHAR_START,8);
disp_string_E(dispBuff,strTraffic,DISP_8CHAR_START,8);
radio_is_preset(radioBand,cur_freq);
//disp_string_E(dispBuff,*(strNameList+PTR_STR_TRAFFIC),DISP_8CHAR_START,8);
}else{ //否则仅显示台标
if(psReadyFlag==0x0F)//如果台标准备好
{
#if defined(PT6523) || defined(PT6524)
disp_set_bit(dispBuff,LCD_BIT_DOT,OFF);
#endif
if(txtAreadyFlag!=0xffff)
{
disp_clr_led(dispBuff);
//for(i=1;i<DISP_8CHAR_START;i++)
// disp_char(dispBuff,i,' ');
disp_string(dispBuff,programServiceBuf,DISP_8CHAR_START,8);
radio_is_preset(radioBand,cur_freq);
}
}
}
// //广播文本到达
// if((txtBreadyFlag == 0xffff))
// {
//
// }
// if((txtAreadyFlag == 0xffff))
// {
// // printf("RT0:%d %s\n",text_ab,radioTextBufA[text_ab]);
//#ifndef LCD_393
// //disp_string(dispBuff,radioTextBufA[radio_text_type],1,12);
//#endif
// }
if(ptyReadyFlag==0xFF)
{
disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
}else{
disp_set_bit(dispBuff,LCD_BIT_PTY,OFF);
}
}
}
#endif
#endif /*SUPPORT_RDS_FUNCTION*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -