From 0848d52f881358c7749a9a51573fdf7351771527 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Mon, 22 Dec 2025 21:34:07 +0100 Subject: [PATCH] af is in lua now --- plugin.lua | 9 ++++++++- src/ascii_cmd.c | 48 ------------------------------------------------ src/command.lua | 36 ++++++++++++++++++++++++++++++++++++ src/lua_rds.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 49 deletions(-) diff --git a/plugin.lua b/plugin.lua index f662850..cbcf9f8 100644 --- a/plugin.lua +++ b/plugin.lua @@ -193,4 +193,11 @@ function set_rds_rtp_meta(ertp, enabled, running) end ---Gets the metadata of RTP and ERTP ---@param ertp boolean ---@return boolean enabled, boolean running -function get_rds_rtp_meta(ertp) end \ No newline at end of file +function get_rds_rtp_meta(ertp) end + +---Sets the AFs included in group 0 +---@param afs table +function set_rds_af_group0(afs) end +---Sets the AFs included in the ODA +---@param afs table +function set_rds_af_oda(afs) end \ No newline at end of file diff --git a/src/ascii_cmd.c b/src/ascii_cmd.c index cf95629..3a826ab 100644 --- a/src/ascii_cmd.c +++ b/src/ascii_cmd.c @@ -12,45 +12,6 @@ typedef struct { void (*handler)(char *arg, char *pattern, RDSModulator* mod, char* output); } pattern_command_handler_t; -#define AF_HANDLER(name, af_struct, af_entry, add_func) \ -static void handle_##name(char *arg, RDSModulator* mod, char* output) { \ - if (arg[0] == 0) { \ - memset(&(mod->enc->data[mod->enc->program].af_entry), 0, sizeof(mod->enc->data[mod->enc->program].af_entry)); \ - return; \ - } \ - \ - uint8_t arg_count; \ - af_struct new_af; \ - float af[MAX_AFS], *af_iter; \ - \ - arg_count = sscanf(arg, \ - "%f,%f,%f,%f,%f," \ - "%f,%f,%f,%f,%f," \ - "%f,%f,%f,%f,%f," \ - "%f,%f,%f,%f,%f," \ - "%f,%f,%f,%f,%f", \ - &af[0], &af[1], &af[2], &af[3], &af[4], \ - &af[5], &af[6], &af[7], &af[8], &af[9], \ - &af[10], &af[11], &af[12], &af[13], &af[14], \ - &af[15], &af[16], &af[17], &af[18], &af[19], \ - &af[20], &af[21], &af[22], &af[23], &af[24]); \ - \ - if (arg_count <= 0 || arg_count > MAX_AFS) { \ - strcpy(output, "-"); \ - return; \ - } \ - \ - memset(&new_af, 0, sizeof(af_struct)); \ - af_iter = af; \ - while (arg_count-- != 0) add_func(&new_af, *af_iter++); \ - \ - memcpy(&(mod->enc->data[mod->enc->program].af_entry), &new_af, sizeof(new_af)); \ - strcpy(output, "+"); \ -} - -AF_HANDLER(af, RDSAFs, af, add_rds_af) -AF_HANDLER(afo, RDSAFsODA, af_oda, add_rds_af_oda) - static void handle_udg(char *arg, char *pattern, RDSModulator* mod, char* output) { uint8_t all_scanned = 1, bad_format = 0; uint16_t blocks[8][3]; @@ -226,12 +187,7 @@ static void handle_eondt(char *arg, char *pattern, RDSModulator* mod, char* outp strcpy(output, "+"); } -static const command_handler_t commands_eq3[] = { - {"AF", handle_af, 2} -}; - static const command_handler_t commands_eq4[] = { - {"AFO", handle_afo, 3}, {"ADR", handle_adr, 3} }; @@ -340,10 +296,6 @@ void process_ascii_cmd(RDSModulator* mod, char *str, char *cmd_output) { size_t table_size = 0; switch (eq_pos) { - case 2: - table = commands_eq3; - table_size = sizeof(commands_eq3) / sizeof(command_handler_t); - break; case 3: table = commands_eq4; table_size = sizeof(commands_eq4) / sizeof(command_handler_t); diff --git a/src/command.lua b/src/command.lua index 6fb460a..9e24af2 100644 --- a/src/command.lua +++ b/src/command.lua @@ -207,6 +207,42 @@ if type(data) == "string" and data ~= nil then set_rds_rtp_meta(is_ertp, enabled, running) if f2 ~= 0 then toggle_rds_rtp(is_ertp) end return "+" + elseif cmd == "af" then + local af_table = {} + + if value == "" or value == "0" then + set_rds_af_group0({}) + return "+" + end + + for freq_str in value:gmatch("([^,]+)") do + local f = tonumber(freq_str) + if f then table.insert(af_table, f) + else return "-" end + end + + if #af_table > 25 then return "-" end + + set_rds_af_group0(af_table) + return "+" + elseif cmd == "afo" then + local af_table = {} + + if value == "" or value == "0" then + set_rds_af_oda({}) + return "+" + end + + for freq_str in value:gmatch("([^,]+)") do + local f = tonumber(freq_str) + if f then table.insert(af_table, f) + else return "-" end + end + + if #af_table > 25 then return "-" end + + set_rds_af_oda(af_table) + return "+" else return "?" end diff --git a/src/lua_rds.c b/src/lua_rds.c index cc5cb48..7a1064e 100644 --- a/src/lua_rds.c +++ b/src/lua_rds.c @@ -263,6 +263,51 @@ int lua_get_rds_grpseq(lua_State *localL) { return 1; } +int lua_set_rds_af_group0(lua_State *localL) { + luaL_checktype(L, 1, LUA_TTABLE); + + int n = lua_rawlen(L, 1); + if (n == 0) { + memset(&(mod->enc->data[mod->enc->program].af), 0, sizeof(RDSAFs)); + return 0; + } + if(n > 25) return luaL_error(L, "table length over 25"); + + RDSAFs new_af; + memset(&new_af, 0, sizeof(RDSAFs)); + + for (int i = 1; i <= n; i++) { + lua_rawgeti(L, 1, i); + if (lua_isnumber(L, -1)) add_rds_af(&new_af, lua_tonumber(L, -1)); + lua_pop(L, 1); + } + memcpy(&(mod->enc->data[mod->enc->program].af), &new_af, sizeof(new_af)); + + return 0; +} +int lua_set_rds_af_oda(lua_State *localL) { + luaL_checktype(L, 1, LUA_TTABLE); + + int n = lua_rawlen(L, 1); + if (n == 0) { + memset(&(mod->enc->data[mod->enc->program].af_oda), 0, sizeof(RDSAFsODA)); + return 0; + } + if(n > 25) return luaL_error(L, "table length over 25"); + + RDSAFsODA new_af; + memset(&new_af, 0, sizeof(RDSAFsODA)); + + for (int i = 1; i <= n; i++) { + lua_rawgeti(L, 1, i); + if (lua_isnumber(L, -1)) add_rds_af_oda(&new_af, lua_tonumber(L, -1)); + lua_pop(L, 1); + } + memcpy(&(mod->enc->data[mod->enc->program].af_oda), &new_af, sizeof(new_af)); + + return 0; +} + void init_lua(RDSModulator* rds_mod) { mod = rds_mod; L = luaL_newstate(); @@ -367,6 +412,9 @@ void init_lua(RDSModulator* rds_mod) { lua_register(L, "put_rds_custom_group", lua_put_rds_custom_group); lua_register(L, "put_rds2_custom_group", lua_put_rds2_custom_group); + + lua_register(L, "set_rds_af_group0", lua_set_rds_af_group0); + lua_register(L, "set_rds_af_oda", lua_set_rds_af_oda); } void run_lua(char *str, char *cmd_output) {