📄 tunerrds.c
字号:
{' ',' ','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 + -