⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rds.c

📁 车载DVD+tuner,意法半导体的方案. 纯C编写.
💻 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 + -