📄 radio.c
字号:
else
DispBuff[2][9]='0'+j;
#endif
}
#ifdef SINO_MOS
// PrintLine(str);
#else
Display(DISP_REFRESH2);
#endif
}
#endif
/*********************************************
Function: RadioSeek
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:27
*********************************************/
void RadioSeek(void)
{
switch(Radio.SeekMode)
{
case RADIO_SEEK_IDLE:
break;
case RADIO_SEEK_INIT:
Radio.SeekMode=RADIO_SEEK_CHANGE_FRE;
break;
case RADIO_SEEK_CHANGE_FRE:
RadioSetFreq(Radio.ReqFreq);
if(FreqInFM(Radio.Freq))
{
//Wait10us(60);//wait for SMeter stable
Wait10us(200);
if(GetSMeter()>DB10)
{
RadioWaitTimer=6;//wait for SSTOP in FM
Radio.SeekMode=RADIO_SEEK_WAIT;
}
else
{
Radio.SeekMode=RADIO_SEEK_IDLE;
}
}
else
{
RadioWaitTimer=6;
Radio.SeekMode=RADIO_SEEK_AMFSU_WAIT;
}
break;
case RADIO_SEEK_AMFSU_WAIT:
if(RadioWaitTimer>0)break;
if(GetSMeter()>30)
{
RadioWaitTimer=12;//wait for SSTOP in AM
Radio.SeekMode=RADIO_SEEK_WAIT;
}
else
{
Radio.SeekMode=RADIO_SEEK_IDLE;
}
break;
case RADIO_SEEK_WAIT:
if(RadioWaitTimer>0)break;
/*if(FreqInFM(Radio.Freq))
{
if (CheckIFC(50,1000))
Radio.F_GoodStation=1;
}
else*/
{
if (CheckIFC(50,1000))
{
Radio.F_GoodStation=1;
}
}
Radio.SeekMode=RADIO_SEEK_IDLE;
break;
case RADIO_SEEK_CHECK:
break;
case RADIO_SEEK_GOOD_STATION:
break;
case RADIO_SEEK_BAD_STATION:
break;
}
}
/*********************************************
Function: RadioWork
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:25
*********************************************/
void RadioWork(void)
{
unsigned char i,j;
switch(Radio.WorkMode)
{
case RADIO_WORK_IDLE:
if(System.DispMode.Current!=DISPMODE_RADIO)
break;
if(F_HalfSecondOut)
{
Radio.Smeter=GetSMeter();
/*AniBuff[23]=Radio.Smeter/100+'0';
i=Radio.Smeter%100;
AniBuff[24]=i/10+'0';
AniBuff[25]=i%10+'0';
Radio.F_TunerDispReq=1;*/
}
break;
case RADIO_WORK_SEEKREQ:
//Radio.Band[Radio.CurrentBand].CurrentMem=0;
Radio.F_TunerDispReq=1;
Radio.WorkMode=RADIO_WORK_SEEKWAIT;
Radio.BackupFreq=Radio.Freq;
SeekOn();
RadioMute(SOFTON);
Radio.SeekMode=RADIO_SEEK_IDLE;
//break;//!!!!!!!!
case RADIO_WORK_SEEKWAIT:
if(Radio.SeekMode!=RADIO_SEEK_IDLE)break;
if(Radio.F_GoodStation)
{
Radio.F_GoodStation=0;
if((FreqInFM(Radio.Freq)&&!FreqInJapanFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))&&(RDS.F_AFEnable||RDS.F_TAEnable||RDS.F_PTYEnable||RDS.F_PISeek))
{
if(FreqInNormalFM(Radio.Freq))
{
if(Radio.Freq%10==0)
{
Radio.WorkMode=RADIO_WORK_SEEKWAITRDS;
RadioWorkTimer10ms=25;
}
else
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
else
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
else
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
break;
}
case RADIO_WORK_SEEKNEXT:
Radio.ReqFreq=RadioFreqCal(Radio.SeekStep);
//debug("AUTO SEEK FREQ: ",Radio.ReqFreq);
Radio.SeekMode=RADIO_SEEK_INIT;
Radio.WorkMode=RADIO_WORK_SEEKWAIT;
if(!Radio.F_Scan)
{
if((Radio.BackupFreq==Radio.ReqFreq)
||(Radio.BackupFreq==Radio.ReqFreq+5 && Radio.Direction==1)
||(Radio.BackupFreq==Radio.ReqFreq-5 && Radio.Direction==-1))
{
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
RadioSetFreq(Radio.BackupFreq);
if(RDS.F_PTYEnable)
{
F_NoPTY=1;
PTYSelectTimer=50;
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PTYSELECT;
}
}
}
else
{
if((Radio.ScanBackupFreq==Radio.ReqFreq)
||(Radio.ScanBackupFreq==Radio.ReqFreq+5 && Radio.Direction==1)
||(Radio.ScanBackupFreq==Radio.ReqFreq-5 && Radio.Direction==-1))
{
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
RadioSetFreq(Radio.ScanBackupFreq);
if(RDS.F_PTYEnable)
{
F_NoPTY=1;
PTYSelectTimer=50;
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PTYSELECT;
}
Radio.F_Scan=0;
}
}
//Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_SEEKWAITRDS:
if(RDS.F_RDSStation)
{
Radio.WorkMode=RADIO_WORK_SEEKWAITPI;
RadioWorkTimer10ms=100;
//Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
break;
}
if(RadioWorkTimer10ms==0)
{
#ifdef TunerSeekOK
Radio.WorkMode = RADIO_WORK_SEEKOKWAIT;
#else
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
#endif
}
break;
case RADIO_WORK_SEEKWAITPI:
if(RDS.F_GetNewPI)
{
if(RDS.F_TAEnable)
{
Radio.WorkMode=RADIO_WORK_SEEKWAITTP;
RadioWorkTimer10ms=9;
}
else if(RDS.F_PTYEnable)
{
Radio.WorkMode=RADIO_WORK_SEEKWAITPTY;
PTYSelectTimer=100;
RadioWorkTimer10ms=9;
}
else if(RDS.F_PISeek)
{
if(((RDS.PI==RDS.PIBackup&&RDS.F_REGEnable)
||((RDS.PI&0x00FF)==(RDS.PIBackup&0x00FF)&&!RDS.F_REGEnable))
&& RDS.PI!=0)
{
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
RDS.F_PISeek=0;
}
else
{
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
}
else
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
break;
}
if(RadioWorkTimer10ms==0)
{
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
break;
case RADIO_WORK_SEEKWAITTP:
if(RDS.F_GetNewTP&&RDS.TP)
{
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
break;
}
if(RadioWorkTimer10ms==0)
{
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
break;
case RADIO_WORK_SEEKWAITPTY:
if(RDS.F_GetNewPTY&&(RDS.PTY==PTYSelectType))
{
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
PTYSelectTimer=1;
break;
}
if(RadioWorkTimer10ms==0)
{
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
}
break;
case RADIO_WORK_SEEKOKWAIT:
RadioSeekMuteTimer=5;
Radio.WorkMode=RADIO_WORK_SEEKOK;
break;
case RADIO_WORK_SEEKOK:
if(RadioSeekMuteTimer>0)break;
RDS.F_PISeek=0;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
debug_val("Get Real Freq: ",Radio.ReqFreq);
Radio.F_TunerDispReq=1;
if(Radio.F_Scan)
{
Radio.WorkMode=RADIO_WORK_SCANWAIT;
RadioWorkTimer=50;
}
break;
case RADIO_WORK_SCANWAIT:
if(RadioWorkTimer>0)break;
Radio.WorkMode=RADIO_WORK_SEEKREQ;
break;
case RADIO_WORK_SEEKBREAK:
RDS.F_PISeek=0;
Radio.F_GoodStation=0;
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_PSREQ://display the each preset memory frequency during 5 seconds
Radio.WorkMode=RADIO_WORK_PSWAIT;
if(FreqInFM(Radio.Freq))
{
Radio.FMBand[FmIdx].CurrentMem=0;
}
else
{
Radio.AMBand[AmIdx].CurrentMem=0;
}
RadioWorkTimer=0;
break;
case RADIO_WORK_PSWAIT:
if(RadioWorkTimer>0)break;
RadioWorkTimer=50;
if(FreqInFM(Radio.Freq))
{
if(Radio.FMBand[FmIdx].CurrentMem==6)
{
Radio.FMBand[FmIdx].CurrentMem=1;
Radio.WorkMode=RADIO_WORK_PSEND;
}
else
Radio.FMBand[FmIdx].CurrentMem++;
}
else
{
if(Radio.AMBand[AmIdx].CurrentMem==6)
{
Radio.AMBand[AmIdx].CurrentMem=1;
Radio.WorkMode=RADIO_WORK_PSEND;
}
else
Radio.AMBand[AmIdx].CurrentMem++;
}
BreakAFCheck();
RadioMute(SOFTON);
if(FreqInFM(Radio.Freq))
{
RadioSetFreq(Radio.FMBand[FmIdx].MemFreq[Radio.FMBand[FmIdx].CurrentMem-1]);
}
else
{
RadioSetFreq(Radio.AMBand[AmIdx].MemFreq[Radio.AMBand[AmIdx].CurrentMem-1]);
}
RadioMute(SOFTOFF);
System.DispMode.Requst=DISPMODE_RADIO;
RDSDispMode=RDSDISP_IDLE;
break;
case RADIO_WORK_PSEND:
RadioWorkTimer=0;
Radio.WorkMode=RADIO_WORK_IDLE;
break;
case RADIO_WORK_ASPSBREAK:
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
RadioWorkTimer=0;
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_ASREQ:
if(FreqInFM(Radio.Freq)&&Radio.Area==AREA_OIRT)
Radio.BackupFreq=Area[AREA_OIRT].FMMinFreqOirt;
else
Radio.BackupFreq=Radio.MinFreq;
Radio.ReqFreq=Radio.BackupFreq;
RadioSetFreq(Radio.ReqFreq);
Radio.Direction=1;
if(FreqInFM(Radio.Freq))
{
for(i=0;i<6;i++)
{
Radio.FMBand[FmIdx].MemFreq[i]=Radio.BackupFreq;
Radio.FMBand[FmIdx].MemSmeter[i]=0;
Radio.FMBand[FmIdx].PI[i]=0;
Radio.FMBand[FmIdx].MemAFNum[i]=1;
for(j=0;j<8;j++)
Radio.FMBand[FmIdx].MemAFList[i][j]=0xFF;
}
}
else
{
for(i=0;i<6;i++)
{
Radio.AMBand[AmIdx].MemFreq[i]=Radio.BackupFreq;
Radio.AMBand[AmIdx].MemSmeter[i]=0;
//Radio.AMBand[FmIdx].PI[i]=0;
//Radio.AMBand[FmIdx].MemAFNum[i]=1;
//for(j=0;j<8;j++)
//Radio.FMBand[FmIdx].MemAFList[i][j]=0xFF;
}
}
SeekOn();
RadioMute(SOFTON);
Radio.WorkMode=RADIO_WORK_ASWAIT;
TempPresetNum=0;
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_ASWAIT:
if(Radio.SeekMode!=RADIO_SEEK_IDLE)break;
if(Radio.F_GoodStation)
{
Radio.F_GoodStation=0;
if((FreqInFM(Radio.Freq)&&!FreqInJapanFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))&&(RDS.F_AFEnable||RDS.F_TAEnable))
{
Radio.WorkMode=RADIO_WORK_ASWAITRDS;
RadioWorkTimer10ms=25;
break;
}
else
PresetOrder();
}
case RADIO_WORK_ASNEXT:
Radio.ReqFreq=RadioFreqCal(Radio.SeekStep);
Radio.SeekMode=RADIO_SEEK_INIT;
Radio.WorkMode=RADIO_WORK_ASWAIT;
if(Radio.ReqFreq==Radio.BackupFreq)
{
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_ASEND;
}
break;
case RADIO_WORK_ASWAITRDS:
if(RDS.F_RDSStation)
{
Radio.WorkMode=RADIO_WORK_ASWAITPI;
RadioWorkTimer10ms=100;
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASWAITPI:
if(RDS.F_GetNewPI&&RDS.PI!=0)
{
if(FreqInFM(Radio.Freq))
{
for(i=0,j=0;i<TempPresetNum;i++)
{
if(RDS.PI==Radio.FMBand[FmIdx].PI[i])
{
j=1;
break;
}
}
}
if(j)
{
Radio.WorkMode=RADIO_WORK_ASNEXT;
}
else
{
Radio.WorkMode=RADIO_WORK_ASWAITAFLIST;
RadioWorkTimer10ms=250;
}
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASWAITAFLIST:
if(RDS.F_GetAFList)
{
PresetOrder();
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASEND:
//for(i=0;i<TempPresetNum;i++)
// Radio.Band[Radio.CurrentBand].MemFreq[i]=TempPreset[i].Freq;
SeekOff();
RadioMute(SOFTOFF);
Radio.WorkMode=RADIO_WORK_PSREQ;
break;
}
}
/*********************************************
Function: RadioSetFreq
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:24
*********************************************/
void RadioSetFreq(unsigned int setfreq)
{
volatile unsigned int pc;
volatile unsigned char i,start,end;
debug_val("Set Freq:",setfreq);
#if TDA7540_TUNER
if(!Radio.F_TDA7541)
{
start=39;
end=0;
if(Radio.F_ForceSetBuff)
{
for(i=0;i<40;i++)
Radio.TunerBuff[i]=EepromBuff[i];
// seek off
Radio.TunerBuff[0] &= 0x7F;
// Disable local mode
Radio.TunerBuff[7] &= 0x7F;
//Enable AFS PIN and AFS influence on stereodecoder mute
Radio.TunerBuff[31] &= y11110011;
Pin_AFS=1;
start=0;
end=39;
}
//PLL counter
if(FreqInJapanFM(setfreq))
{
pc=(setfreq-1070)/5-32;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -