From c2f83068108e268beae4702bd791279ebcf53551 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Tue, 22 Apr 2025 14:21:43 +0200 Subject: [PATCH] add user defined groups for rds2 --- .vscode/.server-controller-port.log | 2 +- src/ascii_cmd.c | 34 ++++++++++++++++++++++ src/rds.c | 45 ++++++++++++++++++++--------- src/rds.h | 6 ++++ 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/.vscode/.server-controller-port.log b/.vscode/.server-controller-port.log index 4f55694..b0286c8 100644 --- a/.vscode/.server-controller-port.log +++ b/.vscode/.server-controller-port.log @@ -1,5 +1,5 @@ { "port": 13452, - "time": 1744724934249, + "time": 1745323988035, "version": "0.0.3" } \ No newline at end of file diff --git a/src/ascii_cmd.c b/src/ascii_cmd.c index c57eed8..ecc20a2 100644 --- a/src/ascii_cmd.c +++ b/src/ascii_cmd.c @@ -370,6 +370,39 @@ static void handle_udg(char *arg, char *pattern, RDSModulator* mod, char* output else strcpy(output, "/\0"); } +static void handle_udg2(char *arg, char *pattern, RDSModulator* mod, char* output) { + uint8_t all_scanned = 1, bad_format = 0; + uint16_t blocks[8][4]; + int sets = 0; + char *ptr = arg; + + while (sets < 8) { + int count = sscanf(ptr, "%4hx%4hx%4hx%4hx", &blocks[sets][0], &blocks[sets][1], &blocks[sets][2], &blocks[sets][3]); + if (count != 4) { + all_scanned = 0; + break; + } + sets++; + while (*ptr && *ptr != ',') ptr++; + if (*ptr == ',') ptr++; + else { + bad_format = 1; + break; + } + } + + if (strcmp(pattern, "1") == 0) { + memcpy(&(mod->enc->data[mod->enc->program].udg1_rds2), &blocks, sets * sizeof(uint16_t[4])); + mod->enc->data[mod->enc->program].udg1_len_rds2 = sets; + } else if(strcmp(pattern, "2") == 0) { + memcpy(&(mod->enc->data[mod->enc->program].udg2_rds2), &blocks, sets * sizeof(uint16_t[4])); + mod->enc->data[mod->enc->program].udg2_len_rds2 = sets; + } else strcpy(output, "!\0"); + if(bad_format) strcpy(output, "-\0"); + else if(all_scanned) strcpy(output, "+\0"); + else strcpy(output, "/\0"); +} + static void handle_rttype(char *arg, RDSModulator* mod, char* output) { mod->enc->data[mod->enc->program].rt_type = atoi(arg); strcpy(output, "+\0"); @@ -544,6 +577,7 @@ static const pattern_command_handler_t pattern_commands[] = { {"EON", "AF", handle_eonaf}, {"EON", "DT", handle_eondt}, {"UDG", "", handle_udg}, + {"UDG2", "", handle_udg2}, }; static bool process_command_table(const command_handler_t *table, int table_size, diff --git a/src/rds.c b/src/rds.c index 162c24a..4bf7b6d 100644 --- a/src/rds.c +++ b/src/rds.c @@ -507,53 +507,72 @@ static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, get_rds_eon_group(enc, group); goto group_coded; case 'X': + if(stream != 0) { + udg_idx = enc->state[enc->program].udg_idxs_rds2[0]; + group->a = enc->data[enc->program].udg1_rds2[udg_idx][0]; + group->b = enc->data[enc->program].udg1_rds2[udg_idx][1]; + group->c = enc->data[enc->program].udg1_rds2[udg_idx][2]; + group->d = enc->data[enc->program].udg1_rds2[udg_idx][3]; + enc->state[enc->program].udg_idxs_rds2[0]++; + if(enc->state[enc->program].udg_idxs_rds2[0] == enc->data[enc->program].udg1_len_rds2) enc->state[enc->program].udg_idxs_rds2[0] = 0; + group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); + break; + } udg_idx = enc->state[enc->program].udg_idxs[0]; group->b = enc->data[enc->program].udg1[udg_idx][0]; group->c = enc->data[enc->program].udg1[udg_idx][1]; group->d = enc->data[enc->program].udg1[udg_idx][2]; enc->state[enc->program].udg_idxs[0]++; if(enc->state[enc->program].udg_idxs[0] == enc->data[enc->program].udg1_len) enc->state[enc->program].udg_idxs[0] = 0; - group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); - goto group_coded; + group->is_type_b = IS_TYPE_B(group->b); + break; case 'Y': + if(stream != 0) { + udg_idx = enc->state[enc->program].udg_idxs_rds2[1]; + group->a = enc->data[enc->program].udg2_rds2[udg_idx][0]; + group->b = enc->data[enc->program].udg2_rds2[udg_idx][1]; + group->c = enc->data[enc->program].udg2_rds2[udg_idx][2]; + group->d = enc->data[enc->program].udg2_rds2[udg_idx][3]; + enc->state[enc->program].udg_idxs_rds2[1]++; + if(enc->state[enc->program].udg_idxs_rds2[1] == enc->data[enc->program].udg2_len_rds2) enc->state[enc->program].udg_idxs_rds2[1] = 0; + group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); + break; + } udg_idx = enc->state[enc->program].udg_idxs[1]; group->b = enc->data[enc->program].udg2[udg_idx][0]; group->c = enc->data[enc->program].udg2[udg_idx][1]; group->d = enc->data[enc->program].udg2[udg_idx][2]; enc->state[enc->program].udg_idxs[1]++; if(enc->state[enc->program].udg_idxs[1] == enc->data[enc->program].udg2_len) enc->state[enc->program].udg_idxs[1] = 0; - group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); - goto group_coded; + group->is_type_b = IS_TYPE_B(group->b); + break; case 'R': if(enc->state[enc->program].rtp_oda == 0) get_rds_rtplus_group(enc, group); else get_rds_rtp_oda_group(enc, group); enc->state[enc->program].rtp_oda ^= 1; - goto group_coded; + break; case 'P': if(enc->state[enc->program].ert_oda == 0) get_rds_ertplus_group(enc, group); else get_rds_ertp_oda_group(enc, group); - enc->state[enc->program].ert_oda ^= 1; - goto group_coded; + break; case 'S': if(enc->state[enc->program].ert_oda == 0) get_rds_ert_group(enc, group); else get_rds_ert_oda_group(enc, group); enc->state[enc->program].ert_oda ^= 1; - goto group_coded; + break; case 'F': get_rds_lps_group(enc, group); - goto group_coded; + break; case 'T': get_rds_fasttuning_group(enc, group); - goto group_coded; + break; case 'U': if(enc->state[enc->program].af_oda == 0) get_oda_af_group(enc, group); else get_oda_af_oda_group(enc, group); enc->state[enc->program].af_oda ^= 1; - goto group_coded; + break; } -group_coded: - return; } static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp, uint8_t stream) { diff --git a/src/rds.h b/src/rds.h index 6850179..049dee8 100644 --- a/src/rds.h +++ b/src/rds.h @@ -101,10 +101,15 @@ typedef struct { uint8_t udg1_len : 4; uint8_t udg2_len : 4; + uint8_t udg1_len_rds2 : 4; + uint8_t udg2_len_rds2 : 4; uint16_t udg1[8][3]; uint16_t udg2[8][3]; + uint16_t udg1_rds2[8][4]; + uint16_t udg2_rds2[8][4]; + RDSEON eon[4]; } RDSData; typedef struct { @@ -153,6 +158,7 @@ typedef struct { uint8_t data_ecc : 1; uint8_t grp_seq_idx[4]; uint8_t udg_idxs[2]; + uint8_t udg_idxs_rds2[2]; uint8_t fasttuning_state : 3;