📄 rds.c
字号:
/*
Creator: xiongyuyue 2003-10-24 10:51
Alphanumeric character repertoires(G0) definition
*/
#define __DECL_RDS__
#include "system.h"
#define SUPPORT_BA1924
#define RDS_DBG
#define SUPPORT_G1
#define SUPPORT_G2
#ifdef _SUPPORT_RDS
#ifdef SUPPORT_SAA6588
#include "saa6588.c"
#endif
#ifdef SUPPORT_BA1924
#include "ba1924.c"
#endif
#define SUPPORT_RDS_FUNCTION
#ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 9:29
#ifdef SUPPORT_G2
char radioTextBufA[2][65]; //广播文本,A方式传输
#endif
#ifdef SUPPORT_2B_GP
char radioTextBufB[2][33]; //广播文本,B方式传输
#endif
char programServiceBuf[9]; //PS :program service name,节目业务名
char programTypeNameBuf[9]; //PTY :program Type,节目类型
char programTypeBuf[17]; //PTY :?
char clocktimeBuf[26];
UINT16 txtAreadyFlag,txtBreadyFlag,ptynReadyFlag,ctReadyFlag;
BYTE psReadyFlag,ptyReadyFlag,afReadyFlag;
UINT16 ta,pi;
BYTE radio_text_type = 0;
BYTE cur_pty = 0; //当前设置的pty类型
static BYTE currentAFIndex=0; //当前使用的af表index
UINT16 ptyLastFreq;
extern BYTE seek_start;
UINT16 nTextAb;
#ifdef _PTY_USE_16CHR
char *ptyName[]= {"NONE", "NEWS", "CURRENT AFFAIR", "INFORMATION", //3
"SPORT","EDUCATION", "DRAMA", "CULTURE", //7
"SCIENCE", "VARIED SPEECH", //9
"POP MUSIC", "RICK MUSIC",
"EASY LISTENING", "LIGHT CLASSIC MUSIC", "SERIOUS CLASSICS", "OTHER MUSIC", //15
"WEATHER", "FINANCE", "CHILDRENS PROGS", "SOCLAIL AFFAIRS", //19
"RELIGION", "PHONE IN", "TRAVEL", "LEISURE AND HOBBY", //23
"JAZZ", "COUNTRY", "NATIONAL MUSIC", "OLDIES", //27
"FOLK", "DOCUMENTARY", "ALARM TEST", "ALARM"};
//#else //8字符显示
#endif
#define PTY_USE_FLASH_
#ifdef PTY_USE_FLASH_
__eeprom__ char strPtyNone[] = "PTY NONE";
__eeprom__ char strNews[] = "NEWS";
__eeprom__ char strAffairs[] = "AFFAIRS";
__eeprom__ char strInfo[] = "INFO";
__eeprom__ char strSport[] = "SPORT";
__eeprom__ char strEducate[] = "EDUCATE";
__eeprom__ char strDrama[] = "DRAMA";
__eeprom__ char strCulture[] = "CULTURE";
__eeprom__ char strScience[] = "SCIENCE";
__eeprom__ char strVaried[] = "VARIED";
__eeprom__ char strPopM[] = "POP M";
__eeprom__ char strRockM[] = "ROCK M";
__eeprom__ char strEasyM[] = "EASY M";
__eeprom__ char strLightM[] = "LIGHT M";
__eeprom__ char strClassics[] = "CLASSICS";
__eeprom__ char strOtherM[] = "OTHER M";
__eeprom__ char strWeather[] = "WEATHER";
__eeprom__ char strFinance[] = "FINANCE";
__eeprom__ char strChildren[] = "CHILDREN";
__eeprom__ char strSoclail[] = "SOCLAIL";
__eeprom__ char strReligion[] = "RELIGION";
__eeprom__ char strPhoneIn[] = "PHONE IN";
__eeprom__ char strTravel[] = "TRAVEL";
__eeprom__ char strLeisure[] = "LEISURE";
__eeprom__ char strJazz[] = "JAZZ";
__eeprom__ char strCountry[] = "COUNTRY";
__eeprom__ char strNationM[] = "NATION M";
__eeprom__ char strOldies[] = "OLDIES";
__eeprom__ char strFolkM[] = "FOLK M";
__eeprom__ char strDocument[] = "DOCUMENT";
__eeprom__ char strTest[] = "TEST";
__eeprom__ char strAlarm[] = "ALARM";
char *ptyName[]= { strPtyNone,//"PTY NONE", //0
strNews,//"NEWS", //1
strAffairs,//"AFFAIRS", //2
strInfo,//"INFO", //3
strSport,//"SPORT", //4
strEducate,//"EDUCATE", //5
strDrama,//"DRAMA", //6
strCulture,//"CULTURE", //7
strScience,//"SCIENCE", //8
strVaried,//"VARIED", //9
strPopM,//"POP M", //10
strRockM,//"ROCK M", //11
strEasyM,//"EASY M", //12
strLightM,//"LIGHT M", //13
strClassics,//"CLASSICS", //14
strOtherM,//"OTHER M", //15
strWeather,//"WEATHER", //16
strFinance,//"FINANCE", //17
strChildren,//"CHILDREN", //18
strSoclail,//"SOCLAIL", //19
strReligion,//"RELIGION", //20
strPhoneIn,//"PHONE IN", //21
strTravel,//"TRAVEL", //22
strLeisure,//"LEISURE", //23
strJazz,//"JAZZ", //24
strCountry,//"COUNTRY", //25
strNationM,//"NATION M", //26
strOldies,//"OLDIES", //27
strFolkM,//"FOLK M", //28
strDocument,//"DOCUMENT", //29
strTest,//"TEST", //30
strAlarm,//"ALARM", //31
};
#else
char *ptyName[]= { "PTY NONE", //0
"NEWS", //1
"AFFAIRS", //2
"INFO", //3
"SPORT", //4
"EDUCATE", //5
"DRAMA", //6
"CULTURE", //7
"SCIENCE", //8
"VARIED", //9
"POP M", //10
"ROCK M", //11
"EASY M", //12
"LIGHT M", //13
"CLASSICS", //14
"OTHER M", //15
"WEATHER", //16
"FINANCE", //17
"CHILDREN", //18
"SOCLAIL", //19
"RELIGION", //20
"PHONE IN", //21
"TRAVEL", //22
"LEISURE", //23
"JAZZ", //24
"COUNTRY", //25
"NATION M", //26
"OLDIES", //27
"FOLK M", //28
"DOCUMENT", //29
"TEST", //30
"ALARM"}; //31
//#endif
#endif
//robbin
BYTE afDelayMs=AF_SEEK_DELAY;
void rds_clear_af(void) //add by robbin
{
rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
memset(afTableBuf,0,sizeof(afTableBuf));
}
void rds_clear(void)
{
rds_clear_af();
rds_clear_var();
disp_set_bit(dispBuff,LCD_BIT_PTY,OFF);
disp_set_bit(dispBuff,LCD_BIT_EON,OFF);
disp_set_bit(dispBuff,LCD_BIT_TP,OFF);
disp_set_bit(dispBuff,LCD_BIT_AF,OFF);
}
void rds_clear_var(void)
{
#ifdef SUPPORT_G2
memset(radioTextBufA[0],0,sizeof(radioTextBufA[0]));
memset(radioTextBufA[1],0,sizeof(radioTextBufA[1]));
#endif
#ifdef SUPPORT_2B_GP
memset(radioTextBufB[0],0,sizeof(radioTextBufB[0]));
memset(radioTextBufB[1],0,sizeof(radioTextBufB[1]));
#endif
memset(programServiceBuf,0,sizeof(programServiceBuf));
memset(programTypeNameBuf,0,sizeof(programTypeNameBuf));
memset(programTypeBuf,0,sizeof(programTypeBuf));
memset(clocktimeBuf,0,sizeof(clocktimeBuf));
txtAreadyFlag = 0;
txtBreadyFlag = 0;
ptynReadyFlag = 0;
ctReadyFlag = 0;
psReadyFlag = 0;
ptyReadyFlag = 0;
nCurrentPty = 0; //pty not exist
rdsEONGet = 0;
rdsTPGet = 0;
nRadioTextStart=0;
}
volatile BYTE tp_ch_get=0;
// Basic Tuning and Switching (AF, PS)
void rds_process_group0(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{ //为什么没有AF 的提取?
static UINT16 i,ms,di,ps_seg;
UINT16 gp_ab;
UINT16 tp;
char ch1,ch2;
static UINT16 lastpi;
c=c; //avoid warning
pi=a;
ta =(b>>4) & 0x01; //获得ta信息,播送交通公告or not
ms =(b>>3) & 0x01; //获得M/S码,0播送语言/1播送音乐
di =(b>>2) & 0x01; //表征16种不同的工作模式,
ps_seg=b&0x03; //PS和DI段地址
gp_ab = (b>>11) & 0x01;
//add by Robbin
tp = (b>>10) & 0x01;
if(tp)
{
rdsTPGet = 1;
//tp_ch_get=1;
}else{
rdsTPGet = 0;
//tp_ch_get=0;
}
if(ta)
{
rdsTAGet = 1;
}else{
rdsTAGet = 0;
}
//end of Robbin modify
if(lastpi!=pi) //如果pi改变了,清空programServiceBuf数组
{
psReadyFlag = 0;//告知外部ps被修改
for(i=0;i<8;i++)
programServiceBuf[i]=' ';
}
ch1=d>>8;
ch2=d&0xff;
psReadyFlag |= 0x01<<ps_seg; //判断ps是否ready
programServiceBuf[ps_seg*2]=ch1; //获得ps字符
programServiceBuf[ps_seg*2+1]=ch2;
lastpi=pi;
if(!bRadioSeeking)
{
if(gp_ab == 0) //A方式
{
afTableBuf[ps_seg*2] = c>>8;
afTableBuf[ps_seg*2+1] = c&0xFF;
}
}
return;
}
/*====================================================
====================================================*/
#ifdef SUPPORT_G1
void rds_process_group1(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
UINT8 gp_ab = 0,day = 0,hour =0,min = 0;
a = a;
c = c;
gp_ab = (b>>11) & 0x01; //获得A/B标志,即是以A方式还是B方式传输
if(gp_ab == 0) //_1A type //只对A 方式解码
{
day = (d>>11)&0x1f; //获得时间????
hour = (d>>6)&0x1f;
min = d&0x3f;
}
}
#endif
// Radiotext
#ifdef SUPPORT_G2
void rds_process_group2(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
UINT16 pi,text_ab,txt_seg,gp_ab;
static UINT16 lastab=-1;
static UINT16 lastpi=-1;
pi=a;
text_ab=(b>>4) & 0x01;
txt_seg=b &0x0f;
gp_ab = (b>>11) & 0x01;
radio_text_type = text_ab;
if(text_ab == 0) //A方式
txtAreadyFlag |= 0x01<<txt_seg;
else if(text_ab ==1) //B方式
txtBreadyFlag |= 0x01<<txt_seg;
if(((c&0xff) == 0x0d) || (((c&0xff00)>>8)==0x0d) || ((d&0xff) == 0x0d) || (((d&0xff00)>>8)==0x0d))
{
if((text_ab == 0) && (txtAreadyFlag == (0xffff>>(15-txt_seg))))
{
txtAreadyFlag = 0xffff;
nRadioTextStart =0;//add by robbin
}
else if((text_ab == 1) && (txtBreadyFlag == (0xffff>>(15-txt_seg))))
txtBreadyFlag = 0xffff;
}
if(gp_ab == 0)
{
radioTextBufA[text_ab][txt_seg*4]= c>>8;
radioTextBufA[text_ab][txt_seg*4+1]= c&0xff;
radioTextBufA[text_ab][txt_seg*4+2]= d>>8;
radioTextBufA[text_ab][txt_seg*4+3]= d&0xff;
}
#ifdef RDS_DBG
//if((txtBreadyFlag == 0xffff)||(txtAreadyFlag == 0xffff))
// printf("RT0:%d %s\n",text_ab,radioTextBufA[text_ab]);
#endif
#ifdef SUPPORT_2B_GP
else if(gp_ab == 1)
{
radioTextBufB[text_ab][txt_seg*2] = d>>8;
radioTextBufB[text_ab][txt_seg*2+1] = d&0xff;
#ifdef RDS_DBG
//printf("Radiotext: %s\n",radioTextBufB[text_ab]);
//printf("Group2 Radiotext: a/b=%d text_segment=%2d TEXT=%c%c\n",
//text_ab,txt_seg,radioTextBufB[text_ab][txt_seg*2], radioTextBufB[text_ab][txt_seg*2+1]);
#endif
}
#endif
//printf("*****txtAreadyFlag : %x txtBreadyFlag :%x ****\n",txtAreadyFlag,txtBreadyFlag);
lastpi=pi;
lastab=text_ab;
return;
}
#endif
// Clock-time and date
void rds_process_group4(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
/*static*/ UINT16 sign,mjd,hour,min,utc_offset;
/*static*/ UINT16 y,m,dd,k=0;
UINT8 version_ab = 0;
a =a ;
version_ab=(b>>11) & 0x01;
if(version_ab == 0) //for 4A group
{
mjd= ((b&0x03)<<15) + (c>>1);
hour = ((c&0x01)<<4) + (d>>12);
min = (d>>6) & 0x3f;
sign = (d>>5)&0x01;
utc_offset=d&0x1f; // in 30 min units
y=((mjd * 100 - 1507820))/36525;
m=(mjd*10000 - 149561000 - y * 36525 * 100)/306001;
dd= mjd - 14956 - (y * 36525)/100 - (m * 306001)/10000;
if(m==14 || m==15)
k=1;
else k=0;
y=y+k+1900;
m=m-1-k*12;
if(sign)
hour -= (utc_offset*5)/10;
else
hour += (utc_offset*5)/10;
ctReadyFlag = 0xff;
if((d & 0xff00)==0xff00){
//psprintf(clocktimeBuf,"DATE %d-%d-%d",y,m,dd);
}else{
//psprintf(clocktimeBuf,"DATE %d-%d-%d TIME %02d:%02d",y,m,dd,hour,min);
}
timeNow[_HOUR] = hour;
timeNow[_MINUTE] = min;
#ifdef RDS_DBG
//printf("date %d %d %d %d\n",y,m,dd,(utc_offset*5)/10);
//printf("clk %d %d\n",hour,min);
#endif
}else{
#ifdef RDS_DBG
//printf("4B group\n");
#endif
}
return;
}
// Program type Name (8 char)
void rds_process_group10(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
UINT16 i,pi,last_ab=0,last_pi=0,ptn_seg,flag_ab;
pi=a;
flag_ab=(b>>4) & 0x01;
ptn_seg=b&0x01;
if((last_ab != flag_ab)||(last_pi!=pi))
{
ptynReadyFlag = 0;
for(i=0;i<9;i++)
programTypeNameBuf[i]=' ';
}
ptynReadyFlag |= 0x01<<ptn_seg;
programTypeNameBuf[ptn_seg*4]= c>>8;
programTypeNameBuf[ptn_seg*4+1]= c&0xff;
programTypeNameBuf[ptn_seg*4+2]= d>>8;
programTypeNameBuf[ptn_seg*4+3]= d&0xff;
last_ab=flag_ab;
last_pi=pi;
return;
}
// Enchanged Other Networks infomation
void rds_process_group14(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
#if 1
static UINT16 ms,di,ps_seg;//i,
UINT16 gp_ab,tp;
char ch1,ch2;
static UINT16 lastpi;
c=c; //avoid warning
pi=a;
ta =(b>>4) & 0x01; //获得ta信息,播送交通公告or not
ms =(b>>3) & 0x01; //获得M/S码,0播送语言/1播送音乐
di =(b>>2) & 0x01; //表征16种不同的工作模式,
ps_seg=b&0x03; //PS和DI段地址
gp_ab = (b>>11) & 0x01;
//add by Robbin
tp = (b>>TP) & 0x01;
if(tp)
{
rdsTPGet = 1;
}else{
rdsTPGet = 0;
}
rdsEONGet = 1;//rdsParam |= EON_GET;
//end of Robbin modify
/*
if(lastpi!=pi) //如果pi改变了,清空programServiceBuf数组
{
psReadyFlag = 0;//告知外部ps被修改
for(i=0;i<8;i++)
programServiceBuf[i]=' ';
}
*/
ch1=d>>8;
ch2=d&0xff;
/*
psReadyFlag |= 0x01<<ps_seg; //判断ps是否ready
programServiceBuf[ps_seg*2]=ch1; //获得ps字符
programServiceBuf[ps_seg*2+1]=ch2;
*/
lastpi=pi;
/*
if(gp_ab == 0) //A方式
{
afTableBuf[ps_seg*2] = c>>8;
afTableBuf[ps_seg*2+1] = c&0xFF;
}
*/
#endif
return;
}
void rds_process_group(UINT16 a, UINT16 b, UINT16 c, UINT16 d)
{
UINT16 pi, group_type,version_ab, tp, pty;
static UINT16 prevlastpi=-1,lastpi=-1;
rdsActive = 1;//rdsParam |= RDS_ACTIVE;
pi=a;
group_type= b>>12;
version_ab=(b>>11) & 0x01;
tp =(b>>10) & 0x01;
pty =(b>> 5) & 0x1f;
if(prevlastpi==lastpi && lastpi!=pi)
{
lastpi=pi;
prevlastpi=lastpi;
return;
}
if(pty)
{
//strcpy(programTypeBuf,ptyName[pty]);
//printf("pty %s\n",programTypeBuf);
nCurrentPty = pty;
ptyReadyFlag = 0xFF;
}
#ifdef RDS_DBG
//printf("type %d\n",group_type);
#endif
switch(group_type)
{
case 0:
case 15:
rds_process_group0(a,b,c,d);
break;
#ifdef SUPPORT_G1
case 1:
rds_process_group1(a,b,c,d);
break;
#endif
#ifdef SUPPORT_G2
case 2:
rds_process_group2(a,b,c,d);
break;
#endif
case 4:
rds_process_group4(a,b,c,d);
break;
case 10: //???????????
//Type 10 groups: Programme Type Name (Group type 10A) and Open data (Group type 10B)
rds_process_group10(a,b,c,d);
break;
case 14:
rds_process_group14(a,b,c,d);
break;
default:
//printf("default\n");
break;
}
lastpi=pi;
prevlastpi=lastpi;
}
void rds_process_block(UINT8 id, UINT16 v)
{
static UINT16 blocs[4];
static UINT8 prev;
#ifdef MORE_COMPATIBLE
static BYTE block_rdy_flag = 0;
#endif
#ifdef RDS_DBG
//printf("id %d ",id);
#endif
if ((id==0) || id==prev+1)
{
blocs[id]=v;
if(id==3)
rds_process_group(blocs[0],blocs[1],blocs[2],blocs[3]);
prev=id;
}
else
prev=-1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -