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

📄 rds.c

📁 lc72130.收音机软件 #include "saa6588.c" #include "ba1924.c"
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
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 + -