?? radiomodulerdsapi.c
字號:
//***************************************************************
// ARM BOOT ROUTE VER1.0 for NXP_ARM release
// bjwork2007@gmail.com
// chenjun @ 2008-7-19
//***************************************************************
#include "..\inc\usart.h"
#include "..\inc\common.h"
#include "..\inc\rtc.h"
#include "..\inc\AppDemo.h"
#include "..\inc\RadioModuleHwDrv.h"
#include "..\inc\RadioModuleTypeDEF.h"
#include "..\inc\RadioModuleSwCmd.h"
#include "..\inc\RadioModuleGUI.h"
#include "..\inc\RadioModuleAPI.h"
#include "..\inc\RadioModuleRDSAPI.h"
#ifdef UseSI473X_Radio
#ifdef Radio_Module_GUI
RM_U8 LineNum;
#endif
RDSInfoStruct RDSInfo;
RDSInfoStruct PreRDSInfo;
typedef int (*cmdproc)(FmRDSDataStruct Data);
typedef struct {
#ifdef Radio_Module_Console_Debug
char *GroupType;
#endif
cmdproc proc;
}RDS_Proc_Struct;
RDS_Proc_Struct RDS_PROC_ARRAY[] = {
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 0A",
#endif
GroupType0A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 0B",
#endif
GroupType0B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 1A",
#endif
GroupType1A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 1B",
#endif
GroupType1B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 2A",
#endif
GroupType2A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 2B",
#endif
GroupType2B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 3A",
#endif
GroupType3A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType3B_proc}, //GroupType3B
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 4A",
#endif
GroupType4A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType4B
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 5A",
#endif
GroupType5A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 5B",
#endif
GroupType5B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 6A",
#endif
GroupType6A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 6B",
#endif
GroupType6B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 7A",
#endif
GroupType7A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType7B
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 8A",
#endif
GroupType8A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType8B
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 9A",
#endif
GroupType9A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType9B
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType10A
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType10B
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType11A
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType11B
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType12A
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType12B
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType13A
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType13B
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 14A",
#endif
GroupType14A_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 14B",
#endif
GroupType14B_proc}, //
{
#ifdef Radio_Module_Console_Debug
"Get Undef GroupType",
#endif
GroupType_Undef_proc}, //GroupType15A
{
#ifdef Radio_Module_Console_Debug
"Get GroupType 15B",
#endif
GroupType15B_proc}, //
{
#ifdef Radio_Module_Console_Debug
NULL,
#endif
NULL}
};
char *PTY_Name[] = {
{"None"},//00
{"News"},//01
{"Current Affairs"},//02
{"Infomation"},//03
{"Sport"},//04
{"Education"},//05
{"Drama"},//06
{"Cultures"},//07
{"Science"},//08
{"Varied Speech"},//09
{"Pop Music"},//10
{"Rock Music"},//11
{"Easy Listening"},//12
{"Light Classics M"},//13
{"Serious Classics"},//14
{"Other Music"},//15
{"Weather & Metr"},//16
{"Finance"},//17
{"Children's Progs"},//18
{"Social Affairs"},//19
{"Religion"},//20
{"Phone In"},//21
{"Travel & Touring"},//22
{"Leisure & Hobby"},//23
{"Jazz Music"},//24
{"Country Music"},//25
{"National Music"},//26
{"Oldies Music"},//27
{"Folk Music"},//28
{"Documentary"},//29
{"Alarm Test"},//30
{"ALarm-Alarm!"},//31
{NULL}
};
char *MS_Info[] = {
{"Speech"},
{"Music"},
{NULL}
};
char *DI_EXP[] = {
{"SPTY + Not compressed Mono"},
{"SPTY + Not compressed Stereo"},
{"Undef"},
{"SPTY + Not compressed Artifical Head Stereo"},
{"SPTY + Compressed Mono"},
{"SPTY + Compressed Stereo"},
{"Undef"},
{"SPTY + Compressed Artifical Head Stereo"},
{"DPTY + Not compressed Mono"},
{"DPTY + Not compressed Stereo"},
{"Undef"},
{"DPTY + Not compressed Artifical Head Stereo"},
{"DPTY + Compressed Mono"},
{"DPTY + Compressed Stereo"},
{"Undef"},
{"DPTY + Compressed Artifical Head Stereo"},
{NULL}
};
#ifdef Radio_Module_Console_Debug
char *TP_TA_EXP[] = {
{"This programme does not carry traffic announcements nor does it\n refer,via EON,to a programme that docs!"},
{"This programme carries EON information about another programme \n which gives traffic information!"},
{"This programme carries traffic announcements but none are being\n broadcast at present and may also carry EON information about\n other traffic announcements!"},
{"A traffic announcement is being broadcast on this programme at present!"},
{NULL}
};
#endif
RM_U8 Set_RDS_Data(RM_U8 *BlockAH,FmRDSDataStruct *RDSData)
{
RM_U8 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));
#ifdef RDS_Data_Console_Debug
printf("%.4x . %.4x . %.4x . %.4x %s\n",RDSData->BlockA,
RDSData->BlockB,
RDSData->BlockC,
RDSData->BlockD,
RDS_PROC_ARRAY[((RDSData->BlockB & GroupType_Mask) >> 11)].GroupType);
#endif
#ifdef Radio_Module_GUI
RM_DrawColorWindow(RDS_Title_Bk_Color,8,66,60,12);
#endif
return OK;
}
else//存在不可糾正的錯誤
{
#ifdef Radio_Module_Console_Debug
puts("Found RDS Data Block Uncorrect Error!\n");
#endif
#ifdef Radio_Module_GUI
LCD_printf(10,66,Level_3_Color,0x0000,AlignLeft,True,False,"DataError");
#endif
// Init_RDSInfo();
return RDSDataIncUncorrectErr;
}
}
void RDS_Data_Proc(FmRDSDataStruct *RDSData,RM_U8 RDSDataLen)
{
RM_U8 i;
#ifdef Radio_Module_GUI
if(RDSDataLen!=0)
RM_DrawColorWindow(RDS_Title_Bk_Color,8,66,60,12);
#endif
#ifdef Radio_Module_Console_Debug
if(RDSDataLen!=0)
printf("\n\nFifo_counter:%d\n",RDSDataLen);
#endif
if(RDSDataLen!=0)
RDSInfo.RDS_PI = RDSData->BlockA;
RDSInfo.Available = False;
for(i=0;i<RDSDataLen;i++)
{
RDSInfo.Available = True;
if(((RDSData+i)->BlockA) != RDSInfo.RDS_PI)//得到錯誤的PI碼
{
#ifdef Radio_Module_Console_Debug
Debug_RDS_Data(*(RDSData+i));
#endif
#ifdef Radio_Module_GUI
LCD_printf(10,66,Level_3_Color,0x0000,AlignLeft,True,False,"ProcError");
Init_RDSInfo();
#endif
RDSInfo.Available = False;
return;
}
if(RDS_PROC_ARRAY[(((RDSData+i)->BlockB & GroupType_Mask) >> 11)].proc(*(RDSData+i))!=OK)
{
#ifdef Radio_Module_GUI
Init_RDSInfo();
#endif
RDSInfo.Available = False;
return;
}
}
#ifdef Radio_Module_Console_Debug
if(RDSDataLen!=0)
putch('\n');
#endif
#ifdef Radio_Module_GUI
Lcd_disp_RDS_Flag(FM_RDS_VAL_F);
#endif
//Start_process_rds_data
if((FM_RDS_VAL_F & RDS_F & ~RDS_SYNC) == 0)
{
#ifdef Radio_Module_GUI
Init_RDSInfo();
#endif
}
if(RDSDataLen!=0)
{
#ifdef Radio_Module_Console_Debug
Debug_RDS_Decoded_Info();
#endif
#ifdef Radio_Module_GUI
LCD_Disp_RDS_Decoded_Info();
#endif
}
return;
}
RM_U16 Get_AF_Freq(RM_U8 Freq_Index)
{
if((Freq_Index == 0) || (Freq_Index == 0xcd))
return 0;
else if((Freq_Index > 0) && (Freq_Index < 0xcd))
return (8750 + Freq_Index*10);
else if((Freq_Index > 0xcd) && (Freq_Index < 0xd4))
return (8700 + (Freq_Index - 0xce) * 10);
else if((Freq_Index > 0xdf) && (Freq_Index < 0xfa))
return (Freq_Index - 0xe0);
else
return 0xffff;
}
//---------------------------- Start Group Type Data Process ----------------------------//
int GroupType0A_proc(FmRDSDataStruct FmRDSData)//Basic tuning and switching information 0A
{
RM_U8 PS_C_NUM;
RM_U8 AF_Index;
GroupType0B_proc(FmRDSData);
FM_RDS_VAL_F |= RDS_AF_F;
PS_C_NUM = (FmRDSData.BlockB & PS_C_Mask);
AF_Index = (RM_U8)((FmRDSData.BlockC & AF_H_Mask)>>8);
if((AF_Index > 0xdf) && (AF_Index < 0xfa))
RDSInfo.AF_Number = (RM_U8)(Get_AF_Freq(AF_Index));
else
RDSInfo.AF_Table[PS_C_NUM*2 - 1] = Get_AF_Freq(AF_Index);
RDSInfo.AF_Table[PS_C_NUM*2] = Get_AF_Freq((RM_U8)(FmRDSData.BlockC & AF_L_Mask));
return OK;
}
int GroupType0B_proc(FmRDSDataStruct FmRDSData)//Basic tuning and switching information 0B
{
RM_U8 PS_C_NUM;
#ifdef Radio_Module_Console_Debug
Debug_RDS_Data(FmRDSData);
#endif
#ifdef Radio_Module_GUI
FM_RDS_VAL_F |= (RDS_PI_F|RDS_PS_F|RDS_TP_F|RDS_TA_F|RDS_PTY_F|RDS_M_S_F|RDS_DI_F);
FM_RDS_VAL_F &= ~RDS_AF_F;
#endif
RDSInfo.PTY = (FmRDSData.BlockB & PTY_Mask) >> 5;//Set PTY
PS_C_NUM = (FmRDSData.BlockB & PS_C_Mask);
RDSInfo.PS[PS_C_NUM*2] = (FmRDSData.BlockD & AF_H_Mask)>>8;
RDSInfo.PS[PS_C_NUM*2 + 1] = FmRDSData.BlockD & AF_L_Mask;
if((FmRDSData.BlockB & 0x4)==0)
RDSInfo.DI &= ~(1<<(3-PS_C_NUM));
else
RDSInfo.DI |= 1<<(3-PS_C_NUM);
RDSInfo.TP_TA = ((FmRDSData.BlockB & TP_Mask) >> 9)|((FmRDSData.BlockB & TA_Mask) >> 4);
RDSInfo.MS = (FmRDSData.BlockB & MS_Mask) >> 3;
return OK;
}
int GroupType1A_proc(FmRDSDataStruct FmRDSData)
{
GroupType1B_proc(FmRDSData);
RDSInfo.LA = (FmRDSData.BlockC & LA_Mask) >> 15;
RDSInfo.VarinatCode = (FmRDSData.BlockC & VC_Mask) >> 12;
switch(RDSInfo.VarinatCode)
{
case 0:RDSInfo.ECC = FmRDSData.BlockC & ECC_Mask;break;
case 1:RDSInfo.TMC_ID = FmRDSData.BlockC & SLC_Mask;break;
case 2:RDSInfo.PG_ID = FmRDSData.BlockC & SLC_Mask;break;
case 3:RDSInfo.LangCode = FmRDSData.BlockC & SLC_Mask;break;
case 7:RDSInfo.EWS_ID = FmRDSData.BlockC & SLC_Mask;break;
default:break;
}
return OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -