📄 radio.c
字号:
do
{
status=0;
radio_seek(band,&cur_freq,UP,&status,disp);
if(status==0) //搜索到台
{
#ifdef DISP_PROGRESS
disp_radio(dispBuff,(BYTE)(channel/6)+RADIO_TYPE_AM1,cur_freq);
#endif
disp_char(dispBuff,DISP_CHANNEL,ASCII_NUM+(channel%6+1));
if(channel%6==0)//修改每个波段的首个电台
{
bandLastFreq[regionIndex][channel/6+RADIO_TYPE_AM1-1]=cur_freq;
}
#ifdef PRESET_SAVE_IN_RAM
amPresetFreq[regionIndex][channel++]=(UINT16)(cur_freq);
#else
eeprom_busy_wait();
eeprom_write_word(amPresetFreq[0]+AM_COUNT*regionIndex+channel,cur_freq);
channel++;
#endif
}
} while((channel<AM_COUNT) && (status==0));
}
if(channel && (status==SEARCH_UP_TO_END))
{
if(rds==OFF)//AMS
{
if((regionIndex==REGION_ORIT) && (sub_band>RADIO_TYPE_FM1))
radio_set_channel(band,6); //停留在第一个台
else
radio_set_channel(band,0); //停留在第一个台
}
}
if( ((band==AM) && (channel==AM_COUNT)) || ((band==FM) && (channel==FM_COUNT)) )//最多台
{
if(rds==OFF)
radio_set_channel(band,0); //停留在第一个台
}
if((status==SEARCH_BREAK))//如果不是用户中断且搜索到台//停留在最后搜索的频率
{
pll_set_station(band,cur_freq);
radio_save_last_station(sub_band,cur_freq);
}
if(rds && (status==SEARCH_UP_TO_END) && disp)
{
if(!rdsPTYSeek)
{
if(maxRdsFreq)
{
cur_freq = maxRdsFreq;
pll_set_station(radioBand,maxRdsFreq);
disp_radio(dispBuff,sub_band,maxRdsFreq);
}
//rds_clear_af();
//返回最后频率
}
}
//is_ams=0;
bRadioInAMS = 0;//radioParam &= ~RA_IN_AMS;
if(currentPower==_POWER_RADIO)
{
//#ifndef DISP_PROGRESS
disp_radio(dispBuff,sub_band,cur_freq);
radio_is_preset(band,cur_freq);
//#endif
audio_set_mute(OFF);
}
}
void radio_seek_delay(char band,UINT16 freq)
{
BYTE i;
for(i=4;i>0;i--)
{
if(band==FM)
pll_reset_CTE(band,freq-i*freqParam[regionIndex][FM_FREQ_STEP]);
else
pll_reset_CTE(band,freq-i*freqParam[regionIndex][AM_FREQ_STEP]);
#if defined(LCD_393)
display();
#endif
pll_is_station(band,freq);
}
}
void radio_seek(char band,UINT16 * start_freq,BYTE dir,BYTE *status,BYTE disp)
{
//BYTE i=0;
//UINT16 curSmeter=0;
disp_volume(0); //清除当前音量显示值
#ifdef LCD_BIT_STEREO
disp_set_bit(dispBuff,LCD_BIT_STEREO,OFF);//两个圈
#endif
#if defined(LCD_BIT_ANT)
disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);//两个圈
#endif
#ifdef LCD_BIT_CH
#ifndef LCD_316
disp_set_bit(dispBuff,LCD_BIT_CH,OFF);//CH
#endif
#endif
if(currentPower==_POWER_RADIO)
display();
bRadioSeeking =1;//radioParam |= RA_SEEKING;
#ifndef DISP_PROGRESS
disp_clr_led(dispBuff);
//disp_string(dispBuff,"SEARCH",DISP_6CHAR_START,8);
disp_string_E(dispBuff,strSearch,DISP_6CHAR_START,8);
display();
#endif
if(band==FM)
{
radio_set_loc(radioParam&RA_LOC);
if(*start_freq>ORIT_JUMP_FREQ1) //调整
{
while(((*start_freq+10) % freqParam[regionIndex][FM_FREQ_STEP]))//判断当前频率是整倍数
{
*start_freq+=freqParam[regionIndex][FM_FREQ_FINE];
}
}
do
{
if(dir==UP)
{
if(*start_freq==ORIT_JUMP_FREQ1)//74->87.5
{
*start_freq = ORIT_JUMP_FREQ2;
}else{
if(*start_freq>ORIT_JUMP_FREQ1) //76,87,...etc
{
*start_freq+=freqParam[regionIndex][FM_FREQ_STEP];//先+固定频率,然后设定,再判断是否锁定
}else{
if(*start_freq<ORIT_JUMP_FREQ1); //<74
*start_freq += ORIT_LOW_STEP;
}
}
}else{ //DOWN
if((*start_freq==ORIT_JUMP_FREQ2) && (regionIndex==REGION_ORIT))
{
*start_freq = ORIT_JUMP_FREQ1;
}else{
if(*start_freq>ORIT_JUMP_FREQ1) //>74
{
*start_freq-=freqParam[regionIndex][FM_FREQ_STEP];//先-固定频率,然后设定,再判断是否锁定
}else{ //<74
*start_freq -= ORIT_LOW_STEP; //--1
}
}
}
//up to low
if(*start_freq<freqParam[regionIndex][FM_FREQ_START])
{
*start_freq=freqParam[regionIndex][FM_FREQ_END];
radio_seek_delay(band,*start_freq);
}
//up to high
if(*start_freq>freqParam[regionIndex][FM_FREQ_END])
{
*start_freq=freqParam[regionIndex][FM_FREQ_START];
radio_seek_delay(band,*start_freq);
*status = SEARCH_UP_TO_END;
if(bRadioInAMS)
{
break;
}
}
#ifdef DISP_PROGRESS
if(disp)
{
if(bRadioInAMS)
{
disp_FM_data(dispBuff,*start_freq);
}else{
disp_radio(dispBuff,sub_band,*start_freq);
}
}
#endif
#ifdef DISP_PROGRESS
disp_thread();//显示刷新
#endif
//kb_thread();
pll_reset_CTE(band,*start_freq);
if(pll_is_station(band,*start_freq))// 计算IF校验是否假台
{
*status = FOUND_STATION;
break;
}
#ifdef LCD_BIT_STEREO
disp_set_bit(dispBuff,LCD_BIT_STEREO,OFF);//两个圈
#endif
#if defined(LCD_BIT_ANT)
disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);//天线
#endif
dvd_thread();
rdsAFFlash = 1;//rdsParam |= AF_FLASH;
sys_event_500ms();
if(bit_is_clear(PIN_ACC_IN,ACC_IN))
{
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
break;
}
kb_thread();
if(keyParam&KEY_SEEK_MANUAL) //搜索过程中避免手动操作超时
seekManualTimeout = SEEK_MANUAL_TIMEOUT;
}while(bRadioSeeking);
radio_set_loc(OFF);// LOC OFF
}else{ //AM
do
{
if(dir==UP)
*start_freq += freqParam[regionIndex][AM_FREQ_STEP];
else
*start_freq -= freqParam[regionIndex][AM_FREQ_STEP];
if(*start_freq<freqParam[regionIndex][AM_FREQ_START])
{
*start_freq = freqParam[regionIndex][AM_FREQ_END];
radio_seek_delay(band,*start_freq);
}
if(*start_freq>freqParam[regionIndex][AM_FREQ_END])
{
*start_freq = freqParam[regionIndex][AM_FREQ_START];
radio_seek_delay(band,*start_freq);
*status = SEARCH_UP_TO_END;
if(bRadioInAMS)
{
break;
}
}
#ifdef DISP_PROGRESS
if(bRadioInAMS)
disp_AM_data(dispBuff,*start_freq);
else
disp_radio(dispBuff,sub_band,*start_freq);
#endif
pll_reset_CTE(band,*start_freq);
//以下在等待中频计数期间做其它任务
dvd_thread();
disp_thread();//in loop, need to reflash lcd
sys_event_500ms();
if(bit_is_clear(PIN_ACC_IN,ACC_IN))
{
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
break;
}
kb_thread();
if(keyParam&KEY_SEEK_MANUAL)
seekManualTimeout = SEEK_MANUAL_TIMEOUT;
}while((pll_is_station(band,*start_freq)==FALSE) && bRadioSeeking);
}
pll_set_station(band,*start_freq);
radio_save_last_station(sub_band,*start_freq);
if(!bRadioSeeking)
{
*status = SEARCH_BREAK;
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
}
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
//if(disp)
//disp_radio(dispBuff,sub_band,*start_freq);
//return start_freq;
}
BYTE seekStatus=0;
extern BYTE afDelayMs;
//搜索线程
void sys_event_seek(void)
{
UINT rdsWaitLoops=0;
if(currentPower==_POWER_RADIO)//仅在收音模式下工作
{
//短按事件
if((keyParam&KEY_SEEK_FWD) || (keyParam&KEY_SEEK_REV))//短按释放
{
if(rdsTASeek)
return;
cur_channel=0xFF;
bRadioInPreview = 0;//radioParam &= ~RA_PREVIEW;//如果预览则停止
disp_char(dispBuff,DISP_CHANNEL,' ');//clear save channel flag
if(!bRadioSeeking)
{
cur_channel=0xFF;
//如果AF开启,FM,自动模式
if(!(keyParam&KEY_SEEK_MANUAL))
{
muteStart=OFF;//防止静音被打开
audio_set_mute(ON);
beforeSeekFreq= cur_freq;//保存搜索前的频率
if(rdsAFEnable && (radioBand==FM))//AF开启
{
#ifdef _SUPPORT_RDS
rdsActive = 0;//rdsParam &= ~RDS_ACTIVE;
rds_clear();
do{
seekStatus=0;
if(keyParam&KEY_SEEK_FWD)
{
radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
}else{
radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
}
if(seekStatus==0)//找到台
{
pll_set_station(radioBand,cur_freq);
//display();
rdsWaitLoops=0;
//#ifndef LA1844
while(!rdsActive)
{
rdsWaitLoops++;
if(rdsWaitLoops>WAIT_RDS_READY_LOOPS)
break;
sys_delay_loops(1);
}
//sys_delay_loops(WAIT_RDS_READY_LOOPS);
//delay_ms(1000);
if(rdsActive)
{
#ifdef USE_AF_SEEK_DELAY
afDelayMs=AF_SEEK_DELAY;//重新置延迟数
#endif
if(rdsTAEnable && rdsTAGet)
{
//rdsParam &= ~TA_SEEK;
rdsTASeek = 0;
}
if(rdsAFEnable)
{
rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;
}
disp_radio(dispBuff,sub_band,cur_freq);
break;
}
//#endif
//seekStatus=SEARCH_BREAK;
//break;
}
}while(seekStatus!=SEARCH_BREAK);
#ifdef USE_AF_SEEK_DELAY
afDelayMs=AF_SEEK_DELAY; //重新置延迟数
#endif
#endif
}else{//AF关闭或AM
seekStatus=0;
if(keyParam&KEY_SEEK_FWD)
{
radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
}else{
radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
}
}
//此处判断是用户中断还是找到台
if(seekStatus==SEARCH_BREAK)//恢复
{
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
keyParam &= ~KEY_SEEK_REV;
keyParam &= ~KEY_SEEK_FWD;
cur_freq = beforeSeekFreq;
lastFreq = cur_freq;
pll_set_station(radioBand,cur_freq);
//disp_radio(dispBuff,sub_band,cur_freq);
radio_save_last_station(sub_band,cur_freq);
radio_is_preset(radioBand,cur_freq);
}
disp_radio(dispBuff,sub_band,cur_freq);
radio_is_preset(radioBand,cur_freq);
audio_set_mute(OFF);
}else{//手工模式短按
seekManualTimeout = SEEK_MANUAL_TIMEOUT;
#ifdef _SUPPORT_RDS
rds_clear();
#endif
if((keyParam&KEY_SEEK_FWD))
radio_go_next(UP);
else
radio_go_next(DOWN);
}
}
keyParam &= ~KEY_SEEK_FWD;
keyParam &= ~KEY_SEEK_REV;
}
//长按事件
if((keyParam&KEY_DEPRESS_FWD) || (keyParam&KEY_DEPRESS_REV))
{
bRadioInPreview = 0;//radioParam &= ~RA_PREVIEW;//如果预览则停止
#ifdef _SUPPORT_RDS
//切换到手工模式
rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
rds_clear();
#endif
if(!(keyParam&KEY_SEEK_MANUAL))//自动模式
{
disp_clr_led(dispBuff);
//disp_string(dispBuff,"MANUAL",DISP_6CHAR_START,6);
disp_string_E(dispBuff,strManual,DISP_6CHAR_START,6);
keyParam |= KEY_SEEK_MANUAL;
seekManualTimeout = SEEK_MANUAL_TIMEOUT;
display();
delay_ms(1000);//显示MANUAL 1S
disp_radio(dispBuff,sub_band,cur_freq);
}else{//手工模式
muteStart=OFF;//防止静音被打开
audio_set_mute(ON);
//beforeSeekFreq= cur_freq;//保存搜索前的频率
seekStatus=0;
if(keyParam&KEY_DEPRESS_FWD)
{
radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
}else{
radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
}
//此处判断是用户中断还是找到台
if(seekStatus==SEARCH_BREAK)//恢复
{
bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
keyParam &= ~KEY_SEEK_REV;
keyParam &= ~KEY_SEEK_FWD;
//cur_freq = beforeSeekFreq;
lastFreq = cur_freq;
pll_set_station(radioBand,cur_freq);
//disp_radio(dispBuff,sub_band,cur_freq);
radio_save_last_station(radioBand,cur_freq);
}
disp_radio(dispBuff,sub_band,cur_freq);
audio_set_mute(OFF);
}
keyParam &= ~KEY_DEPRESS_FWD;
keyParam &= ~KEY_DEPRESS_REV;
}
//radio_is_preset(radioBand,cur_freq);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -