From 3b75eff11512e602cd27189e33c9ffb83e988df0 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sat, 25 Apr 2026 22:32:52 +0200 Subject: [PATCH] reinvent the group sequence --- plugin.lua | 5 -- scripts/1-oda.lua | 2 +- scripts/99-data.lua | 4 -- src/fs.c | 3 -- src/lua_api.c | 21 +------- src/lua_rds.c | 3 -- src/rds.c | 120 ++++++++++++++------------------------------ src/rds.h | 11 ++-- src/rds_setters.c | 25 ++------- 9 files changed, 46 insertions(+), 148 deletions(-) diff --git a/plugin.lua b/plugin.lua index 269d323..07d6f91 100644 --- a/plugin.lua +++ b/plugin.lua @@ -222,11 +222,6 @@ function rds.set_grpseq(grpseq) end ---@return string function rds.get_grpseq() end ----@param grpseq2 string -function rds.set_grpseq2(grpseq2) end ----@return string -function rds.get_grpseq2() end - ---Puts in a RDS1 group in the buffer, note that block A is filled in always ---@param b integer ---@param c integer diff --git a/scripts/1-oda.lua b/scripts/1-oda.lua index c314b74..77e8811 100644 --- a/scripts/1-oda.lua +++ b/scripts/1-oda.lua @@ -119,7 +119,7 @@ local function group_handler(group_type) if group_type == "O" then return get_aid() elseif group_type == "K" then return get_data() end end -rds.ext.register_group("OK", group_handler) +rds.ext.register_group("\x06\xff", group_handler) table.insert(hooks.on_state, function () _RDS_ODAs = {} diff --git a/scripts/99-data.lua b/scripts/99-data.lua index daf00d6..d8a4b41 100644 --- a/scripts/99-data.lua +++ b/scripts/99-data.lua @@ -79,7 +79,6 @@ function hooks.data_handle(data) elseif data == "lps" then return string.format("LPS=%s\r\n", rds.get_lps()) elseif data == "ert" then return string.format("ERT=%s\r\n", rds.ext.get_ert()) elseif data == "grpseq" then return string.format("GRPSEQ=%s\r\n", rds.get_grpseq()) - elseif data == "grpseq2" then return string.format("GRPSEQ2=%s\r\n", rds.get_grpseq2()) else local eon_cmd, eon_num = data:match("^eon(%d+)([a-z]+)$") if eon_cmd then @@ -261,9 +260,6 @@ function hooks.data_handle(data) elseif cmd == "grpseq" then rds.set_grpseq(value) return "+\r\n" - elseif cmd == "grpseq2" then - rds.set_grpseq2(value) - return "+\r\n" elseif cmd == "rtp" or cmd == "ertp" then local is_ertp = (cmd == "ertp") local t1, s1, l1, t2, s2, l2 = value:match("(%d+),(%d+),(%d+),(%d+),(%d+),(%d+)") diff --git a/src/fs.c b/src/fs.c index 04b3a02..c509277 100644 --- a/src/fs.c +++ b/src/fs.c @@ -14,13 +14,11 @@ void encoder_saveToFile(RDSEncoder *enc) { } else memcpy(&tempEncoder, enc, sizeof(RDSEncoder)); memcpy(tempEncoder.data, enc->data, sizeof(RDSData) * PROGRAMS); - memcpy(&tempEncoder.encoder_data, &enc->encoder_data, sizeof(RDSEncoderData)); tempEncoder.program = enc->program; tempEncoder.enabled_streams = enc->enabled_streams; RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program, .enabled_streams = tempEncoder.enabled_streams}; memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS); - memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData)); rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc)); @@ -58,7 +56,6 @@ int encoder_loadFromFile(RDSEncoder *enc) { } memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS); - memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData)); enc->program = rdsEncoderfile.program; enc->enabled_streams = rdsEncoderfile.enabled_streams; return 0; diff --git a/src/lua_api.c b/src/lua_api.c index 6ccb891..13dd4cf 100644 --- a/src/lua_api.c +++ b/src/lua_api.c @@ -165,16 +165,6 @@ BOOL_GETTER(rt_enabled) BOOL_SETTER(ptyn_enabled) BOOL_GETTER(ptyn_enabled) -int lua_set_rds2_mode(lua_State *localL) { - enc->encoder_data.rds2_mode = luaL_checkinteger(localL, 1); - return 0; -} - -int lua_get_rds2_mode(lua_State *localL) { - lua_pushinteger(localL, enc->encoder_data.rds2_mode); - return 1; -} - int lua_set_rds_streams(lua_State *localL) { enc->enabled_streams = luaL_checkinteger(localL, 1); return 0; @@ -259,16 +249,7 @@ STR_RAW_SETTER(rt_raw, set_rds_rt) STR_RAW_SETTER(lps, set_rds_lps) STR_RAW_GETTER(lps, LPS_LENGTH) -STR_RAW_SETTER(grp_sqc_rds2, set_rds_grpseq2) -STR_RAW_GETTER(grp_sqc_rds2, 32) - -int lua_set_rds_grp_sqc(lua_State *localL) { - const char* str = luaL_checklstring(localL, 1, NULL); - if(_strnlen(str, 2) < 1) set_rds_grpseq(enc, DEFAULT_GRPSQC, writing_program); - else set_rds_grpseq(enc, str, writing_program); - return 0; -} - +STR_RAW_SETTER(grp_sqc, set_rds_grpseq) STR_RAW_GETTER(grp_sqc, 32) AF_SETTER(af_group0, af, RDSAFs, add_rds_af) diff --git a/src/lua_rds.c b/src/lua_rds.c index f56b892..0fef478 100644 --- a/src/lua_rds.c +++ b/src/lua_rds.c @@ -136,9 +136,6 @@ void init_lua(RDSEncoder* _enc) { lua_registertotable(L, "set_grpseq", lua_set_rds_grp_sqc); lua_registertotable(L, "get_grpseq", lua_get_rds_grp_sqc); - lua_registertotable(L, "set_grpseq2", lua_set_rds_grp_sqc_rds2); - lua_registertotable(L, "get_grpseq2", lua_get_rds_grp_sqc_rds2); - lua_registertotable(L, "put_custom_group", lua_put_rds_custom_group); lua_registertotable(L, "put_rds2_custom_group", lua_put_rds2_custom_group); diff --git a/src/rds.c b/src/rds.c index fe3d08d..5782578 100644 --- a/src/rds.c +++ b/src/rds.c @@ -22,70 +22,62 @@ uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group); int get_rdsp_lua_group(RDSGroup *group, const char grp); static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) { - uint8_t ps_seq_idx = (stream == 0) ? 1 : 3; - uint8_t grp_seq_idx = (stream == 0) ? 0 : 2; - switch (*grp) - { - default: - case '0': - if(enc->state[enc->program].grp_seq_idx[ps_seq_idx] < 4) enc->state[enc->program].grp_seq_idx[grp_seq_idx]--; - else enc->state[enc->program].grp_seq_idx[ps_seq_idx] = 0; - - enc->state[enc->program].grp_seq_idx[ps_seq_idx]++; + switch (*grp) { + case 0: get_rds_ps_group(enc, group); break; - case '1': + case 2: if(enc->state[enc->program].data_ecc == 0 && enc->data[enc->program].slc_data != 0) get_rds_slcdata_group(enc, group); else get_rds_ecc_group(enc, group); TOGGLE(enc->state[enc->program].data_ecc); break; - case '2': + case 4: get_rds_rt_group(enc, group); break; - case 'A': + case 20: get_rds_ptyn_group(enc, group); break; - case 'E': + case 28: get_rds_eon_group(enc, group); break; - case 'F': + case 30: get_rds_lps_group(enc, group); break; - case 'T': + case 31: get_rds_fasttuning_group(enc, group); break; - case 'L': - case 'R': - case 'P': - case 'S': - case 'O': - case 'K': - case 'U': - case 'X': - case 'Y': + default: if(get_rdsp_lua_group(group, *grp) == 0) get_rds_ps_group(enc, group); break; } } static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp) { - uint8_t good_group = 0; - if(*grp == '0') good_group = 1; - if(*grp == '1' && (enc->data[enc->program].ecc != 0 || enc->data[enc->program].slc_data != 0)) good_group = 1; - if(*grp == '2' && enc->data[enc->program].rt_enabled) good_group = 1; - if(*grp == 'A' && enc->data[enc->program].ptyn_enabled) good_group = 1; - if(*grp == 'E') { + if(*grp == 2) { + if(enc->data[enc->program].ecc != 0 || enc->data[enc->program].slc_data != 0) return 1; + return 0; + } + if(*grp == 4) { + if(enc->data[enc->program].rt_enabled) return 1; + return 0; + } + if(*grp == 20) { + if(enc->data[enc->program].ptyn_enabled) return 1; + return 0; + } + if(*grp == 28) { for (int i = 0; i < EONs; i++) { if (enc->data[enc->program].eon[i].enabled) { - good_group = 1; + return 1; break; } } } - if(*grp == 'F' && enc->data[enc->program].lps[0] != '\0') good_group = 1; - if(*grp == 'T') good_group = 1; - if(*grp == 'L' || *grp == 'R' || *grp == 'P' || *grp == 'S' || *grp == 'O' || *grp == 'K' || *grp == 'U' || *grp == 'X' || *grp == 'Y') good_group = 1; - return good_group; + if(*grp == 30) { + if(enc->data[enc->program].lps[0] != '\0') return 1; + return 0; + } + return 1; } void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { @@ -124,57 +116,23 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { group->a = 0; if(get_rds_custom_groups2(enc, group)) goto group_coded_rds2; - if(enc->encoder_data.rds2_mode == 0) { + int generated = lua_rds2_group(group, stream); + if(group->a == 0 && generated == 1) group->is_type_b = (IS_TYPE_B(group->b) != 0); + else if(generated == 0) { group->b = enc->state[enc->program].last_stream0_group[0]; group->c = enc->state[enc->program].last_stream0_group[1]; group->d = enc->state[enc->program].last_stream0_group[2]; group->is_type_b = enc->state[enc->program].last_stream0_group_type_b; - goto group_coded_rds2; - } else if(enc->encoder_data.rds2_mode == 1) { - while(good_group == 0) { - grp_sqc_idx = enc->state[enc->program].grp_seq_idx[2]; - if(enc->data[enc->program].grp_sqc_rds2[grp_sqc_idx] == '\0') { - enc->state[enc->program].grp_seq_idx[2] = 0; - grp_sqc_idx = 0; - } - grp = enc->data[enc->program].grp_sqc_rds2[grp_sqc_idx]; - - good_group = check_rds_good_group(enc, &grp); - - if(!good_group) cant_find_group++; - else cant_find_group = 0; - - if(!good_group && cant_find_group == 23) { - cant_find_group = 0; - break; - } - - enc->state[enc->program].grp_seq_idx[2]++; - } - if(!good_group) grp = '0'; - - get_rds_sequence_group(enc, group, &grp, stream); - - goto group_coded_rds2; - } else if(enc->encoder_data.rds2_mode == 2) { - int generated = lua_rds2_group(group, stream); - if(group->a == 0 && generated == 1) group->is_type_b = (IS_TYPE_B(group->b) != 0); - else if(generated == 0) { - group->b = enc->state[enc->program].last_stream0_group[0]; - group->c = enc->state[enc->program].last_stream0_group[1]; - group->d = enc->state[enc->program].last_stream0_group[2]; - group->is_type_b = enc->state[enc->program].last_stream0_group_type_b; - } - goto group_coded_rds2; } + goto group_coded_rds2; } if(get_rds_custom_groups(enc, group)) goto group_coded; while(good_group == 0) { - grp_sqc_idx = enc->state[enc->program].grp_seq_idx[0]; - if(enc->data[enc->program].grp_sqc[grp_sqc_idx] == '\0') { - enc->state[enc->program].grp_seq_idx[0] = 0; + grp_sqc_idx = enc->state[enc->program].grp_seq_idx; + if(grp_sqc_idx > enc->data[enc->program].grp_sqc_len) { + enc->state[enc->program].grp_seq_idx = 0; grp_sqc_idx = 0; } grp = enc->data[enc->program].grp_sqc[grp_sqc_idx]; @@ -188,9 +146,9 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { break; } - enc->state[enc->program].grp_seq_idx[0]++; + enc->state[enc->program].grp_seq_idx++; } - if(!good_group) grp = '0'; + if(!good_group) grp = 0; get_rds_sequence_group(enc, group, &grp, stream); @@ -267,7 +225,6 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) { set_rds_lps(&tempCoder, enc->data[program].lps, program); set_rds_ptyn(&tempCoder, enc->data[program].ptyn, program); set_rds_grpseq(&tempCoder, enc->data[program].grp_sqc, program); - set_rds_grpseq2(&tempCoder, enc->data[program].grp_sqc_rds2, program); struct tm *utc; time_t now; @@ -284,10 +241,9 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) { void set_rds_defaults(RDSEncoder* enc, uint8_t program) { memset(&(enc->data[program]), 0, sizeof(RDSData)); - memset(&(enc->encoder_data), 0, sizeof(RDSEncoderData)); enc->data[program].ct = 1; - strcpy((char *)enc->data[program].grp_sqc, DEFAULT_GRPSQC); + strcpy((char *)enc->data[program].grp_sqc, "0"); enc->data[program].tp = 1; enc->data[program].pi = 0xFFFF; strcpy((char *)enc->data[program].ps, "* RDS * "); diff --git a/src/rds.h b/src/rds.h index a67724e..b13fbb4 100644 --- a/src/rds.h +++ b/src/rds.h @@ -17,7 +17,6 @@ #define PS_LENGTH 8 #define PTYN_LENGTH 8 #define LPS_LENGTH 32 -#define DEFAULT_GRPSQC "002222XYOK" #define MAX_AFS 25 #define AF_CODE_FILLER 205 @@ -69,7 +68,9 @@ typedef struct { char lps[LPS_LENGTH]; + uint8_t grp_sqc_len; char grp_sqc[32]; + uint8_t grp_sqc_rds2_len; char grp_sqc_rds2[32]; RDSEON eon[EONs]; @@ -107,7 +108,7 @@ typedef struct { uint16_t custom_group2[GROUP_LENGTH + 1]; uint8_t data_ecc : 1; - uint8_t grp_seq_idx[4]; + uint8_t grp_seq_idx; uint8_t fasttuning_state : 3; @@ -127,10 +128,6 @@ typedef struct { } RDSState; typedef struct { - uint8_t rds2_mode : 2; -} RDSEncoderData; -typedef struct { - RDSEncoderData encoder_data; RDSData data[PROGRAMS]; RDSState state[PROGRAMS]; uint8_t program : 3; @@ -140,7 +137,6 @@ typedef struct { uint8_t file_starter; // Always is 225 first polish radio programme am frequency RDSData data[PROGRAMS]; uint8_t file_middle; // Always is 160, average of both - RDSEncoderData encoder_data; uint8_t program : 3; uint8_t enabled_streams : 3; uint8_t file_ender; // Always is 95 my freq @@ -171,4 +167,3 @@ void set_rds_tps(RDSEncoder* enc, const char *tps, uint8_t program); void set_rds_lps(RDSEncoder* enc, const char *lps, uint8_t program); void set_rds_ptyn(RDSEncoder *enc, const char *ptyn, uint8_t program); void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, uint8_t program); -void set_rds_grpseq2(RDSEncoder* enc, const char *grpseq2, uint8_t program); \ No newline at end of file diff --git a/src/rds_setters.c b/src/rds_setters.c index aea2941..eeb2d15 100644 --- a/src/rds_setters.c +++ b/src/rds_setters.c @@ -78,29 +78,10 @@ void set_rds_ptyn(RDSEncoder* enc, const char *ptyn, uint8_t program) { while (*ptyn != 0 && len < PTYN_LENGTH) enc->data[program].ptyn[len++] = *ptyn++; } -void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, uint8_t program) { +void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, size_t size, uint8_t program) { uint8_t len = 0; - if(grpseq[0] == '\0') { - while (DEFAULT_GRPSQC[len] != 0 && len < 32) { - enc->data[program].grp_sqc[len] = DEFAULT_GRPSQC[len]; - len++; - } - return; - } - + enc->data[program].grp_sqc_len = size; memset(enc->data[program].grp_sqc, 0, 32); - while (*grpseq != 0 && len < 32) enc->data[program].grp_sqc[len++] = *grpseq++; -} -void set_rds_grpseq2(RDSEncoder* enc, const char *grpseq2, uint8_t program) { - uint8_t len = 0; - - if(grpseq2[0] == '\0') { - memset(enc->data[program].grp_sqc_rds2, 0, 32); - memcpy(enc->data[program].grp_sqc_rds2, enc->data[program].grp_sqc, 32); - return; - } - - memset(enc->data[program].grp_sqc_rds2, 0, 32); - while (*grpseq2 != 0 && len < 32) enc->data[program].grp_sqc_rds2[len++] = *grpseq2++; + while (len < size && len < 32) enc->data[program].grp_sqc[len++] = *grpseq++; } \ No newline at end of file