📄 rds.c
字号:
/*********************************************************
Project: ST FST(TDA7540)
File name: RDS.c
Description:
Write/Modify: Perry Liang
Time: 2006-1-24- 15:35:50
*********************************************************/
#include "public.h"
#pragma INTO_ROM
static const unsigned char PTYDisplayTable[33][9]=
{
" None ",
" News ",
"Affairs ",
" Info ",
" Sport ",
"Educate ",
" Drama ",
"Culture ",
"Science ",
" Varied ",
" Pop M ",
" Rock M ",
" Easy M ",
"Light M ",
"Classics",
"Other M ",
"Weather ",
"Finance ",
"Children",
" Social ",
"Religion",
"Phone In",
" Travel ",
"Leisure ",
" Jazz ",
"Country ",
"Nation M",
" Oldies ",
" Folk M ",
"Document",
" Test ",
" Alarm ",
"PTY Seek"
};
/*********************************************
Function: RDSInit
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:52
*********************************************/
void RDSInit(void)
{
DB3=6;
DB10=40;
DB20=60;
DB40=100;
PD_RDSDATA=0;//PA1--floating input
PO_RDSDATA=0;
Enable_RDS_Int();
RDSDataInit();
RDS.F_AFEnable=1;
RDS.F_REGEnable=1;
RDS.F_EONEnable=1;
AFCheckDisable1sTimer=90;
}
/*********************************************
Function: RDSMain
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:51
*********************************************/
void RDSMain(void)
{
RDSDataMain();
RDSDisplay();
RDSKey();
if(RDS.F_GetNewCT)
{
RDS.F_GetNewCT=0;
ClockChange(RDS.TimeHour,RDS.TimeMin);
}
if(RDS.F_TAEnable&&!F_InEONTASwitch)
{
// TA switch
if(RDS.F_GetNewTA)
{
RDS.F_GetNewTA=0;
if(RDS.TA)
{
SwitchToTa();
}
else
{
TaSwitchBack();
}
}
if(NotRDSStation&&F_InTASwitch&&InTADelayTimer==0)
{
TaSwitchBack();
}
// Auto TA seek
if(RDS.TP||RDS.TA)
{
AutoTASeekTimer=0;
}
else
{
if(AutoTASeekTimer==1&&Radio.WorkMode==RADIO_WORK_IDLE&&FreqInFM(Radio.Freq))
{
Radio.Direction=1;
Radio.WorkMode=RADIO_WORK_SEEKREQ;
}
if(AutoTASeekTimer==0||AutoTASeekTimer==1)
AutoTASeekTimer=600;
}
}
#ifdef EON_ENABLE
// EON
if(RDS.F_TAEnable&&RDS.F_EONEnable&&!F_InTASwitch)
{
// EONTA switch
if(RDS.F_GetNewEONTA&&RDS.EONTA&&RDS.F_GetEONAFList&&!F_InEONTASwitch)
{
SwitchToEONTa();
}
if(F_InEONTASwitch&&InTADelayTimer==0&&((!RDS.TA)||NotRDSStation))
{
EONTaSwitchBack();
}
}
#endif
// PI SEEK
if(RDS.PISeekTimer==1&&Radio.WorkMode==RADIO_WORK_IDLE&&FreqInFM(Radio.Freq))
{
RDS.PISeekTimer=0;
if(RDS.F_AFEnable)
{
Radio.Direction=1;
Radio.WorkMode=RADIO_WORK_SEEKREQ;
RDS.F_PISeek=1;
}
}
if(PTYSelectTimer==1)
{
PTYSelectTimer=0;
F_PTYSelect=0;
RDS.F_PTYEnable=0;
F_NoPTY=0;
//Radio.F_TunerDispReq=1;
System.DispMode.Requst=DISPMODE_RADIO;
RDSDispMode=RDSDISP_IDLE;
}
}
/*********************************************
Function: RDSKey
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:48
*********************************************/
void RDSKey(void)
{
if(F_MuteKey)return;
if(F_PTYSelect
&&KeyCode!=R_AD_SEEKUP
&&KeyCode!=R_AD_SEEKDN
&&KeyCode!=L_AD_SEEKUP
&&KeyCode!=L_AD_SEEKDN
&&KeyCode!=S_AD_SEEKUP
&&KeyCode!=S_AD_SEEKDN
&&KeyCode!=P_AD_SEEKUP
&&KeyCode!=P_AD_SEEKDN
&&KeyCode!=P_EC_UP
&&KeyCode!=P_EC_DN
&&KeyCode!=P_AD_PTY
&&KeyCode!=S_AD_PTY
&&KeyCode!=P_AD_SEL
&&KeyCode!=S_AD_SEL
&&KeyCode!=NOKEY)
PTYSelectTimer=1;
switch (KeyCode)
{
//case P_AD_VOLUP:
case P_EC_UP:
if(F_PTYSelect)
{
PTYSelectType=MaxMinChangeProtect(PTYSelectType, 1, 31, 1, 0);
PTYSelectTimer=100;
F_RDSDispReq=1;
}
break;
//case P_AD_VOLDN:
case P_EC_DN:
if(F_PTYSelect)
{
PTYSelectType=MaxMinChangeProtect(PTYSelectType, -1, 31, 1, 0);
PTYSelectTimer=100;
F_RDSDispReq=1;
}
break;
case S_AD_AF:
if (FreqInAM(Radio.Freq))
break;
if (RADIO_IN_SEARCH)
break;
RDS.F_AFEnable=~RDS.F_AFEnable;
if(System.FWorkMode.Current!=WORKMODE_RADIO)break;
break;
case S_AD_TA:
//case S_RM_2ZONE:
if (FreqInAM(Radio.Freq))
break;
if (RADIO_IN_SEARCH)
break;
RDS.F_TAEnable=~RDS.F_TAEnable;
if(System.FWorkMode.Current!=WORKMODE_RADIO)break;
if (RDS.F_TAEnable)
{
if(!RDS.TP)
{
Radio.Direction=1;
Radio.WorkMode=RADIO_WORK_SEEKREQ;
}
if(RDS.TA)
{
SwitchToTa();
}
}
else
{
if(F_InTASwitch)TaSwitchBack();
#ifdef EON_ENABLE
if(F_InEONTASwitch)EONTaSwitchBack();
#endif
}
break;
case S_AD_PTY:
if (System.FWorkMode.Current!= WORKMODE_RADIO)
break;
//if (FreqInAM(Radio.Freq)||F_InTASwitch)
if (FreqInAM(Radio.Freq)||F_InTASwitch||F_InEONTASwitch)
break;
if(F_PTYSelect)
{
PTYSelectTimer=1;
break;
}
if(PTYSelectType==0)PTYSelectType=1;
F_PTYSelect=1;
RDS.F_PTYEnable=1;
PTYSelectTimer=100;
F_NoPTY=0;
//Radio.F_TunerDispReq=1;
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PTYSELECT;
break;
case S_AD_DISP:
if(System.DispMode.Current==DISPMODE_RDS&&RDSDispMode==RDSDISP_PS)
{
RDSDispTimer=50;
System.DispMode.Requst=DISPMODE_RADIO;
RDSDispMode=RDSDISP_IDLE;
}
//else if(RDSDispTimer>1&&System.DispMode.Current==DISPMODE_RADIO)
else if(System.DispMode.Current==DISPMODE_RADIO)
{
RDSDispTimer=50;
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PTY;
}
else if(System.DispMode.Current==DISPMODE_RDS&&RDSDispMode==RDSDISP_PTY)
{
RDSDispTimer=50;
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PS;
}
break;
case L_AD_AF:
RDS.F_REGEnable=~RDS.F_REGEnable;
break;
}
}
/*********************************************
Function: RDSDisplay
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:46
*********************************************/
void RDSDisplay(void)
{
unsigned char i;
if(System.DispMode.Next==DISPMODE_RDS)
{
F_RDSDispReq=1;
}
/*if(System.DispMode.Last==DISPMODE_RDS)
{
}*/
/*if(!RDSAFChecking)
{
F_DISP_AF=0;
F_DISP_TA=0;
F_DISP_TP=0;
F_DISP_PTY=0;
}*/
if (FreqInAM(Radio.Freq))
return;
if(System.PowerMode!=POWERMODE_POWERON||System.AccMode!=ACCMODE_ACCON)return;
if(F_HalfSecondOut)
{
ShowVolBar();
if(F_SpecOK)
{
F_SpecOK=0;
ShowSpectrum();
}
RadioTunerRead();
if (F_TunerStereo)
F_DISP_ST=1;
else
F_DISP_ST=0;
}
if(RDS.F_AFEnable)
{
if(RDSStation&&(!RDSAFChecking))
{
F_DISP_AF=1;
}
else
{
if(F_HalfSecondOut)
F_DISP_AF=~F_DISP_AF;
}
}
else
{
F_DISP_AF=0;
}
F_DISP_TA=RDS.F_TAEnable;
F_DISP_PTY=RDS.F_PTYEnable;
F_DISP_REG=RDS.F_REGEnable;
if(RDSStation&&RDS.TP)
{
F_DISP_TP=1;
}
else
{
F_DISP_TP=0;
}
if(RDSStation&&F_InEONTASwitch&&RDS.TA)
{
F_DISP_EON=1;
}
else
{
F_DISP_EON=0;
}
if(RADIO_IN_AS)return;
if(RDSDispTimer==1)
{
RDSDispTimer=0;
if(RDS.F_PSExist)
{
if(RDSDispMode!=RDSDISP_PTYSELECT)
{
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PS;
}
}
else
{
System.DispMode.Requst=DISPMODE_RADIO;
RDSDispMode=RDSDISP_IDLE;
}
}
if(RDS.F_GetNewPS && System.FWorkMode.Current==WORKMODE_RADIO)
{
RDS.F_GetNewPS=0;
if(RDSDispMode!=RDSDISP_TRAFFIC)
{
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PS;
}
}
if(System.DispMode.Current!=DISPMODE_RDS)return;
if(!F_RDSDispReq)return;
F_RDSDispReq=0;
F_DISP_P=0;
switch(RDSDispMode)
{
case RDSDISP_PS:
for(i=0;i<8;i++)
DispNum[i]=RDS.PS[i];
DisplayRefresh();
break;
case RDSDISP_PTY:
for(i=0;i<8;i++)
DispNum[i]=PTYDisplayTable[RDS.PTY][i];
DisplayRefresh();
break;
case RDSDISP_PTYSELECT:
for(i=0;i<8;i++)
DispNum[i]=PTYDisplayTable[PTYSelectType][i];
if(F_NoPTY)
{
DispNum[0]='N';
DispNum[1]='o';
DispNum[2]=' ';
DispNum[3]='M';
DispNum[4]='a';
DispNum[5]='t';
DispNum[6]='c';
DispNum[7]='h';
}
DisplayRefresh();
break;
case RDSDISP_TRAFFIC:
DispNum[0]=' ';
DispNum[1]='T';
DispNum[2]='R';
DispNum[3]='A';
DispNum[4]='F';
DispNum[5]='F';
DispNum[6]='I';
DispNum[7]='C';
DisplayRefresh();
break;
}
}
/*********************************************
Function: SwitchToTa
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:41
*********************************************/
void SwitchToTa(void)
{
if(F_InTASwitch)return;
F_InTASwitch=1;
InTADelayTimer=10;
System.FWorkMode.Save=System.FWorkMode.Current;
ChangeFWorkmode(WORKMODE_RADIO);
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_TRAFFIC;
F_RDSDispReq=1;
AudioVolBackup=AudioVol;//add traffic vol by yete at Sept.2006
AudioVol=TAVol;
AudioCalc(AUDIO_ALL_VAL);
AudioSend(AUDIO_AREA_SOURCE_VOL);
}
/*********************************************
Function: TaSwitchBack
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:40
*********************************************/
void TaSwitchBack(void)
{
unsigned char temp;
if(!F_InTASwitch)return;
F_InTASwitch=0;
RDSClearTAFlags();
ChangeFWorkmode(System.FWorkMode.Save);
//System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_PS;
F_RDSDispReq=1;
TAVol=AudioVol;
AudioVol=AudioVolBackup;
AudioCalc(AUDIO_ALL_VAL);
AudioSend(AUDIO_AREA_SOURCE_VOL);
}
#ifdef EON_ENABLE
/*********************************************
Function: SwitchToEONTa
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:38
*********************************************/
void SwitchToEONTa(void)
{
unsigned char i;
if(F_InEONTASwitch)return;
F_InEONTASwitch=1;
InTADelayTimer=30;
for(i=0;i<25;i++)
{
RDS.EONAFBackup[i]=RDS.AF[i];
RDS.AF[i]=RDS.EONAF[i];
}
for(i=0;i<8;i++)
{
RDS.EONPSBackup[i]=RDS.PS[i];
RDS.PS[i]=RDS.EONPS[i];
}
RDS.EONPIBackup=RDS.PI;
RDS.PI=RDS.EONPI;
RDS.EONAFNumBackup=RDS.AFNum;
RDS.AFNum=RDS.EONAFNum;
RDS.PILast=RDS.PI;
RDS.PIBackup=RDS.PI;
RDSAFSearchSetFreq(RDS.AF[0]);
SetAFSearch();
RDSClearEONTAFlags();
RDSClearTAFlags();
System.FWorkMode.Save=System.FWorkMode.Current;
ChangeFWorkmode(WORKMODE_RADIO);
System.DispMode.Requst=DISPMODE_RDS;
RDSDispMode=RDSDISP_TRAFFIC;
F_RDSDispReq=1;
AudioVolBackup=AudioVol;
AudioVol=TAVol;
AudioCalc(AUDIO_ALL_VAL);
AudioSend(AUDIO_AREA_SOURCE_VOL);
}
/*********************************************
Function: EONTaSwitchBack
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:36
*********************************************/
void EONTaSwitchBack(void)
{
unsigned char i;
if(!F_InEONTASwitch)return;
F_InEONTASwitch=0;
//InTADelayTimer=30;
for(i=0;i<25;i++)
{
RDS.AF[i]=RDS.EONAFBackup[i];
}
for(i=0;i<8;i++)
{
RDS.PS[i]=RDS.EONPSBackup[i];
}
RDS.PI=RDS.EONPIBackup;
RDS.AFNum=RDS.EONAFNumBackup;
RDS.PILast=RDS.PI;
RDS.PIBackup=RDS.PI;
RDSAFSearchSetFreq(RDS.AF[0]);
SetAFSearch();
RDSClearEONTAFlags();
RDSClearTAFlags();
ChangeFWorkmode(System.FWorkMode.Save);
RDSDispMode=RDSDISP_PS;
//System.DispMode.Requst=DISPMODE_RDS;
F_RDSDispReq=1;
TAVol=AudioVol;
AudioVol=AudioVolBackup;
AudioCalc(AUDIO_ALL_VAL);
AudioSend(AUDIO_AREA_SOURCE_VOL);
}
#endif
/*********************************************
Function: RDSTimer100ms
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:37:34
*********************************************/
void RDSTimer100ms(void)
{
if(RDSDispTimer>1)RDSDispTimer--;
if(AutoTASeekTimer>1)AutoTASeekTimer--;
if(PTYSelectTimer>1)PTYSelectTimer--;
if(InTADelayTimer>0)InTADelayTimer--;
}
/*********************************************************
File End
*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -