3 #include "fm_typedef.h"
5 //FM_RDS_DATA_CRC_FFOST
6 #define FM_RDS_GDBK_IND_A (0x08)
7 #define FM_RDS_GDBK_IND_B (0x04)
8 #define FM_RDS_GDBK_IND_C (0x02)
9 #define FM_RDS_GDBK_IND_D (0x01)
10 #define FM_RDS_DCO_FIFO_OFST (0x01E0)
11 #define FM_RDS_READ_DELAY (0x80)
13 #define RDS_RX_BLOCK_PER_GROUP (4)
14 #define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP)
15 #define MAX_RDS_RX_GROUP_CNT (12)
16 #define RDS_RT_MULTI_REV_TH 100
18 typedef struct rds_packet_t {
23 fm_u16 cbc; //correct bit cnt
24 fm_u16 crc; //crc checksum
27 typedef struct rds_rx_t {
30 rds_packet_t data[MAX_RDS_RX_GROUP_CNT];
33 typedef enum rds_ps_state_machine_t {
40 } rds_ps_state_machine_t;
42 typedef enum rds_rt_state_machine_t {
49 } rds_rt_state_machine_t;
53 RDS_GRP_VER_A = 0, //group version A
57 typedef enum rds_blk_t {
65 //For RDS feature, these strcutures also be defined in "fm.h"
66 typedef struct rds_flag_t {
71 fm_u8 Artificial_Head;
78 typedef struct rds_ct_t {
84 fm_u8 Local_Time_offset_signbit;
85 fm_u8 Local_Time_offset_half_hour;
88 typedef struct rds_af_t {
90 fm_s16 AF[2][25]; //100KHz
96 typedef struct rds_ps_t {
101 typedef struct rds_rt_t {
102 fm_u8 TextData[4][64];
111 typedef struct rds_raw_t {
112 fm_s32 dirty; //indicate if the data changed or not
113 fm_s32 len; //the data len form chip
117 typedef struct rds_group_cnt_t {
119 unsigned long groupA[16]; //RDS groupA counter
120 unsigned long groupB[16]; //RDS groupB counter
123 typedef enum rds_group_cnt_op_t {
124 RDS_GROUP_CNT_READ = 0,
128 } rds_group_cnt_op_t;
130 typedef struct rds_group_cnt_req_t {
132 enum rds_group_cnt_op_t op;
133 struct rds_group_cnt_t gc;
134 } rds_group_cnt_req_t;
136 typedef struct rds_t {
138 struct rds_flag_t RDSFlag;
142 struct rds_af_t AF_Data;
143 struct rds_af_t AFON_Data;
144 fm_u8 Radio_Page_Code;
145 fm_u16 Program_Item_Number_Code;
146 fm_u8 Extend_Country_Code;
147 fm_u16 Language_Code;
148 struct rds_ps_t PS_Data;
150 struct rds_rt_t RT_Data;
151 fm_u16 event_status; //will use RDSFlag_Struct RDSFlag->flag_status to check which event, is that ok?
152 struct rds_group_cnt_t gc;
156 //Need care the following definition.
157 //valid Rds Flag for notify
158 typedef enum rds_flag_status_t {
159 RDS_FLAG_IS_TP = 0x0001, // Program is a traffic program
160 RDS_FLAG_IS_TA = 0x0002, // Program currently broadcasts a traffic ann.
161 RDS_FLAG_IS_MUSIC = 0x0004, // Program currently broadcasts music
162 RDS_FLAG_IS_STEREO = 0x0008, // Program is transmitted in stereo
163 RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, // Program is an artificial head recording
164 RDS_FLAG_IS_COMPRESSED = 0x0020, // Program content is compressed
165 RDS_FLAG_IS_DYNAMIC_PTY = 0x0040, // Program type can change
166 RDS_FLAG_TEXT_AB = 0x0080 // If this flag changes state, a new radio text string begins
169 typedef enum rds_event_status_t {
170 RDS_EVENT_FLAGS = 0x0001, // One of the RDS flags has changed state
171 RDS_EVENT_PI_CODE = 0x0002, // The program identification code has changed
172 RDS_EVENT_PTY_CODE = 0x0004, // The program type code has changed
173 RDS_EVENT_PROGRAMNAME = 0x0008, // The program name has changed
174 RDS_EVENT_UTCDATETIME = 0x0010, // A new UTC date/time is available
175 RDS_EVENT_LOCDATETIME = 0x0020, // A new local date/time is available
176 RDS_EVENT_LAST_RADIOTEXT = 0x0040, // A radio text string was completed
177 RDS_EVENT_AF = 0x0080, // Current Channel RF signal strength too weak, need do AF switch
178 RDS_EVENT_AF_LIST = 0x0100, // An alternative frequency list is ready
179 RDS_EVENT_AFON_LIST = 0x0200, // An alternative frequency list is ready
180 RDS_EVENT_TAON = 0x0400, // Other Network traffic announcement start
181 RDS_EVENT_TAON_OFF = 0x0800, // Other Network traffic announcement finished.
182 RDS_EVENT_RDS = 0x2000, // RDS Interrupt had arrived durint timer period
183 RDS_EVENT_NO_RDS = 0x4000, // RDS Interrupt not arrived durint timer period
184 RDS_EVENT_RDS_TIMER = 0x8000 // Timer for RDS Bler Check. ---- BLER block error rate
185 } rds_event_status_t;
188 #define RDS_LOG_SIZE 2
190 struct rds_rx_t rds_log[RDS_LOG_SIZE];
191 fm_s32 log_len[RDS_LOG_SIZE];
196 fm_s32(*log_in)(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
197 fm_s32(*log_out)(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
200 extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, fm_u16(*getfreq)(void));
201 extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src);
202 extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc);
203 extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
204 extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
207 #define DEFINE_RDSLOG(name) \
208 struct rds_log_t name = { \
209 .size = RDS_LOG_SIZE, \
213 .log_in = rds_log_in, \
214 .log_out = rds_log_out, \
218 #endif //__FM_RDS_H__