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:
18
.vscode/settings.json
vendored
18
.vscode/settings.json
vendored
@@ -24,5 +24,23 @@
|
|||||||
},
|
},
|
||||||
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
|
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
|
||||||
"clang-diagnostic-error"
|
"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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -74,26 +74,6 @@ static void handle_##name(char *arg, RDSModulator* mod, char* output) { \
|
|||||||
AF_HANDLER(af, RDSAFs, af, add_rds_af)
|
AF_HANDLER(af, RDSAFs, af, add_rds_af)
|
||||||
AF_HANDLER(afo, RDSAFsODA, af_oda, add_rds_af_oda)
|
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(ps, PS_LENGTH, set_rds_ps)
|
||||||
STRING_HANDLER(tps, PS_LENGTH, set_rds_tps)
|
STRING_HANDLER(tps, PS_LENGTH, set_rds_tps)
|
||||||
STRING_HANDLER(rt1, RT_LENGTH, set_rds_rt1)
|
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(lps, LPS_LENGTH, set_rds_lps)
|
||||||
RAW_STRING_HANDLER(ert, ERT_LENGTH, set_rds_ert)
|
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) {
|
static void handle_udg(char *arg, char *pattern, RDSModulator* mod, char* output) {
|
||||||
uint8_t all_scanned = 1, bad_format = 0;
|
uint8_t all_scanned = 1, bad_format = 0;
|
||||||
uint16_t blocks[8][3];
|
uint16_t blocks[8][3];
|
||||||
@@ -199,16 +176,6 @@ static void handle_link(char *arg, RDSModulator* mod, char* output) {
|
|||||||
strcpy(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) {
|
static void handle_adr(char *arg, RDSModulator* mod, char* output) {
|
||||||
uint16_t ids[2];
|
uint16_t ids[2];
|
||||||
int count = sscanf(arg, "%4hu,%4hu", &ids[0], &ids[1]);
|
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[] = {
|
static const command_handler_t commands_eq3[] = {
|
||||||
{"PS", handle_ps, 2},
|
{"PS", handle_ps, 2},
|
||||||
{"PI", handle_pi, 2},
|
|
||||||
{"TP", handle_tp, 2},
|
|
||||||
{"TA", handle_ta, 2},
|
|
||||||
{"CT", handle_ct, 2},
|
|
||||||
{"AF", handle_af, 2}
|
{"AF", handle_af, 2}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -429,8 +392,6 @@ static const command_handler_t commands_eq4[] = {
|
|||||||
{"TPS", handle_tps, 3},
|
{"TPS", handle_tps, 3},
|
||||||
{"RT1", handle_rt1, 3},
|
{"RT1", handle_rt1, 3},
|
||||||
{"RT2", handle_rt2, 3},
|
{"RT2", handle_rt2, 3},
|
||||||
{"PTY", handle_pty, 3},
|
|
||||||
{"ECC", handle_ecc, 3},
|
|
||||||
{"RTP", handle_rtp, 3},
|
{"RTP", handle_rtp, 3},
|
||||||
{"LPS", handle_lps, 3},
|
{"LPS", handle_lps, 3},
|
||||||
{"ERT", handle_ert, 3},
|
{"ERT", handle_ert, 3},
|
||||||
@@ -440,9 +401,6 @@ static const command_handler_t commands_eq4[] = {
|
|||||||
|
|
||||||
static const command_handler_t commands_eq5[] = {
|
static const command_handler_t commands_eq5[] = {
|
||||||
{"TEXT", handle_rt1, 4},
|
{"TEXT", handle_rt1, 4},
|
||||||
{"PTYN", handle_ptyn, 4},
|
|
||||||
{"DPTY", handle_dpty, 4},
|
|
||||||
{"SLCD", handle_slcd, 4},
|
|
||||||
{"ERTP", handle_ertp, 4},
|
{"ERTP", handle_ertp, 4},
|
||||||
{"LINK", handle_link, 4},
|
{"LINK", handle_link, 4},
|
||||||
{"SITE", handle_site, 4}
|
{"SITE", handle_site, 4}
|
||||||
@@ -453,23 +411,17 @@ static const command_handler_t commands_eq2[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const command_handler_t commands_eq6[] = {
|
static const command_handler_t commands_eq6[] = {
|
||||||
{"RT1EN", handle_rt1en, 5},
|
|
||||||
{"RT2EN", handle_rt2en, 5},
|
|
||||||
{"RTPER", handle_rtper, 5},
|
{"RTPER", handle_rtper, 5},
|
||||||
{"LEVEL", handle_level, 5},
|
{"LEVEL", handle_level, 5},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const command_handler_t commands_eq7[] = {
|
static const command_handler_t commands_eq7[] = {
|
||||||
{"PTYNEN", handle_ptynen, 6},
|
|
||||||
{"RTPRUN", handle_rtprun, 6},
|
{"RTPRUN", handle_rtprun, 6},
|
||||||
{"GRPSEQ", handle_grpseq, 6},
|
{"GRPSEQ", handle_grpseq, 6},
|
||||||
{"RDSGEN", handle_rdsgen, 6},
|
|
||||||
{"RTTYPE", handle_rttype, 6},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const command_handler_t commands_eq8[] = {
|
static const command_handler_t commands_eq8[] = {
|
||||||
{"PROGRAM", handle_program, 7},
|
{"PROGRAM", handle_program, 7},
|
||||||
{"RDS2MOD", handle_rds2mod, 7},
|
|
||||||
{"GRPSEQ2", handle_grpseq2, 7},
|
{"GRPSEQ2", handle_grpseq2, 7},
|
||||||
{"DTTMOUT", handle_dttmout, 7},
|
{"DTTMOUT", handle_dttmout, 7},
|
||||||
{"ERTPRUN", handle_ertprun, 7},
|
{"ERTPRUN", handle_ertprun, 7},
|
||||||
|
|||||||
@@ -1,11 +1,80 @@
|
|||||||
-- if type(cmd) == "string" then
|
do return "" end
|
||||||
-- if cmd:sub(1, 3) == "PI=" then
|
|
||||||
-- local hex = cmd:sub(7)
|
if type(cmd) == "string" then
|
||||||
-- local pi = tonumber(hex, 16)
|
local cmd, value = cmd:match("([^=]+)=([^=]+)")
|
||||||
-- if (pi & 0xf000) == 0 then return "-" end
|
cmd = cmd:lower()
|
||||||
-- if pi then
|
if cmd == "pi" then
|
||||||
-- set_rds_pi(pi)
|
local pi = tonumber(value, 16)
|
||||||
-- return "+"
|
if not pi then return "-" end
|
||||||
-- end
|
if (pi & 0xF000) == 0 then return "-" end
|
||||||
-- end
|
set_rds_pi(pi)
|
||||||
-- end
|
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
|
||||||
@@ -3,17 +3,69 @@
|
|||||||
static RDSModulator* mod = NULL;
|
static RDSModulator* mod = NULL;
|
||||||
static lua_State *L = NULL;
|
static lua_State *L = NULL;
|
||||||
|
|
||||||
int lua_set_rds_pi(lua_State *localL) {
|
#define INT_NONRETURN_HANDLER(name) \
|
||||||
int pi_value = luaL_checkinteger(localL, 1);
|
int lua_set_rds_##name(lua_State *localL) { \
|
||||||
mod->enc->data[mod->enc->program].pi = pi_value;
|
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;
|
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) {
|
void init_lua(RDSModulator* rds_mod) {
|
||||||
mod = rds_mod;
|
mod = rds_mod;
|
||||||
L = luaL_newstate();
|
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_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) {
|
void run_lua(char *str, char *cmd_output) {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#include "rds.h"
|
#include "rds.h"
|
||||||
#include "modulator.h"
|
#include "modulator.h"
|
||||||
|
|
||||||
int lua_set_rds_pi(lua_State *L);
|
|
||||||
void init_lua(RDSModulator* rds_mod);
|
void init_lua(RDSModulator* rds_mod);
|
||||||
void run_lua(char *str, char *cmd_output);
|
void run_lua(char *str, char *cmd_output);
|
||||||
void destroy_lua();
|
void destroy_lua();
|
||||||
@@ -61,7 +61,7 @@ void poll_udp_server() {
|
|||||||
|
|
||||||
memset(cmd_output, 0, BUF_SIZE);
|
memset(cmd_output, 0, BUF_SIZE);
|
||||||
process_ascii_cmd(mod, cmd_buf, cmd_output);
|
process_ascii_cmd(mod, cmd_buf, cmd_output);
|
||||||
run_lua(cmd_buf, NULL);
|
run_lua(cmd, NULL);
|
||||||
|
|
||||||
size_t out_len = strlen(cmd_output);
|
size_t out_len = strlen(cmd_output);
|
||||||
if (out_len > 0) {
|
if (out_len > 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user