mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-26 12:32:05 +01:00
add default rt setter + rt timeout and switching period now can be in seconds
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
39
src/rds.c
39
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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
Reference in New Issue
Block a user