From ce2f21f879e2d100d66f2e80877fce5d5f5b0e1e Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sun, 16 Mar 2025 19:44:39 +0100 Subject: [PATCH] intro to dps --- src/rds.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/rds.c b/src/rds.c index 3d854d1..a11b95f 100644 --- a/src/rds.c +++ b/src/rds.c @@ -178,7 +178,7 @@ static uint16_t get_next_af(RDSEncoder* enc) { // #region Group encoding static void get_rds_ps_group(RDSEncoder* enc, uint16_t *blocks) { - if (enc->state[enc->program].ps_csegment == 0 && enc->state[enc->program].ps_update) { + if (enc->state[enc->program].ps_csegment == 0 && enc->state[enc->program].ps_update && !enc->data[enc->program].dps1_enabled) { memcpy(enc->state[enc->program].ps_text, enc->data[enc->program].ps, PS_LENGTH); enc->state[enc->program].ps_update = 0; } @@ -186,6 +186,37 @@ static void get_rds_ps_group(RDSEncoder* enc, uint16_t *blocks) { memcpy(enc->state[enc->program].tps_text, enc->data[enc->program].tps, PS_LENGTH); enc->state[enc->program].tps_update = 0; } + if(enc->data[enc->program].dps1_enabled && + enc->state[enc->program].ps_csegment == 0) { + // Copy Static PS + memcpy(enc->state[enc->program].ps_text, enc->data[enc->program].ps, PS_LENGTH); + + if(enc->state[enc->program].dynamic_ps_period == (enc->data[enc->program].dps_label_period*3)) { + enc->state[enc->program].dynamic_ps_state = 0; // Static + enc->state[enc->program].dynamic_ps_period = 0; + } + } + if(enc->data[enc->program].dps1_enabled && + enc->state[enc->program].ps_csegment == 0) { + // Copy DPS1 + switch (enc->data[enc->program].dps1_mode) + { + case 0: + memcpy(enc->state[enc->program].dps1_text[enc->state->dynamic_ps_position], enc->data[enc->program].ps, PS_LENGTH); + enc->state[enc->program].dynamic_ps_position += PS_LENGTH; + break; + case 1: + memcpy(enc->state[enc->program].dps1_text[enc->state->dynamic_ps_position], enc->data[enc->program].ps, PS_LENGTH); + enc->state[enc->program].dynamic_ps_position += 1; + break; + // TODO: Mode 2 and 3 + } + if(enc->state[enc->program].dynamic_ps_position >= enc->data[enc->program].dps1_len) enc->state[enc->program].dynamic_ps_position = 0; + if(enc->state[enc->program].static_ps_period == (enc->data[enc->program].static_ps_period*3)) { + enc->state[enc->program].dynamic_ps_state = 1; // DPS1 + enc->state[enc->program].static_ps_period = 0; + } + } blocks[1] |= enc->data[enc->program].ta << 4; blocks[1] |= enc->data[enc->program].ms << 3; @@ -195,8 +226,22 @@ static void get_rds_ps_group(RDSEncoder* enc, uint16_t *blocks) { if(enc->data[enc->program].ta && enc->state[enc->program].tps_text[0] != '\0') { blocks[3] = enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2 + 1]; } else { - blocks[3] = enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2 + 1]; + blocks[3] = enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2 + 1]; } + + if(enc->data[enc->program].dps1_enabled || enc->data[enc->program].dps2_enabled) { + switch (enc->state[enc->program].dynamic_ps_state) + { + case 0: + enc->state[enc->program].static_ps_period++; + break; + case 1: + case 2: + enc->state[enc->program].dynamic_ps_period++; + break; + } + } + enc->state[enc->program].ps_csegment++; if (enc->state[enc->program].ps_csegment >= 4) enc->state[enc->program].ps_csegment = 0; }