diff --git a/plugin.lua b/plugin.lua index 18888de..54393ac 100644 --- a/plugin.lua +++ b/plugin.lua @@ -144,12 +144,13 @@ function set_rds_program(program_idx) end function get_rds_program() end -- Timeouts and Periods ----@param period integer +---@param period integer in seconds function set_rds_rt_switching_period(period) end ---@return integer function get_rds_rt_switching_period() end ----@param timeout integer +---For a RT1, this sets the timeout period before setting RT1 into "Default RT" +---@param timeout integer in seconds function set_rds_rt_text_timeout(timeout) end ---@return integer function get_rds_rt_text_timeout() end @@ -165,6 +166,8 @@ function set_rds_tps(tps) end function set_rds_rt1(rt1) end ---@param rt2 string Radio Text 2 (max 64 chars) function set_rds_rt2(rt2) end +---@param rt string Default radio text - max 64 characters +function set_rds_default_rt(rt) end ---@param lps string function set_rds_lps(lps) end @@ -292,7 +295,7 @@ function register_oda(group, group_version, id, id_data) end ---@param fun ODAHandler function set_oda_handler(oda_id, fun) end ----Data is allocated in each program's data for lua data, note that this overwrites existing data +---Data is allocated in each program's data for lua data (per program, diffrent program, diffrent data), note that this overwrites existing data ---@param data string function set_userdata(data) end ---Writes to the userdata at the offset, size does not have to match the length of the string, if the string is less than size then the rest of the string will be padded with zeroes until it is size diff --git a/scripts/99-data.lua b/scripts/99-data.lua index 0f1859c..8885789 100644 --- a/scripts/99-data.lua +++ b/scripts/99-data.lua @@ -265,7 +265,7 @@ function data_handle(data) elseif cmd == "rtper" then local period = tonumber(value) if not period then return "-" end - set_rds_rt_switching_period(period) + set_rds_rt_switching_period(period*60) return "+" elseif cmd == "program" then local program = tonumber(value) @@ -281,7 +281,7 @@ function data_handle(data) elseif cmd == "dttmout" then local timeout = tonumber(value) if not timeout then return "-" end - set_rds_rt_text_timeout(timeout) + set_rds_rt_text_timeout(timeout*60) return "+" elseif cmd == "grpseq" then set_rds_grpseq(value) diff --git a/src/lua_rds.c b/src/lua_rds.c index 69efbb8..02482ee 100644 --- a/src/lua_rds.c +++ b/src/lua_rds.c @@ -314,12 +314,13 @@ STR_SETTER(ps, set_rds_ps) STR_SETTER(tps, set_rds_tps) STR_SETTER(rt1, set_rds_rt1) STR_SETTER(rt2, set_rds_rt2) +STR_SETTER(default_rt, set_rds_default_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, 24) +STR_RAW_GETTER(grp_sqc_rds2, 32) int lua_set_rds_grp_sqc(lua_State *localL) { const char* str = luaL_checklstring(localL, 1, NULL); @@ -327,7 +328,7 @@ int lua_set_rds_grp_sqc(lua_State *localL) { else set_rds_grpseq(mod->enc, str); return 0; } -STR_RAW_GETTER(grp_sqc, 24) +STR_RAW_GETTER(grp_sqc, 32) AF_SETTER(af_group0, af, RDSAFs, add_rds_af) AF_SETTER(af_oda, af_oda, RDSAFsODA, add_rds_af_oda) @@ -589,6 +590,7 @@ void init_lua(RDSModulator* rds_mod) { lua_register(L, "set_rds_tps", lua_set_rds_tps); lua_register(L, "set_rds_rt1", lua_set_rds_rt1); lua_register(L, "set_rds_rt2", lua_set_rds_rt2); + lua_register(L, "set_rds_default_rt", lua_set_rds_default_rt); lua_register(L, "set_rds_lps", lua_set_rds_lps); lua_register(L, "get_rds_lps", lua_get_rds_lps); diff --git a/src/rds.c b/src/rds.c index b1e9bbb..5809475 100644 --- a/src/rds.c +++ b/src/rds.c @@ -170,6 +170,26 @@ static void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { if(utc->tm_sec != enc->state[enc->program].last_second) { enc->state[enc->program].last_second = utc->tm_sec; + + if(enc->data[enc->program].rt1_enabled && enc->data[enc->program].current_rt == 0 && enc->state[enc->program].rt_text_timeout_state) { + enc->state[enc->program].rt_text_timeout_state--; + if(enc->state[enc->program].rt_text_timeout_state == 0) { + enc->state[enc->program].rt_update = 1; + memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].default_rt, RT_LENGTH); + enc->state[enc->program].rt_segments = enc->state[enc->program].default_rt_segments; + } + } + if(enc->data[enc->program].rt1_enabled && enc->data[enc->program].rt2_enabled && enc->state[enc->program].rt_switching_period_state) { + enc->state[enc->program].rt_switching_period_state--; + if(enc->state[enc->program].rt_switching_period_state == 0) { + TOGGLE(enc->data[enc->program].current_rt); + if (enc->data[enc->program].current_rt == 1) memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt2, RT_LENGTH); + else memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt1, RT_LENGTH); + enc->state[enc->program].rt_state = 0; + enc->state[enc->program].rt_switching_period_state = enc->data[enc->program].rt_switching_period; + } + } + lua_call_function("tick"); } @@ -191,25 +211,6 @@ static void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) { }; } - if(enc->data[enc->program].rt1_enabled && enc->data[enc->program].rt2_enabled && enc->state[enc->program].rt_switching_period_state) { - enc->state[enc->program].rt_switching_period_state--; - if(enc->state[enc->program].rt_switching_period_state == 0) { - TOGGLE(enc->data[enc->program].current_rt); - if (enc->data[enc->program].current_rt == 1) memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt2, RT_LENGTH); - else memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt1, RT_LENGTH); - enc->state[enc->program].rt_state = 0; - enc->state[enc->program].rt_switching_period_state = enc->data[enc->program].rt_switching_period; - } - } - - if(enc->data[enc->program].rt1_enabled && enc->data[enc->program].current_rt == 0 && enc->state[enc->program].rt_text_timeout_state) { - enc->state[enc->program].rt_text_timeout_state--; - if(enc->state[enc->program].rt_text_timeout_state == 0) { - enc->state[enc->program].rt_update = 1; - memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].default_rt, RT_LENGTH); - } - } - if(enc->data[enc->program].ct && stream == 0) { get_rdsp_ct_group(group, now); goto group_coded; diff --git a/src/rds.h b/src/rds.h index 19f2cec..ba6ea7f 100644 --- a/src/rds.h +++ b/src/rds.h @@ -87,8 +87,8 @@ typedef struct { char lps[LPS_LENGTH]; - char grp_sqc[24]; - char grp_sqc_rds2[24]; + char grp_sqc[32]; + char grp_sqc_rds2[32]; uint8_t udg1_len : 4; uint8_t udg2_len : 4; @@ -137,6 +137,7 @@ typedef struct { uint8_t rt_ab : 1; uint8_t rt_segments : 5; uint8_t rt2_segments : 5; + uint8_t default_rt_segments : 5; char ptyn_text[PTYN_LENGTH]; uint8_t ptyn_state : 1; @@ -240,6 +241,7 @@ void get_rds_bits(RDSEncoder* enc, uint8_t *bits, uint8_t stream); void set_rds_rt1(RDSEncoder* enc, const char *rt1); void set_rds_rt2(RDSEncoder* enc, const char *rt2); +void set_rds_default_rt(RDSEncoder* enc, const char *rt); void set_rds_ps(RDSEncoder* enc, const char *ps); void set_rds_tps(RDSEncoder* enc, const char *tps); void set_rds_lps(RDSEncoder* enc, const char *lps); diff --git a/src/rds_setters.c b/src/rds_setters.c index 50138e7..42f5861 100644 --- a/src/rds_setters.c +++ b/src/rds_setters.c @@ -23,6 +23,25 @@ void set_rds_rt1(RDSEncoder* enc, const char *rt1) { if(enc->state[enc->program].rt_segments > 16) enc->state[enc->program].rt_segments = 16; //make sure } +void set_rds_default_rt(RDSEncoder* enc, const char *rt) { + uint8_t i = 0, len = 0; + + memset(enc->data[enc->program].default_rt, ' ', RT_LENGTH); + while (*rt != 0 && len < RT_LENGTH) enc->data[enc->program].default_rt[len++] = *rt++; + + while (len > 0 && enc->data[enc->program].default_rt[len - 1] == ' ') len--; + + if (len < RT_LENGTH) { + enc->state[enc->program].default_rt_segments = 0; + enc->data[enc->program].default_rt[len++] = '\r'; + while (i < len) { + i += 4; + enc->state[enc->program].default_rt_segments++; + } + } else enc->state[enc->program].default_rt_segments = 16; + if(enc->state[enc->program].default_rt_segments > 16) enc->state[enc->program].default_rt_segments = 16; //make sure +} + void set_rds_rt2(RDSEncoder* enc, const char *rt2) { uint8_t i = 0, len = 0; @@ -131,25 +150,25 @@ void set_rds_grpseq(RDSEncoder* enc, const char *grpseq) { uint8_t len = 0; if(grpseq[0] == '\0') { - while (DEFAULT_GRPSQC[len] != 0 && len < 24) { + while (DEFAULT_GRPSQC[len] != 0 && len < 32) { enc->data[enc->program].grp_sqc[len] = DEFAULT_GRPSQC[len]; len++; } return; } - memset(enc->data[enc->program].grp_sqc, 0, 24); - while (*grpseq != 0 && len < 24) enc->data[enc->program].grp_sqc[len++] = *grpseq++; + memset(enc->data[enc->program].grp_sqc, 0, 32); + while (*grpseq != 0 && len < 32) enc->data[enc->program].grp_sqc[len++] = *grpseq++; } void set_rds_grpseq2(RDSEncoder* enc, const char *grpseq2) { uint8_t len = 0; if(grpseq2[0] == '\0') { - memset(enc->data[enc->program].grp_sqc_rds2, 0, 24); - memcpy(enc->data[enc->program].grp_sqc_rds2, enc->data[enc->program].grp_sqc, 24); + memset(enc->data[enc->program].grp_sqc_rds2, 0, 32); + memcpy(enc->data[enc->program].grp_sqc_rds2, enc->data[enc->program].grp_sqc, 32); return; } - memset(enc->data[enc->program].grp_sqc_rds2, 0, 24); - while (*grpseq2 != 0 && len < 24) enc->data[enc->program].grp_sqc_rds2[len++] = *grpseq2++; + memset(enc->data[enc->program].grp_sqc_rds2, 0, 32); + while (*grpseq2 != 0 && len < 32) enc->data[enc->program].grp_sqc_rds2[len++] = *grpseq2++; } \ No newline at end of file