0
1
mirror of https://github.com/radio95-rnt/rds95.git synced 2026-02-26 20:33:53 +01:00

transition to lua based

This commit is contained in:
2025-12-22 16:10:33 +01:00
parent 1a747d9264
commit ecf02a7479
6 changed files with 155 additions and 65 deletions

18
.vscode/settings.json vendored
View File

@@ -24,5 +24,23 @@
},
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
"clang-diagnostic-error"
],
"Lua.diagnostics.globals": [
"set_rds_pi",
"set_rds_ecc",
"str",
"cmd",
"set_rds_pty",
"set_rds_slc_data",
"set_rds_ct",
"set_rds_dpty",
"set_rds_tp",
"set_rds_ta",
"set_rds_rt1_enabled",
"set_rds_rt2_enabled",
"set_rds_ptyn_enabled",
"set_rds_rt_type",
"set_rds_rds2mod",
"set_rds_rdsgen"
]
}

View File

@@ -74,26 +74,6 @@ static void handle_##name(char *arg, RDSModulator* mod, char* output) { \
AF_HANDLER(af, RDSAFs, af, add_rds_af)
AF_HANDLER(afo, RDSAFsODA, af_oda, add_rds_af_oda)
SIMPLE_INT_HANDLER(pty, pty)
SIMPLE_INT_HANDLER(ct, ct)
SIMPLE_INT_HANDLER(dpty, dpty)
SIMPLE_INT_HANDLER(tp, tp)
SIMPLE_INT_HANDLER(ta, ta)
SIMPLE_INT_HANDLER(rt1en, rt1_enabled)
SIMPLE_INT_HANDLER(rt2en, rt2_enabled)
SIMPLE_INT_HANDLER(ptynen, ptyn_enabled)
SIMPLE_INT_HANDLER(rttype, rt_type)
static void handle_rds2mod(char *arg, RDSModulator* mod, char* output) {
mod->enc->encoder_data.rds2_mode = atoi(arg);
strcpy(output, "+");
}
static void handle_rdsgen(char *arg, RDSModulator* mod, char* output) {
mod->params.rdsgen = atoi(arg);
strcpy(output, "+");
}
STRING_HANDLER(ptyn, PTYN_LENGTH, set_rds_ptyn)
STRING_HANDLER(ps, PS_LENGTH, set_rds_ps)
STRING_HANDLER(tps, PS_LENGTH, set_rds_tps)
STRING_HANDLER(rt1, RT_LENGTH, set_rds_rt1)
@@ -102,9 +82,6 @@ STRING_HANDLER(rt2, RT_LENGTH, set_rds_rt2)
RAW_STRING_HANDLER(lps, LPS_LENGTH, set_rds_lps)
RAW_STRING_HANDLER(ert, ERT_LENGTH, set_rds_ert)
HEX_HANDLER(ecc, ecc)
HEX_HANDLER(slcd, slc_data)
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];
@@ -199,16 +176,6 @@ static void handle_link(char *arg, RDSModulator* mod, char* output) {
strcpy(output, "+");
}
static void handle_pi(char *arg, RDSModulator* mod, char* output) {
uint16_t pi_value = strtoul(arg, NULL, 16);
if ((pi_value & 0xF000) == 0) {
strcpy(output, "-");
return;
}
mod->enc->data[mod->enc->program].pi = pi_value;
strcpy(output, "+");
}
static void handle_adr(char *arg, RDSModulator* mod, char* output) {
uint16_t ids[2];
int count = sscanf(arg, "%4hu,%4hu", &ids[0], &ids[1]);
@@ -418,10 +385,6 @@ static void handle_eondt(char *arg, char *pattern, RDSModulator* mod, char* outp
static const command_handler_t commands_eq3[] = {
{"PS", handle_ps, 2},
{"PI", handle_pi, 2},
{"TP", handle_tp, 2},
{"TA", handle_ta, 2},
{"CT", handle_ct, 2},
{"AF", handle_af, 2}
};
@@ -429,8 +392,6 @@ static const command_handler_t commands_eq4[] = {
{"TPS", handle_tps, 3},
{"RT1", handle_rt1, 3},
{"RT2", handle_rt2, 3},
{"PTY", handle_pty, 3},
{"ECC", handle_ecc, 3},
{"RTP", handle_rtp, 3},
{"LPS", handle_lps, 3},
{"ERT", handle_ert, 3},
@@ -440,9 +401,6 @@ static const command_handler_t commands_eq4[] = {
static const command_handler_t commands_eq5[] = {
{"TEXT", handle_rt1, 4},
{"PTYN", handle_ptyn, 4},
{"DPTY", handle_dpty, 4},
{"SLCD", handle_slcd, 4},
{"ERTP", handle_ertp, 4},
{"LINK", handle_link, 4},
{"SITE", handle_site, 4}
@@ -453,23 +411,17 @@ static const command_handler_t commands_eq2[] = {
};
static const command_handler_t commands_eq6[] = {
{"RT1EN", handle_rt1en, 5},
{"RT2EN", handle_rt2en, 5},
{"RTPER", handle_rtper, 5},
{"LEVEL", handle_level, 5},
};
static const command_handler_t commands_eq7[] = {
{"PTYNEN", handle_ptynen, 6},
{"RTPRUN", handle_rtprun, 6},
{"GRPSEQ", handle_grpseq, 6},
{"RDSGEN", handle_rdsgen, 6},
{"RTTYPE", handle_rttype, 6},
};
static const command_handler_t commands_eq8[] = {
{"PROGRAM", handle_program, 7},
{"RDS2MOD", handle_rds2mod, 7},
{"GRPSEQ2", handle_grpseq2, 7},
{"DTTMOUT", handle_dttmout, 7},
{"ERTPRUN", handle_ertprun, 7},

View File

@@ -1,11 +1,80 @@
-- if type(cmd) == "string" then
-- if cmd:sub(1, 3) == "PI=" then
-- local hex = cmd:sub(7)
-- local pi = tonumber(hex, 16)
-- if (pi & 0xf000) == 0 then return "-" end
-- if pi then
-- set_rds_pi(pi)
-- return "+"
-- end
-- end
-- end
do return "" end
if type(cmd) == "string" then
local cmd, value = cmd:match("([^=]+)=([^=]+)")
cmd = cmd:lower()
if cmd == "pi" then
local pi = tonumber(value, 16)
if not pi then return "-" end
if (pi & 0xF000) == 0 then return "-" end
set_rds_pi(pi)
return "+"
elseif cmd == "ecc" then
local ecc = tonumber(value, 16)
if not ecc then return "-" end
set_rds_ecc(ecc)
return "+"
elseif cmd == "pty" then
local pty = tonumber(value)
if not pty then return "-" end
set_rds_pty(pty)
return "+"
elseif cmd == "slcd" then
local slc_data = tonumber(value, 16)
if not slc_data then return "-" end
set_rds_slc_data(slc_data)
return "+"
elseif cmd == "ct" then
local ct = tonumber(value)
if not ct then return "-" end
set_rds_ct(ct)
return "+"
elseif cmd == "dpty" then
local dpty = tonumber(value)
if not dpty then return "-" end
set_rds_dpty(dpty)
return "+"
elseif cmd == "tp" then
local tp = tonumber(value)
if not tp then return "-" end
set_rds_tp(tp)
return "+"
elseif cmd == "ta" then
local ta = tonumber(value)
if not ta then return "-" end
set_rds_ta(ta)
return "+"
elseif cmd == "rt1en" then
local en = tonumber(value)
if not en then return "-" end
set_rds_rt1_enabled(en)
return "+"
elseif cmd == "rt2en" then
local en = tonumber(value)
if not en then return "-" end
set_rds_rt2_enabled(en)
return "+"
elseif cmd == "ptynen" then
local en = tonumber(value)
if not en then return "-" end
set_rds_ptyn_enabled(en)
return "+"
elseif cmd == "rttype" then
local type = tonumber(value)
if not type then return "-" end
set_rds_rt_type(type)
return "+"
elseif cmd == "rds2mod" then
local type = tonumber(value)
if not type then return "-" end
set_rds_rds2mod(type)
return "+"
elseif cmd == "rdsgen" then
local type = tonumber(value)
if not type then return "-" end
set_rds_rdsgen(type)
return "+"
else
return "?"
end
end

View File

@@ -3,17 +3,69 @@
static RDSModulator* mod = NULL;
static lua_State *L = NULL;
int lua_set_rds_pi(lua_State *localL) {
int pi_value = luaL_checkinteger(localL, 1);
mod->enc->data[mod->enc->program].pi = pi_value;
#define INT_NONRETURN_HANDLER(name) \
int lua_set_rds_##name(lua_State *localL) { \
mod->enc->data[mod->enc->program].name = luaL_checkinteger(localL, 1); \
return 0; \
}
#define STR_NONRETURN_HANDLER(name, function) \
int lua_set_rds_##name(lua_State *localL) { \
const char* str = luaL_checklstring(L, 1); \
function(mod->enc, str); \
return 0; \
}
INT_NONRETURN_HANDLER(pi)
INT_NONRETURN_HANDLER(pty)
INT_NONRETURN_HANDLER(ecc)
INT_NONRETURN_HANDLER(slc_data)
INT_NONRETURN_HANDLER(ct)
INT_NONRETURN_HANDLER(dpty)
INT_NONRETURN_HANDLER(tp)
INT_NONRETURN_HANDLER(ta)
INT_NONRETURN_HANDLER(rt1_enabled)
INT_NONRETURN_HANDLER(rt2_enabled)
INT_NONRETURN_HANDLER(ptyn_enabled)
INT_NONRETURN_HANDLER(rt_type)
int lua_set_rds_rds2mod(lua_State *localL) {
mod->enc->encoder_data.rds2_mode = luaL_checkinteger(localL, 1);
return 0;
}
int lua_set_rds_rdsgen(lua_State *localL) {
mod->params.rdsgen = luaL_checkinteger(localL, 1);
return 0;
}
STR_NONRETURN_HANDLER(ptyn, set_rds_ptyn)
void init_lua(RDSModulator* rds_mod) {
mod = rds_mod;
L = luaL_newstate();
luaL_openlibs(L);
luaL_requiref(L, "_G", luaopen_base, 1);
luaL_requiref(L, LUA_STRLIBNAME, luaopen_string, 1);
luaL_requiref(L, LUA_TABLIBNAME, luaopen_table, 1);
luaL_requiref(L, LUA_UTF8LIBNAME, luaopen_utf8, 1);
luaL_requiref(L, LUA_COLIBNAME, luaopen_coroutine, 1);
luaL_requiref(L, LUA_MATHLIBNAME, luaopen_math, 1);
lua_pop(L, 6);
lua_register(L, "set_rds_pi", lua_set_rds_pi);
lua_register(L, "set_rds_pty", lua_set_rds_pty);
lua_register(L, "set_rds_ecc", lua_set_rds_ecc);
lua_register(L, "set_rds_slc_data", lua_set_rds_slc_data);
lua_register(L, "set_rds_ct", lua_set_rds_ct);
lua_register(L, "set_rds_dpty", lua_set_rds_dpty);
lua_register(L, "set_rds_tp", lua_set_rds_tp);
lua_register(L, "set_rds_ta", lua_set_rds_ta);
lua_register(L, "set_rds_rt1_enabled", lua_set_rds_rt1_enabled);
lua_register(L, "set_rds_rt2_enabled", lua_set_rds_rt2_enabled);
lua_register(L, "set_rds_ptyn_enabled", lua_set_rds_ptyn_enabled);
lua_register(L, "set_rds_rt_type", lua_set_rds_rt_type);
lua_register(L, "set_rds_rds2mod", lua_set_rds_rds2mod);
lua_register(L, "set_rds_rdsgen", lua_set_rds_rdsgen);
lua_register(L, "set_rds_ptyn", lua_set_rds_ptyn);
}
void run_lua(char *str, char *cmd_output) {

View File

@@ -5,7 +5,6 @@
#include "rds.h"
#include "modulator.h"
int lua_set_rds_pi(lua_State *L);
void init_lua(RDSModulator* rds_mod);
void run_lua(char *str, char *cmd_output);
void destroy_lua();

View File

@@ -61,7 +61,7 @@ void poll_udp_server() {
memset(cmd_output, 0, BUF_SIZE);
process_ascii_cmd(mod, cmd_buf, cmd_output);
run_lua(cmd_buf, NULL);
run_lua(cmd, NULL);
size_t out_len = strlen(cmd_output);
if (out_len > 0) {