X-Git-Url: https://git.karo-electronics.de/?p=rdstmc.git;a=blobdiff_plain;f=decoder%2Frds.c;fp=decoder%2Frds.c;h=27a417c49398053184b816b084fd72c8695d0b37;hp=677609fba7a9e41665ed09c57ecf51503b49531e;hb=676e37ddd2faa27593615e47d42a50446bf10fac;hpb=1d60a58e4c7c7ab477df4520fd48726e42d66b75 diff --git a/decoder/rds.c b/decoder/rds.c index 677609f..27a417c 100644 --- a/decoder/rds.c +++ b/decoder/rds.c @@ -138,6 +138,7 @@ enum RDSGroupType { GROUP_0A=0, GROUP_0B, GROUP_1A, GROUP_1B, GROUP_2A, GROUP_2B 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; @@ -147,15 +148,19 @@ int local_time_off = 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)); @@ -338,6 +343,16 @@ int year_, mon_, K; 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: @@ -431,27 +446,40 @@ int year_, mon_, K; 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; @@ -504,5 +532,8 @@ int year_, mon_, K; printf("unkn. RDS group %d\n", grp_type); break; } + + /* done with this group */ + grp_decoded = 1; }