From aed57a1e45b3b3cff8b0321f3596e5a762b1ee94 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Wed, 24 Dec 2025 10:43:37 +0100 Subject: [PATCH] some updates --- src/lua_rds.c | 2 +- src/rds.c | 69 +++++++++++++++++++++-------------------------- src/rds.h | 3 ++- src/rds_groups.c | 6 ++--- src/rds_setters.c | 3 +++ 5 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/lua_rds.c b/src/lua_rds.c index 3d794ea..5c52723 100644 --- a/src/lua_rds.c +++ b/src/lua_rds.c @@ -413,7 +413,7 @@ void init_lua(RDSModulator* rds_mod) { lua_setglobal(L, "core_version"); lua_pushinteger(L, PROGRAMS); lua_setglobal(L, "max_programs"); - lua_pushinteger(L, 4); + lua_pushinteger(L, EONs); lua_setglobal(L, "eon_count"); lua_register(L, "set_rds_program_defaults", lua_set_rds_program_defaults); diff --git a/src/rds.c b/src/rds.c index 18419fe..e0a981d 100644 --- a/src/rds.c +++ b/src/rds.c @@ -5,6 +5,7 @@ #include "lua_rds.h" #include +// declarations (stupid c) uint16_t get_next_af(RDSEncoder* enc); void get_next_af_oda(RDSEncoder* enc, uint16_t* af_group); uint16_t get_next_af_eon(RDSEncoder* enc, uint8_t eon_index); @@ -28,6 +29,30 @@ void get_rds_ert_group(RDSEncoder* enc, RDSGroup *group); uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group); uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group); +#define HANDLE_UDG_STREAM(chan_idx, udg_prefix) \ + do { \ + if (stream != 0) { \ + udg_idx = enc->state[enc->program].udg_idxs_rds2[chan_idx]; \ + group->a = enc->data[enc->program].udg_prefix##_rds2[udg_idx][0]; \ + group->b = enc->data[enc->program].udg_prefix##_rds2[udg_idx][1]; \ + group->c = enc->data[enc->program].udg_prefix##_rds2[udg_idx][2]; \ + group->d = enc->data[enc->program].udg_prefix##_rds2[udg_idx][3]; \ + enc->state[enc->program].udg_idxs_rds2[chan_idx]++; \ + if (enc->state[enc->program].udg_idxs_rds2[chan_idx] == enc->data[enc->program].udg_prefix##_len_rds2) \ + enc->state[enc->program].udg_idxs_rds2[chan_idx] = 0; \ + group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); \ + } else { \ + udg_idx = enc->state[enc->program].udg_idxs[chan_idx]; \ + group->b = enc->data[enc->program].udg_prefix[udg_idx][0]; \ + group->c = enc->data[enc->program].udg_prefix[udg_idx][1]; \ + group->d = enc->data[enc->program].udg_prefix[udg_idx][2]; \ + enc->state[enc->program].udg_idxs[chan_idx]++; \ + if (enc->state[enc->program].udg_idxs[chan_idx] == enc->data[enc->program].udg_prefix##_len) \ + enc->state[enc->program].udg_idxs[chan_idx] = 0; \ + group->is_type_b = (IS_TYPE_B(group->b) != 0); \ + } \ + } while(0) + static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) { uint8_t udg_idx; uint8_t ps_seq_idx = (stream == 0) ? 1 : 3; @@ -57,44 +82,10 @@ static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, get_rds_eon_group(enc, group); break; 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 = (IS_TYPE_B(group->b) != 0); + HANDLE_UDG_STREAM(0, udg1); 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 = (IS_TYPE_B(group->b) != 0); + HANDLE_UDG_STREAM(1, udg2); break; case 'R': if(enc->state[enc->program].rtp_oda == 0) get_rds_rtplus_group(enc, group); @@ -132,7 +123,7 @@ static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp) { if(*grp == '2' && (enc->data[enc->program].rt1_enabled || enc->data[enc->program].rt2_enabled)) good_group = 1; if(*grp == 'A' && enc->data[enc->program].ptyn_enabled) good_group = 1; if(*grp == 'E') { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < EONs; i++) { if (enc->data[enc->program].eon[i].enabled) { good_group = 1; break; @@ -165,7 +156,7 @@ static void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { enc->state[enc->program].last_minute = utc->tm_min; uint8_t eon_has_ta = 0; - for (int i = 0; i < 4; i++) { + for (int i = 0; i < EONs; i++) { if (enc->data[enc->program].eon[i].enabled && enc->data[enc->program].eon[i].ta) { eon_has_ta = 1; break; @@ -359,7 +350,7 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) { utc = gmtime(&now); tempCoder.state[program].last_minute = utc->tm_min; - for(int i = 0; i < 4; i++) tempCoder.data[program].eon[i].ta = 0; + for(int i = 0; i < EONs; i++) tempCoder.data[program].eon[i].ta = 0; memcpy(&(enc->state[program]), &(tempCoder.state[program]), sizeof(RDSState)); memcpy(&(enc->rtpState[program]), &(tempCoder.rtpState[program]), sizeof(RDSRTPlusState)); diff --git a/src/rds.h b/src/rds.h index fa32342..20e88f1 100644 --- a/src/rds.h +++ b/src/rds.h @@ -25,6 +25,7 @@ #define AF_CODE_LFMF_FOLLOWS 250 #define PROGRAMS 3 +#define EONs 4 // List of ODAs: https://www.nrscstandards.org/committees/dsm/archive/rds-oda-aids.pdf #define ODA_AID_RTPLUS 0x4bd7 @@ -105,7 +106,7 @@ typedef struct { uint16_t udg1_rds2[8][4]; uint16_t udg2_rds2[8][4]; - RDSEON eon[4]; + RDSEON eon[EONs]; } RDSData; typedef struct { uint8_t af_state : 6; diff --git a/src/rds_groups.c b/src/rds_groups.c index 0cf57f0..494ad3e 100644 --- a/src/rds_groups.c +++ b/src/rds_groups.c @@ -312,9 +312,7 @@ void get_rds_eon_group(RDSEncoder* enc, RDSGroup *group) { uint8_t i = 0; while(i < 4 && !enc->data[enc->program].eon[enc->state[enc->program].eon_index].enabled) { enc->state[enc->program].eon_index++; - if(enc->state[enc->program].eon_index == 4) { - enc->state[enc->program].eon_index = 0; - } + if(enc->state[enc->program].eon_index >= EONs) enc->state[enc->program].eon_index = 0; eon = enc->data[enc->program].eon[enc->state[enc->program].eon_index]; i++; } @@ -340,7 +338,7 @@ void get_rds_ert_group(RDSEncoder* enc, RDSGroup *group) { group->d |= enc->state[enc->program].ert_text[enc->state[enc->program].ert_state * 4 + 3]; enc->state[enc->program].ert_state++; - if (enc->state[enc->program].ert_state == enc->state[enc->program].ert_segments) enc->state[enc->program].ert_state = 0; + if (enc->state[enc->program].ert_state >= enc->state[enc->program].ert_segments) enc->state[enc->program].ert_state = 0; } uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group) { diff --git a/src/rds_setters.c b/src/rds_setters.c index 0fea8d6..2aae80c 100644 --- a/src/rds_setters.c +++ b/src/rds_setters.c @@ -20,6 +20,7 @@ void set_rds_rt1(RDSEncoder* enc, const char *rt1) { enc->state[enc->program].rt_segments++; } } else enc->state[enc->program].rt_segments = 16; + if(enc->state[enc->program].rt_segments > 16) enc->state[enc->program].rt_segments = 16; //make sure } void set_rds_rt2(RDSEncoder* enc, const char *rt2) { @@ -40,6 +41,7 @@ void set_rds_rt2(RDSEncoder* enc, const char *rt2) { enc->state[enc->program].rt2_segments++; } } else enc->state[enc->program].rt2_segments = 16; + if(enc->state[enc->program].rt2_segments > 16) enc->state[enc->program].rt2_segments = 16; //make sure } void set_rds_ps(RDSEncoder* enc, const char *ps) { @@ -103,6 +105,7 @@ void set_rds_ert(RDSEncoder* enc, const char *ert) { enc->state[enc->program].ert_segments++; } } else enc->state[enc->program].ert_segments = 32; + if(enc->state[enc->program].ert_segments > 32) enc->state[enc->program].ert_segments = 32; //make sure } inline void set_rds_rtplus_tags(RDSEncoder* enc, uint8_t *tags) {