void rds_decode_group(unsigned short *rdsgroup)
{
static unsigned short ogrp[4];
+static unsigned char grp_decoded = 0;
unsigned char grp_type = (rdsgroup[1] >> 11);
unsigned char offs;
static unsigned char otextAB = 0, newtext = 0;
int day_code = 0;
int year_, mon_, K;
- if (ogrp[0] == rdsgroup[0] && ogrp[1] == rdsgroup[1] && ogrp[2] == rdsgroup[2] && ogrp[3] == rdsgroup[3])
- return;
- else {
+ /* we want to wait for at least two identical group transmits */
+ if (ogrp[0] != rdsgroup[0] || ogrp[1] != rdsgroup[1] || ogrp[2] != rdsgroup[2] || ogrp[3] != rdsgroup[3]) {
ogrp[0] = rdsgroup[0];
ogrp[1] = rdsgroup[1];
ogrp[2] = rdsgroup[2];
ogrp[3] = rdsgroup[3];
//printf("grp: 0x%04x 0x%04x 0x%04x 0x%04x\n", rdsgroup[0], rdsgroup[1], rdsgroup[2], rdsgroup[3]);
+ grp_decoded = 0;
+ return;
}
+ if (grp_decoded)
+ return;
+
if (rds_info.PI != PI) {
/* station change? */
memset(&rds_info, 0, sizeof(rds_info));
printf("urban ");
printf("\n");
}
+ } else if (rds_info.AID == 0x4bd7) {
+ if (OutputFlags & RDS_OUTPUT_RDSINFO) {
+ printf("RT+\nG2 = 0x%04x\n", rdsgroup[2]);
+ printf("template = 0x%02x\n", (rdsgroup[2] & 0x00ff));
+ printf("SCB = 0x%02x\n", (rdsgroup[2] & 0x0f00)>>8);
+ printf("CB = 0x%02x\n", (rdsgroup[2] & 0x1000)>>12);
+ printf("rfu = 0x%02x\n", (rdsgroup[2] & 0xe000)>>13);
+ }
+ } else {
+ printf("3A AID=0x%04x\n", rds_info.AID);
}
break;
case GROUP_3B:
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP10B\n");
break;
- case GROUP_11A:
+ case GROUP_11A: /* Open Data Application ODA */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
- printf("GRP11A\n");
+ printf("GRP11A ODA: #1=0x%02x #2=0x%04x #3=0x%04x\n", rdsgroup[1] & 0x1f, rdsgroup[2], rdsgroup[3]);
+
+ /* we previously got an RT+ identifier, try RT+ decoding */
+ if (rds_info.AID == 0x4bd7) {
+ printf("RT+\ntoggle: %s\n", (rdsgroup[1] & 0x10) ? "yes" : "no");
+ printf("item running : %s\n", (rdsgroup[1] & 0x08) ? "yes" : "no");
+ printf("content type 1 : %d\n", (rdsgroup[1] & 0x07) << 3 | (rdsgroup[2] & 0x0e00) >> 13);
+ printf("start marker 1 : %d\n", (rdsgroup[2] & 0x1f80) >> 7);
+ printf("length marker 1: %d\n", (rdsgroup[2] & 0x007e) >> 1);
+ printf("content type 2 : %d\n", (rdsgroup[1] & 0x01) << 4);
+ printf("start marker 2 : %d\n", (rdsgroup[2] & 0x07e0) >> 5);
+ printf("length marker 2: %d\n", (rdsgroup[2] & 0x001f));
+ }
break;
- case GROUP_11B:
+ case GROUP_11B: /* Open Data Application ODA */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP11B\n");
+ printf("11B ODA: #1=0x%02x PI=0x%04x #3=0x%04x\n", rdsgroup[1] & 0x1f, rdsgroup[2], rdsgroup[3]);
break;
- case GROUP_12A:
+ case GROUP_12A: /* Open Data Application ODA */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP12A\n");
break;
- case GROUP_12B:
+ case GROUP_12B: /* Open Data Application ODA */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP12B\n");
break;
- case GROUP_13A:
+ case GROUP_13A: /* Open Data Application ODA or paging */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP13A\n");
break;
- case GROUP_13B:
+ case GROUP_13B: /* Open Data Application ODA */
if (OutputFlags & RDS_OUTPUT_UNKNGRP)
printf("GRP13B\n");
break;
printf("unkn. RDS group %d\n", grp_type);
break;
}
+
+ /* done with this group */
+ grp_decoded = 1;
}