From ff9f3d1bb81aa40401e0860f43f771d43d7052be Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Mon, 22 Dec 2025 19:13:17 +0100 Subject: [PATCH] errors? --- .vscode/settings.json | 16 +++- plugin.lua | 178 ++++++++++++++++++++++++++++++++++++++++++ src/ascii_cmd.c | 19 ----- src/command.lua | 5 +- src/lua_rds.c | 64 +++++++++++++++ src/lua_rds.h | 2 + src/rds.c | 3 + 7 files changed, 265 insertions(+), 22 deletions(-) create mode 100644 plugin.lua diff --git a/.vscode/settings.json b/.vscode/settings.json index 262a9a5..11c0901 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -56,6 +56,18 @@ "set_rds_program", "set_rds_level", "set_rds_rt_text_timeout", - "set_rds_program_defaults" - ] + "set_rds_program_defaults", + "reset_rds", + "max_programs", + "on_init", + "get_rds_pi", + "get_rds_ecc", + "get_rds_pty", + "get_rds_slc_data", + "get_rds_ct", + "get_rds_dpty", + "get_rds_tp", + "get_rds_ta" + ], + "Lua.runtime.plugin": "plugin.lua" } \ No newline at end of file diff --git a/plugin.lua b/plugin.lua new file mode 100644 index 0000000..8ef9209 --- /dev/null +++ b/plugin.lua @@ -0,0 +1,178 @@ +---@meta + +-- Global Variables +---@type string +core_version = "" +---@type integer +max_programs = 0 +---@type string|nil +data = "" -- Set during run_lua calls + +---Starts the initialization sequence, also calls the on_init function +---@return nil +function set_rds_program_defaults() end + +---Saves, loads and resets the state of the data +---@return nil +function reset_rds() end + +---This function is called by the C core after the script is loaded. +---It should be defined by the user in the script. +---@return nil +function on_init() end + +---@param pi integer +function set_rds_pi(pi) end +---@return integer +function get_rds_pi() end + +---@param pty integer +function set_rds_pty(pty) end +---@return integer +function get_rds_pty() end + +---@param ecc integer +function set_rds_ecc(ecc) end +---@return integer +function get_rds_ecc() end + +---@param slc_data integer +function set_rds_slc_data(slc_data) end +---@return integer +function get_rds_slc_data() end + +---@param ct integer 0 or 1 +function set_rds_ct(ct) end +---@return integer +function get_rds_ct() end + +---@param dpty integer 0 or 1 +function set_rds_dpty(dpty) end +---@return integer +function get_rds_dpty() end + +---@param tp integer 0 or 1 +function set_rds_tp(tp) end +---@return integer +function get_rds_tp() end + +---@param ta integer 0 or 1 +function set_rds_ta(ta) end +---@return integer +function get_rds_ta() end + +-- Feature Flags +---@param enabled integer 0 or 1 +function set_rds_rt1_enabled(enabled) end +---@return integer +function get_rds_rt1_enabled() end + +---@param enabled integer 0 or 1 +function set_rds_rt2_enabled(enabled) end +---@return integer +function get_rds_rt2_enabled() end + +---@param enabled integer 0 or 1 +function set_rds_ptyn_enabled(enabled) end +---@return integer +function get_rds_ptyn_enabled() end + +---@param rt_type integer 0 (RT A/B) or 1 (RT C) +function set_rds_rt_type(rt_type) end +---@return integer +function get_rds_rt_type() end + +-- Modulation & Generation +---@param mode integer +function set_rds_rds2mod(mode) end +---@return integer +function get_rds_rds2mod() end + +---@param rdsgen integer +function set_rds_rdsgen(rdsgen) end +---@return integer +function get_rds_rdsgen() end + +---@param level number +function set_rds_level(level) end +---@return number +function get_rds_level() end + +-- Program & Linking +---@param linkage integer +function set_rds_link(linkage) end +---@return integer +function get_rds_link() end + +---@param program_idx integer 0 to (max_programs - 1) +function set_rds_program(program_idx) end +---@return integer +function get_rds_program() end + +-- Timeouts and Periods +---@param period integer +function set_rds_rt_switching_period(period) end +---@return integer +function get_rds_rt_switching_period() end + +---@param timeout integer +function set_rds_rt_text_timeout(timeout) end +---@return integer +function get_rds_rt_text_timeout() end + +-- String Setters (Charset converted) +---@param ptyn string Program Type Name (max 8 chars) +function set_rds_ptyn(ptyn) end +---@param ps string Program Service (8 chars) +function set_rds_ps(ps) end +---@param tps string Text PS (Scrolling PS) +function set_rds_tps(tps) end +---@param rt1 string Radio Text 1 (max 64 chars) +function set_rds_rt1(rt1) end +---@param rt2 string Radio Text 2 (max 64 chars) +function set_rds_rt2(rt2) end + +---@param lps string +function set_rds_lps(lps) end +---@return string +function get_rds_lps() end + +function set_rds_ert(ert) end +---@return string +function get_rds_ert() end + +function set_rds_grpseq(grpseq) end +---@return string +function get_rds_grpseq() end + + +function set_rds_grpseq2(grpseq) end +---@return string +function get_rds_grpseq2() end + +-- RT Plus Tags +---Sets RT+ tags: type1, start1, len1, type2, start2, len2 +---@param t1 integer +---@param s1 integer +---@param l1 integer +---@param t2 integer +---@param s2 integer +---@param l2 integer +function set_rds_rtplus_tags(t1, s1, l1, t2, s2, l2) end + +---Gets RT+ tags: type1, start1, len1, type2, start2, len2 +---@return integer, integer, integer, integer, integer, integer +function get_rds_rtplus_tags() end + +---Sets eRT+ tags: type1, start1, len1, type2, start2, len2 +---@param t1 integer +---@param s1 integer +---@param l1 integer +---@param t2 integer +---@param s2 integer +---@param l2 integer +function set_rds_ertplus_tags(t1, s1, l1, t2, s2, l2) end + +---Gets eRT+ tags: type1, start1, len1, type2, start2, len2 +---@return integer, integer, integer, integer, integer, integer +function get_rds_ertplus_tags() end \ No newline at end of file diff --git a/src/ascii_cmd.c b/src/ascii_cmd.c index b8c665b..37a8c09 100644 --- a/src/ascii_cmd.c +++ b/src/ascii_cmd.c @@ -205,14 +205,6 @@ static void handle_grpseq(char *arg, RDSModulator* mod, char* output) { strcpy(output, "+"); } -static void handle_reset(char *arg, RDSModulator* mod, char* output) { - (void)arg; - encoder_loadFromFile(mod->enc); - for(int i = 0; i < PROGRAMS; i++) reset_rds_state(mod->enc, i); - Modulator_loadFromFile(&mod->params); - strcpy(output, "+"); -} - static void handle_eonen(char *arg, char *pattern, RDSModulator* mod, char* output) { mod->enc->data[mod->enc->program].eon[atoi(pattern)-1].enabled = atoi(arg); strcpy(output, "+"); @@ -321,9 +313,6 @@ static const command_handler_t commands_eq7[] = { static const command_handler_t commands_eq8[] = { {"ERTPRUN", handle_ertprun, 7}, }; -static const command_handler_t commands_exact[] = { - {"RESET", handle_reset, 5}, -}; static const pattern_command_handler_t pattern_commands[] = { {"EON", "EN", handle_eonen}, @@ -406,14 +395,6 @@ void process_ascii_cmd(RDSModulator* mod, char *str, char *cmd_output) { if(upper_str[i] >= 'a' && upper_str[i] <= 'z') upper_str[i] = upper_str[i] - 'a' + 'A'; } - for (size_t i = 0; i < sizeof(commands_exact) / sizeof(command_handler_t); i++) { - const command_handler_t *handler = &commands_exact[i]; - if (cmd_len == handler->cmd_length && strcmp(upper_str, handler->cmd) == 0) { - handler->handler(NULL, mod, output); - return; - } - } - char *equals_pos = strchr(upper_str, '='); if (equals_pos != NULL) { cmd = upper_str; diff --git a/src/command.lua b/src/command.lua index f101a4b..a008067 100644 --- a/src/command.lua +++ b/src/command.lua @@ -7,6 +7,9 @@ if type(data) == "string" then elseif data == "init" then set_rds_program_defaults() return "+" + elseif data == "reset" then + reset_rds() + return "+" end end cmd = cmd:lower() @@ -115,7 +118,7 @@ if type(data) == "string" then elseif cmd == "program" then local program = tonumber(value) if not program then return "-" end - if program < 1 then return "-" end + if program < 1 or program > max_programs then return "-" end set_rds_program(program-1) return "+" elseif cmd == "level" then diff --git a/src/lua_rds.c b/src/lua_rds.c index c6a4453..ec89c59 100644 --- a/src/lua_rds.c +++ b/src/lua_rds.c @@ -9,6 +9,16 @@ int lua_set_rds_program_defaults(lua_State *localL) { return 0; } +int lua_reset_rds(lua_State *localL) { + (void)localL; + encoder_saveToFile(mod->enc); + encoder_loadFromFile(mod->enc); + for(int i = 0; i < PROGRAMS; i++) reset_rds_state(mod->enc, i); + Modulator_saveToFile(&mod->params); + Modulator_loadFromFile(&mod->params); + return 0; +} + #define INT_SETTER(name) \ int lua_set_rds_##name(lua_State *localL) { \ mod->enc->data[mod->enc->program].name = luaL_checkinteger(localL, 1); \ @@ -203,6 +213,17 @@ int lua_get_rds_grpseq2(lua_State *localL) { return 1; } +int lua_set_rds_grpseq(lua_State *localL) { + const char* str = luaL_checklstring(localL, 1, NULL); + if(_strnlen(str, 2) < 1) set_rds_grpseq(mod->enc, DEFAULT_GRPSQC); + else set_rds_grpseq(mod->enc, str); + return 0; +} +int lua_get_rds_grpseq(lua_State *localL) { + lua_pushstring(localL, mod->enc->data[mod->enc->program].grp_sqc); + return 1; +} + void init_lua(RDSModulator* rds_mod) { mod = rds_mod; L = luaL_newstate(); @@ -217,8 +238,11 @@ void init_lua(RDSModulator* rds_mod) { lua_pushstring(L, VERSION); lua_setglobal(L, "core_version"); + lua_pushinteger(L, PROGRAMS) + lua_setglobal(L, "max_programs"); lua_register(L, "set_rds_program_defaults", lua_set_rds_program_defaults); + lua_register(L, "reset_rds", lua_reset_rds); lua_register(L, "set_rds_pi", lua_set_rds_pi); lua_register(L, "get_rds_pi", lua_get_rds_pi); @@ -262,6 +286,9 @@ void init_lua(RDSModulator* rds_mod) { lua_register(L, "set_rds_rdsgen", lua_set_rds_rdsgen); lua_register(L, "get_rds_rdsgen", lua_get_rds_rdsgen); + lua_register(L, "set_rds_grpseq", lua_set_rds_grpseq); + lua_register(L, "get_rds_grpseq", lua_get_rds_grpseq); + lua_register(L, "set_rds_grpseq2", lua_set_rds_grpseq2); lua_register(L, "get_rds_grpseq2", lua_get_rds_grpseq2); @@ -294,6 +321,9 @@ void init_lua(RDSModulator* rds_mod) { lua_register(L, "set_rds_rtplus_tags", lua_set_rds_rtplus_tags); lua_register(L, "get_rds_rtplus_tags", lua_get_rds_rtplus_tags); + + lua_register(L, "set_rds_ertplus_tags", lua_set_rds_ertplus_tags); + lua_register(L, "get_rds_ertplus_tags", lua_get_rds_ertplus_tags); } void run_lua(char *str, char *cmd_output) { @@ -318,6 +348,40 @@ void run_lua(char *str, char *cmd_output) { } } +void lua_on_init() { + char path[128]; + snprintf(path, sizeof(path), "%s/.rds95.command.lua", getenv("HOME")); + + if (luaL_loadfilex(L, path, NULL) != LUA_OK) { + const char *err = lua_tostring(L, -1); + fprintf(stderr, "Lua error loading file: %s\n", err); + lua_pop(L, 1); + return; + } + + lua_pushnil(); + lua_setglobal(L, "data") + + if (lua_pcall(L, 0, 0, 0) != LUA_OK) { + const char *err = lua_tostring(L, -1); + fprintf(stderr, "Lua error running script: %s\n", err); + lua_pop(L, 1); + return; + } + + lua_getglobal(L, "on_init"); + + if (lua_isfunction(L, -1)) { + if (lua_pcall(L, 0, 0, 0) != LUA_OK) { + fprintf(stderr, "Lua error running 'on_init': %s\n", lua_tostring(L, -1)); + lua_pop(L, 1); + } + } else { + // printf("Note: 'on_init' function not found in Lua script. Skipping.\n"); + lua_pop(L, 1); + } +} + void destroy_lua(void) { if (L) { lua_close(L); diff --git a/src/lua_rds.h b/src/lua_rds.h index ca58bb4..ca440b2 100644 --- a/src/lua_rds.h +++ b/src/lua_rds.h @@ -3,8 +3,10 @@ #include #include #include "rds.h" +#include "fs.h" #include "modulator.h" void init_lua(RDSModulator* rds_mod); void run_lua(char *str, char *cmd_output); +void lua_on_init(); void destroy_lua(); \ No newline at end of file diff --git a/src/rds.c b/src/rds.c index 6b2db46..0fe3f0a 100644 --- a/src/rds.c +++ b/src/rds.c @@ -3,6 +3,7 @@ #include "fs.h" #include "modulator.h" #include "lib.h" +#include "lua_rds.h" #include static uint16_t get_next_af(RDSEncoder* enc) { @@ -695,6 +696,8 @@ void set_rds_defaults(RDSEncoder* enc, uint8_t program) { reset_rds_state(enc, program); enc->encoder_data.ascii_data.expected_encoder_addr = 255; // Unknown + + lua_on_init(); } void init_rds_encoder(RDSEncoder* enc) {