0
1
mirror of https://github.com/radio95-rnt/rds95.git synced 2026-02-27 12:53:53 +01:00

intro to dps

This commit is contained in:
2025-03-16 19:44:39 +01:00
parent 3871660e28
commit ce2f21f879

View File

@@ -178,7 +178,7 @@ static uint16_t get_next_af(RDSEncoder* enc) {
// #region Group encoding // #region Group encoding
static void get_rds_ps_group(RDSEncoder* enc, uint16_t *blocks) { 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); memcpy(enc->state[enc->program].ps_text, enc->data[enc->program].ps, PS_LENGTH);
enc->state[enc->program].ps_update = 0; 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); memcpy(enc->state[enc->program].tps_text, enc->data[enc->program].tps, PS_LENGTH);
enc->state[enc->program].tps_update = 0; 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].ta << 4;
blocks[1] |= enc->data[enc->program].ms << 3; 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') { 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]; 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 { } 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++; enc->state[enc->program].ps_csegment++;
if (enc->state[enc->program].ps_csegment >= 4) enc->state[enc->program].ps_csegment = 0; if (enc->state[enc->program].ps_csegment >= 4) enc->state[enc->program].ps_csegment = 0;
} }