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

📄 rds.c

📁 lc72130.收音机软件 #include "saa6588.c" #include "ba1924.c"
💻 C
📖 第 1 页 / 共 2 页
字号:

char * rds_get_ps(void)
{
	return programServiceBuf;
}

char * rds_get_pty(void)
{
	return programTypeBuf;
}
#ifdef SUPPORT_G2
char * rds_get_rt(BYTE type)
{
	if(type == 0)
		return radioTextBufA[0];
	else if(type == 1)
		return radioTextBufA[1];
	else
		return NULL;
}
#endif
char * rds_get_ct(void)
{
	return clocktimeBuf;
}

char * rds_get_ptyn(void)
{
	return programTypeNameBuf;
}

BYTE * rds_get_af(void)
{
	return afTableBuf;
}
//add by Robbin
UINT16 rds_af_val2freq(BYTE val)
{
	UINT16 freq=DEFAULT_FREQ;
	if(val<=AF_1ST_TABLE_MAX)
	{
		freq = AF_1ST_FREQ_START+(val-1)*10;
	}
	if((val>=AF_2ND_TABLE_START) && (val<=AF_2ND_TABLE_MAX))
	{
		freq = AF_2ND_FREQ_START+(val-1)*10;
	}
	return freq;
}
//add by Robbin

void rds_ta_check(void)
{
	if(!rdsEnable)
		return;
	if(!rdsTAEnable)
	{
		//rdsParam &= ~TA_SEEK;
		rdsTASeek = 0;
		return;
	}
	if(radioBand==AM)
		return;
	if(currentPower>_POWER_OFF)	//if work in DISC or AUX
	{
		if(currentPower>_POWER_RADIO)//AUX && CD
		{
			if(radioBand==AM)//if work at AM, set to FM, ready for RDS
			{
				radio_set_band(FM);
				//radioParam &= ~RA_BAND;//set to FM
				radioBand = FM;
			}
			rds_is_ta_freq();//test is TA freq?
		}

		if(rdsTAEnable && (radioBand==FM))	//if FM TA ON
		{
			if(rdsTASeek)	//如果需要搜索TA
			{
				if(currentPower==_POWER_RADIO)	//当前工作在收音机状态
				{
					rdsTAGet = 0;
					memset(tmpDispBuff,0,sizeof(tmpDispBuff));
					//disp_string(tmpDispBuff,"SEARCH",DISP_6CHAR_START,8);
					disp_string_E(tmpDispBuff,strSearch,DISP_6CHAR_START,8);
					display_buff(tmpDispBuff);
					//sys_delay_loops(5000);
					delay_ms(500);
					if(radioBand==FM)
					{
						muteStart=OFF;
						audio_set_mute(ON);
						radio_ams(radioBand,ON,ON);	//show freq when ta search
					}else{
						//rdsParam &= ~TA_SEEK;
						rdsTASeek = 0;
					}
					bandSetTimeout = BAND_SET_TIMEOUT;
					//rdsParam &= ~TA_SEEK;		//搜索一遍,如果没有则不再搜索
					rdsTASeek = 0;
				}else{							//非收音机状态
					rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;		//dont seek af
					radio_ams(radioBand,ON,OFF);//隐蔽自动搜台
				}
			}
			if(rdsTAGet && rdsTPGet)	//如果正在播放交通信息
			{
				if((currentPower==_POWER_AUX) || (currentPower==_POWER_DISC))//如果处于其它模式
				{
					lastWorkPower = currentPower; //保存当前模式
					preMediaType = currentMediaType;//保存当前媒体类型
//					dvd_save_resume();
					//setPower(_POWER_RADIO);			//切换到收音机
					audio_set_mute(ON);
					delay_ms(200);
					setDvdPow(OFF);
					currentMode=_MODE_RADIO;
					muteTimeout=MUTE_TIMEOUT; 
					muteStart=ON;//// 2006-07-04
					//radio_set_band(FM);					//波段FM
					currentPower=_POWER_RADIO;
					audio_sel_channel(AUDIO_CH_RADIO);
					ta_freq=cur_freq;
					disp_clr_cd_flag();
					disp_radio(dispBuff,RADIO_TYPE_FM1,ta_freq);
					//pll_set_station(FM,ta_freq);			//有TA信息的频率
					//rdsParam |= TA_SEND;			//TA已切换
					rdsTASend = 1;
					//rdsParam &= ~TA_SEEK;			//dont seek TA
					rdsTASeek = 0;
					disp_set_bit(dispBuff,LCD_BIT_TP,ON);
					disp_st(radioParam&RA_ST);
				}
			}
			if(rdsTASend && (!rdsTAGet))//交通信息播放完毕或没有交通信息
			{
				//rdsParam &= ~TA_SEND;
				rdsTASend = 0;
				disp_char(dispBuff,DISP_CHANNEL,' '); 
				if((lastWorkPower==_POWER_DISC)||(lastWorkPower==_POWER_AUX))
				{
					currentMediaType=preMediaType;
					setPower(lastWorkPower);
				}
			}
		}
	}
}
//add by Robbin
void rds_af_flash(void)
{
	if(rdsAFEnable && (radioBand==FM))
	{
		if(rdsAFFlash)
		{
			//if(rdsParam&AF_DISP)	//flash display 'AF'
			if(halfSecond&1)
			{
				//rdsParam &= ~AF_DISP;
				disp_set_bit(dispBuff,LCD_BIT_AF,ON);
			}else{
				//rdsParam |= AF_DISP;
				disp_set_bit(dispBuff,LCD_BIT_AF,OFF);
			}
		}
	}else{
		disp_set_bit(dispBuff,LCD_BIT_AF,OFF);	//AF OFF
	}
}

void rds_seek_ta(void)
{
	if(rdsTAEnable && (radioBand==FM))
	{
		disp_set_bit(dispBuff,LCD_BIT_TA,ON);
		rds_is_ta_freq();
	}
}
void rds_seek_pty(void)
{
	BYTE i;
	if(rdsPTYSeek)
	{
		ptyLastFreq = cur_freq;
		memset(tmpDispBuff,0,sizeof(tmpDispBuff));
		//disp_string(tmpDispBuff,"SEEK PTY",DISP_7CHAR_START,8);
		disp_string_E(tmpDispBuff,strSeekPty,DISP_7CHAR_START,8);
		disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
		//disp_string_E(tmpDispBuff,*(strNameList+PTR_STR_SEEKPTY),DISP_7CHAR_START,8);
		display_buff(tmpDispBuff);
		delay_ms(500);
		radio_ams(FM,ON,ON);
		rdsPTYSeek = 0;//rdsParam &= ~PTY_SEEK;
		if(bit_is_set(PIN_ACC_IN,ACC_IN))
		{
			if(!rdsPTYGet)//没有找到pty
			{
				disp_set_bit(dispBuff,LCD_BIT_PTY,OFF);
				for(i=0;i<3;i++)
				{
					memset(tmpDispBuff,0,sizeof(tmpDispBuff));
					disp_string_E(tmpDispBuff,strPtyNone,DISP_7CHAR_START,8);
					//disp_string(tmpDispBuff,"PTY NONE",DISP_7CHAR_START,8);
					display_buff(tmpDispBuff);
					delay_ms(400);
					memset(tmpDispBuff,0,sizeof(tmpDispBuff));
					display_buff(tmpDispBuff);
					delay_ms(400);
				}
			}else{
				disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
				memset(tmpDispBuff,0,sizeof(tmpDispBuff));
				//strcpy_E(dispStrBuff,*(ptyName+nCurrentPty));
				//disp_string(tmpDispBuff,dispStrBuff,1,8);
				disp_string_E(tmpDispBuff,*(ptyName+nCurrentPty),1,8);
				display_buff(tmpDispBuff);
				delay_ms(500);
			}
		}
		cur_freq = ptyLastFreq;
		pll_set_station(radioBand,cur_freq);
		disp_radio(dispBuff,sub_band,cur_freq);
	}
}
BYTE rds_is_af_freq(UINT16 freq)
{
	BYTE i;
	if((afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+8)))//AF exist
	{
		for(i=0;i<(afTableBuf[0]-AF_CNT_START);i++)
		{
			if(freq==rds_af_val2freq(afTableBuf[i+1]))//频率转换
				return 1;
		}
		return 0;
	}
	return 1;
}

BYTE rds_get_af_max(UINT16 *ptrAfBuff,BYTE len)
{
	UINT16 tmpVal=0;
	BYTE i,index=0;
	for(i=1;i<len;i++)
	{
		if(*(ptrAfBuff+i)>tmpVal)
		{
			tmpVal = *(ptrAfBuff+i);
			index=i;
			if(*(ptrAfBuff+i)>minRdsAfAdc)
				rdsAFGetMax = 1;//rdsParam |= AF_GET_MAX;
		}
		*(ptrAfBuff+i)=0;
	}
	if(rdsAFGetMax)
		return index;
	else 
		return 0;
}
void rds_af_check(void)		//1s运行一次
{
	if(bRadioInPreview || bRadioInAMS)//预览过程中不检测AF
		return;
	if(bRadioSeeking)
		return;
	if((currentPower==_POWER_RADIO) && (radioBand==AM))//AM
		return;
	if(rdsTASeek)		//in seeking not check
	{
		afDelayMs=AF_SEEK_DELAY;
		return;
	}
	if(!rdsEnable)
		return;
	//if((currentPower>_POWER_OFF) && (radioBand==FM))//当使能AF
	if((currentPower==_POWER_RADIO) && (radioBand==FM))//收音模式下使能AF
	{
		if(currentAFIndex<8)
			afSignalMeter[currentAFIndex] = adcValue[AD_SMETER];//保存当前信号强度
		if((adcValue[AD_SMETER]<minRdsAfAdc) && !bRadioSeeking)	//如果信号过于弱
		{
			rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX;	//AF需要重新对比
			//rdsParam &= ~RDS_ACTIVE;	//清除RDS
#if defined(LCD_BIT_ANT)
			disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);
#endif
			if(rdsAFEnable/* && (rdsParam&AF_ACTIVE)*/)
			{
#ifdef USE_AF_SEEK_DELAY
				if(afDelayMs)//等待5秒,如果没有信号则寻找新频率
				{
					afDelayMs--;
				}else{
					rdsTPGet = 0;
					//rdsParam &= ~RDS_ACTIVE;
					if(rdsAFActive)
					{
						rdsAFSeek = 1;//rdsParam |= AF_SEEK;  //标记已经开始寻找新频率
						if(rdsAFGetMax)
							currentAFIndex=0;
					}
				}
#else
				rdsTPGet = 0;
				if(rdsAFActive)
					rdsAFSeek = 1;//rdsParam |= AF_SEEK;  //标记已经开始寻找新频率
#endif
			}else{
				rdsTPGet = 0;
			}
			if(!((afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+9))) ) //AF not exist
			{
				rdsTAGet = 0;
				rdsTPGet = 0;
			}
			if(rdsAFActive)	//当AF激活时启动查找
			{
				if(!rds_is_af_freq(cur_freq) && !(radioParam&RA_AM_WORK))//测试当前频率是否在AF表中存在
				{
					rdsAFSeek = 1;//rdsParam |= AF_SEEK;  //如果不存在,标记已经开始寻找新频率
				}
			}
		}else{//信号增益够
			//rdsParam &= ~TA_SEEK;
#if defined(LCD_BIT_ANT)
			if(currentPower==_POWER_RADIO)
				disp_set_bit(dispBuff,LCD_BIT_ANT,ON);
#endif
			bandSetTimeout = BAND_SET_TIMEOUT;
#ifdef USE_AF_SEEK_DELAY
				afDelayMs=AF_SEEK_DELAY;	//重新置延迟数
#endif
			taSeekTimeout = TA_SEEK_DELAY;
			if(rdsAFGetMax && rdsTPGet)		//获得最大的AF频率才停止
			{
				rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX;
				rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;		//一旦信号增益够,清除
				//currentAFIndex=0;
			}
			currentAFIndex=0;
		}
		//AF表查找,判断是否存在AF表
		if(rdsAFEnable && (afTableBuf[0]>AF_CNT_START) && (afTableBuf[0]<(AF_CNT_START+9)) && (radioBand==FM))//if af exist
		{
			rdsAFActive = 1;//rdsParam |= AF_ACTIVE;
			if(taSeekTimeout==0)
			{
				if(rdsTAEnable)
				{
					rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
					//rdsParam |= TA_SEEK;
					rdsTASeek = 1;
					//memset(afTableBuf,0,sizeof(afTableBuf));//清除AF表
					taSeekTimeout = TA_SEEK_DELAY;
				}else{	//SEEK PI
					memset(tmpDispBuff,0,sizeof(tmpDispBuff));
					//disp_string(tmpDispBuff,"SEEK PI",DISP_7CHAR_START,8);
					disp_string_E(tmpDispBuff,strSeekPi,DISP_7CHAR_START,8);
					//disp_string_E(tmpDispBuff,*(strNameList+PTR_STR_SEEKPI),DISP_7CHAR_START,8);
					display_buff(tmpDispBuff);
					//memset(afTableBuf,0,sizeof(afTableBuf));//清除AF表
					delay_ms(500);
					radio_ams(FM,ON,ON);
					taSeekTimeout = TA_SEEK_DELAY;
				}	
			}
			if(currentPower==_POWER_DISC)
			{
				if(!rdsTPGet)
					rdsAFSeek = 1;//rdsParam |= AF_SEEK;
			}
			if(rdsAFSeek)	//正在AF查找
			{
				rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;//关闭搜索标志
				bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;	//如果正在搜索则停止
				rdsAFFlash = 1;//rdsParam |= AF_FLASH;
				psReadyFlag=0;
				bandSetTimeout = BAND_SET_TIMEOUT;
				if(currentAFIndex<8)
					currentAFIndex++;//移到下一个AF
				else
					currentAFIndex=1;
				rdsTPGet = 0;
				rdsAFGetMax = 0;//rdsParam &= ~AF_GET_MAX;
#ifdef LA1844
				//disp_radio(dispBuff,sub_band,rds_af_val2freq(afTableBuf[currentAFIndex]));
#endif
				if(currentAFIndex>(afTableBuf[0]-AF_CNT_START))//如果到最后一个
				{
					//currentAFIndex=1;//回到第一个,如果TA开启,重新搜索
					currentAFIndex = rds_get_af_max(afSignalMeter,(afTableBuf[0]-AF_CNT_START));//获得最大值
					if(currentAFIndex>0)
					{
						maxRdsFreq = rds_af_val2freq(afTableBuf[currentAFIndex]);//频率转换
#ifdef LA1844
						rdsAFSeek = 0;
#endif
					}else{
						//psReadyFlag = 0;
						if(rdsTASend)
						{
							//rdsParam &= ~TA_SEND;
							//taSeekTimeout = 0;
							rdsTAGet = 0;
						}
						currentAFIndex=1;
					}
					//rdsParam &= ~AF_SEEK;		//停止搜索AF
					
				}
				rds_freq=rds_af_val2freq(afTableBuf[currentAFIndex]);//频率转换
				cur_freq = rds_freq; //add 08-29
				if(!(radioParam&RA_AM_WORK))
					lastFreq = rds_freq;
				if((currentMode==_MODE_RADIO) && (currentMode!=_MODE_MUTE))
				{
					muteStart=ON;
					muteTimeout=MUTE_TIMEOUT2;
					audio_set_mute(ON);
				}
				rds_clear_var();//切台,清除当前RDS信息
				pll_set_station(radioBand,rds_freq); 
				cur_freq = rds_freq;
				//切换AF是否显示频率
				//if(!(radioParam&RA_IN_AMS))//如果台标没准备好
					//disp_radio(dispBuff,sub_band/*RADIO_TYPE_FM1*/,cur_freq);
				if(currentPower==_POWER_RADIO)
					radio_is_preset(radioBand,rds_freq);
			}else{//无须查找AF
				if(radioBand==FM)
					disp_set_bit(dispBuff,LCD_BIT_AF,ON);
				rdsAFFlash = 0;//rdsParam &= ~AF_FLASH;//not flash AF
			}
		}else{
			//rds_af_flash();
			rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
			rdsAFFlash = 1;//rdsParam |= AF_FLASH;
		}
	}else{
		disp_set_bit(dispBuff,LCD_BIT_AF,OFF);
#ifdef USE_AF_SEEK_DELAY
		afDelayMs=AF_SEEK_DELAY;//重新置延迟数
#endif
	}
}

#ifdef PT6578		//只有点阵屏支持广播文本
#define RDS_RT_DISP_DELAY		6	//delay 6 char	
void rds_disp_radio_text(void)
{
	BYTE i=64;
	if(rdsTAGet && rdsTAEnable)
		return;
	if((txtAreadyFlag == 0xffff))
	{
		//i = rds_get_radiotext_len(radioTextBufA[radio_text_type]);
		//	printf("RT0:%d %s\n",text_ab,radioTextBufA[text_ab]);
		while(i--)	//去除尾部空格或非字符
		{
			if(radioTextBufA[radio_text_type][i]<=' ' || radioTextBufA[radio_text_type][i]>'z')
				radioTextBufA[radio_text_type][i]=0;
			else
				break;
		//	if(radioTextBufA[radio_text_type][i]!=' ' && radioTextBufA[radio_text_type][i]!=0)
		//		break;
		}
		if(nRadioTextStart<RDS_RT_DISP_DELAY)//等待3秒,6*500ms
		{	
			disp_string(dispBuff,radioTextBufA[radio_text_type],1,12);	//显示前12字符
		}else{
			disp_string(dispBuff,radioTextBufA[radio_text_type]+nRadioTextStart-RDS_RT_DISP_DELAY,1,12);
			if(radioTextBufA[radio_text_type][nRadioTextStart-RDS_RT_DISP_DELAY]==0)//结束符
				nRadioTextStart=0;
		}

		if(nRadioTextStart<64 && i<(64-12))
			nRadioTextStart++;
		else
			nRadioTextStart=0;
	}
}
#endif
void rds_thread(void)
{
	if(!rdsEnable)
		return;
	if(bRadioInPreview || bRadioInAMS)//预览过程中不检测AF
		return;
	//任何时候都探测TP
	if(rdsTPGet)
	{
		if(radioBand==FM)
			disp_set_bit(dispBuff,LCD_BIT_TP,ON);
		else
			disp_set_bit(dispBuff,LCD_BIT_TP,OFF);
		ta_freq = cur_freq;	//如果获得TP,更新TA频率
		//rdsParam &= ~TA_SEEK;//不重新搜索
		rdsTASeek = 0;
	}else{
		disp_set_bit(dispBuff,LCD_BIT_TP,OFF);
	}
	if(rdsEONGet)
	{
		disp_set_bit(dispBuff,LCD_BIT_EON,ON);
	}else{
		disp_set_bit(dispBuff,LCD_BIT_EON,OFF);
	}
	if((currentMode==_MODE_RADIO) && (radioBand==FM))//radio mode
	{
		//如果当前频道有TA/TP且允许TA,弹出TRAFFIC警告
		if(rdsTAGet && rdsTAEnable && rdsTPGet)
		{
#if defined(PT6523) || defined(PT6524)
			disp_set_bit(dispBuff,LCD_BIT_DOT,OFF);
#endif
			disp_clr_led(dispBuff);
			//disp_string(dispBuff,"TRAFFIC ",DISP_8CHAR_START,8);
			disp_string_E(dispBuff,strTraffic,DISP_8CHAR_START,8);
			radio_is_preset(radioBand,cur_freq);
			//disp_string_E(dispBuff,*(strNameList+PTR_STR_TRAFFIC),DISP_8CHAR_START,8);
		}else{	//否则仅显示台标
			if(psReadyFlag==0x0F)//如果台标准备好
			{
#if defined(PT6523) || defined(PT6524)
				disp_set_bit(dispBuff,LCD_BIT_DOT,OFF);	
#endif
				if(txtAreadyFlag!=0xffff)
				{
					disp_clr_led(dispBuff);
					//for(i=1;i<DISP_8CHAR_START;i++)
					//	disp_char(dispBuff,i,' ');
					disp_string(dispBuff,programServiceBuf,DISP_8CHAR_START,8);
					radio_is_preset(radioBand,cur_freq);
				}
			}
		}
//		//广播文本到达
//		if((txtBreadyFlag == 0xffff))
//		{
//			
//		}
//		if((txtAreadyFlag == 0xffff))
//		{
//			//	printf("RT0:%d %s\n",text_ab,radioTextBufA[text_ab]);
//#ifndef LCD_393
//			//disp_string(dispBuff,radioTextBufA[radio_text_type],1,12);
//#endif
//		}
		if(ptyReadyFlag==0xFF)
		{
			disp_set_bit(dispBuff,LCD_BIT_PTY,ON);
		}else{
			disp_set_bit(dispBuff,LCD_BIT_PTY,OFF);
		}
	}
}
#endif
#endif /*SUPPORT_RDS_FUNCTION*/

⌨️ 快捷键说明

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