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

📄 tunerrds.c

📁 关于收音功能代码,并且显示在OSD和VFD上
💻 C
📖 第 1 页 / 共 3 页
字号:
{' ',' ','J','A','Z','Z',' ',' '},//14
{'C','L','A','S','S','I','C','S'},//15
{' ',' ',' ','R','&','B',' ',' '},//16
{'S','O','F','T',' ','R','&','B'},//17
{'L','A','N','G','U','A','G','E'},//18
{'R','E','L',' ','M','U','S','C'},//19
{'R','E','L',' ','T','A','L','K'},//20
{'P','E','R','S','N','L','T','Y'},//21
{' ','P','U','B','L','I','C',' '},//22
{' ','C','O','L','L','E','G','E'}//23
};

BYTE bRDSPTYDispPrep(void)large
{
	BYTE i;
	
	if(!_rRDS.fgRDSPTY)
	{
		return(0);
	}
	
	for(i=0;i<8;i++)
	{
		#ifdef RDS_USE_SM
		vSetSharedInfo(SI_RDS_DISPLAYDATA_ST_ADDR+i,_bRDSPTYList[bSharedInfo(SI_RDS_PTY_ST_ADDR)][i]);
		#else
		*(_pbRDSDisplayData+i)=_bRDSPTYList[*(_pbRDSPTY)][i];
		#endif
	}
	
	return(KISENSE_VFD_LENTH+8);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
//根据状态,判断应该显示的内容
void vRDSNewDisCyc(void)large
{
	BYTE i;
	
	//clear the display buffer
	for(i=0;i<64;i++)
	{
		#ifdef RDS_USE_SM
		vSetSharedInfo(SI_RDS_DISPLAYDATA_ST_ADDR+i,0);
		#else
		*(_pbRDSDisplayData+i)=0;
		#endif
	}

	switch(_bRDSState)
	{
		case RDS_PS_ST :
			_bRDSAllStep=bRDSPSDispPrep();
		break;

		case RDS_PTY_ST:
			_bRDSAllStep=bRDSPTYDispPrep();
		break;

		case RDS_RT_ST:
			_bRDSAllStep=bRDSRTDispPrep();
		break;

		case RDS_CLK_ST:
			_bRDSAllStep=bRDSCLKDispPrep();
		break;

		case RDS_PTN_ST:
			_bRDSAllStep=bRDSPTNDispPrep();
		break;

		default:
			_bRDSAllStep=0;
		break;
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
#ifdef OSD_SHOW_RDS
#define OSD_CHAR_NUMBER	20

static BYTE bCheckRdsCharIndex(BYTE bValue)large
{
	if((bValue>=0x30)&&(bValue<=0x39))//0-9
	{
		return(bValue);
	}
	else if((bValue>=0x41)&&(bValue<=0x5a))//A-Z
	{
		return(bValue);
	}
	else if ((bValue>=0x61)&&(bValue<=0x7a))//a-z
	{
		return(bValue);
	}
	else
	{
		return(0x20);//space
	}	
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vOsdShowRDS(BYTE bStep, BYTE *pbRdsData)large
{
	BYTE bRdsStr[OSD_CHAR_NUMBER+1];
	BYTE i = 0;
	BYTE bTemp;	
	
	_wStartX = TUNER_BRW_MSG_START_X;
	_wStartY = TUNER_BRW_MSG_START_Y;
	_wEndX = TUNER_BRW_MSG_END_X;
	_wEndY = TUNER_BRW_MSG_END_Y;
	vSetMsgCol4(WB_TUNER_MENU, TUNER_MENU_BG, TUNER_MENU_BG, TUNER_MENU_BG, TUNER_MENU_YELLOW);

	bTemp = OSD_CHAR_NUMBER * (bStep / OSD_CHAR_NUMBER);

	for(i=0;i<OSD_CHAR_NUMBER+1;i++) bRdsStr[i]=0x20;//space
	
	for(i = 0; i < ((bStep%OSD_CHAR_NUMBER)+1); i++)
	{
		if((bTemp+i)>=64)
		{
			bRdsStr[OSD_CHAR_NUMBER-((bStep%OSD_CHAR_NUMBER)-i)] = 0X20;//space
		}
		else
		{
			#ifdef RDS_USE_SM
			bRdsStr[OSD_CHAR_NUMBER-((bStep%OSD_CHAR_NUMBER)-i)] = bCheckRdsCharIndex(bSharedInfo(SI_RDS_DISPLAYDATA_ST_ADDR+bTemp+i));
			#else
			bRdsStr[OSD_CHAR_NUMBER-((bStep%OSD_CHAR_NUMBER)-i)] = bCheckRdsCharIndex(pbRdsData[bTemp+i]);
			#endif
		}
	}
	
	if((bStep/OSD_CHAR_NUMBER) != 0)
	{
		bTemp = (bStep/OSD_CHAR_NUMBER-1)*OSD_CHAR_NUMBER+((bStep%OSD_CHAR_NUMBER)+1);
		for(i=0; i<(OSD_CHAR_NUMBER-((bStep%OSD_CHAR_NUMBER)+1)); i++)
		{     
			if((bTemp+i)>=64)
			{
				bRdsStr[i+1] = 0X20;//space
			}
			else
			{
				#ifdef RDS_USE_SM
				bRdsStr[i+1] = bCheckRdsCharIndex(bSharedInfo(SI_RDS_DISPLAYDATA_ST_ADDR+bTemp+i));
				#else
				 bRdsStr[i+1] = bCheckRdsCharIndex(pbRdsData[bTemp+i]);
				#endif
			}
		}
	}

	bRdsStr[0] = OSD_CHAR_NUMBER;
	vRectangle(WB_TUNER_MENU, 0, 0, TRUE, TUNER_MENU_BG);
	vOsdShowStrXY(TUNER_BRW_MSG_START_X, TUNER_BRW_MSG_START_Y, WB_TUNER_MENU, bRdsStr);
}
#endif

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vRDSDispProc(void)large
{
	if(!_vTempLoseRDS)
	{
		#ifdef RDS_USE_SM
		VfdShowRDSInfor( _bCurRDSStep, 0);
		#else
		VfdShowRDSInfor( _bCurRDSStep, _pbRDSDisplayData);
		#endif

		#ifdef OSD_SHOW_RDS
		_bScrSaverBeepCnt = 125;
		#ifdef RDS_USE_SM
		vOsdShowRDS(_bCurRDSStep, 0);
		#else
		vOsdShowRDS(_bCurRDSStep, _pbRDSDisplayData);
		#endif
		#endif

		_bCurRDSStep++;


		if(_bCurRDSStep==_bRDSAllStep)
		{
			_bCurRDSStep=0;
			vRDSNewDisCyc();
		}

		_bTimeCnt=RDS_DISP_INTER;
	}
	else
	{
		vRDSSHOWCLR();
	}
	
	#ifdef RDS_BU1924_TWO_DET
	if(!bReadRdsSync())
	{
		vRDSSHOWCLR();			//   无RDS 信号时时消失RDS
	}
	#endif
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vResetRDSMsgSyncfg(void)large
{
	_rRDS.fgRDSPS=FALSE;
	_rRDS.fgRDSPTY=FALSE;
	_rRDS.fgRDSRT=FALSE;
	_rRDS.fgRDSCLK=FALSE;
	_rRDS.fgRDSPTN=FALSE;
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vResetRDSMsgSync(void)large
{
	BYTE i;
	
	//seg address reset	
	_rRDS.wfgRdsSeg=0;
	//group 2 test a/b flag set as a
	_rRDS.fgGrp2CurTextAB=0;
	_rRDS.fgGrp2LasTextAB=0;
	//msg sync flag
	_rRDS.fgRDSMsgSync=0;
	//sync group  id
	_rRDS.bRDSGrpIdSync=0;
	//clear display data
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vResetRDSBlkSync(void)large
{
	_rRDS.fgRDSBlkSync=0;
	_rRDS.fgRDSBlkEnd=0;
	_rRDS.fgRDSStep=0;
	#ifdef RDS_USE_BU1924
	*(_bSequence) = 0xff;
	#endif
}

#ifdef RDS_USE_BU1924
/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vResetRDSDet(void)large
{
	BYTE i;
	
	_rRDS.fgRDSSync=FALSE;
	_rRDS.fgRDS_CLK=FALSE;
	_rRDS.fgNextData=TRUE;
	_rRDS.fgRDSBitData=FALSE;

	_bRDS_data = 0;//26 bit
	_wSyndrome = 0;//10 bit
	*(_bSequence) = 0xff;//8 bit
	for(i=0;i<12;i++)
	{
		*(_pbGroupData+i) =0; 	//' 不可清除,否则无RDS显示
	}

}
#endif

#ifndef TEMP_RDS
/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vResetRDSVar(void)large
{
	//init the rds varabile
	#ifdef RDS_BU1924_NEW_TIMER
	*(_bRDSTimerState)=0;

	*(_bSequence)=0xff;
	#endif
	_bRDSAllStep=0;
	//for test data
	_bRDSState=0;
	#ifdef RDS_USE_BU1924
	vResetRDSDet();
	#endif
	vResetRDSBlkSync();  
	vResetRDSMsgSync();
	vResetRDSMsgSyncfg();
	_vHasRDSINFO=FALSE;
	_vTempLoseRDS=TRUE;
	RDSRECEIVESUM=0;
	_VfdIsLighting=FALSE;
}
#endif

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
BOOL fgParseRDSGroup0()large
{
	BYTE bPsSegaddr;
	
	//get program  type
	#ifdef RDS_USE_SM
	BYTE bByte;

	bByte=((*(_pbGroupData+4))&0x03)<<3;//前2位
	bByte+=((*(_pbGroupData+5))&0xe0)>>5;//后3位
	vSetSharedInfo(SI_RDS_PTY_ST_ADDR, bByte);
	#else
	*( _pbRDSPTY)=((*(_pbGroupData+4))&0x03)<<3;//前2位
	*( _pbRDSPTY)+=((*(_pbGroupData+5))&0xe0)>>5;//后3位
	#endif
	//组2的第98765位
	//set the flag of program type 
	_rRDS.fgRDSPTY=TRUE;

	bPsSegaddr=(*(_pbGroupData+5))&0x03;
	//PS段地址
	if(!_rRDS.fgRDSMsgSync)
	{
		if(bPsSegaddr==0)
		{
			_rRDS.fgRDSMsgSync=1;
			_rRDS.bRDSGrpIdSync=0;
		}
	}
	//if receive the seg then set the bit of flag
	if(_rRDS.fgRDSMsgSync)
	{
		//get program service name 
		_rRDS.wfgRdsSeg=_rRDS.wfgRdsSeg|(1<<bPsSegaddr);
		#ifdef RDS_USE_SM
		vSetSharedInfo(SI_RDS_PS_NAME_ST_ADDR+bPsSegaddr*2, *(_pbGroupData+10));//vSetSharedInfo(SI_RDS_PS_NAME_ST_ADDR+bPsSegaddr*2, bSharedInfo(SI_RDS_GROUP_DATA_ST_ADDR+10));
		vSetSharedInfo(SI_RDS_PS_NAME_ST_ADDR+bPsSegaddr*2+1, *(_pbGroupData+11));//vSetSharedInfo(SI_RDS_PS_NAME_ST_ADDR+bPsSegaddr*2+1, bSharedInfo(SI_RDS_GROUP_DATA_ST_ADDR+11));
		#else
		*( _pbRDSPsName+bPsSegaddr*2)=*(_pbGroupData+10);
		*( _pbRDSPsName+bPsSegaddr*2+1)=*(_pbGroupData+11);
		#endif

		if((_rRDS.wfgRdsSeg&0x000f)==GROUP_0_SEG)
		{
			//set the flag of programe service name 
			_rRDS.fgRDSPS=TRUE;
			//group 0 display data collect finished 
			return(TRUE);
		}
	} 
	return (FALSE);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
BOOL fgParseRDSGroup2(void)large
{
	BYTE bPsSegaddr;
	BOOL fgGroupAB;
	BOOL fgRTMsgEnd=FALSE;
	
	//get group type 2a/2b
	if((*(_pbGroupData+4))&0x08)
	{
		fgGroupAB=TRUE;//group 2b
	}
	else
	{
		fgGroupAB=FALSE;//group 2a
	}

	//get text a/b flag 
	//what is the use of fgGrp2CurTextAB?
	if((*(_pbGroupData+5))&0x10)
	{
		_rRDS.fgGrp2CurTextAB=1;
	}
	else
	{
		_rRDS.fgGrp2CurTextAB=0;
	}

	//seg address
	bPsSegaddr=(*(_pbGroupData+5))&0x0f;
	if(!_rRDS.fgRDSMsgSync)
	{
		if(bPsSegaddr==0)
		{
			_rRDS.fgRDSMsgSync=1;
			//init the last text flag
			_rRDS.fgGrp2LasTextAB= _rRDS.fgGrp2CurTextAB;
			_rRDS.bRDSGrpIdSync=2;
		}
	}
	//if receive the seg then set the bit of flag
	if(_rRDS.fgRDSMsgSync)
	{
		_rRDS.wfgRdsSeg=_rRDS.wfgRdsSeg|(1<<bPsSegaddr);
		if(fgGroupAB) 
		{
			//group 2b just 2 characters
			#ifdef RDS_USE_SM
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*2, *(_pbGroupData+10));
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*2+1, *(_pbGroupData+11));
			#else
			*( _pbRDSRT+bPsSegaddr*2)=*(_pbGroupData+10);
			*( _pbRDSRT+bPsSegaddr*2+1)=*(_pbGroupData+11);
			#endif
			if((*(_pbGroupData+10)==0X0D)||(*(_pbGroupData+11)==0X0D))
			{
				fgRTMsgEnd=TRUE;
			}  			
		}
		else
		{
			//group 2a  4 characters
			#ifdef RDS_USE_SM
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*4, *(_pbGroupData+7));
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*4+1, *(_pbGroupData+8));
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*4+2, *(_pbGroupData+10));
			vSetSharedInfo(SI_RDS_RT_ST_ADDR+bPsSegaddr*4+3, *(_pbGroupData+11));
			#else
			*( _pbRDSRT+bPsSegaddr*4)=*(_pbGroupData+7);
			*( _pbRDSRT+bPsSegaddr*4+1)=*(_pbGroupData+8);
			*( _pbRDSRT+bPsSegaddr*4+2)=*(_pbGroupData+10);
			*( _pbRDSRT+bPsSegaddr*4+3)=*(_pbGroupData+11);
			#endif
			if((*(_pbGroupData+7)==0X0D)||(*(_pbGroupData+8)==0X0D)||
			(*(_pbGroupData+10)==0X0D)||
			(*(_pbGroupData+11)==0X0D))
			{
				fgRTMsgEnd=TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -