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

📄 radiomodulerdsapi.c

📁 SI47**系列DSP的收音芯片驱动C源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	int GroupType1B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		#ifdef Radio_Module_GUI
			FM_RDS_VAL_F |= (RDS_PI_F|RDS_TP_F|RDS_PTY_F|RDS_PIN_F);	
		#endif
		RDSInfo.DAY = (FmRDSData.BlockD & DAY_Mask) >> 11;
		RDSInfo.HOUR = (FmRDSData.BlockD & HOUR_Mask) >> 6;
		RDSInfo.MIN = FmRDSData.BlockD & MIN_Mask;		
		return OK;
	}
	
	int GroupType2A_proc(FmRDSDataStruct FmRDSData)
	{
		RM_U8 CUR_AB_F;
		RM_U8 CAdd;
		
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		#ifdef Radio_Module_GUI
			FM_RDS_VAL_F |= (RDS_PI_F|RDS_TP_F|RDS_PTY_F|RDS_RT_F);	
		#endif
		
		CUR_AB_F = (FmRDSData.BlockB & RT_AB_Mask) >> 4;
		
		if(CUR_AB_F != RDSInfo.RT_AB_F)
		{
			RDSInfo.RT_AB_F = CUR_AB_F;
			#ifdef Radio_Module_Console_Debug
			#ifdef Radio_Module_GUI
			Init_RT_seg();
			#endif
			#endif
		}
		
		CAdd = FmRDSData.BlockB & CAdd_Mask;
		
		RDSInfo.RT[CAdd*4] = (FmRDSData.BlockC & RT_H_Mask) >> 8;
		RDSInfo.RT[CAdd*4+1] = FmRDSData.BlockC & RT_L_Mask;
		RDSInfo.RT[CAdd*4+2] = (FmRDSData.BlockD & RT_H_Mask) >> 8;
		RDSInfo.RT[CAdd*4+3] = FmRDSData.BlockD & RT_L_Mask;
		
		return OK;
	}
	
	int GroupType2B_proc(FmRDSDataStruct FmRDSData)
	{
		RM_U8 CUR_AB_F;
		RM_U8 CAdd;
		
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		#ifdef Radio_Module_GUI
			FM_RDS_VAL_F |= (RDS_PI_F|RDS_TP_F|RDS_PTY_F|RDS_RT_F);	
		#endif
		
		CUR_AB_F = (FmRDSData.BlockB & RT_AB_Mask) >> 4;
		
		if(CUR_AB_F != RDSInfo.RT_AB_F)
		{
			RDSInfo.RT_AB_F = CUR_AB_F;
			#ifdef Radio_Module_Console_Debug
			#ifdef Radio_Module_GUI
			Init_RT_seg();
			#endif
			#endif
		}
		
		CAdd = FmRDSData.BlockB & CAdd_Mask;
		
		RDSInfo.RT[CAdd*4] = (FmRDSData.BlockD & RT_H_Mask) >> 8;
		RDSInfo.RT[CAdd*4+1] = FmRDSData.BlockD & RT_L_Mask;
		
		return OK;
	}
	
	int GroupType3A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType3B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType4A_proc(FmRDSDataStruct FmRDSData)
	{
		RM_U32	MJD;
		RM_U8	K;
		RM_U16	Yp,Mp,D;
		RM_U8	Tmp[8];
	
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		#ifdef Radio_Module_GUI
			FM_RDS_VAL_F |= (RDS_PI_F|RDS_CT_F);	
		#endif
		
		MJD = ((FmRDSData.BlockB & CT_MJD_H_Mask) << 15) | ((FmRDSData.BlockC & CT_MJD_L_Mask) >> 1);
		//printf("MJD=%d\n",MJD);
		RDSInfo.CT_HOUR = ((FmRDSData.BlockC & CT_HOUR_H_Mask) << 4) | ((FmRDSData.BlockD & CT_HOUR_L_Mask) >> 12);
		RDSInfo.CT_MIN = ((FmRDSData.BlockD & CT_Min_Mask) >> 6);
		RDSInfo.CT_P_M_F = FmRDSData.BlockD & CT_P_M_Mask;
		RDSInfo.CT_LTO = FmRDSData.BlockD & CT_LTO_Mask;
		
		Yp = (RM_U16)((MJD - 15078.2)/365.25);
		Mp = (RM_U16)((MJD - 14956.1 - (RM_U16)(Yp * 365.25))/30.6001);
		D = (RM_U16)(MJD-14956 -(RM_U16)(Yp * 365.25) - (RM_U16)(Mp * 30.6001));
		if((Mp == 14) || (Mp == 15))
			K = 1;
		else
			K = 0;
		RDSInfo.CT_YEAR = (RM_U16)(1900 + Yp + K);
		RDSInfo.CT_MON = (RM_U8)((Mp - 1 - (K * 12)) & 0xff);
		RDSInfo.CT_DAY = (RM_U8)(D & 0xff);
		RDSInfo.CT_WEEK = ((MJD + 2) % 7) + 1;


	    Tmp[0] = 0x00;
	    Tmp[1] = RDSInfo.CT_MIN;
	    Tmp[2] = RDSInfo.CT_HOUR;
	    Tmp[3] = RDSInfo.CT_WEEK;
	    Tmp[4] = RDSInfo.CT_DAY;
	    Tmp[5] = RDSInfo.CT_MON;
	    Tmp[6] = (unsigned char)(RDSInfo.CT_YEAR & 0xff);
	    Tmp[7] = (unsigned char)((RDSInfo.CT_YEAR & 0xff00) >> 8);
		SetRTC(Tmp);
		
		return OK;
	}
	
	int GroupType5A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType5B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType6A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType6B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType7A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType8A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType9A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
		
	int GroupType14A_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType14B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
	
	int GroupType15B_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		
		return OK;
	}
		
	int GroupType_Undef_proc(FmRDSDataStruct FmRDSData)
	{
		#ifdef Radio_Module_Console_Debug
			Debug_RDS_Data(FmRDSData);
		#endif
		#ifdef Radio_Module_GUI
			LCD_printf(10,66,Level_3_Color,0x0000,AlignLeft,True,False,"ProcError");
			Init_RDSInfo();
		#endif
		return RDSProcessError;
	}

	#ifdef Radio_Module_Console_Debug
	
		void Debug_RDS_Data(FmRDSDataStruct FmRDSData)
		{
			printf("%.4x . %.4x . %.4x . %.4x   %s\n",FmRDSData.BlockA, FmRDSData.BlockB, FmRDSData.BlockC, FmRDSData.BlockD,
													  RDS_PROC_ARRAY[((FmRDSData.BlockB & GroupType_Mask) >> 11)].GroupType);
		}
		
		void Debug_RDS_Decoded_Info(void)
		{
			RM_U8 i;
			
			if(RDSInfo.Available == True)
			{
				printf("RDS.PS  :%s\n",RDSInfo.PS);
				printf("RDS.MS  :%s\n",MS_Info[RDSInfo.MS]);
				printf("RDS.DI  :0x%x.%s\n",RDSInfo.DI,DI_EXP[RDSInfo.DI]);
				printf("RDS.PTY :%d.%s\n",RDSInfo.PTY,PTY_Name[RDSInfo.PTY]);
				printf("RDS.TPTA:%s\n",TP_TA_EXP[RDSInfo.TP_TA]);
				printf("RDS.AFs :%d\n",RDSInfo.AF_Number);
				puts("RDS.AFT :");
				for(i=0;i<25;i++)
				{
					if(RDSInfo.AF_Table[i]<10000)
						printf(" %.2d.%.2d   ",RDSInfo.AF_Table[i]/100,RDSInfo.AF_Table[i]%100);
					else
						printf("%.3d.%.2d   ",RDSInfo.AF_Table[i]/100,RDSInfo.AF_Table[i]%100);
					if(i%8==7)
					{
						puts("\n         ");
					}
				}
				putch('\n');
				printf("RDS.DHM:%d-%d:%d,  LA:%d\n",RDSInfo.DAY,RDSInfo.HOUR,RDSInfo.MIN,RDSInfo.LA);
				printf("RDS.ECC:0x%.2x, TMC_ID:0x%.3x, PG_ID:0x%.3x, LangCode:0x%.3x, EWS_ID:0x%.3x\n",RDSInfo.ECC,RDSInfo.TMC_ID,RDSInfo.PG_ID,RDSInfo.LangCode,RDSInfo.EWS_ID);
				printf("RDS.RT:%s\n",RDSInfo.RT);			
				printf("RDS.CT:%.4d-%.2d-%.2d Week%d %.2d:%.2d %c %.2d:00\n",RDSInfo.CT_YEAR,
																		   RDSInfo.CT_MON,
																		   RDSInfo.CT_DAY,
																		   RDSInfo.CT_WEEK,
																		   RDSInfo.CT_HOUR,
																		   RDSInfo.CT_MIN,
																		   ((RDSInfo.CT_P_M_F != 0)?'-':'+'),
																		   RDSInfo.CT_LTO);
				puts("\n                  ");
			}
		}
	
	#endif
	
	#ifdef Radio_Module_GUI
	
		void Init_RDSInfo(void)
		{
			RM_U8 i,j;
			RM_U8 *addr;
			
			i = sizeof(RDSInfo);
			addr = (RM_U8 *)(&RDSInfo);
			
			for(j=0;j<i;j++)
			{
				*addr++ = 0;
			}			
		}
		
		void Init_RT_seg(void)
		{
			RM_U8 i;
			RM_U8 *addr;
			
			addr = (RM_U8 *)(&RDSInfo.RT[0]);
			for(i=0;i<65;i++)
			{
				*addr++ = 0;
			}	
		}
	
		void LCD_Disp_RDS_Decoded_Info(void)
		{
			RM_U8 i;
			
			if(MemChk((RM_U32)(&PreRDSInfo),(RM_U32)(&RDSInfo),sizeof(RDSInfoStruct))!=0)
			{
				MemCpy((RM_U32)(&PreRDSInfo),(RM_U32)(&RDSInfo),sizeof(RDSInfoStruct));
				Draw_RDS_Info_BK();
				if(RDSInfo.Available == True)
				{
					LCD_printf(6,98,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"PS:");LCD_printf(25,98,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%s",RDSInfo.PS);
					LCD_printf(92,98,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"MS:");LCD_printf(111,98,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%s",MS_Info[RDSInfo.MS]);
					LCD_printf(166,98,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"PTY:");LCD_printf(191,98,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%d.%s",RDSInfo.PTY,PTY_Name[RDSInfo.PTY]);
					
					LCD_printf(6,114,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"TP.TA:");LCD_printf(43,114,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%d.%d",((RDSInfo.TP_TA & 2) >> 1),(RDSInfo.TP_TA & 1));
					LCD_printf(77,114,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"DI:");LCD_printf(96,114,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%x",RDSInfo.DI);
					LCD_printf(130,114,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"AF Number:");LCD_printf(191,114,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%.2d",RDSInfo.AF_Number);
					LCD_printf(233,114,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"AF list:");
					
					if(RDSInfo.AF_Table[0]<10000)
						LCD_printf(282,114,RDS_AFT_Color,Title_Fr_Color,AlignLeft,True,False," %.2d.%.2d",RDSInfo.AF_Table[0]/100,RDSInfo.AF_Table[0]%100);
					else
						LCD_printf(282,114,RDS_AFT_Color,Title_Fr_Color,AlignLeft,True,False,"%.3d.%.2d",RDSInfo.AF_Table[0]/100,RDSInfo.AF_Table[0]%100);
					
					for(i=0;i<24;i++)
					{
						if(RDSInfo.AF_Table[i+1]<10000)
							LCD_printf(2+(i%8)*40,130+((i-(i%8))*2),RDS_AFT_Color,Title_Fr_Color,AlignLeft,True,False," %.2d.%.2d",RDSInfo.AF_Table[i+1]/100,RDSInfo.AF_Table[i+1]%100);
						else
							LCD_printf(2+(i%8)*40,130+((i-(i%8))*2),RDS_AFT_Color,Title_Fr_Color,AlignLeft,True,False,"%.3d.%.2d",RDSInfo.AF_Table[i+1]/100,RDSInfo.AF_Table[i+1]%100);
						
					}

					LCD_printf(6,178,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"DHM:");LCD_printf(31,178,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%.2d-%.2d:%.2d",RDSInfo.DAY,RDSInfo.HOUR,RDSInfo.MIN);
					LCD_printf(91,178,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"ECC:");LCD_printf(116,178,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%.2x",RDSInfo.ECC);
					LCD_printf(156,178,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"TMC_ID:");LCD_printf(199,178,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%.3x",RDSInfo.TMC_ID);
					LCD_printf(245,178,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"PG_ID:");LCD_printf(282,178,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%.3x",RDSInfo.PG_ID);
					
					LCD_printf(6,194,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"LANG:");LCD_printf(37,194,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%.3x",RDSInfo.LangCode);
					LCD_printf(79,194,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"EWS_ID:");LCD_printf(122,194,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"0x%.3x",RDSInfo.EWS_ID);
					LCD_printf(164,194,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"LA:");LCD_printf(183,194,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%d",RDSInfo.LA);
									
					LCD_printf(6,210,RDS_Name_Color,List_2_Color,AlignLeft,False,False,"RT:");
					for(i=0;i<47;i++)
						LCD_printf(25+(i*6),210,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%c",RDSInfo.RT[i]);
					LCD_printf(213,194,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%s",(RM_U8 *)(&RDSInfo.RT[47]));
					RM_DrawColorWindow(RDS_Name_Color,308,211,3,1);RM_DrawColorWindow(RDS_Name_Color,308,221,3,1);RM_DrawColorWindow(RDS_Name_Color,311,211,1,11);
					RM_DrawColorWindow(RDS_Name_Color,209,195,3,1);RM_DrawColorWindow(RDS_Name_Color,209,205,3,1);RM_DrawColorWindow(RDS_Name_Color,208,195,1,11);
					RM_DrawColorWindow(RDS_Name_Color,204,208,111,1);RM_DrawColorWindow(RDS_Name_Color,204,200,1,8);RM_DrawColorWindow(RDS_Name_Color,315,208,1,8);
					RM_DrawColorWindow(RDS_Name_Color,204,200,5,1);RM_DrawColorWindow(RDS_Name_Color,311,216,5,1);
					
					LCD_printf(6,226,RDS_Name_Color,List_1_Color,AlignLeft,False,False,"CT:");
					LCD_printf(25,226,Level_3_Color,Title_Fr_Color,AlignLeft,True,False,"%.4d-%.2d-%.2d (Week%d) %.2d:%.2d %c %.2d:00",RDSInfo.CT_YEAR,
																																	   RDSInfo.CT_MON,
																																	   RDSInfo.CT_DAY,
																																	   RDSInfo.CT_WEEK,
																																	   RDSInfo.CT_HOUR,
																																	   RDSInfo.CT_MIN,
																																	   ((RDSInfo.CT_P_M_F != 0)?'-':'+'),
																																	   RDSInfo.CT_LTO);
				}
			}
		}
		
		RM_U8 MemChk(RM_U32 b1add,RM_U32 b2add,RM_U32 bcsize)
		{
		    RM_U32 i;
		    
		    for(i=0;i<bcsize;i++)
		    {
		        if (*((RM_U8 *)(b1add+i)) != *((RM_U8 *)(b2add+i)))
		            return 1;
		    }
		    return 0;
		}
		
		void MemCpy(RM_U32 b1add,RM_U32 b2add,RM_U32 bcsize)
		{
		    RM_U32 i;
		    
		    for(i=0;i<bcsize;i++)
		    {
		        *((RM_U8 *)(b1add+i)) = *((RM_U8 *)(b2add+i));
		    }
		    return;
		}
		
	#endif
	
/////////////////////////////////**************************  App  ************************////////////////////////////////////


unsigned char APP_Set_RDS_Data(unsigned char *BlockAH, FmRDSDataStruct *RDSData)
{
	unsigned char TempChar;
			
	TempChar = *(BlockAH+8);
	if(((TempChar & 0x3)==0x0) && ((TempChar & 0xc)==0x0) && ((TempChar & 0x30)==0x0) && ((TempChar & 0xc0)==0x0))//数据都是正确的
	{
		RDSData->BlockA = (*BlockAH)<<8 | (*(BlockAH+1));
		RDSData->BlockB = (*(BlockAH+2))<<8 | (*(BlockAH+3));
		RDSData->BlockC = (*(BlockAH+4))<<8 | (*(BlockAH+5));
		RDSData->BlockD = (*(BlockAH+6))<<8 | (*(BlockAH+7));
		return OK;
	}
	return RDSDataIncUncorrectErr;
}	
	
void App_RDS_Data_Proc(FmRDSDataStruct *RDSData,RM_U8 RDSDataLen)
{
	RM_U8 i;
	
	if(RDSDataLen!=0)
	{
		RDSInfo.RDS_PI = RDSData->BlockA;
		RDS_logo_View();
	}
		
	RDSInfo.Available = False;
	
	for(i=0;i<RDSDataLen;i++)
	{
		RDSInfo.Available = True;
	
		if(((RDSData+i)->BlockA) != RDSInfo.RDS_PI)//得到错误的PI码
		{
			RDSInfo.Available = False;
			return;
		}
		if(RDS_PROC_ARRAY[(((RDSData+i)->BlockB & GroupType_Mask) >> 11)].proc(*(RDSData+i))!=OK)
		{
			RDSInfo.Available = False;
			return;
		}
	}
	return;
}

#endif

⌨️ 快捷键说明

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